summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2021-06-11 03:00:56 +0000
committerNorbert Preining <norbert@preining.info>2021-06-11 03:00:56 +0000
commitd6b2eaba6fe47c24603040934903c73535ff09ba (patch)
treee608eb7c4afe8e8f2dd739dda2dd79d375f32da0
parent2bd77f5a4d02b0d1649589aa7a548e79b198f6af (diff)
CTAN sync 202106110300
-rw-r--r--FILES.byname641
-rw-r--r--FILES.byname.gzbin2320808 -> 2321264 bytes
-rw-r--r--FILES.last07days1045
-rw-r--r--graphics/pictex-addons/autoarea/ANNOUNCE.txt (renamed from graphics/pictex/addon/autoarea/ANNOUNCE.txt)0
-rw-r--r--graphics/pictex-addons/autoarea/README (renamed from graphics/pictex/addon/autoarea/README)0
-rw-r--r--graphics/pictex-addons/autoarea/autoarea.sty (renamed from graphics/pictex/addon/autoarea/autoarea.sty)0
-rw-r--r--graphics/pictex-addons/autoarea/autodemo/README.autodemo (renamed from graphics/pictex/addon/autoarea/autodemo/README.autodemo)0
-rw-r--r--graphics/pictex-addons/autoarea/autodemo/autodemo+.pdf (renamed from graphics/pictex/addon/autoarea/autodemo/autodemo+.pdf)bin24873 -> 24873 bytes
-rw-r--r--graphics/pictex-addons/autoarea/autodemo/autodemo+.tex (renamed from graphics/pictex/addon/autoarea/autodemo/autodemo+.tex)0
-rw-r--r--graphics/pictex-addons/autoarea/autodemo/autodemo-.pdf (renamed from graphics/pictex/addon/autoarea/autodemo/autodemo-.pdf)bin25493 -> 25493 bytes
-rw-r--r--graphics/pictex-addons/autoarea/autodemo/autodemo-.tex (renamed from graphics/pictex/addon/autoarea/autodemo/autodemo-.tex)0
-rw-r--r--graphics/pictex-addons/autoarea/autodemo/autodemo.tex (renamed from graphics/pictex/addon/autoarea/autodemo/autodemo.tex)0
-rw-r--r--macros/latex/contrib/cooking-units/cooking-units.dtx6209
-rw-r--r--macros/latex/contrib/cooking-units/cooking-units.ins4
-rw-r--r--macros/latex/contrib/cooking-units/cooking-units.pdfbin700306 -> 748443 bytes
-rw-r--r--macros/latex/contrib/easybook/easybook.dtx40
-rw-r--r--macros/latex/contrib/easybook/easybook.pdfbin324143 -> 324334 bytes
-rw-r--r--macros/latex/contrib/ffcode/DEPENDS.txt5
-rw-r--r--macros/latex/contrib/ffcode/README.md31
-rw-r--r--macros/latex/contrib/ffcode/ffcode.pdfbin0 -> 107272 bytes
-rw-r--r--macros/latex/contrib/ffcode/ffcode.sty50
-rw-r--r--macros/latex/contrib/ffcode/ffcode.tex89
-rw-r--r--macros/latex/contrib/semantex/README.md2
-rw-r--r--macros/latex/contrib/semantex/semantex.pdfbin364816 -> 371132 bytes
-rw-r--r--macros/latex/contrib/semantex/semantex.sty4714
-rw-r--r--macros/latex/contrib/semantex/semantex.tex1960
-rw-r--r--macros/latex/contrib/semantex/stripsemantex.sty4
-rw-r--r--macros/latex/contrib/tiscreen/README3
-rw-r--r--macros/latex/contrib/tiscreen/doc/tiscreen-doc.pdfbin133438 -> 125338 bytes
-rw-r--r--macros/latex/contrib/tiscreen/doc/tiscreen-doc.tex104
-rw-r--r--macros/latex/contrib/tiscreen/tex/tiscreen.sty2
-rw-r--r--macros/luatex/generic/luatexko/ChangeLog17
-rw-r--r--macros/luatex/generic/luatexko/README2
-rw-r--r--macros/luatex/generic/luatexko/luatexko-doc.pdfbin326736 -> 338396 bytes
-rw-r--r--macros/luatex/generic/luatexko/luatexko-doc.tex179
-rw-r--r--macros/luatex/generic/luatexko/luatexko-normalize.lua4
-rw-r--r--macros/luatex/generic/luatexko/luatexko-uhc2utf8.lua4
-rw-r--r--macros/luatex/generic/luatexko/luatexko.lua195
-rw-r--r--macros/luatex/generic/luatexko/luatexko.sty344
-rw-r--r--macros/luatex/generic/minim-xmp/EUPL-1.2-EN.txt287
-rw-r--r--macros/luatex/generic/minim-xmp/README30
-rw-r--r--macros/luatex/generic/minim-xmp/minim-xmp.doc196
-rw-r--r--macros/luatex/generic/minim-xmp/minim-xmp.lua583
-rw-r--r--macros/luatex/generic/minim-xmp/minim-xmp.pdfbin0 -> 61507 bytes
-rw-r--r--macros/luatex/generic/minim-xmp/minim-xmp.tex34
-rw-r--r--macros/xetex/generic/xetexko/ChangeLog11
-rw-r--r--macros/xetex/generic/xetexko/README2
-rw-r--r--macros/xetex/generic/xetexko/xetexko-doc.pdfbin254326 -> 254038 bytes
-rw-r--r--macros/xetex/generic/xetexko/xetexko-doc.tex216
-rw-r--r--macros/xetex/generic/xetexko/xetexko.sty177
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb92
-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.xzbin2311828 -> 2312700 bytes
-rw-r--r--systems/win32/miktex/tm/packages/files.csv.lzmabin582716 -> 582841 bytes
-rw-r--r--systems/win32/miktex/tm/packages/next/files.csv.lzmabin583051 -> 583264 bytes
-rw-r--r--systems/win32/miktex/tm/packages/next/pr.ini10
-rw-r--r--systems/win32/miktex/tm/packages/pr.ini12
-rw-r--r--systems/win32/w32tex/ChangeLog8
-rw-r--r--timestamp2
61 files changed, 10930 insertions, 6396 deletions
diff --git a/FILES.byname b/FILES.byname
index cf21be6d85..a278135df1 100644
--- a/FILES.byname
+++ b/FILES.byname
@@ -5087,7 +5087,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
-2021/06/09 | 253498 | FILES.last07days
+2021/06/10 | 207120 | FILES.last07days
2020/08/14 | 104065 | fonts/academicons/academicons.pdf
2020/08/14 | 17247 | fonts/academicons/academicons.sty
2020/08/14 | 6546 | fonts/academicons/academicons.tex
@@ -146105,22 +146105,22 @@
2021/03/27 | 24561 | graphics/pgf/contrib/yquant/tex/yquant-tools.tex
2021/03/27 | 623618 | graphics/pgf/contrib/yquant.zip
2007/12/11 | 654 | graphics/pgf/README
-2008/08/12 | 1048 | graphics/pictex/addon/autoarea/ANNOUNCE.txt
-2008/08/12 | 9341 | graphics/pictex/addon/autoarea/autoarea.sty
-2008/05/07 | 25493 | graphics/pictex/addon/autoarea/autodemo/autodemo-.pdf
-2008/05/07 | 24873 | graphics/pictex/addon/autoarea/autodemo/autodemo+.pdf
-2008/04/19 | 240 | graphics/pictex/addon/autoarea/autodemo/autodemo-.tex
-2008/04/19 | 519 | graphics/pictex/addon/autoarea/autodemo/autodemo.tex
-2008/04/19 | 186 | graphics/pictex/addon/autoarea/autodemo/autodemo+.tex
-2008/08/12 | 642 | graphics/pictex/addon/autoarea/autodemo/README.autodemo
-2008/08/12 | 479 | graphics/pictex/addon/autoarea/README
-2008/08/12 | 55807 | graphics/pictex/addon/autoarea.zip
2005/10/19 | 4608 | graphics/pictex/addon/piccorr.sty
1994/04/20 | 2876 | graphics/pictex/addon/picmore.tex
1994/04/20 | 294 | graphics/pictex/addon/pictex.sty
1994/04/20 | 397 | graphics/pictex/addon/pictexwd.sty
1994/04/20 | 129555 | graphics/pictex/addon/pictexwd.tex
1994/04/20 | 457 | graphics/pictex/addon/pictexzusatz.txt
+2008/08/12 | 1048 | graphics/pictex-addons/autoarea/ANNOUNCE.txt
+2008/08/12 | 9341 | graphics/pictex-addons/autoarea/autoarea.sty
+2008/05/07 | 25493 | graphics/pictex-addons/autoarea/autodemo/autodemo-.pdf
+2008/05/07 | 24873 | graphics/pictex-addons/autoarea/autodemo/autodemo+.pdf
+2008/04/19 | 240 | graphics/pictex-addons/autoarea/autodemo/autodemo-.tex
+2008/04/19 | 519 | graphics/pictex-addons/autoarea/autodemo/autodemo.tex
+2008/04/19 | 186 | graphics/pictex-addons/autoarea/autodemo/autodemo+.tex
+2008/08/12 | 642 | graphics/pictex-addons/autoarea/autodemo/README.autodemo
+2008/08/12 | 479 | graphics/pictex-addons/autoarea/README
+2021/06/10 | 52682 | graphics/pictex-addons/autoarea.zip
1992/08/27 | 3041 | graphics/pictex/errorbars.tex
1992/08/27 | 10519 | graphics/pictex/latexpicobjs.tex
2005/04/03 | 1419473 | graphics/pictex/PiCTeX_manual.pdf
@@ -146132,7 +146132,7 @@
2021/06/08 | 298 | graphics/pictex/README.txt
1989/11/26 | 7270 | graphics/pictex/texpictex.tex
1992/08/31 | 11382 | graphics/pictex/tree.sty
-2021/06/09 | 1245432 | graphics/pictex.zip
+2021/06/10 | 1136553 | graphics/pictex.zip
2018/05/31 | 17537 | graphics/postage/postage.dtx
2018/05/31 | 2443 | graphics/postage/postage.ins
2018/05/30 | 335762 | graphics/postage/postage.pdf
@@ -186347,7 +186347,7 @@
2013/04/01 | 14776 | macros/context/contrib/context-visualcounter/tex/context/third/visualcounter/t-visualcounter.mkvi
2018/03/05 | 11 | macros/context/contrib/context-visualcounter/VERSION
2018/03/22 | 276789 | macros/context/contrib/context-visualcounter.zip
-2021/06/07 | 122806571 | macros/context/latest/cont-tmf.zip
+2021/06/09 | 122808273 | macros/context/latest/cont-tmf.zip
2016/04/21 | 32846 | macros/cstex/base/cmexb.tar.gz
2016/06/26 | 1728262 | macros/cstex/base/csfonts-t1.tar.gz
2007/03/01 | 187106 | macros/cstex/base/csfonts.tar.gz
@@ -195849,11 +195849,11 @@
2014/12/28 | 409523 | macros/latex/contrib/cookingsymbols/cookingsymbols.pdf
2014/12/28 | 494 | macros/latex/contrib/cookingsymbols/README
2014/12/28 | 386109 | macros/latex/contrib/cookingsymbols.zip
-2020/01/13 | 289016 | macros/latex/contrib/cooking-units/cooking-units.dtx
-2020/01/13 | 1655 | macros/latex/contrib/cooking-units/cooking-units.ins
-2020/01/13 | 700306 | macros/latex/contrib/cooking-units/cooking-units.pdf
-2020/01/13 | 1482 | macros/latex/contrib/cooking-units/README.md
-2020/01/14 | 761901 | macros/latex/contrib/cooking-units.zip
+2021/06/10 | 347913 | macros/latex/contrib/cooking-units/cooking-units.dtx
+2021/06/10 | 1655 | macros/latex/contrib/cooking-units/cooking-units.ins
+2021/06/10 | 748443 | macros/latex/contrib/cooking-units/cooking-units.pdf
+2021/06/10 | 1482 | macros/latex/contrib/cooking-units/README.md
+2021/06/10 | 804682 | macros/latex/contrib/cooking-units.zip
2006/12/09 | 68397 | macros/latex/contrib/cooking.zip
2009/10/12 | 24947 | macros/latex/contrib/cookybooky/cookybooky.dtx
2009/10/10 | 1719 | macros/latex/contrib/cookybooky/cookybooky.ins
@@ -197586,11 +197586,11 @@
2008/02/10 | 19110 | macros/latex/contrib/ean13isbn/License.txt
2021/01/24 | 422 | macros/latex/contrib/ean13isbn/README
2021/01/24 | 322624 | macros/latex/contrib/ean13isbn.zip
-2021/06/09 | 131006 | macros/latex/contrib/easybook/easybook.dtx
+2021/06/10 | 130951 | macros/latex/contrib/easybook/easybook.dtx
2021/06/08 | 1499 | macros/latex/contrib/easybook/easybook.ins
-2021/06/09 | 324143 | macros/latex/contrib/easybook/easybook.pdf
+2021/06/10 | 324334 | macros/latex/contrib/easybook/easybook.pdf
2021/06/08 | 1968 | macros/latex/contrib/easybook/README.md
-2021/06/09 | 356748 | macros/latex/contrib/easybook.zip
+2021/06/10 | 356904 | macros/latex/contrib/easybook.zip
2009/06/17 | 82589 | macros/latex/contrib/easy/doc/docbib.pdf
2009/06/17 | 78378 | macros/latex/contrib/easy/doc/docbmat.pdf
2009/06/17 | 99132 | macros/latex/contrib/easy/doc/doceqn.pdf
@@ -199469,6 +199469,12 @@
2013/05/03 | 374250 | macros/latex/contrib/feynmp-auto/feynmp-auto.pdf
2013/05/03 | 1652 | macros/latex/contrib/feynmp-auto/README
2013/05/03 | 378807 | macros/latex/contrib/feynmp-auto.zip
+2021/06/10 | 67 | macros/latex/contrib/ffcode/DEPENDS.txt
+2021/06/10 | 107272 | macros/latex/contrib/ffcode/ffcode.pdf
+2021/06/10 | 2037 | macros/latex/contrib/ffcode/ffcode.sty
+2021/06/10 | 2728 | macros/latex/contrib/ffcode/ffcode.tex
+2021/06/10 | 1150 | macros/latex/contrib/ffcode/README.md
+2021/06/10 | 110754 | macros/latex/contrib/ffcode.zip
2015/10/21 | 398 | macros/latex/contrib/ffslides/bground-example.txt
2015/11/19 | 15305 | macros/latex/contrib/ffslides/ffslides.cls
2015/11/19 | 2747893 | macros/latex/contrib/ffslides/ffslides-doc.pdf
@@ -211397,13 +211403,13 @@
2019/12/10 | 24550 | macros/latex/contrib/selinput/selinput.dtx
2019/12/10 | 537307 | macros/latex/contrib/selinput/selinput.pdf
2019/12/11 | 541126 | macros/latex/contrib/selinput.zip
-2020/09/07 | 1660 | macros/latex/contrib/semantex/README.md
-2020/11/05 | 364816 | macros/latex/contrib/semantex/semantex.pdf
-2020/11/05 | 218857 | macros/latex/contrib/semantex/semantex.sty
-2020/11/05 | 173967 | macros/latex/contrib/semantex/semantex.tex
+2021/06/10 | 1660 | macros/latex/contrib/semantex/README.md
+2021/06/10 | 371132 | macros/latex/contrib/semantex/semantex.pdf
+2021/06/10 | 300946 | macros/latex/contrib/semantex/semantex.sty
+2021/06/10 | 176702 | macros/latex/contrib/semantex/semantex.tex
2020/10/03 | 12086 | macros/latex/contrib/semantex/stripsemantex.lua
-2020/11/05 | 4730 | macros/latex/contrib/semantex/stripsemantex.sty
-2020/11/05 | 420020 | macros/latex/contrib/semantex.zip
+2021/06/10 | 4730 | macros/latex/contrib/semantex/stripsemantex.sty
+2021/06/10 | 430200 | macros/latex/contrib/semantex.zip
2020/01/29 | 1014 | macros/latex/contrib/semantic-markup/README
2020/01/29 | 266707 | macros/latex/contrib/semantic-markup/semantic-markup.pdf
2020/01/29 | 4666 | macros/latex/contrib/semantic-markup/semantic-markup.sty
@@ -214531,11 +214537,11 @@
1994/05/15 | 7262 | macros/latex/contrib/timing/timing.sty
1994/05/17 | 9458 | macros/latex/contrib/timing/timing.tex
2005/06/28 | 106439 | macros/latex/contrib/timing.zip
-2021/06/07 | 133438 | macros/latex/contrib/tiscreen/doc/tiscreen-doc.pdf
-2021/06/07 | 3286 | macros/latex/contrib/tiscreen/doc/tiscreen-doc.tex
-2021/06/07 | 635 | macros/latex/contrib/tiscreen/README
-2021/06/07 | 1781 | macros/latex/contrib/tiscreen/tex/tiscreen.sty
-2021/06/07 | 135157 | macros/latex/contrib/tiscreen.zip
+2021/06/10 | 125338 | macros/latex/contrib/tiscreen/doc/tiscreen-doc.pdf
+2021/06/10 | 3008 | macros/latex/contrib/tiscreen/doc/tiscreen-doc.tex
+2021/06/10 | 689 | macros/latex/contrib/tiscreen/README
+2021/06/10 | 1781 | macros/latex/contrib/tiscreen/tex/tiscreen.sty
+2021/06/10 | 127291 | macros/latex/contrib/tiscreen.zip
2013/04/11 | 447 | macros/latex/contrib/titlecaps/README
2015/01/30 | 272789 | macros/latex/contrib/titlecaps/titlecaps.pdf
2015/01/30 | 15251 | macros/latex/contrib/titlecaps/titlecaps.sty
@@ -223212,15 +223218,15 @@
2021/06/07 | 3100 | macros/luatex/generic/luatexja/tool/table_jisx0208.tex
2021/06/07 | 11335 | macros/luatex/generic/luatexja/tool/unicodeBlocks.tex
2021/06/07 | 3777657 | macros/luatex/generic/luatexja.zip
-2021/04/20 | 8210 | macros/luatex/generic/luatexko/ChangeLog
-2021/04/20 | 326736 | macros/luatex/generic/luatexko/luatexko-doc.pdf
-2021/04/20 | 32803 | macros/luatex/generic/luatexko/luatexko-doc.tex
-2021/04/20 | 69582 | macros/luatex/generic/luatexko/luatexko.lua
-2021/04/20 | 6444 | macros/luatex/generic/luatexko/luatexko-normalize.lua
-2021/04/20 | 32051 | macros/luatex/generic/luatexko/luatexko.sty
-2021/04/20 | 3783 | macros/luatex/generic/luatexko/luatexko-uhc2utf8.lua
-2021/04/20 | 3720 | macros/luatex/generic/luatexko/README
-2021/04/20 | 362476 | macros/luatex/generic/luatexko.zip
+2021/06/10 | 8820 | macros/luatex/generic/luatexko/ChangeLog
+2021/06/10 | 338396 | macros/luatex/generic/luatexko/luatexko-doc.pdf
+2021/06/10 | 35829 | macros/luatex/generic/luatexko/luatexko-doc.tex
+2021/06/10 | 71374 | macros/luatex/generic/luatexko/luatexko.lua
+2021/06/10 | 6444 | macros/luatex/generic/luatexko/luatexko-normalize.lua
+2021/06/10 | 32792 | macros/luatex/generic/luatexko/luatexko.sty
+2021/06/10 | 3783 | macros/luatex/generic/luatexko/luatexko-uhc2utf8.lua
+2021/06/10 | 3720 | macros/luatex/generic/luatexko/README
+2021/06/10 | 375420 | macros/luatex/generic/luatexko.zip
2020/05/17 | 679 | macros/luatex/generic/lua-uni-algos/lua-uni-algos.lua
2020/05/17 | 60487 | macros/luatex/generic/lua-uni-algos/lua-uni-algos.pdf
2020/05/17 | 8259 | macros/luatex/generic/lua-uni-algos/lua-uni-algos.tex
@@ -223312,6 +223318,13 @@
2021/06/08 | 905 | macros/luatex/generic/minim-pdf/README
2021/06/09 | 125669 | macros/luatex/generic/minim-pdf.zip
2021/06/08 | 1165 | macros/luatex/generic/minim/README
+2020/03/06 | 13827 | macros/luatex/generic/minim-xmp/EUPL-1.2-EN.txt
+2021/06/08 | 7473 | macros/luatex/generic/minim-xmp/minim-xmp.doc
+2021/03/01 | 22494 | macros/luatex/generic/minim-xmp/minim-xmp.lua
+2021/06/09 | 61507 | macros/luatex/generic/minim-xmp/minim-xmp.pdf
+2021/04/21 | 744 | macros/luatex/generic/minim-xmp/minim-xmp.tex
+2021/06/08 | 807 | macros/luatex/generic/minim-xmp/README
+2021/06/10 | 64456 | macros/luatex/generic/minim-xmp.zip
2021/06/09 | 297431 | macros/luatex/generic/minim.zip
2020/10/23 | 12610 | macros/luatex/generic/nodetree/nodetree.dtx
2020/10/23 | 2250 | macros/luatex/generic/nodetree/nodetree.ins
@@ -231925,20 +231938,20 @@
2019/04/24 | 32119 | macros/xetex/generic/xesearch/xesearch.sty
2019/04/24 | 101421 | macros/xetex/generic/xesearch/xesearch.tex
2019/08/17 | 620010 | macros/xetex/generic/xesearch.zip
-2021/05/20 | 7793 | macros/xetex/generic/xetexko/ChangeLog
-2021/05/20 | 1812 | macros/xetex/generic/xetexko/hanjacom_hangul.tab
-2021/05/20 | 39492 | macros/xetex/generic/xetexko/hanjaexa_hangul.tab
-2021/05/20 | 125412 | macros/xetex/generic/xetexko/hanja_hangul.tab
-2021/05/20 | 3471 | macros/xetex/generic/xetexko/README
-2021/05/20 | 254326 | macros/xetex/generic/xetexko/xetexko-doc.pdf
-2021/05/20 | 33948 | macros/xetex/generic/xetexko/xetexko-doc.tex
-2021/05/20 | 639 | macros/xetex/generic/xetexko/xetexko-font.sty
-2021/05/20 | 668 | macros/xetex/generic/xetexko/xetexko-hanging.sty
-2021/05/20 | 639 | macros/xetex/generic/xetexko/xetexko-josa.sty
-2021/05/20 | 641 | macros/xetex/generic/xetexko/xetexko-space.sty
-2021/05/20 | 93301 | macros/xetex/generic/xetexko/xetexko.sty
-2021/05/20 | 647 | macros/xetex/generic/xetexko/xetexko-vertical.sty
-2021/05/20 | 333842 | macros/xetex/generic/xetexko.zip
+2021/06/10 | 8116 | macros/xetex/generic/xetexko/ChangeLog
+2021/06/10 | 1812 | macros/xetex/generic/xetexko/hanjacom_hangul.tab
+2021/06/10 | 39492 | macros/xetex/generic/xetexko/hanjaexa_hangul.tab
+2021/06/10 | 125412 | macros/xetex/generic/xetexko/hanja_hangul.tab
+2021/06/10 | 3471 | macros/xetex/generic/xetexko/README
+2021/06/10 | 254038 | macros/xetex/generic/xetexko/xetexko-doc.pdf
+2021/06/10 | 35217 | macros/xetex/generic/xetexko/xetexko-doc.tex
+2021/06/10 | 639 | macros/xetex/generic/xetexko/xetexko-font.sty
+2021/06/10 | 668 | macros/xetex/generic/xetexko/xetexko-hanging.sty
+2021/06/10 | 639 | macros/xetex/generic/xetexko/xetexko-josa.sty
+2021/06/10 | 641 | macros/xetex/generic/xetexko/xetexko-space.sty
+2021/06/10 | 92911 | macros/xetex/generic/xetexko/xetexko.sty
+2021/06/10 | 647 | macros/xetex/generic/xetexko/xetexko-vertical.sty
+2021/06/10 | 334034 | macros/xetex/generic/xetexko.zip
2008/02/10 | 19110 | macros/xetex/generic/xevlna/License.txt
2017/03/25 | 1072 | macros/xetex/generic/xevlna/README
2017/03/25 | 7267 | macros/xetex/generic/xevlna/xevlna-inc.tex
@@ -266727,8 +266740,8 @@
2019/02/28 | 16432 | systems/texlive/tlnet/archive/biblatex-dw.r42649.tar.xz
2019/02/28 | 2284 | systems/texlive/tlnet/archive/biblatex-enc.doc.r44627.tar.xz
2019/02/28 | 8476 | systems/texlive/tlnet/archive/biblatex-enc.r44627.tar.xz
-2021/04/24 | 864040 | systems/texlive/tlnet/archive/biblatex-ext.doc.r58975.tar.xz
-2021/04/24 | 26848 | systems/texlive/tlnet/archive/biblatex-ext.r58975.tar.xz
+2021/06/10 | 866312 | systems/texlive/tlnet/archive/biblatex-ext.doc.r59532.tar.xz
+2021/06/10 | 27124 | systems/texlive/tlnet/archive/biblatex-ext.r59532.tar.xz
2019/02/28 | 595408 | systems/texlive/tlnet/archive/biblatex-fiwi.doc.r45876.tar.xz
2019/02/28 | 16768 | systems/texlive/tlnet/archive/biblatex-fiwi.r45876.tar.xz
2021/05/07 | 1616860 | systems/texlive/tlnet/archive/biblatex-gb7714-2015.doc.r59101.tar.xz
@@ -266757,8 +266770,8 @@
2019/02/28 | 5372 | systems/texlive/tlnet/archive/biblatex-luh-ipw.r32180.tar.xz
2020/01/08 | 143492 | systems/texlive/tlnet/archive/biblatex-manuscripts-philology.doc.r53344.tar.xz
2020/01/08 | 4644 | systems/texlive/tlnet/archive/biblatex-manuscripts-philology.r53344.tar.xz
-2019/02/28 | 1273944 | systems/texlive/tlnet/archive/biblatex-mla.doc.r42445.tar.xz
-2019/02/28 | 15540 | systems/texlive/tlnet/archive/biblatex-mla.r42445.tar.xz
+2021/06/10 | 291456 | systems/texlive/tlnet/archive/biblatex-mla.doc.r59529.tar.xz
+2021/06/10 | 18908 | systems/texlive/tlnet/archive/biblatex-mla.r59529.tar.xz
2019/02/28 | 134744 | systems/texlive/tlnet/archive/biblatex-morenames.doc.r43049.tar.xz
2019/02/28 | 2448 | systems/texlive/tlnet/archive/biblatex-morenames.r43049.tar.xz
2019/02/28 | 54860 | systems/texlive/tlnet/archive/biblatex-multiple-dm.doc.r37081.tar.xz
@@ -267772,9 +267785,9 @@
2021/05/20 | 6356 | systems/texlive/tlnet/archive/collection-latexextra.r59271.tar.xz
2020/12/03 | 696 | systems/texlive/tlnet/archive/collection-latex.r57048.tar.xz
2021/02/24 | 772 | systems/texlive/tlnet/archive/collection-latexrecommended.r57862.tar.xz
-2021/05/14 | 724 | systems/texlive/tlnet/archive/collection-luatex.r59184.tar.xz
+2021/06/10 | 736 | systems/texlive/tlnet/archive/collection-luatex.r59538.tar.xz
2021/05/18 | 1488 | systems/texlive/tlnet/archive/collection-mathscience.r59247.tar.xz
-2019/03/09 | 540 | systems/texlive/tlnet/archive/collection-metapost.r50293.tar.xz
+2021/06/10 | 548 | systems/texlive/tlnet/archive/collection-metapost.r59531.tar.xz
2021/02/24 | 476 | systems/texlive/tlnet/archive/collection-music.r57878.tar.xz
2021/05/08 | 1456 | systems/texlive/tlnet/archive/collection-pictures.r59115.tar.xz
2021/04/15 | 940 | systems/texlive/tlnet/archive/collection-plaingeneric.r58874.tar.xz
@@ -270839,8 +270852,8 @@
2019/02/28 | 24892 | systems/texlive/tlnet/archive/hustthesis.source.r42547.tar.xz
2021/06/02 | 150588 | systems/texlive/tlnet/archive/hvarabic.doc.r59423.tar.xz
2021/06/02 | 1468 | systems/texlive/tlnet/archive/hvarabic.r59423.tar.xz
-2021/06/08 | 7673684 | systems/texlive/tlnet/archive/hvfloat.doc.r59506.tar.xz
-2021/06/08 | 10484 | systems/texlive/tlnet/archive/hvfloat.r59506.tar.xz
+2021/06/10 | 7877664 | systems/texlive/tlnet/archive/hvfloat.doc.r59533.tar.xz
+2021/06/10 | 10540 | systems/texlive/tlnet/archive/hvfloat.r59533.tar.xz
2019/02/28 | 76336 | systems/texlive/tlnet/archive/hvindex.doc.r46051.tar.xz
2019/02/28 | 1672 | systems/texlive/tlnet/archive/hvindex.r46051.tar.xz
2021/05/19 | 105300 | systems/texlive/tlnet/archive/hvqrurl.doc.r59256.tar.xz
@@ -271232,13 +271245,13 @@
2019/02/28 | 340 | systems/texlive/tlnet/archive/jfmutil.amd64-freebsd.r44835.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/jfmutil.amd64-netbsd.r44835.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/jfmutil.armhf-linux.r44835.tar.xz
-2020/05/07 | 9584 | systems/texlive/tlnet/archive/jfmutil.doc.r55044.tar.xz
+2021/06/10 | 9632 | systems/texlive/tlnet/archive/jfmutil.doc.r59530.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/jfmutil.i386-cygwin.r44835.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/jfmutil.i386-freebsd.r44835.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/jfmutil.i386-linux.r44835.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/jfmutil.i386-netbsd.r44835.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/jfmutil.i386-solaris.r44835.tar.xz
-2020/05/07 | 25772 | systems/texlive/tlnet/archive/jfmutil.r55044.tar.xz
+2021/06/10 | 25768 | systems/texlive/tlnet/archive/jfmutil.r59530.tar.xz
2021/02/25 | 340 | systems/texlive/tlnet/archive/jfmutil.universal-darwin.r57908.tar.xz
2019/02/28 | 684 | systems/texlive/tlnet/archive/jfmutil.win32.r44835.tar.xz
2019/02/28 | 344 | systems/texlive/tlnet/archive/jfmutil.x86_64-cygwin.r44835.tar.xz
@@ -271781,13 +271794,13 @@
2019/02/28 | 340 | systems/texlive/tlnet/archive/latexmk.amd64-freebsd.r16472.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/latexmk.amd64-netbsd.r30191.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/latexmk.armhf-linux.r30015.tar.xz
-2021/05/19 | 479652 | systems/texlive/tlnet/archive/latexmk.doc.r59258.tar.xz
+2021/06/10 | 487068 | systems/texlive/tlnet/archive/latexmk.doc.r59535.tar.xz
2019/02/28 | 336 | systems/texlive/tlnet/archive/latexmk.i386-cygwin.r13717.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/latexmk.i386-freebsd.r16472.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/latexmk.i386-linux.r10937.tar.xz
2019/02/28 | 336 | systems/texlive/tlnet/archive/latexmk.i386-netbsd.r30191.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/latexmk.i386-solaris.r10937.tar.xz
-2021/05/19 | 93556 | systems/texlive/tlnet/archive/latexmk.r59258.tar.xz
+2021/06/10 | 94048 | systems/texlive/tlnet/archive/latexmk.r59535.tar.xz
2021/02/25 | 340 | systems/texlive/tlnet/archive/latexmk.universal-darwin.r57908.tar.xz
2019/02/28 | 684 | systems/texlive/tlnet/archive/latexmk.win32.r15404.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/latexmk.x86_64-cygwin.r33557.tar.xz
@@ -273034,6 +273047,16 @@
2019/02/28 | 43836 | systems/texlive/tlnet/archive/minifp.source.r32559.tar.xz
2021/06/08 | 91288 | systems/texlive/tlnet/archive/minimalist.doc.r59513.tar.xz
2021/06/08 | 6708 | systems/texlive/tlnet/archive/minimalist.r59513.tar.xz
+2021/06/10 | 265976 | systems/texlive/tlnet/archive/minim.doc.r59536.tar.xz
+2021/06/10 | 27364 | systems/texlive/tlnet/archive/minim-hatching.doc.r59531.tar.xz
+2021/06/10 | 2240 | systems/texlive/tlnet/archive/minim-hatching.r59531.tar.xz
+2021/06/10 | 93496 | systems/texlive/tlnet/archive/minim-math.doc.r59537.tar.xz
+2021/06/10 | 33168 | systems/texlive/tlnet/archive/minim-math.r59537.tar.xz
+2021/06/10 | 76608 | systems/texlive/tlnet/archive/minim-mp.doc.r59538.tar.xz
+2021/06/10 | 13608 | systems/texlive/tlnet/archive/minim-mp.r59538.tar.xz
+2021/06/10 | 103612 | systems/texlive/tlnet/archive/minim-pdf.doc.r59539.tar.xz
+2021/06/10 | 14280 | systems/texlive/tlnet/archive/minim-pdf.r59539.tar.xz
+2021/06/10 | 21692 | systems/texlive/tlnet/archive/minim.r59536.tar.xz
2019/02/28 | 72252 | systems/texlive/tlnet/archive/minipage-marginpar.doc.r15878.tar.xz
2019/02/28 | 1588 | systems/texlive/tlnet/archive/minipage-marginpar.r15878.tar.xz
2019/02/28 | 6140 | systems/texlive/tlnet/archive/minipage-marginpar.source.r15878.tar.xz
@@ -275836,9 +275859,9 @@
2019/02/28 | 250180 | systems/texlive/tlnet/archive/SIunits.doc.r15878.tar.xz
2019/02/28 | 6064 | systems/texlive/tlnet/archive/SIunits.r15878.tar.xz
2019/02/28 | 34544 | systems/texlive/tlnet/archive/SIunits.source.r15878.tar.xz
-2021/06/08 | 2417064 | systems/texlive/tlnet/archive/siunitx.doc.r59516.tar.xz
-2021/06/08 | 60948 | systems/texlive/tlnet/archive/siunitx.r59516.tar.xz
-2021/06/08 | 104720 | systems/texlive/tlnet/archive/siunitx.source.r59516.tar.xz
+2021/06/10 | 2417948 | systems/texlive/tlnet/archive/siunitx.doc.r59534.tar.xz
+2021/06/10 | 60956 | systems/texlive/tlnet/archive/siunitx.r59534.tar.xz
+2021/06/10 | 104820 | systems/texlive/tlnet/archive/siunitx.source.r59534.tar.xz
2019/02/28 | 200108 | systems/texlive/tlnet/archive/skak.doc.r46259.tar.xz
2019/02/28 | 316212 | systems/texlive/tlnet/archive/skaknew.doc.r20031.tar.xz
2019/02/28 | 160064 | systems/texlive/tlnet/archive/skaknew.r20031.tar.xz
@@ -276636,8 +276659,8 @@
2019/02/28 | 36596 | systems/texlive/tlnet/archive/tex-label.doc.r16372.tar.xz
2019/02/28 | 940 | systems/texlive/tlnet/archive/tex-label.r16372.tar.xz
2019/02/28 | 420 | systems/texlive/tlnet/archive/tex-label.source.r16372.tar.xz
-2021/05/05 | 577640 | systems/texlive/tlnet/archive/texlive-common.doc.r59073.tar.xz
-2021/05/05 | 348 | systems/texlive/tlnet/archive/texlive-common.r59073.tar.xz
+2021/06/10 | 577652 | systems/texlive/tlnet/archive/texlive-common.doc.r59528.tar.xz
+2021/06/10 | 344 | systems/texlive/tlnet/archive/texlive-common.r59528.tar.xz
2020/03/24 | 1197876 | systems/texlive/tlnet/archive/texlive-cz.doc.r54496.tar.xz
2020/03/24 | 280 | systems/texlive/tlnet/archive/texlive-cz.r54496.tar.xz
2021/03/23 | 1554012 | systems/texlive/tlnet/archive/texlive-de.doc.r58648.tar.xz
@@ -276697,7 +276720,7 @@
2020/05/17 | 592 | systems/texlive/tlnet/archive/texlive-scripts.amd64-freebsd.r55172.tar.xz
2020/05/17 | 588 | systems/texlive/tlnet/archive/texlive-scripts.amd64-netbsd.r55172.tar.xz
2020/05/17 | 592 | systems/texlive/tlnet/archive/texlive-scripts.armhf-linux.r55172.tar.xz
-2021/06/09 | 397504 | systems/texlive/tlnet/archive/texlive-scripts.doc.r59520.tar.xz
+2021/06/10 | 397492 | systems/texlive/tlnet/archive/texlive-scripts.doc.r59528.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
@@ -276721,7 +276744,7 @@
2020/05/17 | 588 | systems/texlive/tlnet/archive/texlive-scripts.i386-linux.r55172.tar.xz
2020/05/17 | 592 | systems/texlive/tlnet/archive/texlive-scripts.i386-netbsd.r55172.tar.xz
2020/05/17 | 588 | systems/texlive/tlnet/archive/texlive-scripts.i386-solaris.r55172.tar.xz
-2021/06/09 | 108008 | systems/texlive/tlnet/archive/texlive-scripts.r59520.tar.xz
+2021/06/10 | 108012 | systems/texlive/tlnet/archive/texlive-scripts.r59528.tar.xz
2021/02/25 | 572 | systems/texlive/tlnet/archive/texlive-scripts.universal-darwin.r57908.tar.xz
2021/04/12 | 36308 | systems/texlive/tlnet/archive/texlive-scripts.win32.r58829.tar.xz
2020/05/17 | 588 | systems/texlive/tlnet/archive/texlive-scripts.x86_64-cygwin.r55172.tar.xz
@@ -278423,16 +278446,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
2021/05/02 | 105152 | systems/texlive/tlnet/install-tl
-2021/06/09 | 6812835 | systems/texlive/tlnet/install-tl-unx.tar.gz
-2021/06/09 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
-2021/06/09 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2021/06/10 | 6812707 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2021/06/10 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2021/06/10 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
2021/04/11 | 4945 | systems/texlive/tlnet/install-tl-windows.bat
-2021/06/09 | 20808974 | systems/texlive/tlnet/install-tl-windows.exe
-2021/06/09 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
-2021/06/09 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2021/06/09 | 25584682 | systems/texlive/tlnet/install-tl.zip
-2021/06/09 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
-2021/06/09 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2021/06/10 | 20808988 | systems/texlive/tlnet/install-tl-windows.exe
+2021/06/10 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2021/06/10 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2021/06/10 | 25584682 | systems/texlive/tlnet/install-tl.zip
+2021/06/10 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2021/06/10 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
2021/04/01 | 1229 | systems/texlive/tlnet/README.md
2021/04/01 | 0 | systems/texlive/tlnet/TEXLIVE_2021
2021/03/15 | 6571 | systems/texlive/tlnet/tlpkg/gpg/pubring.gpg
@@ -278484,12 +278507,12 @@
2021/05/16 | 20371 | systems/texlive/tlnet/tlpkg/TeXLive/TLCrypto.pm
2021/05/16 | 5402 | systems/texlive/tlnet/tlpkg/TeXLive/TLDownload.pm
2021/05/16 | 27555 | systems/texlive/tlnet/tlpkg/TeXLive/TLPaper.pm
-2021/06/09 | 17271576 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
-2021/06/09 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2021/06/10 | 17279136 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2021/06/10 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
2021/05/16 | 86511 | systems/texlive/tlnet/tlpkg/TeXLive/TLPDB.pm
-2021/06/09 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
-2021/06/09 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2021/06/09 | 2310696 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2021/06/10 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2021/06/10 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2021/06/10 | 2311828 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
2021/05/16 | 58801 | systems/texlive/tlnet/tlpkg/TeXLive/TLPOBJ.pm
2021/05/16 | 42084 | systems/texlive/tlnet/tlpkg/TeXLive/TLPSRC.pm
2021/05/16 | 16103 | systems/texlive/tlnet/tlpkg/TeXLive/TLTREE.pm
@@ -282302,7 +282325,9 @@
2019/02/04 | 12871 | systems/win32/miktex/tm/packages/biblatex-lni.tar.lzma
2013/11/22 | 366384 | systems/win32/miktex/tm/packages/biblatex-luh-ipw.tar.lzma
2020/01/08 | 148457 | systems/win32/miktex/tm/packages/biblatex-manuscripts-philology.tar.lzma
-2016/11/09 | 1297841 | systems/win32/miktex/tm/packages/biblatex-mla.tar.lzma
+2021/06/10 | 277616 | systems/win32/miktex/tm/packages/biblatex-mla__doc.tar.lzma
+2021/06/10 | 15986 | systems/win32/miktex/tm/packages/biblatex-mla__source.tar.lzma
+2021/06/10 | 19084 | systems/win32/miktex/tm/packages/biblatex-mla.tar.lzma
2017/01/26 | 137488 | systems/win32/miktex/tm/packages/biblatex-morenames.tar.lzma
2015/05/25 | 56364 | systems/win32/miktex/tm/packages/biblatex-multiple-dm.tar.lzma
2011/09/20 | 429966 | systems/win32/miktex/tm/packages/biblatex-musuos.tar.lzma
@@ -282958,9 +282983,9 @@
2006/08/26 | 141965 | systems/win32/miktex/tm/packages/dyntree.tar.bz2
2021/01/28 | 325253 | systems/win32/miktex/tm/packages/ean13isbn.tar.lzma
2016/07/15 | 3965 | systems/win32/miktex/tm/packages/ean.tar.lzma
-2021/06/09 | 324143 | systems/win32/miktex/tm/packages/easybook__doc.tar.lzma
-2021/06/09 | 31964 | systems/win32/miktex/tm/packages/easybook__source.tar.lzma
-2021/06/09 | 14705 | systems/win32/miktex/tm/packages/easybook.tar.lzma
+2021/06/10 | 324049 | systems/win32/miktex/tm/packages/easybook__doc.tar.lzma
+2021/06/10 | 31955 | systems/win32/miktex/tm/packages/easybook__source.tar.lzma
+2021/06/10 | 14690 | systems/win32/miktex/tm/packages/easybook.tar.lzma
2018/03/31 | 183421 | systems/win32/miktex/tm/packages/easyfig.tar.lzma
2020/12/21 | 609763 | systems/win32/miktex/tm/packages/easyfloats.tar.lzma
2017/06/12 | 52618 | systems/win32/miktex/tm/packages/easyformat.tar.lzma
@@ -283244,7 +283269,7 @@
2020/10/03 | 318630 | systems/win32/miktex/tm/packages/filehook.tar.lzma
2012/12/04 | 924573 | systems/win32/miktex/tm/packages/fileinfo.tar.lzma
2011/09/21 | 281409 | systems/win32/miktex/tm/packages/filemod.tar.lzma
-2021/06/09 | 582716 | systems/win32/miktex/tm/packages/files.csv.lzma
+2021/06/10 | 582841 | systems/win32/miktex/tm/packages/files.csv.lzma
2001/05/14 | 5617 | systems/win32/miktex/tm/packages/finbib.tar.lzma
2015/10/20 | 44379 | systems/win32/miktex/tm/packages/findhyph.tar.lzma
2011/10/21 | 89323 | systems/win32/miktex/tm/packages/fink.tar.lzma
@@ -283619,9 +283644,9 @@
2016/07/28 | 127569 | systems/win32/miktex/tm/packages/huncial.tar.lzma
2016/11/28 | 817841 | systems/win32/miktex/tm/packages/hustthesis.tar.lzma
2021/06/03 | 152237 | systems/win32/miktex/tm/packages/hvarabic.tar.lzma
-2021/06/08 | 7316466 | systems/win32/miktex/tm/packages/hvfloat__doc.tar.lzma
+2021/06/10 | 7505202 | systems/win32/miktex/tm/packages/hvfloat__doc.tar.lzma
2021/06/08 | 86830 | systems/win32/miktex/tm/packages/hvfloat__source.tar.lzma
-2021/06/08 | 10650 | systems/win32/miktex/tm/packages/hvfloat.tar.lzma
+2021/06/10 | 10701 | systems/win32/miktex/tm/packages/hvfloat.tar.lzma
2017/12/14 | 78242 | systems/win32/miktex/tm/packages/hvindex.tar.lzma
2016/07/19 | 9825 | systems/win32/miktex/tm/packages/hvmath.tar.lzma
2021/05/20 | 106879 | systems/win32/miktex/tm/packages/hvqrurl.tar.lzma
@@ -283743,7 +283768,8 @@
2020/11/24 | 258850 | systems/win32/miktex/tm/packages/japanese-otf.tar.lzma
2016/07/20 | 37923 | systems/win32/miktex/tm/packages/jasthesis.tar.lzma
2010/04/13 | 1265307 | systems/win32/miktex/tm/packages/jeopardy.tar.lzma
-2020/05/07 | 34168 | systems/win32/miktex/tm/packages/jfmutil.tar.lzma
+2021/06/10 | 9992 | systems/win32/miktex/tm/packages/jfmutil__doc.tar.lzma
+2021/06/10 | 25983 | systems/win32/miktex/tm/packages/jfmutil.tar.lzma
2005/01/03 | 19184 | systems/win32/miktex/tm/packages/jhep.cab
2018/11/11 | 177839 | systems/win32/miktex/tm/packages/jigsaw.tar.lzma
2016/12/18 | 1562507 | systems/win32/miktex/tm/packages/jj-game.tar.lzma
@@ -284501,9 +284527,9 @@
2018/01/12 | 157226 | systems/win32/miktex/tm/packages/miktex-zip-bin-x64.tar.lzma
2021/06/06 | 38984 | systems/win32/miktex/tm/packages/miktex-zlib-bin-2.9.tar.lzma
2021/06/06 | 43369 | systems/win32/miktex/tm/packages/miktex-zlib-bin-x64-2.9.tar.lzma
-2021/06/09 | 217209 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
-2021/06/09 | 1288520 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
-2021/06/09 | 1201645 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
+2021/06/10 | 218093 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
+2021/06/10 | 1291070 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
+2021/06/10 | 1203772 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
2021/06/06 | 13457 | systems/win32/miktex/tm/packages/miktex-zzip-bin-2.9.tar.lzma
2021/06/06 | 14323 | systems/win32/miktex/tm/packages/miktex-zzip-bin-x64-2.9.tar.lzma
2016/07/15 | 35914 | systems/win32/miktex/tm/packages/mil3.tar.lzma
@@ -284517,6 +284543,21 @@
2021/06/08 | 86092 | systems/win32/miktex/tm/packages/minimalist__doc.tar.lzma
2021/06/08 | 6911 | systems/win32/miktex/tm/packages/minimalist__source.tar.lzma
2021/06/08 | 6881 | systems/win32/miktex/tm/packages/minimalist.tar.lzma
+2021/06/10 | 262138 | systems/win32/miktex/tm/packages/minim__doc.tar.lzma
+2021/06/10 | 26143 | systems/win32/miktex/tm/packages/minim-hatching__doc.tar.lzma
+2021/06/10 | 2392 | systems/win32/miktex/tm/packages/minim-hatching__source.tar.lzma
+2021/06/10 | 2456 | systems/win32/miktex/tm/packages/minim-hatching.tar.lzma
+2021/06/10 | 89813 | systems/win32/miktex/tm/packages/minim-math__doc.tar.lzma
+2021/06/10 | 5214 | systems/win32/miktex/tm/packages/minim-math__source.tar.lzma
+2021/06/10 | 33260 | systems/win32/miktex/tm/packages/minim-math.tar.lzma
+2021/06/10 | 71919 | systems/win32/miktex/tm/packages/minim-mp__doc.tar.lzma
+2021/06/10 | 6204 | systems/win32/miktex/tm/packages/minim-mp__source.tar.lzma
+2021/06/10 | 13879 | systems/win32/miktex/tm/packages/minim-mp.tar.lzma
+2021/06/10 | 97148 | systems/win32/miktex/tm/packages/minim-pdf__doc.tar.lzma
+2021/06/10 | 8044 | systems/win32/miktex/tm/packages/minim-pdf__source.tar.lzma
+2021/06/10 | 14504 | systems/win32/miktex/tm/packages/minim-pdf.tar.lzma
+2021/06/10 | 5530 | systems/win32/miktex/tm/packages/minim__source.tar.lzma
+2021/06/10 | 21931 | systems/win32/miktex/tm/packages/minim.tar.lzma
2020/05/06 | 414917 | systems/win32/miktex/tm/packages/minion2newtx.tar.lzma
2008/04/08 | 18099 | systems/win32/miktex/tm/packages/minipage-marginpar.tar.lzma
2010/03/16 | 175492 | systems/win32/miktex/tm/packages/miniplot.tar.lzma
@@ -284671,189 +284712,189 @@
2018/04/09 | 400132 | systems/win32/miktex/tm/packages/newunicodechar.tar.lzma
2011/09/19 | 101312 | systems/win32/miktex/tm/packages/newvbtm.tar.lzma
2021/03/17 | 232249 | systems/win32/miktex/tm/packages/newverbs.tar.lzma
-2021/06/09 | 583051 | systems/win32/miktex/tm/packages/next/files.csv.lzma
-2021/06/09 | 51089 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
-2021/06/09 | 56471 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
-2021/06/09 | 971288 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
-2021/06/09 | 1076119 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
-2021/06/09 | 29045 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
-2021/06/09 | 31328 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
-2021/06/09 | 29835 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
-2021/06/09 | 34652 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
-2021/06/09 | 50032 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
-2021/06/09 | 57634 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
-2021/06/09 | 83761 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
-2021/06/09 | 95453 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
-2021/06/09 | 67889 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
-2021/06/09 | 75965 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
-2021/06/09 | 27186 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
-2021/06/09 | 30808 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
-2021/06/09 | 330439 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
-2021/06/09 | 392699 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
-2021/06/09 | 32600 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
-2021/06/09 | 36606 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
-2021/06/09 | 51290 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
-2021/06/09 | 56814 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
-2021/06/09 | 239583 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
-2021/06/09 | 261912 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
-2021/06/09 | 180188 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
-2021/06/09 | 195754 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
-2021/06/09 | 52544 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
-2021/06/09 | 59144 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
-2021/06/09 | 21178 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
-2021/06/09 | 23369 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
-2021/06/09 | 461825 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
-2021/06/09 | 46495 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
-2021/06/09 | 51118 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
-2021/06/09 | 281967 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
-2021/06/09 | 321646 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
-2021/06/09 | 41190 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
-2021/06/09 | 45318 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
-2021/06/09 | 117479 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
-2021/06/09 | 131582 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
-2021/06/09 | 1294238 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
-2021/06/09 | 1423059 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
-2021/06/09 | 100463 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
-2021/06/09 | 112816 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
-2021/06/09 | 43061 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
-2021/06/09 | 48239 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
-2021/06/09 | 25009 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
-2021/06/09 | 28164 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
-2021/06/09 | 56341 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
-2021/06/09 | 62716 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
-2021/06/09 | 134798 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
-2021/06/09 | 152162 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
-2021/06/09 | 72927 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
-2021/06/09 | 77942 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
-2021/06/09 | 71710 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
-2021/06/09 | 80965 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
-2021/06/09 | 258840 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
-2021/06/09 | 295147 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
-2021/06/09 | 22025 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
-2021/06/09 | 24989 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
-2021/06/09 | 97491 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
-2021/06/09 | 112167 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
-2021/06/09 | 64404 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
-2021/06/09 | 73143 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
-2021/06/09 | 96475 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
-2021/06/09 | 115121 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
-2021/06/09 | 38172 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
-2021/06/09 | 42982 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
-2021/06/09 | 482839 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
-2021/06/09 | 565937 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
-2021/06/09 | 147408 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
-2021/06/09 | 159548 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
-2021/06/09 | 94773 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
-2021/06/09 | 108936 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
-2021/06/09 | 16342 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
-2021/06/09 | 17982 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
-2021/06/09 | 28288 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
-2021/06/09 | 30038 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
-2021/06/09 | 629826 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
-2021/06/09 | 680953 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
-2021/06/09 | 532268 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
-2021/06/09 | 596063 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
-2021/06/09 | 476903 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
-2021/06/09 | 512668 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
-2021/06/09 | 94384 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
-2021/06/09 | 103439 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
-2021/06/09 | 1708079 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
-2021/06/09 | 2005872 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
-2021/06/09 | 67611 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
-2021/06/09 | 74208 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
-2021/06/09 | 27267 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
-2021/06/09 | 31569 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
-2021/06/09 | 7716 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
-2021/06/09 | 8771 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
-2021/06/09 | 197090 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
-2021/06/09 | 215198 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
-2021/06/09 | 250394 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
-2021/06/09 | 284041 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
-2021/06/09 | 98268 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
-2021/06/09 | 103520 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
-2021/06/09 | 60618 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
-2021/06/09 | 67973 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
-2021/06/09 | 124616 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
-2021/06/09 | 136506 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
-2021/06/09 | 147714 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
-2021/06/09 | 163765 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
-2021/06/09 | 199641 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
-2021/06/09 | 180081 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
-2021/06/09 | 67374 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
-2021/06/09 | 76879 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
-2021/06/09 | 31208 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
-2021/06/09 | 35071 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
-2021/06/09 | 37867 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
-2021/06/09 | 42729 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
-2021/06/09 | 42889 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
-2021/06/09 | 46724 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
-2021/06/09 | 45941 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
-2021/06/09 | 52440 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
-2021/06/09 | 194079 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
-2021/06/09 | 206344 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
-2021/06/09 | 35700 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
-2021/06/09 | 40344 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
-2021/06/09 | 748788 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
-2021/06/09 | 816252 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
-2021/06/09 | 198226 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
-2021/06/09 | 202703 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
-2021/06/09 | 207853 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
-2021/06/09 | 243393 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
-2021/06/09 | 78752 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
-2021/06/09 | 87679 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
-2021/06/09 | 1170762 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
-2021/06/09 | 1300401 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
-2021/06/09 | 20125 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
-2021/06/09 | 23882 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
-2021/06/09 | 31548 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
-2021/06/09 | 37231 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
-2021/06/09 | 64034 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
-2021/06/09 | 72178 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
-2021/06/09 | 44613 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
-2021/06/09 | 51457 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
-2021/06/09 | 1308119 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
-2021/06/09 | 1429090 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
-2021/06/09 | 42375 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
-2021/06/09 | 51742 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
-2021/06/09 | 56291 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
-2021/06/09 | 59700 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
-2021/06/09 | 25268 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
-2021/06/09 | 27260 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
-2021/06/09 | 16448 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
-2021/06/09 | 18168 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
-2021/06/09 | 63751 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
-2021/06/09 | 69899 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
-2021/06/09 | 154626 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
-2021/06/09 | 169104 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
-2021/06/09 | 56755 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
-2021/06/09 | 65468 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
-2021/06/09 | 97981 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
-2021/06/09 | 106861 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
-2021/06/09 | 2670404 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
-2021/06/09 | 2793681 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
-2021/06/09 | 56314 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
-2021/06/09 | 62229 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
-2021/06/09 | 33602 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
-2021/06/09 | 37365 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
-2021/06/09 | 27711 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
-2021/06/09 | 33621 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
-2021/06/09 | 67263 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
-2021/06/09 | 70489 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
-2021/06/09 | 311357 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
-2021/06/09 | 345326 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
-2021/06/09 | 55525 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin.tar.lzma
-2021/06/09 | 57112 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin-x64.tar.lzma
-2021/06/09 | 586329 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
-2021/06/09 | 621335 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
-2021/06/09 | 39020 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
-2021/06/09 | 43358 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
-2021/06/09 | 217236 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
-2021/06/09 | 1290005 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
-2021/06/09 | 1201015 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
-2021/06/09 | 13448 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
-2021/06/09 | 14347 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
+2021/06/10 | 583264 | systems/win32/miktex/tm/packages/next/files.csv.lzma
+2021/06/10 | 51090 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
+2021/06/10 | 56472 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
+2021/06/10 | 971288 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
+2021/06/10 | 1076119 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
+2021/06/10 | 29048 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
+2021/06/10 | 31328 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
+2021/06/10 | 29835 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
+2021/06/10 | 34651 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
+2021/06/10 | 50032 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
+2021/06/10 | 57634 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
+2021/06/10 | 83762 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
+2021/06/10 | 95451 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
+2021/06/10 | 67887 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
+2021/06/10 | 75963 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
+2021/06/10 | 27187 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
+2021/06/10 | 30807 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
+2021/06/10 | 330438 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
+2021/06/10 | 392698 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
+2021/06/10 | 32599 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
+2021/06/10 | 36606 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
+2021/06/10 | 51291 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
+2021/06/10 | 56812 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
+2021/06/10 | 239581 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
+2021/06/10 | 261910 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
+2021/06/10 | 180189 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
+2021/06/10 | 195755 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
+2021/06/10 | 52544 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
+2021/06/10 | 59145 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
+2021/06/10 | 21179 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
+2021/06/10 | 23369 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
+2021/06/10 | 461825 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
+2021/06/10 | 46494 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
+2021/06/10 | 51118 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
+2021/06/10 | 281965 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
+2021/06/10 | 321645 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
+2021/06/10 | 41189 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
+2021/06/10 | 45317 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
+2021/06/10 | 117481 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
+2021/06/10 | 131581 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
+2021/06/10 | 1294239 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
+2021/06/10 | 1423060 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
+2021/06/10 | 100462 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
+2021/06/10 | 112815 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
+2021/06/10 | 43061 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
+2021/06/10 | 48240 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
+2021/06/10 | 25008 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
+2021/06/10 | 28164 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
+2021/06/10 | 56342 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
+2021/06/10 | 62717 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
+2021/06/10 | 134797 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
+2021/06/10 | 152167 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
+2021/06/10 | 72926 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
+2021/06/10 | 77942 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
+2021/06/10 | 71709 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
+2021/06/10 | 80966 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
+2021/06/10 | 258840 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
+2021/06/10 | 295147 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
+2021/06/10 | 22025 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
+2021/06/10 | 24987 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
+2021/06/10 | 97493 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
+2021/06/10 | 112168 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
+2021/06/10 | 64402 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
+2021/06/10 | 73144 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
+2021/06/10 | 96476 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
+2021/06/10 | 115121 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
+2021/06/10 | 38170 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
+2021/06/10 | 42981 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
+2021/06/10 | 482838 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
+2021/06/10 | 565939 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
+2021/06/10 | 147408 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
+2021/06/10 | 159548 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
+2021/06/10 | 94773 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
+2021/06/10 | 108937 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
+2021/06/10 | 16342 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
+2021/06/10 | 17983 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
+2021/06/10 | 28286 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
+2021/06/10 | 30037 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
+2021/06/10 | 629825 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
+2021/06/10 | 680955 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
+2021/06/10 | 532271 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
+2021/06/10 | 596059 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
+2021/06/10 | 476901 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
+2021/06/10 | 512668 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
+2021/06/10 | 94384 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
+2021/06/10 | 103439 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
+2021/06/10 | 1708081 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
+2021/06/10 | 2005874 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
+2021/06/10 | 67611 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
+2021/06/10 | 74210 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
+2021/06/10 | 27268 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
+2021/06/10 | 31571 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
+2021/06/10 | 7715 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
+2021/06/10 | 8772 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
+2021/06/10 | 197091 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
+2021/06/10 | 215199 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
+2021/06/10 | 250392 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
+2021/06/10 | 284041 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
+2021/06/10 | 98269 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
+2021/06/10 | 103519 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
+2021/06/10 | 60616 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
+2021/06/10 | 67974 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
+2021/06/10 | 124618 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
+2021/06/10 | 136506 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
+2021/06/10 | 147714 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
+2021/06/10 | 163765 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
+2021/06/10 | 199639 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
+2021/06/10 | 180078 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
+2021/06/10 | 67373 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
+2021/06/10 | 76880 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
+2021/06/10 | 31209 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
+2021/06/10 | 35071 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
+2021/06/10 | 37865 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
+2021/06/10 | 42729 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
+2021/06/10 | 42888 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
+2021/06/10 | 46724 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
+2021/06/10 | 45940 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
+2021/06/10 | 52441 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
+2021/06/10 | 194081 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
+2021/06/10 | 206345 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
+2021/06/10 | 35700 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
+2021/06/10 | 40343 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
+2021/06/10 | 748787 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
+2021/06/10 | 816251 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
+2021/06/10 | 198228 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
+2021/06/10 | 202704 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
+2021/06/10 | 207852 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
+2021/06/10 | 243393 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
+2021/06/10 | 78751 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
+2021/06/10 | 87679 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
+2021/06/10 | 1170761 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
+2021/06/10 | 1300403 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
+2021/06/10 | 20125 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
+2021/06/10 | 23883 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
+2021/06/10 | 31549 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
+2021/06/10 | 37230 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
+2021/06/10 | 64036 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
+2021/06/10 | 72178 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
+2021/06/10 | 44612 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
+2021/06/10 | 51458 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
+2021/06/10 | 1308120 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
+2021/06/10 | 1429094 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
+2021/06/10 | 42376 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
+2021/06/10 | 51742 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
+2021/06/10 | 56290 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
+2021/06/10 | 59700 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
+2021/06/10 | 25268 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
+2021/06/10 | 27260 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
+2021/06/10 | 16447 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
+2021/06/10 | 18169 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
+2021/06/10 | 63753 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
+2021/06/10 | 69899 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
+2021/06/10 | 154626 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
+2021/06/10 | 169103 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
+2021/06/10 | 56754 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
+2021/06/10 | 65468 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
+2021/06/10 | 97981 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
+2021/06/10 | 106859 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
+2021/06/10 | 2670403 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
+2021/06/10 | 2793680 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
+2021/06/10 | 56312 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
+2021/06/10 | 62229 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
+2021/06/10 | 33602 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
+2021/06/10 | 37365 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
+2021/06/10 | 27711 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
+2021/06/10 | 33623 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
+2021/06/10 | 67264 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
+2021/06/10 | 70487 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
+2021/06/10 | 311357 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
+2021/06/10 | 345324 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
+2021/06/10 | 55525 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin.tar.lzma
+2021/06/10 | 57113 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin-x64.tar.lzma
+2021/06/10 | 586329 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
+2021/06/10 | 621334 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
+2021/06/10 | 39019 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
+2021/06/10 | 43357 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
+2021/06/10 | 218110 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
+2021/06/10 | 1290563 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
+2021/06/10 | 1203560 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
+2021/06/10 | 13448 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
+2021/06/10 | 14346 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
2019/03/12 | 1412 | systems/win32/miktex/tm/packages/nextpage.tar.lzma
-2021/06/09 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini
+2021/06/10 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini
2018/07/06 | 145915 | systems/win32/miktex/tm/packages/nexus-otf.tar.lzma
2017/03/30 | 191149 | systems/win32/miktex/tm/packages/nfssext-cfr.tar.lzma
2012/12/20 | 612251 | systems/win32/miktex/tm/packages/nicefilelist.tar.lzma
@@ -285117,7 +285158,9 @@
2020/10/03 | 1154126 | systems/win32/miktex/tm/packages/pict2e.tar.lzma
2001/11/17 | 3952 | systems/win32/miktex/tm/packages/pictex2.tar.lzma
2008/08/16 | 40297 | systems/win32/miktex/tm/packages/pictex-autoarea.tar.lzma
-2016/07/18 | 52994 | systems/win32/miktex/tm/packages/pictex.tar.lzma
+2021/06/10 | 957561 | systems/win32/miktex/tm/packages/pictex__doc.tar.lzma
+2021/06/10 | 1245 | systems/win32/miktex/tm/packages/pictex__source.tar.lzma
+2021/06/10 | 41830 | systems/win32/miktex/tm/packages/pictex.tar.lzma
2020/04/24 | 311094 | systems/win32/miktex/tm/packages/picture.tar.lzma
2016/07/20 | 294326 | systems/win32/miktex/tm/packages/piechartmp.tar.lzma
2011/04/08 | 603802 | systems/win32/miktex/tm/packages/piff.tar.lzma
@@ -285201,7 +285244,7 @@
2020/10/20 | 342254 | systems/win32/miktex/tm/packages/preview.tar.lzma
2019/06/20 | 375963 | systems/win32/miktex/tm/packages/prftree.tar.lzma
2021/04/23 | 274028 | systems/win32/miktex/tm/packages/principia.tar.lzma
-2021/06/09 | 929 | systems/win32/miktex/tm/packages/pr.ini
+2021/06/10 | 945 | systems/win32/miktex/tm/packages/pr.ini
2010/09/27 | 248469 | systems/win32/miktex/tm/packages/printlen.tar.lzma
2008/06/17 | 77313 | systems/win32/miktex/tm/packages/proba.tar.lzma
2017/07/12 | 988486 | systems/win32/miktex/tm/packages/probsoln.tar.lzma
@@ -285647,9 +285690,9 @@
2008/07/22 | 360807 | systems/win32/miktex/tm/packages/sistyle.tar.lzma
2011/04/21 | 76017 | systems/win32/miktex/tm/packages/sitem.tar.lzma
2007/12/09 | 81490 | systems/win32/miktex/tm/packages/siunits.tar.lzma
-2021/06/08 | 2420468 | systems/win32/miktex/tm/packages/siunitx__doc.tar.lzma
-2021/06/08 | 104902 | systems/win32/miktex/tm/packages/siunitx__source.tar.lzma
-2021/06/08 | 60462 | systems/win32/miktex/tm/packages/siunitx.tar.lzma
+2021/06/10 | 2421343 | systems/win32/miktex/tm/packages/siunitx__doc.tar.lzma
+2021/06/10 | 105007 | systems/win32/miktex/tm/packages/siunitx__source.tar.lzma
+2021/06/10 | 60483 | systems/win32/miktex/tm/packages/siunitx.tar.lzma
2009/02/21 | 477338 | systems/win32/miktex/tm/packages/skaknew.tar.lzma
2018/02/08 | 221377 | systems/win32/miktex/tm/packages/skak.tar.lzma
2011/06/23 | 1471957 | systems/win32/miktex/tm/packages/skb.tar.lzma
@@ -286428,9 +286471,9 @@
2019/08/12 | 14654 | systems/win32/w32tex/00FILES.euc
2019/08/12 | 14654 | systems/win32/w32tex/00FILES.sjis
2021/06/03 | 5529800 | systems/win32/w32tex/aleph-w32.tar.xz
-2021/06/03 | 63889744 | systems/win32/w32tex/biblatex-biber.tar.xz
+2021/06/09 | 63893120 | systems/win32/w32tex/biblatex-biber.tar.xz
2016/12/13 | 65971452 | systems/win32/w32tex/cbfonts.tar.xz
-2021/06/08 | 842625 | systems/win32/w32tex/ChangeLog
+2021/06/09 | 843139 | systems/win32/w32tex/ChangeLog
2009/08/03 | 141221 | systems/win32/w32tex/ChangeLog.0
2009/08/03 | 221890 | systems/win32/w32tex/ChangeLog.1
2009/08/03 | 116462 | systems/win32/w32tex/ChangeLog.2
@@ -286438,12 +286481,12 @@
2017/06/24 | 644754 | systems/win32/w32tex/ChangeLog.4
2021/06/08 | 23556216 | systems/win32/w32tex/cjkzr.tar.xz
2013/04/27 | 15858676 | systems/win32/w32tex/context-doc.tar.xz
-2021/06/07 | 144872836 | systems/win32/w32tex/context.tar.xz
+2021/06/09 | 144849564 | systems/win32/w32tex/context.tar.xz
2021/06/07 | 914292 | systems/win32/w32tex/cweb-w32.tar.xz
2021/03/22 | 6433932 | systems/win32/w32tex/datetime2.tar.xz
2021/04/07 | 846020 | systems/win32/w32tex/dvi2ps-w32.tar.xz
2021/04/07 | 484144 | systems/win32/w32tex/dvi2tty-w32.tar.xz
-2021/06/08 | 4667076 | systems/win32/w32tex/dvipdfm-w32.tar.xz
+2021/06/09 | 4667188 | systems/win32/w32tex/dvipdfm-w32.tar.xz
2021/06/08 | 4551656 | systems/win32/w32tex/dvipsk-w32.tar.xz
2021/04/07 | 2652392 | systems/win32/w32tex/dvitools-w32.tar.xz
2021/06/02 | 1181300 | systems/win32/w32tex/extractpdfmark-w32.tar.xz
@@ -286454,7 +286497,7 @@
2021/06/06 | 39449224 | systems/win32/w32tex/latex.tar.xz
2021/04/07 | 1007424 | systems/win32/w32tex/lcdf-typetools-w32.tar.xz
2021/05/25 | 413638248 | systems/win32/w32tex/ltxpkgdocs.tar.xz
-2021/06/08 | 50080024 | systems/win32/w32tex/ltxpkgs.tar.xz
+2021/06/09 | 50086912 | systems/win32/w32tex/ltxpkgs.tar.xz
2021/05/12 | 3891892 | systems/win32/w32tex/luajittex-dev-w32.tar.xz
2021/05/12 | 3899756 | systems/win32/w32tex/luajittex-exp-w32.tar.xz
2021/05/12 | 3907764 | systems/win32/w32tex/luajittex-w32.tar.xz
@@ -286480,7 +286523,7 @@
2021/04/07 | 1170892 | systems/win32/w32tex/pstoedit-w32.tar.xz
2021/06/01 | 274304156 | systems/win32/w32tex/pstricks.tar.xz
2021/04/07 | 518092 | systems/win32/w32tex/psutils-w32.tar.xz
-2021/06/06 | 6802420 | systems/win32/w32tex/ptex-ng-w32.tar.xz
+2021/06/09 | 6801328 | systems/win32/w32tex/ptex-ng-w32.tar.xz
2021/06/06 | 10738988 | systems/win32/w32tex/ptex-w32.tar.xz
2019/04/15 | 499188 | systems/win32/w32tex/sam2p-w32.tar.xz
2021/03/23 | 87955068 | systems/win32/w32tex/t1fonts.tar.xz
@@ -286497,7 +286540,7 @@
2020/06/06 | 2168 | systems/win32/w32tex/TLTEXINFO/00README-TEXINFO.TL
2021/04/07 | 4291444 | systems/win32/w32tex/TLTEXINFO/tl-texinfo.zip
2021/01/03 | 2023 | systems/win32/w32tex/TLW64/00README.TLW64
-2021/06/05 | 99972424 | systems/win32/w32tex/TLW64/tl-win64.zip
+2021/06/09 | 99972346 | systems/win32/w32tex/TLW64/tl-win64.zip
2021/04/07 | 826840 | systems/win32/w32tex/ttf2pk-w32.tar.xz
2021/04/07 | 838272 | systems/win32/w32tex/ttf2pt1-w32.tar.xz
2017/10/13 | 1773368 | systems/win32/w32tex/tuftelatex.tar.xz
@@ -286510,14 +286553,14 @@
2013/04/08 | 13748 | systems/win32/w32tex/vf-n2bk.tar.xz
2021/03/24 | 53260516 | systems/win32/w32tex/w32tex-src.tar.xz
2021/06/08 | 131174548 | systems/win32/w32tex/web2c-lib.tar.xz
-2021/05/21 | 45553952 | systems/win32/w32tex/web2c-w32.tar.xz
+2021/06/09 | 45562216 | systems/win32/w32tex/web2c-w32.tar.xz
2021/05/08 | 811412 | systems/win32/w32tex/win64/aleph-w64.tar.xz
2020/08/20 | 22351540 | systems/win32/w32tex/win64/biblatex-biber-w64.tar.xz
2021/05/27 | 2235788 | systems/win32/w32tex/win64/context-w64.tar.xz
2021/06/07 | 442900 | systems/win32/w32tex/win64/cweb-w64.tar.xz
2021/04/07 | 758972 | systems/win32/w32tex/win64/dvi2ps-w64.tar.xz
2021/04/07 | 448472 | systems/win32/w32tex/win64/dvi2tty-w64.tar.xz
-2021/06/05 | 808368 | systems/win32/w32tex/win64/dvipdfm-w64.tar.xz
+2021/06/09 | 809360 | systems/win32/w32tex/win64/dvipdfm-w64.tar.xz
2021/04/11 | 760436 | systems/win32/w32tex/win64/dvipsk-w64.tar.xz
2021/04/07 | 2365232 | systems/win32/w32tex/win64/dvitools-w64.tar.xz
2021/06/02 | 1086052 | systems/win32/w32tex/win64/extractpdfmark-w64.tar.xz
@@ -286542,7 +286585,7 @@
2021/04/07 | 651552 | systems/win32/w32tex/win64/pmx-w64.tar.xz
2021/04/07 | 791152 | systems/win32/w32tex/win64/pstoedit-w64.tar.xz
2021/04/07 | 386496 | systems/win32/w32tex/win64/psutils-w64.tar.xz
-2021/06/05 | 1691140 | systems/win32/w32tex/win64/ptex-ng-w64.tar.xz
+2021/06/09 | 1690524 | systems/win32/w32tex/win64/ptex-ng-w64.tar.xz
2021/05/11 | 1873116 | systems/win32/w32tex/win64/ptex-w64.tar.xz
2021/01/03 | 329592 | systems/win32/w32tex/win64/sam2p-w64.tar.xz
2020/10/31 | 40588 | systems/win32/w32tex/win64/t1utils-w64.tar.xz
@@ -286553,8 +286596,8 @@
2020/01/18 | 42768 | systems/win32/w32tex/win64/txtutil-w64.tar.xz
2021/05/11 | 1806176 | systems/win32/w32tex/win64/uptex-w64.tar.xz
2021/05/11 | 3755940 | systems/win32/w32tex/win64/web2c-w64.tar.xz
-2021/06/05 | 11127216 | systems/win32/w32tex/win64/xetex-w64.tar.xz
-2021/06/06 | 49507620 | systems/win32/w32tex/xetex-w32.tar.xz
+2021/06/09 | 11127296 | systems/win32/w32tex/win64/xetex-w64.tar.xz
+2021/06/09 | 49496364 | systems/win32/w32tex/xetex-w32.tar.xz
2021/04/28 | 2934168 | systems/win32/w32tex/xindy-w32.tar.xz
2013/11/19 | 11356248 | systems/win32/w32tex/xymtex.tar.xz
2016/09/09 | 4334636 | systems/win32/w32tex/xypic.tar.xz
@@ -286651,7 +286694,7 @@
2004/06/04 | 404 | tds/tds.sed
2004/06/23 | 65418 | tds/tds.tex
2019/05/29 | 304264 | tds.zip
-2021/06/10 | 186 | timestamp
+2021/06/11 | 186 | timestamp
2002/08/26 | 61898 | usergrps/dante/antrag.pdf
2002/08/26 | 118217 | usergrps/dante/antrag.ps
2017/06/30 | 917 | usergrps/dante/dtk/doc/beispiel.bib
diff --git a/FILES.byname.gz b/FILES.byname.gz
index a8f4763bf8..2eb93f5d0e 100644
--- a/FILES.byname.gz
+++ b/FILES.byname.gz
Binary files differ
diff --git a/FILES.last07days b/FILES.last07days
index 5f4e654379..7a9c77c483 100644
--- a/FILES.last07days
+++ b/FILES.last07days
@@ -1,293 +1,409 @@
-2021/06/09 | 98268 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
+2021/06/10 | 9992 | systems/win32/miktex/tm/packages/jfmutil__doc.tar.lzma
+2021/06/10 | 98269 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
+2021/06/10 | 97981 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
+2021/06/10 | 97493 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
+2021/06/10 | 97148 | systems/win32/miktex/tm/packages/minim-pdf__doc.tar.lzma
+2021/06/10 | 971288 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
+2021/06/10 | 96476 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
+2021/06/10 | 9632 | systems/texlive/tlnet/archive/jfmutil.doc.r59530.tar.xz
+2021/06/10 | 957561 | systems/win32/miktex/tm/packages/pictex__doc.tar.lzma
+2021/06/10 | 95451 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
+2021/06/10 | 94773 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
+2021/06/10 | 945 | systems/win32/miktex/tm/packages/pr.ini
+2021/06/10 | 94384 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
+2021/06/10 | 94048 | systems/texlive/tlnet/archive/latexmk.r59535.tar.xz
+2021/06/10 | 93496 | systems/texlive/tlnet/archive/minim-math.doc.r59537.tar.xz
+2021/06/10 | 92911 | macros/xetex/generic/xetexko/xetexko.sty
+2021/06/10 | 89813 | systems/win32/miktex/tm/packages/minim-math__doc.tar.lzma
+2021/06/10 | 8820 | macros/luatex/generic/luatexko/ChangeLog
+2021/06/10 | 8772 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
+2021/06/10 | 87679 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
+2021/06/10 | 866312 | systems/texlive/tlnet/archive/biblatex-ext.doc.r59532.tar.xz
+2021/06/10 | 83762 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
+2021/06/10 | 816251 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
+2021/06/10 | 8116 | macros/xetex/generic/xetexko/ChangeLog
+2021/06/10 | 80966 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
+2021/06/10 | 804682 | macros/latex/contrib/cooking-units.zip
+2021/06/10 | 8044 | systems/win32/miktex/tm/packages/minim-pdf__source.tar.lzma
+2021/06/10 | 7877664 | systems/texlive/tlnet/archive/hvfloat.doc.r59533.tar.xz
+2021/06/10 | 78751 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
+2021/06/10 | 77942 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
+2021/06/10 | 7715 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
+2021/06/10 | 76880 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
+2021/06/10 | 76608 | systems/texlive/tlnet/archive/minim-mp.doc.r59538.tar.xz
+2021/06/10 | 75963 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
+2021/06/10 | 7505202 | systems/win32/miktex/tm/packages/hvfloat__doc.tar.lzma
+2021/06/10 | 748787 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
+2021/06/10 | 748443 | macros/latex/contrib/cooking-units/cooking-units.pdf
+2021/06/10 | 74210 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
+2021/06/10 | 736 | systems/texlive/tlnet/archive/collection-luatex.r59538.tar.xz
+2021/06/10 | 73144 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
+2021/06/10 | 72926 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
+2021/06/10 | 72178 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
+2021/06/10 | 71919 | systems/win32/miktex/tm/packages/minim-mp__doc.tar.lzma
+2021/06/10 | 71709 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
+2021/06/10 | 71374 | macros/luatex/generic/luatexko/luatexko.lua
+2021/06/10 | 70487 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
+2021/06/10 | 69899 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
+2021/06/10 | 689 | macros/latex/contrib/tiscreen/README
+2021/06/10 | 6812707 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2021/06/10 | 680955 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
+2021/06/10 | 67 | macros/latex/contrib/ffcode/DEPENDS.txt
+2021/06/10 | 67974 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
+2021/06/10 | 67887 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
+2021/06/10 | 67611 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
+2021/06/10 | 67373 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
+2021/06/10 | 67264 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
+2021/06/10 | 668 | macros/xetex/generic/xetexko/xetexko-hanging.sty
+2021/06/10 | 65468 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
+2021/06/10 | 647 | macros/xetex/generic/xetexko/xetexko-vertical.sty
+2021/06/10 | 64456 | macros/luatex/generic/minim-xmp.zip
+2021/06/10 | 6444 | macros/luatex/generic/luatexko/luatexko-normalize.lua
+2021/06/10 | 64402 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
+2021/06/10 | 641 | macros/xetex/generic/xetexko/xetexko-space.sty
+2021/06/10 | 64036 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
+2021/06/10 | 639 | macros/xetex/generic/xetexko/xetexko-josa.sty
+2021/06/10 | 639 | macros/xetex/generic/xetexko/xetexko-font.sty
+2021/06/10 | 63753 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
+2021/06/10 | 629825 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
+2021/06/10 | 62717 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
+2021/06/10 | 62229 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
+2021/06/10 | 621334 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
+2021/06/10 | 6204 | systems/win32/miktex/tm/packages/minim-mp__source.tar.lzma
+2021/06/10 | 60956 | systems/texlive/tlnet/archive/siunitx.r59534.tar.xz
+2021/06/10 | 60616 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
+2021/06/10 | 60483 | systems/win32/miktex/tm/packages/siunitx.tar.lzma
+2021/06/10 | 59700 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
+2021/06/10 | 596059 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
+2021/06/10 | 59145 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
+2021/06/10 | 586329 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
+2021/06/10 | 583264 | systems/win32/miktex/tm/packages/next/files.csv.lzma
+2021/06/10 | 582841 | systems/win32/miktex/tm/packages/files.csv.lzma
+2021/06/10 | 577652 | systems/texlive/tlnet/archive/texlive-common.doc.r59528.tar.xz
+2021/06/10 | 57634 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
+2021/06/10 | 57113 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin-x64.tar.lzma
+2021/06/10 | 56812 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
+2021/06/10 | 56754 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
+2021/06/10 | 565939 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
+2021/06/10 | 56472 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
+2021/06/10 | 56342 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
+2021/06/10 | 56312 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
+2021/06/10 | 56290 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
+2021/06/10 | 55525 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin.tar.lzma
+2021/06/10 | 5530 | systems/win32/miktex/tm/packages/minim__source.tar.lzma
+2021/06/10 | 548 | systems/texlive/tlnet/archive/collection-metapost.r59531.tar.xz
+2021/06/10 | 532271 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
+2021/06/10 | 52682 | graphics/pictex-addons/autoarea.zip
+2021/06/10 | 52544 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
+2021/06/10 | 52441 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
+2021/06/10 | 5214 | systems/win32/miktex/tm/packages/minim-math__source.tar.lzma
+2021/06/10 | 51742 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
+2021/06/10 | 51458 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
+2021/06/10 | 51291 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
+2021/06/10 | 512668 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
+2021/06/10 | 51118 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
+2021/06/10 | 51090 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
+2021/06/10 | 50032 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
+2021/06/10 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2021/06/10 | 487068 | systems/texlive/tlnet/archive/latexmk.doc.r59535.tar.xz
+2021/06/10 | 482838 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
+2021/06/10 | 48240 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
+2021/06/10 | 476901 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
+2021/06/10 | 4730 | macros/latex/contrib/semantex/stripsemantex.sty
+2021/06/10 | 46724 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
+2021/06/10 | 46494 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
+2021/06/10 | 461825 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
+2021/06/10 | 45940 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
+2021/06/10 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2021/06/10 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2021/06/10 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2021/06/10 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2021/06/10 | 45317 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
+2021/06/10 | 44612 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
+2021/06/10 | 43357 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
+2021/06/10 | 43061 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
+2021/06/10 | 430200 | macros/latex/contrib/semantex.zip
+2021/06/10 | 42981 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
+2021/06/10 | 42888 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
+2021/06/10 | 42729 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
+2021/06/10 | 42376 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
+2021/06/10 | 41830 | systems/win32/miktex/tm/packages/pictex.tar.lzma
+2021/06/10 | 41189 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
+2021/06/10 | 40343 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
+2021/06/10 | 397492 | systems/texlive/tlnet/archive/texlive-scripts.doc.r59528.tar.xz
+2021/06/10 | 39492 | macros/xetex/generic/xetexko/hanjaexa_hangul.tab
+2021/06/10 | 392698 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
+2021/06/10 | 39019 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
+2021/06/10 | 38170 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
+2021/06/10 | 37865 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
+2021/06/10 | 3783 | macros/luatex/generic/luatexko/luatexko-uhc2utf8.lua
+2021/06/10 | 375420 | macros/luatex/generic/luatexko.zip
+2021/06/10 | 37365 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
+2021/06/10 | 37230 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
+2021/06/10 | 3720 | macros/luatex/generic/luatexko/README
+2021/06/10 | 371132 | macros/latex/contrib/semantex/semantex.pdf
+2021/06/10 | 36606 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
+2021/06/10 | 35829 | macros/luatex/generic/luatexko/luatexko-doc.tex
+2021/06/10 | 35700 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
+2021/06/10 | 356904 | macros/latex/contrib/easybook.zip
+2021/06/10 | 35217 | macros/xetex/generic/xetexko/xetexko-doc.tex
+2021/06/10 | 35071 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
+2021/06/10 | 347913 | macros/latex/contrib/cooking-units/cooking-units.dtx
+2021/06/10 | 3471 | macros/xetex/generic/xetexko/README
+2021/06/10 | 34651 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
+2021/06/10 | 345324 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
+2021/06/10 | 344 | systems/texlive/tlnet/archive/texlive-common.r59528.tar.xz
+2021/06/10 | 338396 | macros/luatex/generic/luatexko/luatexko-doc.pdf
+2021/06/10 | 33623 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
+2021/06/10 | 33602 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
+2021/06/10 | 334034 | macros/xetex/generic/xetexko.zip
+2021/06/10 | 33260 | systems/win32/miktex/tm/packages/minim-math.tar.lzma
+2021/06/10 | 33168 | systems/texlive/tlnet/archive/minim-math.r59537.tar.xz
+2021/06/10 | 330438 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
+2021/06/10 | 32792 | macros/luatex/generic/luatexko/luatexko.sty
+2021/06/10 | 32599 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
+2021/06/10 | 324334 | macros/latex/contrib/easybook/easybook.pdf
+2021/06/10 | 324049 | systems/win32/miktex/tm/packages/easybook__doc.tar.lzma
+2021/06/10 | 321645 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
+2021/06/10 | 31955 | systems/win32/miktex/tm/packages/easybook__source.tar.lzma
+2021/06/10 | 31571 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
+2021/06/10 | 31549 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
+2021/06/10 | 31328 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
+2021/06/10 | 31209 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
+2021/06/10 | 311357 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
+2021/06/10 | 30807 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
+2021/06/10 | 300946 | macros/latex/contrib/semantex/semantex.sty
+2021/06/10 | 3008 | macros/latex/contrib/tiscreen/doc/tiscreen-doc.tex
+2021/06/10 | 30037 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
+2021/06/10 | 29835 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
+2021/06/10 | 295147 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
+2021/06/10 | 291456 | systems/texlive/tlnet/archive/biblatex-mla.doc.r59529.tar.xz
+2021/06/10 | 29048 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
+2021/06/10 | 284041 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
+2021/06/10 | 28286 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
+2021/06/10 | 281965 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
+2021/06/10 | 28164 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
+2021/06/10 | 2793680 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
+2021/06/10 | 277616 | systems/win32/miktex/tm/packages/biblatex-mla__doc.tar.lzma
+2021/06/10 | 27711 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
+2021/06/10 | 27364 | systems/texlive/tlnet/archive/minim-hatching.doc.r59531.tar.xz
+2021/06/10 | 2728 | macros/latex/contrib/ffcode/ffcode.tex
+2021/06/10 | 27268 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
+2021/06/10 | 27260 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
+2021/06/10 | 27187 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
+2021/06/10 | 27124 | systems/texlive/tlnet/archive/biblatex-ext.r59532.tar.xz
+2021/06/10 | 2670403 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
+2021/06/10 | 265976 | systems/texlive/tlnet/archive/minim.doc.r59536.tar.xz
+2021/06/10 | 262138 | systems/win32/miktex/tm/packages/minim__doc.tar.lzma
+2021/06/10 | 261910 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
+2021/06/10 | 26143 | systems/win32/miktex/tm/packages/minim-hatching__doc.tar.lzma
+2021/06/10 | 25983 | systems/win32/miktex/tm/packages/jfmutil.tar.lzma
+2021/06/10 | 258840 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
+2021/06/10 | 25768 | systems/texlive/tlnet/archive/jfmutil.r59530.tar.xz
+2021/06/10 | 25584682 | systems/texlive/tlnet/install-tl.zip
+2021/06/10 | 254038 | macros/xetex/generic/xetexko/xetexko-doc.pdf
+2021/06/10 | 25268 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
+2021/06/10 | 250392 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
+2021/06/10 | 25008 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
+2021/06/10 | 24987 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
+2021/06/10 | 2456 | systems/win32/miktex/tm/packages/minim-hatching.tar.lzma
+2021/06/10 | 243393 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
+2021/06/10 | 2421343 | systems/win32/miktex/tm/packages/siunitx__doc.tar.lzma
+2021/06/10 | 2417948 | systems/texlive/tlnet/archive/siunitx.doc.r59534.tar.xz
+2021/06/10 | 239581 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
+2021/06/10 | 2392 | systems/win32/miktex/tm/packages/minim-hatching__source.tar.lzma
+2021/06/10 | 23883 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
+2021/06/10 | 23369 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
+2021/06/10 | 2311828 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2021/06/10 | 2240 | systems/texlive/tlnet/archive/minim-hatching.r59531.tar.xz
+2021/06/10 | 22025 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
+2021/06/10 | 21931 | systems/win32/miktex/tm/packages/minim.tar.lzma
+2021/06/10 | 218110 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
+2021/06/10 | 218093 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
+2021/06/10 | 21692 | systems/texlive/tlnet/archive/minim.r59536.tar.xz
+2021/06/10 | 215199 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
+2021/06/10 | 21179 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
+2021/06/10 | 20808988 | systems/texlive/tlnet/install-tl-windows.exe
+2021/06/10 | 207852 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
+2021/06/10 | 206345 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
+2021/06/10 | 2037 | macros/latex/contrib/ffcode/ffcode.sty
+2021/06/10 | 202704 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
+2021/06/10 | 20125 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
+2021/06/10 | 2005874 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
+2021/06/10 | 199639 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
+2021/06/10 | 198228 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
+2021/06/10 | 197091 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
+2021/06/10 | 195755 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
+2021/06/10 | 194081 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
+2021/06/10 | 19084 | systems/win32/miktex/tm/packages/biblatex-mla.tar.lzma
+2021/06/10 | 18908 | systems/texlive/tlnet/archive/biblatex-mla.r59529.tar.xz
+2021/06/10 | 18169 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
+2021/06/10 | 1812 | macros/xetex/generic/xetexko/hanjacom_hangul.tab
+2021/06/10 | 180189 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
+2021/06/10 | 180078 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
+2021/06/10 | 17983 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
+2021/06/10 | 1781 | macros/latex/contrib/tiscreen/tex/tiscreen.sty
+2021/06/10 | 176702 | macros/latex/contrib/semantex/semantex.tex
+2021/06/10 | 17279136 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2021/06/10 | 1708081 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
+2021/06/10 | 169103 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
+2021/06/10 | 1660 | macros/latex/contrib/semantex/README.md
+2021/06/10 | 1655 | macros/latex/contrib/cooking-units/cooking-units.ins
+2021/06/10 | 16447 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
+2021/06/10 | 163765 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
+2021/06/10 | 16342 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
+2021/06/10 | 15986 | systems/win32/miktex/tm/packages/biblatex-mla__source.tar.lzma
+2021/06/10 | 159548 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
+2021/06/10 | 154626 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
+2021/06/10 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2021/06/10 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2021/06/10 | 152167 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
+2021/06/10 | 1482 | macros/latex/contrib/cooking-units/README.md
+2021/06/10 | 147714 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
+2021/06/10 | 147408 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
+2021/06/10 | 14690 | systems/win32/miktex/tm/packages/easybook.tar.lzma
+2021/06/10 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2021/06/10 | 14504 | systems/win32/miktex/tm/packages/minim-pdf.tar.lzma
+2021/06/10 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2021/06/10 | 14346 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
+2021/06/10 | 1429094 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
+2021/06/10 | 14280 | systems/texlive/tlnet/archive/minim-pdf.r59539.tar.xz
+2021/06/10 | 1423060 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
+2021/06/10 | 13879 | systems/win32/miktex/tm/packages/minim-mp.tar.lzma
+2021/06/10 | 136506 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
+2021/06/10 | 13608 | systems/texlive/tlnet/archive/minim-mp.r59538.tar.xz
+2021/06/10 | 134797 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
+2021/06/10 | 13448 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
+2021/06/10 | 131581 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
+2021/06/10 | 130951 | macros/latex/contrib/easybook/easybook.dtx
+2021/06/10 | 1308120 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
+2021/06/10 | 1300403 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
+2021/06/10 | 1294239 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
+2021/06/10 | 1291070 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
+2021/06/10 | 1290563 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
+2021/06/10 | 127291 | macros/latex/contrib/tiscreen.zip
+2021/06/10 | 125412 | macros/xetex/generic/xetexko/hanja_hangul.tab
+2021/06/10 | 125338 | macros/latex/contrib/tiscreen/doc/tiscreen-doc.pdf
+2021/06/10 | 124618 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
+2021/06/10 | 1245 | systems/win32/miktex/tm/packages/pictex__source.tar.lzma
+2021/06/10 | 1203772 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
+2021/06/10 | 1203560 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
+2021/06/10 | 117481 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
+2021/06/10 | 1170761 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
+2021/06/10 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini
+2021/06/10 | 115121 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
+2021/06/10 | 1150 | macros/latex/contrib/ffcode/README.md
+2021/06/10 | 1136553 | graphics/pictex.zip
+2021/06/10 | 112815 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
+2021/06/10 | 112168 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
+2021/06/10 | 110754 | macros/latex/contrib/ffcode.zip
+2021/06/10 | 108937 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
+2021/06/10 | 108012 | systems/texlive/tlnet/archive/texlive-scripts.r59528.tar.xz
+2021/06/10 | 1076119 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
+2021/06/10 | 107272 | macros/latex/contrib/ffcode/ffcode.pdf
+2021/06/10 | 10701 | systems/win32/miktex/tm/packages/hvfloat.tar.lzma
+2021/06/10 | 106859 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
+2021/06/10 | 10540 | systems/texlive/tlnet/archive/hvfloat.r59533.tar.xz
+2021/06/10 | 105007 | systems/win32/miktex/tm/packages/siunitx__source.tar.lzma
+2021/06/10 | 104820 | systems/texlive/tlnet/archive/siunitx.source.r59534.tar.xz
+2021/06/10 | 103612 | systems/texlive/tlnet/archive/minim-pdf.doc.r59539.tar.xz
+2021/06/10 | 103519 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
+2021/06/10 | 103439 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
+2021/06/10 | 100462 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
+2021/06/09 | 99972346 | systems/win32/w32tex/TLW64/tl-win64.zip
2021/06/09 | 98075 | macros/luatex/generic/minim-mp.zip
-2021/06/09 | 97981 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
2021/06/09 | 97866 | macros/latex/contrib/siunitx/siunitx-unit.dtx
-2021/06/09 | 97491 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
-2021/06/09 | 971288 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
2021/06/09 | 964 | macros/latex/contrib/siunitx/README.md
-2021/06/09 | 96475 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
-2021/06/09 | 95453 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
-2021/06/09 | 94773 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
-2021/06/09 | 94384 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
2021/06/09 | 94160 | systems/win32/miktex/tm/packages/latexmk.tar.lzma
-2021/06/09 | 929 | systems/win32/miktex/tm/packages/pr.ini
-2021/06/09 | 8771 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
-2021/06/09 | 87679 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
2021/06/09 | 8762 | macros/latex/contrib/siunitx/siunitx-command.dtx
2021/06/09 | 8726 | macros/latex/contrib/siunitx/siunitx-symbol.dtx
-2021/06/09 | 83761 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
+2021/06/09 | 843139 | systems/win32/w32tex/ChangeLog
2021/06/09 | 833160 | systems/win32/miktex/tm/packages/biblatex-ext__doc.tar.lzma
2021/06/09 | 82287 | macros/luatex/generic/minim-mp/minim-mp.pdf
-2021/06/09 | 816252 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
-2021/06/09 | 80965 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
-2021/06/09 | 78752 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
-2021/06/09 | 77942 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
-2021/06/09 | 7716 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
+2021/06/09 | 809360 | systems/win32/w32tex/win64/dvipdfm-w64.tar.xz
2021/06/09 | 771076 | systems/texlive/tlnet/archive/csvsimple.doc.r59521.tar.xz
2021/06/09 | 770846 | systems/win32/miktex/tm/packages/csvsimple__doc.tar.lzma
2021/06/09 | 769585 | macros/generic/wichura-table.zip
-2021/06/09 | 76879 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
-2021/06/09 | 75965 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
-2021/06/09 | 748788 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
-2021/06/09 | 74208 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
-2021/06/09 | 73143 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
-2021/06/09 | 72927 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
-2021/06/09 | 72178 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
-2021/06/09 | 71710 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
2021/06/09 | 7114454 | macros/latex/contrib/hvfloat/doc/hvfloat.pdf
2021/06/09 | 7075 | systems/win32/miktex/tm/packages/keyfloat.tar.lzma
-2021/06/09 | 70489 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
-2021/06/09 | 69899 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
2021/06/09 | 6820 | systems/texlive/tlnet/archive/keyfloat.r59523.tar.xz
-2021/06/09 | 6812835 | systems/texlive/tlnet/install-tl-unx.tar.gz
-2021/06/09 | 680953 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
-2021/06/09 | 67973 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
-2021/06/09 | 67889 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
-2021/06/09 | 67611 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
-2021/06/09 | 67374 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
-2021/06/09 | 67263 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
-2021/06/09 | 65468 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
-2021/06/09 | 64404 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
-2021/06/09 | 64034 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
+2021/06/09 | 6801328 | systems/win32/w32tex/ptex-ng-w32.tar.xz
+2021/06/09 | 63893120 | systems/win32/w32tex/biblatex-biber.tar.xz
2021/06/09 | 6380 | macros/luatex/generic/minim/minim-callbacks.lua
-2021/06/09 | 63751 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
2021/06/09 | 6370 | systems/win32/miktex/tm/packages/xintsession.tar.lzma
2021/06/09 | 634773 | macros/latex/contrib/siunitx/siunitx.pdf
2021/06/09 | 6312 | macros/luatex/generic/minim/minim-doc.sty
-2021/06/09 | 629826 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
-2021/06/09 | 62716 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
-2021/06/09 | 62229 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
-2021/06/09 | 621335 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
2021/06/09 | 62127 | graphics/minim-hatching/minim-hatching-doc.pdf
+2021/06/09 | 61507 | macros/luatex/generic/minim-xmp/minim-xmp.pdf
2021/06/09 | 6124 | systems/texlive/tlnet/archive/xintsession.r59524.tar.xz
2021/06/09 | 61005 | macros/latex/contrib/hvfloat/latex/hvfloat.sty
-2021/06/09 | 60618 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
-2021/06/09 | 59700 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
-2021/06/09 | 596063 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
-2021/06/09 | 59144 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
-2021/06/09 | 586329 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
-2021/06/09 | 583051 | systems/win32/miktex/tm/packages/next/files.csv.lzma
2021/06/09 | 5828 | systems/win32/miktex/tm/packages/csvsimple.tar.lzma
-2021/06/09 | 582716 | systems/win32/miktex/tm/packages/files.csv.lzma
-2021/06/09 | 57634 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
-2021/06/09 | 57112 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin-x64.tar.lzma
-2021/06/09 | 56814 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
-2021/06/09 | 56755 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
-2021/06/09 | 565937 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
-2021/06/09 | 56471 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
-2021/06/09 | 56341 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
-2021/06/09 | 56314 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
-2021/06/09 | 56291 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
2021/06/09 | 5576 | systems/texlive/tlnet/archive/csvsimple.r59521.tar.xz
-2021/06/09 | 55525 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin.tar.lzma
-2021/06/09 | 532268 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
-2021/06/09 | 52544 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
-2021/06/09 | 52440 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
-2021/06/09 | 51742 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
-2021/06/09 | 51457 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
-2021/06/09 | 51290 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
-2021/06/09 | 512668 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
-2021/06/09 | 51118 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
-2021/06/09 | 51089 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
-2021/06/09 | 50032 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
-2021/06/09 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2021/06/09 | 50086912 | systems/win32/w32tex/ltxpkgs.tar.xz
+2021/06/09 | 49496364 | systems/win32/w32tex/xetex-w32.tar.xz
2021/06/09 | 48536 | macros/latex/contrib/siunitx/siunitx-table.dtx
-2021/06/09 | 482839 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
-2021/06/09 | 48239 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
-2021/06/09 | 476903 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
2021/06/09 | 475888 | macros/latex/contrib/siunitx/siunitx-table.pdf
2021/06/09 | 4748 | macros/latex/contrib/siunitx/siunitx-abbreviations.cfg
2021/06/09 | 471 | macros/generic/wichura-table/README.txt
-2021/06/09 | 46724 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
-2021/06/09 | 46495 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
+2021/06/09 | 4667188 | systems/win32/w32tex/dvipdfm-w32.tar.xz
2021/06/09 | 4629 | macros/latex/contrib/siunitx/siunitx-locale.dtx
-2021/06/09 | 461825 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
-2021/06/09 | 45941 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
-2021/06/09 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2021/06/09 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
-2021/06/09 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2021/06/09 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
-2021/06/09 | 45318 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
-2021/06/09 | 44613 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
-2021/06/09 | 43358 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
-2021/06/09 | 43061 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
-2021/06/09 | 42982 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
-2021/06/09 | 42889 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
-2021/06/09 | 42729 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
+2021/06/09 | 45562216 | systems/win32/w32tex/web2c-w32.tar.xz
2021/06/09 | 4241 | graphics/minim-hatching/minim-hatching-doc.mp
-2021/06/09 | 42375 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
2021/06/09 | 42090 | macros/latex/contrib/siunitx/CHANGELOG.md
-2021/06/09 | 41190 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
-2021/06/09 | 40344 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
-2021/06/09 | 397504 | systems/texlive/tlnet/archive/texlive-scripts.doc.r59520.tar.xz
2021/06/09 | 39616 | macros/luatex/generic/minim-pdf/minim-pdf.lua
-2021/06/09 | 392699 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
-2021/06/09 | 39020 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
2021/06/09 | 38955 | fonts/utilities/jfmutil.zip
2021/06/09 | 38711 | systems/win32/miktex/tm/packages/biblatex-ext__source.tar.lzma
2021/06/09 | 385 | macros/luatex/generic/minim-mp/minim-mp.ini
-2021/06/09 | 38172 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
2021/06/09 | 379 | macros/luatex/generic/minim/minim.ini
-2021/06/09 | 37867 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
-2021/06/09 | 37365 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
-2021/06/09 | 37231 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
2021/06/09 | 3687 | macros/latex/contrib/siunitx/siunitx.ins
-2021/06/09 | 36606 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
2021/06/09 | 35935 | graphics/minim-hatching.zip
2021/06/09 | 35840 | systems/win32/miktex/tm/packages/keyfloat__source.tar.lzma
-2021/06/09 | 35700 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
-2021/06/09 | 356748 | macros/latex/contrib/easybook.zip
-2021/06/09 | 35071 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
-2021/06/09 | 34652 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
-2021/06/09 | 345326 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
-2021/06/09 | 33621 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
-2021/06/09 | 33602 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
2021/06/09 | 33332 | macros/latex/contrib/siunitx/siunitx-compound.dtx
2021/06/09 | 332308 | systems/texlive/tlnet/archive/dvipdfmx.win32.r59526.tar.xz
2021/06/09 | 331146 | macros/latex/contrib/biblatex-contrib/biblatex-mla.zip
-2021/06/09 | 330439 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
-2021/06/09 | 32600 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
-2021/06/09 | 324143 | systems/win32/miktex/tm/packages/easybook__doc.tar.lzma
-2021/06/09 | 324143 | macros/latex/contrib/easybook/easybook.pdf
2021/06/09 | 323036 | systems/texlive/tlnet/archive/easybook.doc.r59522.tar.xz
-2021/06/09 | 321646 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
-2021/06/09 | 31964 | systems/win32/miktex/tm/packages/easybook__source.tar.lzma
2021/06/09 | 31738 | macros/latex/contrib/siunitx/siunitx-version-1.cfg
2021/06/09 | 31576 | systems/texlive/tlnet/archive/easybook.source.r59522.tar.xz
-2021/06/09 | 31569 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
-2021/06/09 | 31548 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
-2021/06/09 | 31328 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
-2021/06/09 | 31208 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
-2021/06/09 | 311357 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
-2021/06/09 | 30808 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
2021/06/09 | 30792 | macros/latex/contrib/siunitx/siunitx-print.dtx
-2021/06/09 | 30038 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
-2021/06/09 | 29835 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
2021/06/09 | 29819 | macros/latex/contrib/siunitx/siunitx-emulation.dtx
2021/06/09 | 297431 | macros/luatex/generic/minim.zip
-2021/06/09 | 295147 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
-2021/06/09 | 29045 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
2021/06/09 | 2883 | macros/latex/contrib/siunitx/siunitx-binary.dtx
2021/06/09 | 285949 | macros/luatex/generic/minim/minim.pdf
2021/06/09 | 2853 | systems/win32/miktex/tm/packages/xintsession__doc.tar.lzma
-2021/06/09 | 284041 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
-2021/06/09 | 28288 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
-2021/06/09 | 281967 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
2021/06/09 | 28188 | systems/texlive/tlnet/archive/keyfloat.source.r59523.tar.xz
-2021/06/09 | 28164 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
2021/06/09 | 279382 | systems/win32/miktex/tm/packages/latexmk__doc.tar.lzma
-2021/06/09 | 2793681 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
-2021/06/09 | 27711 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
2021/06/09 | 273398 | macros/latex/contrib/siunitx/siunitx-v2.sty
-2021/06/09 | 27267 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
-2021/06/09 | 27260 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
-2021/06/09 | 27186 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
2021/06/09 | 2714917 | install/macros/latex/contrib/siunitx.tds.zip
2021/06/09 | 27133 | systems/win32/miktex/tm/packages/biblatex-ext.tar.lzma
2021/06/09 | 2676999 | macros/latex/contrib/siunitx.zip
-2021/06/09 | 2670404 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
2021/06/09 | 2652 | macros/latex/contrib/hvfloat/Changes
-2021/06/09 | 261912 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
-2021/06/09 | 258840 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
2021/06/09 | 25717 | macros/latex/contrib/siunitx/siunitx-complex.dtx
-2021/06/09 | 25584682 | systems/texlive/tlnet/install-tl.zip
-2021/06/09 | 25268 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
-2021/06/09 | 250394 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
-2021/06/09 | 25009 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
-2021/06/09 | 24989 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
2021/06/09 | 245795 | macros/latex/contrib/hvfloat/doc/examples/odd2s1c.pdf
-2021/06/09 | 243393 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
2021/06/09 | 2426 | macros/latex/contrib/siunitx/siunitx-code.tex
-2021/06/09 | 239583 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
-2021/06/09 | 23882 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
-2021/06/09 | 23369 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
-2021/06/09 | 2310696 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
2021/06/09 | 2244 | systems/texlive/tlnet/archive/xintsession.doc.r59524.tar.xz
-2021/06/09 | 22025 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
-2021/06/09 | 217236 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
-2021/06/09 | 217209 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
-2021/06/09 | 215198 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
-2021/06/09 | 21178 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
-2021/06/09 | 20808974 | systems/texlive/tlnet/install-tl-windows.exe
-2021/06/09 | 207853 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
-2021/06/09 | 206344 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
-2021/06/09 | 202703 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
-2021/06/09 | 20125 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
-2021/06/09 | 2005872 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
-2021/06/09 | 199641 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
-2021/06/09 | 198226 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
-2021/06/09 | 197090 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
-2021/06/09 | 195754 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
2021/06/09 | 19542 | macros/latex/contrib/siunitx/siunitx.dtx
-2021/06/09 | 194079 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
-2021/06/09 | 18168 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
-2021/06/09 | 180188 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
-2021/06/09 | 180081 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
-2021/06/09 | 17982 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
2021/06/09 | 1729 | macros/latex/contrib/siunitx/siunitx-binary.cfg
-2021/06/09 | 17271576 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
-2021/06/09 | 1708079 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
-2021/06/09 | 169104 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
+2021/06/09 | 1690524 | systems/win32/w32tex/win64/ptex-ng-w64.tar.xz
2021/06/09 | 16529 | macros/latex/contrib/siunitx/siunitx-angle.dtx
-2021/06/09 | 16448 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
-2021/06/09 | 163765 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
-2021/06/09 | 16342 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
-2021/06/09 | 159548 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
-2021/06/09 | 154626 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
-2021/06/09 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
-2021/06/09 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
2021/06/09 | 152851 | macros/luatex/generic/minim-math.zip
-2021/06/09 | 152162 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
2021/06/09 | 1486326 | macros/latex/contrib/siunitx/siunitx-code.pdf
2021/06/09 | 14802216 | macros/latex/contrib/hvfloat.zip
-2021/06/09 | 147714 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
-2021/06/09 | 147408 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
-2021/06/09 | 14705 | systems/win32/miktex/tm/packages/easybook.tar.lzma
2021/06/09 | 14661 | systems/win32/miktex/tm/packages/latexmk__source.tar.lzma
-2021/06/09 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
2021/06/09 | 145224 | macros/latex/contrib/siunitx/siunitx.tex
-2021/06/09 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2021/06/09 | 144849564 | systems/win32/w32tex/context.tar.xz
2021/06/09 | 14444 | systems/texlive/tlnet/archive/easybook.r59522.tar.xz
2021/06/09 | 14351 | macros/latex/contrib/siunitx/siunitx-quantity.dtx
-2021/06/09 | 14347 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
-2021/06/09 | 1429090 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
-2021/06/09 | 1423059 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
-2021/06/09 | 136506 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
-2021/06/09 | 134798 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
-2021/06/09 | 13448 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
-2021/06/09 | 131582 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
-2021/06/09 | 131006 | macros/latex/contrib/easybook/easybook.dtx
-2021/06/09 | 1308119 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
-2021/06/09 | 1300401 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
-2021/06/09 | 1294238 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
-2021/06/09 | 1290005 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
-2021/06/09 | 1288520 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
2021/06/09 | 12818 | macros/luatex/generic/minim-pdf/minim-pdf.tex
2021/06/09 | 125669 | macros/luatex/generic/minim-pdf.zip
-2021/06/09 | 124616 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
-2021/06/09 | 1245432 | graphics/pictex.zip
-2021/06/09 | 1201645 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
-2021/06/09 | 1201015 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
-2021/06/09 | 117479 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
-2021/06/09 | 1170762 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
+2021/06/09 | 122808273 | macros/context/latest/cont-tmf.zip
2021/06/09 | 115561 | macros/latex/contrib/siunitx/siunitx-number.dtx
-2021/06/09 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini
-2021/06/09 | 115121 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
-2021/06/09 | 112816 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
-2021/06/09 | 112167 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
+2021/06/09 | 11127296 | systems/win32/w32tex/win64/xetex-w64.tar.xz
2021/06/09 | 1091 | fonts/utilities/jfmutil/LICENSE
-2021/06/09 | 108936 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
2021/06/09 | 108362 | macros/luatex/generic/minim-pdf/minim-pdf.pdf
-2021/06/09 | 108008 | systems/texlive/tlnet/archive/texlive-scripts.r59520.tar.xz
-2021/06/09 | 1076119 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
2021/06/09 | 106915 | macros/luatex/generic/minim-math/minim-math.pdf
-2021/06/09 | 106861 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
-2021/06/09 | 103520 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
-2021/06/09 | 103439 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
2021/06/09 | 1011581 | systems/win32/miktex/tm/packages/keyfloat__doc.tar.lzma
2021/06/09 | 10106 | macros/latex/contrib/siunitx/siunitx-abbreviation.dtx
2021/06/09 | 1008152 | systems/texlive/tlnet/archive/keyfloat.doc.r59523.tar.xz
-2021/06/09 | 100463 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
2021/06/08 | 9923235 | systems/win32/miktex/tm/packages/bjfuthesis__doc.tar.lzma
2021/06/08 | 9903148 | systems/texlive/tlnet/archive/bjfuthesis.doc.r59505.tar.xz
2021/06/08 | 958085 | macros/latex/contrib/biblatex-contrib/biblatex-ext.zip
@@ -309,12 +425,12 @@
2021/06/08 | 86830 | systems/win32/miktex/tm/packages/hvfloat__source.tar.lzma
2021/06/08 | 86092 | systems/win32/miktex/tm/packages/minimalist__doc.tar.lzma
2021/06/08 | 8428 | macros/latex/contrib/biblatex-contrib/biblatex-mla/spanish-mla.lbx
-2021/06/08 | 842625 | systems/win32/w32tex/ChangeLog
2021/06/08 | 83944 | systems/texlive/tlnet/archive/pythontex.source.r59514.tar.xz
2021/06/08 | 835302 | macros/latex/contrib/biblatex-contrib/biblatex-ext/biblatex-ext.pdf
2021/06/08 | 83288 | systems/texlive/tlnet/archive/luatexja.source.r59518.tar.xz
2021/06/08 | 832329 | macros/latex/contrib/csvsimple/csvsimple.pdf
2021/06/08 | 8316 | macros/latex/contrib/biblatex-contrib/biblatex-ext/ext-authoryear-comp.cbx
+2021/06/08 | 807 | macros/luatex/generic/minim-xmp/README
2021/06/08 | 8058 | macros/plain/contrib/xintsession.zip
2021/06/08 | 803 | macros/latex/contrib/biblatex-contrib/biblatex-mla/american-mla.lbx
2021/06/08 | 80379 | macros/latex/contrib/biblatex-contrib/biblatex-mla/doc/examples.bib
@@ -323,13 +439,12 @@
2021/06/08 | 793466 | macros/latex/contrib/csvsimple.zip
2021/06/08 | 792902 | install/macros/latex/contrib/csvsimple.tds.zip
2021/06/08 | 78715 | systems/win32/miktex/tm/packages/bangla__doc.tar.lzma
-2021/06/08 | 7673684 | systems/texlive/tlnet/archive/hvfloat.doc.r59506.tar.xz
2021/06/08 | 764 | macros/luatex/generic/minim/minim-hooks.lua
2021/06/08 | 76213 | macros/latex/contrib/csvsimple/csvsimple.tex
2021/06/08 | 76028 | systems/win32/miktex/tm/packages/pythontex.tar.lzma
2021/06/08 | 75627 | macros/latex/contrib/csvsimple/csvsimple-example.pdf
2021/06/08 | 752631 | systems/win32/miktex/tm/packages/bangla.tar.lzma
-2021/06/08 | 7316466 | systems/win32/miktex/tm/packages/hvfloat__doc.tar.lzma
+2021/06/08 | 7473 | macros/luatex/generic/minim-xmp/minim-xmp.doc
2021/06/08 | 727 | macros/luatex/generic/minim-mp/README
2021/06/08 | 7248 | graphics/minim-hatching/minim-hatching.mp
2021/06/08 | 718 | macros/latex/contrib/biblatex-contrib/biblatex-ext/ext-verbose-inote.cbx
@@ -384,9 +499,7 @@
2021/06/08 | 6171 | macros/latex/contrib/biblatex-contrib/biblatex-ext/ext-authoryear-tecomp.cbx
2021/06/08 | 6137 | macros/latex/contrib/biblatex-contrib/biblatex-ext/ext-authortitle-icomp.cbx
2021/06/08 | 6130 | macros/latex/contrib/biblatex-contrib/biblatex-ext/README.md
-2021/06/08 | 60948 | systems/texlive/tlnet/archive/siunitx.r59516.tar.xz
2021/06/08 | 6074 | macros/latex/contrib/biblatex-contrib/biblatex-ext/biblatex-ext-oasymb-tikz.sty
-2021/06/08 | 60462 | systems/win32/miktex/tm/packages/siunitx.tar.lzma
2021/06/08 | 58 | systems/mac/mactex/MacTeXtras-20210608.zip.md5
2021/06/08 | 5847 | macros/latex/contrib/biblatex-contrib/biblatex-mla/doc/examples.tex
2021/06/08 | 5833 | macros/latex/contrib/biblatex-contrib/biblatex-ext/ext-authortitle-comp.cbx
@@ -403,7 +516,6 @@
2021/06/08 | 5129 | macros/latex/contrib/csvsimple/CHANGES
2021/06/08 | 507 | graphics/minim-hatching/README
2021/06/08 | 5078 | systems/win32/miktex/tm/packages/pxjahyper__source.tar.lzma
-2021/06/08 | 50080024 | systems/win32/w32tex/ltxpkgs.tar.xz
2021/06/08 | 4995 | systems/win32/miktex/tm/packages/mathcommand.tar.lzma
2021/06/08 | 4920 | macros/luatex/generic/minim-pdf/minim-languagecodes.lua
2021/06/08 | 4915 | macros/latex/contrib/biblatex-contrib/biblatex-ext/ext-authortitle-ibid.cbx
@@ -412,7 +524,6 @@
2021/06/08 | 4748 | macros/latex/contrib/biblatex-contrib/biblatex-mla/mla.bbx
2021/06/08 | 4700 | macros/latex/contrib/keyfloat/images/image2.pdf
2021/06/08 | 4697 | macros/latex/contrib/biblatex-contrib/biblatex-ext/ext-authortitle.cbx
-2021/06/08 | 4667076 | systems/win32/w32tex/dvipdfm-w32.tar.xz
2021/06/08 | 465328 | support/latexmk.zip
2021/06/08 | 4614565 | systems/win32/miktex/tm/packages/musixtex-fonts.tar.lzma
2021/06/08 | 4600340 | systems/texlive/tlnet/archive/musixtex-fonts.r59507.tar.xz
@@ -459,8 +570,6 @@
2021/06/08 | 2541 | macros/luatex/generic/minim-mp/minim.mp
2021/06/08 | 2511 | macros/latex/contrib/csvsimple/README
2021/06/08 | 25077 | macros/latex/contrib/csvsimple/csvsimple.sty
-2021/06/08 | 2420468 | systems/win32/miktex/tm/packages/siunitx__doc.tar.lzma
-2021/06/08 | 2417064 | systems/texlive/tlnet/archive/siunitx.doc.r59516.tar.xz
2021/06/08 | 238 | macros/latex/contrib/csvsimple/csvsimple-example.csv
2021/06/08 | 23556216 | systems/win32/w32tex/cjkzr.tar.xz
2021/06/08 | 229 | macros/latex/contrib/csvsimple/namesort.xml
@@ -535,12 +644,8 @@
2021/06/08 | 110 | macros/latex/contrib/biblatex-contrib/biblatex-mla/mla-strict.cbx
2021/06/08 | 108 | macros/latex/contrib/biblatex-contrib/biblatex-mla/mla7.cbx
2021/06/08 | 10823 | macros/latex/contrib/biblatex-contrib/biblatex-ext/biblatex-ext-tabular.sty
-2021/06/08 | 10650 | systems/win32/miktex/tm/packages/hvfloat.tar.lzma
2021/06/08 | 105712 | systems/win32/miktex/tm/packages/musixtex-fonts__doc.tar.lzma
2021/06/08 | 105336 | systems/texlive/tlnet/archive/musixtex-fonts.doc.r59507.tar.xz
-2021/06/08 | 104902 | systems/win32/miktex/tm/packages/siunitx__source.tar.lzma
-2021/06/08 | 10484 | systems/texlive/tlnet/archive/hvfloat.r59506.tar.xz
-2021/06/08 | 104720 | systems/texlive/tlnet/archive/siunitx.source.r59516.tar.xz
2021/06/08 | 1046598 | systems/win32/miktex/tm/packages/suftesi__doc.tar.lzma
2021/06/08 | 1041110 | macros/latex/contrib/keyfloat.zip
2021/06/08 | 1012669 | macros/latex/contrib/keyfloat/keyfloat.pdf
@@ -601,7 +706,6 @@
2021/06/07 | 6677 | macros/latex/contrib/bjfuthesis/bjfuthesis.cls
2021/06/07 | 6497 | macros/luatex/generic/luatexja/src/patches/lltjdefs.sty
2021/06/07 | 64097 | macros/latex/contrib/pythontex/pythontex_engines.py
-2021/06/07 | 635 | macros/latex/contrib/tiscreen/README
2021/06/07 | 62143 | systems/win32/miktex/setup/rpm/fedora/28/repodata/224c9aeb5874f6580adb0cffcdcfa677ba31959cba8b28042436b850d92d1716-filelists.sqlite.bz2
2021/06/07 | 6205 | systems/win32/miktex/setup/rpm/fedora/34/repodata/ec560b75589d6ec37e7aa3184ce24a6cf5dd7081ae7c925144a4318ee7109b81-filelists.xml.gz
2021/06/07 | 6203 | macros/luatex/generic/luatexja/src/ltj-base.sty
@@ -707,7 +811,6 @@
2021/06/07 | 3313 | macros/luatex/generic/luatexja/tool/ltj-unicode-ccfix_make2.pl
2021/06/07 | 3308 | systems/texlive/tlnet/archive/beaulivre.r59496.tar.xz
2021/06/07 | 3304 | systems/texlive/tlnet/archive/lebhart.r59498.tar.xz
-2021/06/07 | 3286 | macros/latex/contrib/tiscreen/doc/tiscreen-doc.tex
2021/06/07 | 326 | macros/luatex/generic/luatexja/tool/otf-AdobeMyungjoStd-Medium.txt
2021/06/07 | 3238 | macros/luatex/generic/luatexja/doc/jfm-test.lua
2021/06/07 | 32223804 | systems/win32/miktex/setup/deb/pool/universe/m/miktex/miktex_21.6-bionic1_amd64.deb
@@ -792,7 +895,6 @@
2021/06/07 | 18543 | macros/luatex/generic/luatexja/src/patches/lltjp-geometry.sty
2021/06/07 | 1832 | macros/luatex/generic/luatexja/src/luatexja.sty
2021/06/07 | 181612 | macros/latex/contrib/pythontex/pythontex_quickstart.pdf
-2021/06/07 | 1781 | macros/latex/contrib/tiscreen/tex/tiscreen.sty
2021/06/07 | 177581 | macros/luatex/generic/luatexja/src/ltjclasses.dtx
2021/06/07 | 1774 | systems/win32/miktex/setup/rpm/opensuse/15/repodata/17c2ddc9be8cd6deee5cc2f163bf461cdac6394b7f255ed96c04f9298f7ace1b-other.sqlite.bz2
2021/06/07 | 1767705 | macros/latex/contrib/pythontex.zip
@@ -831,7 +933,6 @@
2021/06/07 | 145804 | macros/latex/contrib/bjfuthesis/example/contents/mission-statement.pdf
2021/06/07 | 14517 | macros/luatex/generic/luatexja/src/ltj-rmlgbm.lua
2021/06/07 | 14515 | macros/latex/contrib/hyperref/doc/hyperref-doc.css
-2021/06/07 | 144872836 | systems/win32/w32tex/context.tar.xz
2021/06/07 | 1443 | macros/latex/contrib/pmdb/examples/tst-qzdb.tex
2021/06/07 | 142377 | macros/latex/contrib/pythontex/pythontex3.py
2021/06/07 | 142373 | macros/latex/contrib/pythontex/pythontex2.py
@@ -840,8 +941,6 @@
2021/06/07 | 13726 | macros/luatex/generic/luatexja/doc/lltjp-geometry.tex
2021/06/07 | 136384 | systems/texlive/tlnet/archive/tex4ht.doc.r59489.tar.xz
2021/06/07 | 1362 | macros/luatex/generic/luatexja/src/patches/lltjp-footmisc.sty
-2021/06/07 | 135157 | macros/latex/contrib/tiscreen.zip
-2021/06/07 | 133438 | macros/latex/contrib/tiscreen/doc/tiscreen-doc.pdf
2021/06/07 | 1332 | language/bengali/bangla/b-map.tex
2021/06/07 | 132184 | macros/latex/contrib/bjfuthesis/documentation/bjfuthesis.pdf
2021/06/07 | 13194 | macros/luatex/generic/luatexja/src/ltj-setwidth.lua
@@ -849,7 +948,6 @@
2021/06/07 | 126 | macros/luatex/generic/luatexja/src/ltjltxdoc.ins
2021/06/07 | 12570 | systems/win32/miktex/setup/deb/dists/focal/universe/binary-amd64/Packages
2021/06/07 | 12389 | macros/luatex/generic/luatexja/src/patches/lltjcore.sty
-2021/06/07 | 122806571 | macros/context/latest/cont-tmf.zip
2021/06/07 | 1224 | macros/luatex/generic/luatexja/tool/chars2defcharrange.rb
2021/06/07 | 12151 | macros/luatex/generic/luatexja/src/ltj-base.lua
2021/06/07 | 121228 | systems/texlive/tlnet/archive/ptex.doc.r59502.tar.xz
@@ -942,7 +1040,6 @@
2021/06/06 | 6839 | systems/win32/miktex/tm/packages/environ__source.tar.lzma
2021/06/06 | 680776 | systems/win32/miktex/tm/packages/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
2021/06/06 | 68032 | systems/win32/miktex/tm/packages/miktex-mkfntmap-bin-x64-2.9.tar.lzma
-2021/06/06 | 6802420 | systems/win32/w32tex/ptex-ng-w32.tar.xz
2021/06/06 | 6798 | systems/win32/miktex/tm/packages/make4ht__source.tar.lzma
2021/06/06 | 679707 | macros/latex/contrib/suftesi/templates.zip
2021/06/06 | 67784 | systems/win32/miktex/tm/packages/miktex-bibtex-bin-2.9.tar.lzma
@@ -1021,7 +1118,6 @@
2021/06/06 | 499290 | systems/win32/miktex/tm/packages/hyph-utf8__doc.tar.lzma
2021/06/06 | 4977 | systems/win32/miktex/tm/packages/atbegshi.tar.lzma
2021/06/06 | 49641 | systems/win32/miktex/tm/packages/amsfonts__source.tar.lzma
-2021/06/06 | 49507620 | systems/win32/w32tex/xetex-w32.tar.xz
2021/06/06 | 490015 | macros/unicodetex/latex/simplivre.zip
2021/06/06 | 483154 | systems/win32/miktex/tm/packages/miktex-harfbuzz-bin-2.9.tar.lzma
2021/06/06 | 48207 | systems/win32/miktex/tm/packages/miktex-expat-bin-x64-2.9.tar.lzma
@@ -1343,7 +1439,6 @@
2021/06/06 | 10045 | systems/win32/miktex/tm/packages/xkeyval.tar.lzma
2021/06/06 | 100408 | systems/win32/miktex/tm/packages/miktex-epstopdf-bin-2.9.tar.lzma
2021/06/05 | 99 | macros/latex-dev/base/ltpara-code.tex
-2021/06/05 | 99972424 | systems/win32/w32tex/TLW64/tl-win64.zip
2021/06/05 | 9809 | macros/latex-dev/base/ltnews21.tex
2021/06/05 | 970 | macros/latex/contrib/bmstu-iu8/bmstu-iu8/styles/20-IU8-listing.sty
2021/06/05 | 9583 | macros/latex-dev/base/format.ins
@@ -1375,7 +1470,6 @@
2021/06/05 | 82371 | macros/latex-dev/required/amsmath/testmath.tex
2021/06/05 | 819 | macros/latex/contrib/bmstu-iu8/bmstu-iu8/styles/16-IU8-references.sty
2021/06/05 | 818898 | macros/latex-dev/base/ltshipout-code.pdf
-2021/06/05 | 808368 | systems/win32/w32tex/win64/dvipdfm-w64.tar.xz
2021/06/05 | 80670 | macros/latex-dev/base/ltfssbas.dtx
2021/06/05 | 795607 | macros/latex-dev/base/ltfilehook-code.pdf
2021/06/05 | 78863 | macros/latex/contrib/eq-pin2corr/examples/get-hash-string.pdf
@@ -1726,7 +1820,6 @@
2021/06/05 | 1694 | macros/latex-dev/base/small2e.tex
2021/06/05 | 1694 | macros/latex/contrib/bmstu-iu8/bmstu-iu8/styles/13-IU8-contents.sty
2021/06/05 | 169323 | macros/latex-dev/base/graphpap.pdf
-2021/06/05 | 1691140 | systems/win32/w32tex/win64/ptex-ng-w64.tar.xz
2021/06/05 | 167686 | macros/latex-dev/required/graphics/epsfig.pdf
2021/06/05 | 167628 | systems/win32/miktex/tm/packages/l3kernel.tar.lzma
2021/06/05 | 1666 | macros/latex-dev/required/tools/README.md
@@ -1813,7 +1906,6 @@
2021/06/05 | 112556 | macros/latex-dev/required/amsmath/amsxtra.pdf
2021/06/05 | 111955 | macros/latex-dev/base/ltnews11.pdf
2021/06/05 | 11153 | macros/latex-dev/required/tools/hhline.dtx
-2021/06/05 | 11127216 | systems/win32/w32tex/win64/xetex-w64.tar.xz
2021/06/05 | 1110 | macros/latex/contrib/eq-pin2corr/README.md
2021/06/05 | 109 | systems/win32/miktex/setup/rpm/fedora-34.repo
2021/06/05 | 109737 | macros/latex-dev/required/amsmath/subeqn.pdf
@@ -2035,484 +2127,3 @@
2021/06/04 | 1034 | macros/latex/contrib/todonotes/examples/alterAppearenceOfListOfTodos.tex
2021/06/04 | 10168 | language/japanese/platex/kinsoku.dtx
2021/06/04 | 1000084 | macros/latex/contrib/acrotex/doc/eformman.pdf
-2021/06/03 | 97808 | fonts/musixtex-fonts/doc/musixtex-fonts-install.pdf
-2021/06/03 | 967 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_set_definition_simple.snap
-2021/06/03 | 9622 | macros/latex/contrib/tuda-ci/tex/tudamecheng.cfg
-2021/06/03 | 9462 | support/texlab/src/features/cursor.rs
-2021/06/03 | 944 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__glossary_entry_definition_simple.snap
-2021/06/03 | 9420 | support/texlab/tests/integration/snapshots/integration__completion__latex__begin_command.snap
-2021/06/03 | 9407 | macros/optex/base/fams-ini.opm
-2021/06/03 | 9399 | support/texlab/src/features.rs
-2021/06/03 | 9383 | macros/latex/contrib/tuda-ci/tex/beamerouterthemeTUDa.sty
-2021/06/03 | 928 | support/texlab/tests/integration/snapshots/integration__completion__latex__user_environment.snap
-2021/06/03 | 923 | support/texlab/src/language.rs
-2021/06/03 | 909 | support/texlab/src/features/formatting.rs
-2021/06/03 | 901 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__delimiters.snap
-2021/06/03 | 88 | support/texlab/tests/integration/snapshots/integration__hover__empty_labtex_document.snap
-2021/06/03 | 88 | support/texlab/tests/integration/snapshots/integration__hover__empty_bibtex_document.snap
-2021/06/03 | 883 | support/texlab/src/context.rs
-2021/06/03 | 8762 | support/texlab/src/features/completion/citation.rs
-2021/06/03 | 875 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__glossary_entry_reference_options.snap
-2021/06/03 | 8705 | support/texlab/src/label.rs
-2021/06/03 | 8703 | macros/latex/contrib/tuda-ci/example/DEMO-TUDaSciPoster.tex
-2021/06/03 | 869 | support/texlab/src/workspace.rs
-2021/06/03 | 862 | info/dtk-bibliography/dtk-bibliography.tex
-2021/06/03 | 85 | support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__empty.snap
-2021/06/03 | 855 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_set_definition_error1.snap
-2021/06/03 | 855 | support/texlab/src/syntax/bibtex/kind.rs
-2021/06/03 | 843 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__biblatex_include_options.snap
-2021/06/03 | 8414 | support/texlab/src/citation/name.rs
-2021/06/03 | 839 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__equation_missing_end.snap
-2021/06/03 | 8397894 | fonts/newtx.zip
-2021/06/03 | 833 | support/texlab/src/syntax/latex.rs
-2021/06/03 | 83266 | macros/generic/expkv-cs/expkv-cs.dtx
-2021/06/03 | 830168 | systems/texlive/tlnet/archive/babel.doc.r59439.tar.xz
-2021/06/03 | 829434 | language/japanese/uplatex.zip
-2021/06/03 | 8237 | macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa.sty
-2021/06/03 | 821 | support/texlab/src/features/reference.rs
-2021/06/03 | 808 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__equation_missing_begin.snap
-2021/06/03 | 802 | support/texlab/src/syntax/bibtex.rs
-2021/06/03 | 786 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__acroynm_reference_options.snap
-2021/06/03 | 785 | support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_two_fields_incomplete.snap
-2021/06/03 | 776 | support/texlab/tests/integration/snapshots/integration__completion__latex__citation_multi_word.snap
-2021/06/03 | 772 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__caption_figure.snap
-2021/06/03 | 76 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__empty.snap
-2021/06/03 | 763 | support/texlab/tests/integration/snapshots/integration__completion__latex__citation_open_brace.snap
-2021/06/03 | 7634618 | support/texlab.zip
-2021/06/03 | 761837 | systems/win32/miktex/tm/packages/schulschriften.tar.lzma
-2021/06/03 | 7534511 | systems/win32/miktex/tm/packages/pstricks.tar.lzma
-2021/06/03 | 745 | support/texlab/docs/tectonic.md
-2021/06/03 | 742 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__acroynm_definition_simple.snap
-2021/06/03 | 741 | support/texlab/tests/integration/snapshots/integration__workspace_symbol__filter_type_math.snap
-2021/06/03 | 734 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__theorem_definition_full.snap
-2021/06/03 | 7336 | macros/latex/contrib/tuda-ci/example/DEMO-TUDaBeamer.tex
-2021/06/03 | 7281 | support/texlab/src/features/completion/label.rs
-2021/06/03 | 727 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__environment_simple.snap
-2021/06/03 | 721 | support/texlab/tests/integration/snapshots/integration__workspace_symbol__filter_bibtex.snap
-2021/06/03 | 710 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_definition_simple.snap
-2021/06/03 | 7067 | support/texlab/src/features/folding.rs
-2021/06/03 | 6 | support/texlab/rust-toolchain
-2021/06/03 | 696 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__graphics_include_options.snap
-2021/06/03 | 6955 | support/texlab/src/features/completion/entry_type.rs
-2021/06/03 | 6927 | support/texlab/src/syntax/latex/lexer.rs
-2021/06/03 | 688 | support/texlab/src/lib.rs
-2021/06/03 | 6888 | support/texlab/src/features/symbol/project_order.rs
-2021/06/03 | 6881 | macros/latex/contrib/tuda-ci/example/DEMO-TUDaLeaflet.tex
-2021/06/03 | 685752 | systems/texlive/tlnet/archive/babel.source.r59439.tar.xz
-2021/06/03 | 6843 | support/texlab/src/features/reference/entry.rs
-2021/06/03 | 682661 | macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPub.pdf
-2021/06/03 | 677 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__structure_siblings.snap
-2021/06/03 | 676 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__svg_include_options.snap
-2021/06/03 | 6764 | macros/latex/contrib/ocgx2/ChangeLog
-2021/06/03 | 670 | support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_one_field_trailing_comma.snap
-2021/06/03 | 668 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__inkscape_include_options.snap
-2021/06/03 | 6673 | macros/latex/contrib/tuda-ci/tex/tudabeamer.cls
-2021/06/03 | 665160 | systems/texlive/tlnet/archive/latex.source.r59440.tar.xz
-2021/06/03 | 6618 | support/texlab/src/features/reference/string.rs
-2021/06/03 | 6579 | support/texlab/src/syntax/bibtex/cst.rs
-2021/06/03 | 656 | support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_one_field_number_key.snap
-2021/06/03 | 655529 | macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPhD.pdf
-2021/06/03 | 654 | info/dtk-bibliography/README.md
-2021/06/03 | 65446 | support/texlab/Cargo.lock
-2021/06/03 | 65424 | systems/texlive/tlnet/archive/amsmath.source.r59441.tar.xz
-2021/06/03 | 648 | support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_one_field.snap
-2021/06/03 | 6485 | support/texlab/src/line_index.rs
-2021/06/03 | 647323 | macros/latex/contrib/tuda-ci/doc/DEMO-TUDaThesis.pdf
-2021/06/03 | 6465091 | macros/latex/contrib/tuda-ci.zip
-2021/06/03 | 643 | support/texlab/texlab.1
-2021/06/03 | 63889744 | systems/win32/w32tex/biblatex-biber.tar.xz
-2021/06/03 | 6365 | macros/latex/contrib/tuda-ci/tex/tudarules.sty
-2021/06/03 | 634 | support/texlab/src/syntax/latex/analysis/label_number.rs
-2021/06/03 | 630 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__inline_double_dollar.snap
-2021/06/03 | 624 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__inline.snap
-2021/06/03 | 623 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__caption.snap
-2021/06/03 | 622116 | macros/latex/contrib/tuda-ci/doc/DEMO-TUDaBeamer.pdf
-2021/06/03 | 621 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__caption_error.snap
-2021/06/03 | 6196 | macros/optex/README
-2021/06/03 | 6187 | support/texlab/src/features/reference/label.rs
-2021/06/03 | 616 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__command_definition_simple.snap
-2021/06/03 | 614 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__formula.snap
-2021/06/03 | 609 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_set_definition_error2.snap
-2021/06/03 | 6092 | support/texlab/docs/previewing.md
-2021/06/03 | 608 | systems/texlive/tlnet/archive/graphics-def.doc.r59435.tar.xz
-2021/06/03 | 607666 | support/TeX4ht/source/tex4ht-html4.tex
-2021/06/03 | 598 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__theorem_definition_name_with_description_and_counter.snap
-2021/06/03 | 594959 | macros/latex/contrib/tuda-ci/doc/DEMO-TUDaExercise.pdf
-2021/06/03 | 590183 | macros/latex/contrib/tuda-ci/doc/DEMO-TUDaLetter.pdf
-2021/06/03 | 5896 | support/texlab/src/features/completion/field.rs
-2021/06/03 | 586895 | macros/latex/contrib/tuda-ci/doc/DEMO-TUDaSciPoster.pdf
-2021/06/03 | 5859 | macros/latex/contrib/tuda-ci/example/DEMO-TUDaPoster.tex
-2021/06/03 | 583 | support/texlab/src/syntax/latex/analysis/theorem.rs
-2021/06/03 | 583234 | macros/latex/contrib/tuda-ci/doc/DEMO-TUDaLeaflet.pdf
-2021/06/03 | 582465 | systems/win32/miktex/tm/packages/platex-tools.tar.lzma
-2021/06/03 | 5817 | macros/latex/contrib/tuda-ci/tex/tudacolors.sty
-2021/06/03 | 5789 | macros/latex/contrib/tuda-ci/tex/tudasize9pt.clo
-2021/06/03 | 575 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__command_with_parameter.snap
-2021/06/03 | 574086 | macros/latex/contrib/tuda-ci/doc/DEMO-TUDaAnnouncement.pdf
-2021/06/03 | 57018 | support/texlab/data/lang_data.json
-2021/06/03 | 5679 | support/texlab/src/features/completion/import.rs
-2021/06/03 | 565 | support/texlab/src/features/formatting/snapshots/texlab__features__formatting__bibtex_internal__tests__multiple_entries.snap
-2021/06/03 | 5650 | support/texlab/src/features/completion/argument.rs
-2021/06/03 | 56296 | support/texlab/src/citation/apa.csl
-2021/06/03 | 559 | support/texlab/src/features/semantic.rs
-2021/06/03 | 558 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_number.snap
-2021/06/03 | 558 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_prenote_postnote.snap
-2021/06/03 | 558963 | macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPoster.pdf
-2021/06/03 | 5529800 | systems/win32/w32tex/aleph-w32.tar.xz
-2021/06/03 | 550646 | macros/latex/contrib/tuda-ci/doc/DEMO-TUDaReport.pdf
-2021/06/03 | 549 | support/texlab/tests/integration/snapshots/integration__completion__latex__kernel_command.snap
-2021/06/03 | 540 | support/texlab/tests/integration/snapshots/integration__completion__latex__kernel_command_environment.snap
-2021/06/03 | 540 | support/texlab/tests/integration/snapshots/integration__completion__latex__class_environment.snap
-2021/06/03 | 538 | support/texlab/tests/integration/snapshots/integration__completion__latex__user_command.snap
-2021/06/03 | 5381 | macros/latex/contrib/tuda-ci/tex/tudalettersize10pt.clo
-2021/06/03 | 5361 | support/texlab/src/features/completion/component_command.rs
-2021/06/03 | 5325764 | install/fonts/musixtex-fonts.tds.zip
-2021/06/03 | 5296 | support/texlab/src/features/definition/string.rs
-2021/06/03 | 5267 | support/texlab/src/features/completion/color_model.rs
-2021/06/03 | 521 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__structure_invalid_nesting.snap
-2021/06/03 | 5217 | support/texlab/src/features/completion/include.rs
-2021/06/03 | 520 | info/dtk-bibliography/dtk-authoryear.dbx
-2021/06/03 | 519 | support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__string_complete.snap
-2021/06/03 | 519 | support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__string_casing.snap
-2021/06/03 | 519245 | info/dtk-bibliography/dtk-bibliography.bib
-2021/06/03 | 517 | support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__string_missing_quote.snap
-2021/06/03 | 517 | support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__string_incomplete.snap
-2021/06/03 | 5170 | macros/latex/contrib/tuda-ci/example/DEMO-TUDaLetter.tex
-2021/06/03 | 51420 | support/texlab/src/syntax/build_log.rs
-2021/06/03 | 5041 | support/texlab/src/features/rename/entry.rs
-2021/06/03 | 503390 | install/macros/generic/expkv.tds.zip
-2021/06/03 | 4994 | support/texlab/src/capabilities.rs
-2021/06/03 | 497 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_set_definition_error3.snap
-2021/06/03 | 497236 | macros/generic/expkv.zip
-2021/06/03 | 4948 | support/texlab/tests/integration/snapshots/integration__completion__latex__class_import.snap
-2021/06/03 | 4940 | support/texlab/src/features/completion/acronym_ref.rs
-2021/06/03 | 491 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__caption_minimal.snap
-2021/06/03 | 4916 | support/texlab/src/features/highlight/label.rs
-2021/06/03 | 490 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__theorem_definition_name_with_counter.snap
-2021/06/03 | 489 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__caption_minimal_error.snap
-2021/06/03 | 488 | support/texlab/src/range.rs
-2021/06/03 | 4814 | support/texlab/src/features/completion/tikz_library.rs
-2021/06/03 | 480 | support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__preamble_complete.snap
-2021/06/03 | 480 | support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__preamble_casing.snap
-2021/06/03 | 480586 | macros/generic/expkv/expkv.pdf
-2021/06/03 | 479 | support/texlab/src/features/highlight.rs
-2021/06/03 | 4769 | support/texlab/src/features/completion/component_environment.rs
-2021/06/03 | 4736 | support/texlab/src/features/rename/label.rs
-2021/06/03 | 47332 | macros/latex/contrib/derivative/derivative.sty
-2021/06/03 | 472 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__math_operator_simple.snap
-2021/06/03 | 4729 | support/texlab/src/citation/bibutils.rs
-2021/06/03 | 4712 | support/texlab/src/diagnostics/bibtex.rs
-2021/06/03 | 470 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_reference_range_simple.snap
-2021/06/03 | 468 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_reference_range_error.snap
-2021/06/03 | 464 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__command_definition_no_argc.snap
-2021/06/03 | 462 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__theorem_definition_name_with_description.snap
-2021/06/03 | 4603 | support/texlab/src/citation.rs
-2021/06/03 | 45906 | support/texlab/src/syntax/latex/parser.rs
-2021/06/03 | 455288 | systems/texlive/tlnet/archive/newpx.doc.r59431.tar.xz
-2021/06/03 | 450 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__package_include_multiple.snap
-2021/06/03 | 4476 | macros/optex/doc/optex-doc.tex
-2021/06/03 | 446 | support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__preamble_missing_end.snap
-2021/06/03 | 4441 | macros/latex/contrib/tuda-ci/tex/tudacolors.def
-2021/06/03 | 4427 | support/texlab/README.md
-2021/06/03 | 4380 | support/texlab/src/syntax/latex/kind.rs
-2021/06/03 | 4328 | macros/latex/contrib/tuda-ci/tex/tuda-pgfplots.sty
-2021/06/03 | 4314 | support/texlab/src/diagnostics/latex.rs
-2021/06/03 | 4294 | support/texlab/src/citation/name/parser.lalrpop
-2021/06/03 | 428 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__import_simple.snap
-2021/06/03 | 426 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_prenote.snap
-2021/06/03 | 425 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__generic_command_args.snap
-2021/06/03 | 425 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__comment.snap
-2021/06/03 | 4238 | support/texlab/src/features/completion/glossary_ref.rs
-2021/06/03 | 423573 | info/dtk-bibliography.zip
-2021/06/03 | 4218 | support/texlab/src/component_db.rs
-2021/06/03 | 4190 | support/texlab/tests/integration/snapshots/integration__completion__bibtex__field_incomplete_entry.snap
-2021/06/03 | 4190 | support/texlab/tests/integration/snapshots/integration__completion__bibtex__field_complete_entry.snap
-2021/06/03 | 416 | support/texlab/tests/integration/snapshots/integration__workspace_symbol__filter_type_figure.snap
-2021/06/03 | 4165 | support/texlab/tests/integration/snapshots/integration__completion__bibtex__entry_type_empty_name.snap
-2021/06/03 | 41581 | macros/latex/contrib/tuda-ci/tex/tudapub.cls
-2021/06/03 | 411 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_reference_multiple.snap
-2021/06/03 | 4091 | support/texlab/src/features/completion/theorem.rs
-2021/06/03 | 4061 | macros/optex/base/optex.ini
-2021/06/03 | 4060 | support/texlab/src/features/hover/string_ref.rs
-2021/06/03 | 4053 | support/texlab/tests/integration/snapshots/integration__completion__latex__package_import.snap
-2021/06/03 | 401 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_multiple_keys.snap
-2021/06/03 | 4010 | support/texlab/src/features/hover/citation.rs
-2021/06/03 | 3994 | support/texlab/src/workspace/storage.rs
-2021/06/03 | 3993 | support/texlab/src/features/lsp_kinds.rs
-2021/06/03 | 3982 | support/texlab/src/features/definition/command.rs
-2021/06/03 | 3928 | support/texlab/src/features/definition/entry.rs
-2021/06/03 | 3871 | macros/latex/contrib/tuda-ci/example/DEMO-TUDaFromaddress.lco
-2021/06/03 | 3815 | macros/latex/contrib/tuda-ci/tex/beamercolorthemeTUDa.sty
-2021/06/03 | 380190 | support/texlab/docs/demo.gif
-2021/06/03 | 3779 | support/texlab/docs/options.md
-2021/06/03 | 377210 | install/macros/generic/expkv-cs.tds.zip
-2021/06/03 | 3733214 | systems/win32/miktex/tm/packages/lwarp.tar.lzma
-2021/06/03 | 371347 | macros/generic/expkv-cs.zip
-2021/06/03 | 3707 | support/texlab/src/features/symbol/types.rs
-2021/06/03 | 3693 | support/texlab/src/features/hover/field.rs
-2021/06/03 | 3670 | support/texlab/src/features/hover/entry_type.rs
-2021/06/03 | 366 | support/texlab/src/syntax/latex/analysis/environment.rs
-2021/06/03 | 366387 | info/dtk-bibliography/dtk-bibliography.pdf
-2021/06/03 | 364 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__math_operator_no_impl.snap
-2021/06/03 | 3627 | support/texlab/src/features/build.rs
-2021/06/03 | 361 | support/texlab/src/req_queue.rs
-2021/06/03 | 361934 | macros/generic/expkv-cs/expkv-cs.pdf
-2021/06/03 | 3615 | support/texlab/src/features/definition/document.rs
-2021/06/03 | 360 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__equation.snap
-2021/06/03 | 3596 | support/texlab/src/workspace/parent_expand.rs
-2021/06/03 | 358 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_reference_range_incomplete.snap
-2021/06/03 | 357 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__graphics_include_simple.snap
-2021/06/03 | 356 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__command_definition_no_impl.snap
-2021/06/03 | 355 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__biblatex_include_simple.snap
-2021/06/03 | 3553 | support/texlab/src/features/symbol.rs
-2021/06/03 | 354 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__theorem_definition_only_name.snap
-2021/06/03 | 354 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__escaped_brackets.snap
-2021/06/03 | 354 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__command_definition_no_impl_error.snap
-2021/06/03 | 353 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__verbatim_include_simple.snap
-2021/06/03 | 35149 | support/texlab/LICENSE
-2021/06/03 | 3497 | fonts/musixtex-fonts/doc/musixtex-fonts-install.tex
-2021/06/03 | 347 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_redundant_comma.snap
-2021/06/03 | 3467 | support/texlab/src/features/completion/types.rs
-2021/06/03 | 345 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__tikz_library_import_simple.snap
-2021/06/03 | 344357 | systems/win32/miktex/tm/packages/pxchfon.tar.lzma
-2021/06/03 | 343 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__pgf_library_import_simple.snap
-2021/06/03 | 342 | support/texlab/src/syntax.rs
-2021/06/03 | 341 | support/texlab/src/syntax/latex/analysis/command.rs
-2021/06/03 | 3409 | support/texlab/src/features/link.rs
-2021/06/03 | 3400 | support/texlab/tests/integration/snapshots/integration__completion__latex__kernel_command_glyph.snap
-2021/06/03 | 339 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__class_include_simple.snap
-2021/06/03 | 339 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__bibtex_include_simple.snap
-2021/06/03 | 337 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__svg_include_simple.snap
-2021/06/03 | 337 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__package_include_simple.snap
-2021/06/03 | 3364 | support/texlab/src/features/symbol/bibtex.rs
-2021/06/03 | 33569 | install/macros/latex/contrib/ocgx2.tds.zip
-2021/06/03 | 331 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__acroynm_reference_simple.snap
-2021/06/03 | 3317 | support/texlab/src/features/forward_search.rs
-2021/06/03 | 329 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__inkscape_include_simple.snap
-2021/06/03 | 325 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__latex_input_simple.snap
-2021/06/03 | 32510 | macros/latex/contrib/ocgx2.zip
-2021/06/03 | 3243 | support/texlab/src/workspace/document.rs
-2021/06/03 | 3243 | macros/latex/contrib/tuda-ci/tex/tudafonts.sty
-2021/06/03 | 321 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__latex_include_simple.snap
-2021/06/03 | 32198 | macros/latex/contrib/tuda-ci/tex/tudaexercise.cls
-2021/06/03 | 3181 | support/texlab/tests/integration/workspace_symbol.rs
-2021/06/03 | 3175 | macros/latex/contrib/tuda-ci/example/DEMO-TUDaAnnouncement.tex
-2021/06/03 | 3167 | support/texlab/src/diagnostics/chktex.rs
-2021/06/03 | 314 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__import_incomplete.snap
-2021/06/03 | 314 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__glossary_entry_reference_simple.snap
-2021/06/03 | 313 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__equation_label_reference_simple.snap
-2021/06/03 | 312 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_reference_simple.snap
-2021/06/03 | 3122 | support/texlab/src/features/completion/color.rs
-2021/06/03 | 310 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_definition_simple.snap
-2021/06/03 | 30856 | systems/texlive/tlnet/archive/amsmath.r59441.tar.xz
-2021/06/03 | 30816 | macros/latex/contrib/tuda-ci/tex/tudathesis.cfg
-2021/06/03 | 3072 | support/texlab/src/features/rename/command.rs
-2021/06/03 | 3043 | support/texlab/src/features/hover/component.rs
-2021/06/03 | 302 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_set_definition_error4.snap
-2021/06/03 | 301 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_reference_simple.snap
-2021/06/03 | 299 | support/texlab/src/features/formatting/snapshots/texlab__features__formatting__bibtex_internal__tests__wrap_long_lines.snap
-2021/06/03 | 2984 | support/texlab/src/workspace/watch.rs
-2021/06/03 | 297 | support/texlab/tests/integration/snapshots/integration__hover__label_theorem_child_file_mumber.snap
-2021/06/03 | 294 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_star.snap
-2021/06/03 | 294 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_simple.snap
-2021/06/03 | 29437 | support/texlab/src/server.rs
-2021/06/03 | 2906 | support/texlab/tests/integration/snapshots/integration__completion__bibtex__command_incomplete_entry.snap
-2021/06/03 | 2906 | support/texlab/tests/integration/snapshots/integration__completion__bibtex__command_complete_entry.snap
-2021/06/03 | 2903 | support/texlab/tests/integration/snapshots/integration__completion__latex__label.snap
-2021/06/03 | 289 | support/texlab/tests/integration/snapshots/integration__hover__label_theorem_child_file.snap
-2021/06/03 | 2897 | support/texlab/tests/integration/snapshots/integration__completion__latex__class_command.snap
-2021/06/03 | 287 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_missing_brace.snap
-2021/06/03 | 2878 | support/texlab/src/features/completion/user_environment.rs
-2021/06/03 | 2874 | support/texlab/src/features/completion/user_command.rs
-2021/06/03 | 2873 | support/texlab/tests/integration/snapshots/integration__completion__latex__package_environment.snap
-2021/06/03 | 287273 | info/tex-nutshell.zip
-2021/06/03 | 2863 | support/texlab/tests/integration/snapshots/integration__completion__latex__preselect_environment.snap
-2021/06/03 | 285 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__unmatched_brackets_with_group.snap
-2021/06/03 | 28400 | macros/latex/contrib/tuda-ci/example/DEMO-TUDaPub.tex
-2021/06/03 | 283 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__brace_group_simple.snap
-2021/06/03 | 2825 | support/texlab/tests/integration/snapshots/integration__completion__latex__pgf_library.snap
-2021/06/03 | 281 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__class_include_empty.snap
-2021/06/03 | 281 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__brace_group_missing_end.snap
-2021/06/03 | 2801 | support/texlab/src/config.rs
-2021/06/03 | 279 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__package_include_empty.snap
-2021/06/03 | 277 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__command_with_star.snap
-2021/06/03 | 2773 | support/texlab/tests/integration/snapshots/integration__completion__latex__package_command.snap
-2021/06/03 | 27577780 | systems/texlive/tlnet/archive/latex.doc.r59440.tar.xz
-2021/06/03 | 2717 | support/texlab/src/features/definition/label.rs
-2021/06/03 | 26972 | macros/latex/contrib/tuda-ci/example/DEMO-TUDaPhD.tex
-2021/06/03 | 26718 | macros/optex/base/table.opm
-2021/06/03 | 26637 | macros/latex/contrib/tuda-ci/example/DEMO-TUDaThesis.tex
-2021/06/03 | 2662 | support/texlab/src/options.rs
-2021/06/03 | 2658 | support/texlab/tests/integration/snapshots/integration__completion__latex__color_name.snap
-2021/06/03 | 2657 | support/texlab/tests/integration/snapshots/integration__document_symbol__enumerate_nested.snap
-2021/06/03 | 2644 | macros/latex/contrib/tuda-ci/example/DEMO-TUDaBibliography.bib
-2021/06/03 | 2628139 | systems/win32/miktex/tm/packages/newpx.tar.lzma
-2021/06/03 | 2620 | support/texlab/src/distro/miktex.rs
-2021/06/03 | 26161 | support/texlab/texlab.pdf
-2021/06/03 | 2614 | support/texlab/src/features/formatting/latexindent.rs
-2021/06/03 | 25872 | macros/latex/contrib/ocgx2/ocgbase.sty
-2021/06/03 | 2586 | support/texlab/texlab.tex
-2021/06/03 | 258588 | info/tex-nutshell/tex-nutshell.pdf
-2021/06/03 | 2564 | support/texlab/src/workspace/children_expand.rs
-2021/06/03 | 25592 | systems/texlive/tlnet/archive/hep-paper.source.r59436.tar.xz
-2021/06/03 | 2537816 | graphics/circuit_macros.zip
-2021/06/03 | 2516989 | systems/win32/miktex/tm/packages/changes.tar.lzma
-2021/06/03 | 2495253 | systems/win32/miktex/tm/packages/xcharter.tar.lzma
-2021/06/03 | 247 | support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_no_fields.snap
-2021/06/03 | 2478 | support/texlab/tests/integration/snapshots/integration__completion__latex__theorem_environment.snap
-2021/06/03 | 247157 | systems/win32/miktex/tm/packages/lua-typo.tar.lzma
-2021/06/03 | 2463101 | systems/win32/miktex/tm/packages/libertinust1math.tar.lzma
-2021/06/03 | 243 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_empty.snap
-2021/06/03 | 243414 | systems/win32/miktex/tm/packages/translator.tar.lzma
-2021/06/03 | 24234835 | support/texlab/data/components.json
-2021/06/03 | 2393920 | systems/texlive/tlnet/archive/amsmath.doc.r59441.tar.xz
-2021/06/03 | 23660 | support/texlab/src/features/completion.rs
-2021/06/03 | 2361 | support/texlab/src/features/semantic/legend.rs
-2021/06/03 | 2353 | support/texlab/src/syntax/latex/analysis/explicit_link.rs
-2021/06/03 | 2350 | macros/latex/contrib/tuda-ci/example/DEMO-TUDaReport.tex
-2021/06/03 | 234 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__escape_sequence.snap
-2021/06/03 | 2340500 | macros/optex.zip
-2021/06/03 | 2337 | support/texlab/src/features/completion/begin_command.rs
-2021/06/03 | 22741 | support/texlab/tests/integration/completion.rs
-2021/06/03 | 225 | support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_no_fields_missing_comma.snap
-2021/06/03 | 2257 | support/texlab/Cargo.toml
-2021/06/03 | 2250 | support/texlab/docs/lsp_kinds.md
-2021/06/03 | 2246 | support/texlab/src/features/hover/label.rs
-2021/06/03 | 2240 | support/texlab/src/diagnostics/debouncer.rs
-2021/06/03 | 2221 | support/texlab/tests/integration/snapshots/integration__completion__bibtex__entry_type_incomplete.snap
-2021/06/03 | 2218 | support/texlab/tests/integration/hover.rs
-2021/06/03 | 2209 | support/texlab/src/workspace/api.rs
-2021/06/03 | 2180 | macros/latex/contrib/tuda-ci/tex/beamerfontthemeTUDa.sty
-2021/06/03 | 2172 | macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa.sty
-2021/06/03 | 2171 | support/texlab/src/syntax/latex/analysis/distro_file.rs
-2021/06/03 | 2168204 | systems/texlive/tlnet/archive/newpx.r59431.tar.xz
-2021/06/03 | 216000 | systems/texlive/tlnet/archive/latex.r59440.tar.xz
-2021/06/03 | 2108 | support/texlab/src/distro.rs
-2021/06/03 | 2084 | support/texlab/src/dispatch.rs
-2021/06/03 | 2070 | support/texlab/src/diagnostics/build_log.rs
-2021/06/03 | 206 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__unmatched_brackets.snap
-2021/06/03 | 206 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__unmatched_braces.snap
-2021/06/03 | 205 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__hello_world.snap
-2021/06/03 | 205706 | macros/latex/contrib/derivative.zip
-2021/06/03 | 2021 | support/texlab/docs/custom_messages.md
-2021/06/03 | 2019 | support/texlab/src/distro/kpsewhich.rs
-2021/06/03 | 1998 | support/texlab/src/lang_data.rs
-2021/06/03 | 1930 | support/texlab/src/syntax/latex/analysis/label_name.rs
-2021/06/03 | 1917 | support/texlab/tests/integration/snapshots/integration__completion__latex__color_model_define_color.snap
-2021/06/03 | 1914 | support/texlab/src/main.rs
-2021/06/03 | 18915 | macros/latex/contrib/tuda-ci/tex/tudasciposter.cls
-2021/06/03 | 1886 | support/texlab/src/uri.rs
-2021/06/03 | 1869 | info/dtk-bibliography/dtk-authoryear.bbx
-2021/06/03 | 1865048 | systems/win32/w32tex/jtex-w32.tar.xz
-2021/06/03 | 1859 | support/texlab/src/syntax/latex/analysis/types.rs
-2021/06/03 | 1854 | support/texlab/tests/integration/snapshots/integration__document_symbol__theorem_nested.snap
-2021/06/03 | 183 | support/texlab/CONTRIBUTING.md
-2021/06/03 | 181 | support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__junk.snap
-2021/06/03 | 180462 | macros/latex/contrib/derivative/derivative.pdf
-2021/06/03 | 179773 | systems/win32/miktex/tm/packages/biblatex-cv.tar.lzma
-2021/06/03 | 179752 | systems/texlive/tlnet/archive/babel.r59439.tar.xz
-2021/06/03 | 1791 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__structure_nested.snap
-2021/06/03 | 1789 | support/texlab/src/features/completion/util.rs
-2021/06/03 | 1780 | support/texlab/src/diagnostics.rs
-2021/06/03 | 17408 | macros/latex/contrib/tuda-ci/tex/tudaposter.cls
-2021/06/03 | 17242 | support/texlab/src/syntax/latex/cst.rs
-2021/06/03 | 1716 | fonts/musixtex-fonts/README
-2021/06/03 | 170 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__generic_command_empty.snap
-2021/06/03 | 1687 | support/texlab/tests/integration/snapshots/integration__document_symbol__enumerate_flat.snap
-2021/06/03 | 1686 | macros/latex/contrib/tuda-ci/tex/tuda-a5paper.clo
-2021/06/03 | 1684 | macros/latex/contrib/tuda-ci/tex/tuda-a4paper.clo
-2021/06/03 | 1682 | macros/latex/contrib/tuda-ci/tex/tuda-a3paper.clo
-2021/06/03 | 1681 | macros/latex/contrib/tuda-ci/tex/tuda-a1paper.clo
-2021/06/03 | 1680 | macros/latex/contrib/tuda-ci/tex/tuda-a2paper.clo
-2021/06/03 | 16796 | CTAN.sites
-2021/06/03 | 1676 | macros/latex/contrib/tuda-ci/tex/tuda-a0paper.clo
-2021/06/03 | 1675915 | systems/win32/miktex/tm/packages/thuthesis.tar.lzma
-2021/06/03 | 167160 | systems/texlive/tlnet/archive/biblatex-cv.doc.r59433.tar.xz
-2021/06/03 | 166 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__generic_command_escape.snap
-2021/06/03 | 16688 | macros/latex/contrib/tuda-ci/tex/tudaletter.cls
-2021/06/03 | 1662 | support/texlab/src/syntax/bibtex/lexer.rs
-2021/06/03 | 16613 | macros/latex/contrib/tuda-ci/example/DEMO-TUDaExercise.tex
-2021/06/03 | 1658914 | systems/win32/miktex/tm/packages/circuitikz.tar.lzma
-2021/06/03 | 16188 | support/texlab/src/citation/ris.rs
-2021/06/03 | 159 | support/texlab/build.rs
-2021/06/03 | 1593 | support/texlab/src/client.rs
-2021/06/03 | 1578 | support/texlab/src/syntax/latex/analysis/implicit_link.rs
-2021/06/03 | 15323 | macros/latex/contrib/tuda-ci/README.md
-2021/06/03 | 152 | support/texlab/tests/integration/snapshots/integration__completion__latex__citation_after.snap
-2021/06/03 | 152237 | systems/win32/miktex/tm/packages/hvarabic.tar.lzma
-2021/06/03 | 1494 | support/texlab/tests/integration/snapshots/integration__document_symbol__section_nested.snap
-2021/06/03 | 1490 | macros/latex/contrib/derivative/README.md
-2021/06/03 | 148 | support/texlab/tests/integration/snapshots/integration__completion__latex__empty_document.snap
-2021/06/03 | 148 | support/texlab/tests/integration/snapshots/integration__completion__bibtex__junk.snap
-2021/06/03 | 148 | support/texlab/tests/integration/snapshots/integration__completion__bibtex__entry_type_empty_name_before.snap
-2021/06/03 | 148 | support/texlab/tests/integration/snapshots/integration__completion__bibtex__empty_document.snap
-2021/06/03 | 1475 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__acronym_declaration.snap
-2021/06/03 | 14708 | support/texlab/CHANGELOG.md
-2021/06/03 | 144548 | systems/win32/miktex/tm/packages/plautopatch.tar.lzma
-2021/06/03 | 1432140 | systems/texlive/tlnet/archive/libertinust1math.doc.r59430.tar.xz
-2021/06/03 | 1431 | macros/generic/expkv/README.md
-2021/06/03 | 14223 | support/texlab/src/features/symbol/latex.rs
-2021/06/03 | 1413 | support/texlab/tests/integration/snapshots/integration__document_symbol__float_nested.snap
-2021/06/03 | 1405 | support/texlab/tests/integration/snapshots/integration__document_symbol__equation_nested.snap
-2021/06/03 | 1398 | support/texlab/tests/integration/snapshots/integration__document_symbol__theorem_flat.snap
-2021/06/03 | 1384346 | systems/win32/miktex/tm/packages/hep-paper.tar.lzma
-2021/06/03 | 1383214 | macros/optex/doc/optex-doc.pdf
-2021/06/03 | 1374 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__acroynm_definition_options.snap
-2021/06/03 | 13710 | macros/latex/contrib/tuda-ci/tex/tudaleaflet.cls
-2021/06/03 | 1365 | support/texlab/tests/integration/snapshots/integration__workspace_symbol__filter_type_section.snap
-2021/06/03 | 1352244 | systems/texlive/tlnet/archive/hep-paper.doc.r59436.tar.xz
-2021/06/03 | 1297 | macros/generic/expkv-cs/README.md
-2021/06/03 | 1286 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__environment_nested_missing_braces.snap
-2021/06/03 | 1282 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__structure_enum_item.snap
-2021/06/03 | 126 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__parameter.snap
-2021/06/03 | 1269 | support/texlab/src/line_index_ext.rs
-2021/06/03 | 1265 | support/texlab/src/features/hover.rs
-2021/06/03 | 125 | support/texlab/tests/integration/main.rs
-2021/06/03 | 124 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__parameter_error.snap
-2021/06/03 | 124 | support/texlab/src/features/formatting/snapshots/texlab__features__formatting__bibtex_internal__tests__concatenation.snap
-2021/06/03 | 12489 | support/texlab/src/features/formatting/bibtex_internal.rs
-2021/06/03 | 1243 | support/texlab/tests/integration/issues.rs
-2021/06/03 | 123 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__invalid_parameter.snap
-2021/06/03 | 1232 | systems/texlive/tlnet/archive/collection-bibtexextra.r59433.tar.xz
-2021/06/03 | 1210 | support/texlab/tests/integration/snapshots/integration__completion__latex__citation.snap
-2021/06/03 | 1209 | support/texlab/tests/integration/snapshots/integration__completion__latex__color_model_define_color_set.snap
-2021/06/03 | 117 | support/texlab/src/features/formatting/snapshots/texlab__features__formatting__bibtex_internal__tests__command.snap
-2021/06/03 | 11519 | support/texlab/tests/integration/document_symbol.rs
-2021/06/03 | 114 | support/texlab/src/features/formatting/snapshots/texlab__features__formatting__bibtex_internal__tests__trailing_comma.snap
-2021/06/03 | 114 | support/texlab/src/features/formatting/snapshots/texlab__features__formatting__bibtex_internal__tests__insert_braces.snap
-2021/06/03 | 11495 | support/texlab/tests/integration/common.rs
-2021/06/03 | 114700 | info/tex-nutshell/tex-nutshell.tex
-2021/06/03 | 1141 | support/texlab/src/syntax/latex/analysis.rs
-2021/06/03 | 1138 | support/texlab/src/features/rename.rs
-2021/06/03 | 1136 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__environment_nested.snap
-2021/06/03 | 11355 | systems/win32/miktex/tm/packages/graphics-def.tar.lzma
-2021/06/03 | 111 | support/texlab/src/features/formatting/snapshots/texlab__features__formatting__bibtex_internal__tests__preamble.snap
-2021/06/03 | 1115 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__environment_definition.snap
-2021/06/03 | 109774 | macros/generic/expkv/expkv.dtx
-2021/06/03 | 10936 | systems/texlive/tlnet/archive/graphics-def.r59435.tar.xz
-2021/06/03 | 1084 | support/texlab/src/features/definition.rs
-2021/06/03 | 1080 | support/texlab/tests/integration/snapshots/integration__completion__bibtex__entry_type_complete.snap
-2021/06/03 | 10808 | systems/texlive/tlnet/archive/context-vim.doc.r59432.tar.xz
-2021/06/03 | 107 | support/texlab/src/features/formatting/snapshots/texlab__features__formatting__bibtex_internal__tests__string.snap
-2021/06/03 | 1078 | support/texlab/tests/integration/snapshots/integration__document_symbol__float_flat.snap
-2021/06/03 | 1077 | support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_two_fields.snap
-2021/06/03 | 1074 | support/texlab/tests/integration/snapshots/integration__document_symbol__equation_flat.snap
-2021/06/03 | 1074 | support/texlab/src/distro/texlive.rs
-2021/06/03 | 10656 | support/texlab/src/syntax/bibtex/parser.rs
-2021/06/03 | 10640 | systems/texlive/tlnet/archive/hep-paper.r59436.tar.xz
-2021/06/03 | 1051 | support/texlab/tests/integration/snapshots/integration__document_symbol__section_flat.snap
-2021/06/03 | 1050 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__class_include_options.snap
-2021/06/03 | 10493584 | systems/win32/miktex/tm/packages/reledmac.tar.lzma
-2021/06/03 | 1048 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__package_include_options.snap
-2021/06/03 | 104723 | macros/latex/contrib/ocgx2/ocgx2.sty
-2021/06/03 | 10438 | support/texlab/src/features/semantic/bibtex.rs
-2021/06/03 | 1038 | support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__string_concatenation.snap
-2021/06/03 | 103642 | macros/latex/contrib/derivative/derivative.tex
-2021/06/03 | 1035 | support/texlab/tests/integration/snapshots/integration__workspace_symbol__filter_type_item.snap
-2021/06/03 | 102 | support/texlab/src/features/formatting/snapshots/texlab__features__formatting__bibtex_internal__tests__parens.snap
-2021/06/03 | 10120 | systems/texlive/tlnet/archive/context-vim.r59432.tar.xz
-2021/06/03 | 1011400 | systems/texlive/tlnet/archive/libertinust1math.r59430.tar.xz
-2021/06/03 | 100 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__empty.snap
-2021/06/03 | 10078 | macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa-mecheng.sty
-2021/06/03 | 10060 | systems/texlive/tlnet/archive/biblatex-cv.r59433.tar.xz
-2021/06/03 | 1005 | support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_complete_parens.snap
diff --git a/graphics/pictex/addon/autoarea/ANNOUNCE.txt b/graphics/pictex-addons/autoarea/ANNOUNCE.txt
index fa1d7034b5..fa1d7034b5 100644
--- a/graphics/pictex/addon/autoarea/ANNOUNCE.txt
+++ b/graphics/pictex-addons/autoarea/ANNOUNCE.txt
diff --git a/graphics/pictex/addon/autoarea/README b/graphics/pictex-addons/autoarea/README
index 5ab324fe2f..5ab324fe2f 100644
--- a/graphics/pictex/addon/autoarea/README
+++ b/graphics/pictex-addons/autoarea/README
diff --git a/graphics/pictex/addon/autoarea/autoarea.sty b/graphics/pictex-addons/autoarea/autoarea.sty
index 84aa0160a7..84aa0160a7 100644
--- a/graphics/pictex/addon/autoarea/autoarea.sty
+++ b/graphics/pictex-addons/autoarea/autoarea.sty
diff --git a/graphics/pictex/addon/autoarea/autodemo/README.autodemo b/graphics/pictex-addons/autoarea/autodemo/README.autodemo
index 39b8f0abda..39b8f0abda 100644
--- a/graphics/pictex/addon/autoarea/autodemo/README.autodemo
+++ b/graphics/pictex-addons/autoarea/autodemo/README.autodemo
diff --git a/graphics/pictex/addon/autoarea/autodemo/autodemo+.pdf b/graphics/pictex-addons/autoarea/autodemo/autodemo+.pdf
index 4ceb8ed8c8..4ceb8ed8c8 100644
--- a/graphics/pictex/addon/autoarea/autodemo/autodemo+.pdf
+++ b/graphics/pictex-addons/autoarea/autodemo/autodemo+.pdf
Binary files differ
diff --git a/graphics/pictex/addon/autoarea/autodemo/autodemo+.tex b/graphics/pictex-addons/autoarea/autodemo/autodemo+.tex
index e59401a480..e59401a480 100644
--- a/graphics/pictex/addon/autoarea/autodemo/autodemo+.tex
+++ b/graphics/pictex-addons/autoarea/autodemo/autodemo+.tex
diff --git a/graphics/pictex/addon/autoarea/autodemo/autodemo-.pdf b/graphics/pictex-addons/autoarea/autodemo/autodemo-.pdf
index 03887de455..03887de455 100644
--- a/graphics/pictex/addon/autoarea/autodemo/autodemo-.pdf
+++ b/graphics/pictex-addons/autoarea/autodemo/autodemo-.pdf
Binary files differ
diff --git a/graphics/pictex/addon/autoarea/autodemo/autodemo-.tex b/graphics/pictex-addons/autoarea/autodemo/autodemo-.tex
index 3512c1d65a..3512c1d65a 100644
--- a/graphics/pictex/addon/autoarea/autodemo/autodemo-.tex
+++ b/graphics/pictex-addons/autoarea/autodemo/autodemo-.tex
diff --git a/graphics/pictex/addon/autoarea/autodemo/autodemo.tex b/graphics/pictex-addons/autoarea/autodemo/autodemo.tex
index e033f3ff52..e033f3ff52 100644
--- a/graphics/pictex/addon/autoarea/autodemo/autodemo.tex
+++ b/graphics/pictex-addons/autoarea/autodemo/autodemo.tex
diff --git a/macros/latex/contrib/cooking-units/cooking-units.dtx b/macros/latex/contrib/cooking-units/cooking-units.dtx
index 0e01884a27..ee29c982c3 100644
--- a/macros/latex/contrib/cooking-units/cooking-units.dtx
+++ b/macros/latex/contrib/cooking-units/cooking-units.dtx
@@ -82,7 +82,7 @@ for the details of that license.
%\keepsilent
\askforoverwritefalse
\preamble
-Copyright (C) 2016--2020 by Ben Vitecek (current Maintainer)
+Copyright (C) 2016--2021 by Ben Vitecek (current Maintainer)
This file may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
@@ -182,7 +182,14 @@ and the derived file cooking-units.sty.
\NewDocumentCommand \cookingunitsToDo { m }
{
-% \marginpar { \textcolor{red}{#1} }
+ \marginpar { \textcolor{red}{#1} }
+ }
+\NewDocumentCommand \cookingunitsTODO { m } { \cookingunitsToDo {#1} }
+\NewDocumentCommand \cookingunitsContinue { } { \cookingunitsToDo {Continue} }
+\NewDocumentCommand \cookingunitsCONTINUE { } { \cookingunitsContinue }
+\NewDocumentCommand \cookingunitsChecked { }
+ {
+ \cookingunitsToDo{Checked}
}
@@ -210,7 +217,10 @@ and the derived file cooking-units.sty.
declarecookingderivatives ,
cufrac ,
cusetoptionfor, cuaddoptionfor, cuclearoptionfor,
- cudeclareunitgroup, cuaddtounitgroup, cuclearunitgroup
+ cudeclareunitgroup, cuaddtounitgroup, cuclearunitgroup ,
+ cudefinekeys ,
+ , cudefinekeychain , cuaddtokeychain
+ , cudeclareunitgroup
}
\NewDocumentCommand \mycs { m }
@@ -219,9 +229,9 @@ and the derived file cooking-units.sty.
{
\cs_if_exist:cTF {#1}
{ \cs{\textcolor{blue}{#1}} }
- { \mycsERRORII }
+ { \tl_show:n {#1}\mycsERRORII }
}
- { \mycsERROR }
+ { \tl_show:n {#1} \mycsERROR }
}
\newcommand\opt{\texttt}
\newcommand\myunit{\texttt}
@@ -233,14 +243,12 @@ and the derived file cooking-units.sty.
%: \PrintUnit
\NewDocumentCommand \PrintUnit { o m }
{
- \SaveTranslation \l_tmpa_tl { #2 (cu-unitname) }
+ \__cookingunits_culang_let:nnN { name } {#2} \l_tmpa_tl
\tl_if_eq:NNF \l_tmpa_tl \q__cookingunits_no_translation
{ \l_tmpa_tl }
\IfNoValueF {#1} {#1}
&
- \texttt {#2}
- &
- \tl_use:c { l__cookingunits_default_unit_ #2 _tl }
+ \PrintUnitSymbol {#2}
}
\NewDocumentCommand \PrintUnitSymbol { m }
{
@@ -258,7 +266,6 @@ and the derived file cooking-units.sty.
\msg_redirect_name:nnn { cooking-units } { curef-forbidden-unit } { warning }
}
-
%% Allyourwhitespacearebelongtous (too long)
%% 42
%% Miep!
@@ -272,16 +279,18 @@ and the derived file cooking-units.sty.
{
\begin{center}
\begin{minipage}{0.4\linewidth}
- \tl_replace_all:Nnn \BODY { @ } { \dothewhitespace }
- \tl_replace_all:Nnn \BODY { \% } { \color{red} \% \ignorespaces }
- \tl_replace_all:Nnn \BODY { \\ } { \\ \color{black} }
- \tl_replace_all:Nnn \BODY { & } { \ignorespaces }
- \BODY
+ \hbadness=10000
+ \tl_replace_all:Nnn \BODY { @ } { \dothewhitespace }
+ \tl_replace_all:Nnn \BODY { \% } { \color{red} \% \ignorespaces }
+ \tl_replace_all:Nnn \BODY { \\ } { \\ \color{black} }
+ \tl_replace_all:Nnn \BODY { & } { \ignorespaces }
+ \BODY
\end{minipage}
#1
\int_zero:N \l_tmpa_int
\begin{minipage}{0.5\linewidth}
+ \hbadness=10000
\ttfamily
\tl_set_rescan:Nno \l_tmpa_tl
{
@@ -289,6 +298,7 @@ and the derived file cooking-units.sty.
\char_set_catcode_other:N \} %
\char_set_catcode_other:N \_ %
\char_set_catcode_other:N \~ %
+% \char_set_catcode_other:N \# %
}
{ \BODY }
\tl_map_inline:Nn \l_tmpa_tl
@@ -297,46 +307,27 @@ and the derived file cooking-units.sty.
{
\cs_if_eq:NNTF ##1 \\
{ \textbackslash\textbackslash \\ }
- {
- \tl_set_rescan:Nnn \l_tmpb_tl
- {
- \char_set_catcode_ignore:N \\ %
- \char_set_catcode_ignore:N \ %
- }
- {##1}
- \textbackslash \textcolor{blue}{\l_tmpb_tl}
- }
- }
- {
- \bool_lazy_any:nTF
- {
- { \str_if_eq_p:nn {##1} { @ } }
- { \str_if_eq_p:nn {##1} { ! } }
- { \str_if_eq_p:nn {##1} { & } }
- }
- {
- \str_if_eq:nnTF {##1} { & }
- { \space }
- {
- \str_if_eq:nnTF {##1} { ! }
- { \ERROR }
- { \\ }
- }
- }
+ { \textbackslash \textcolor{blue}{\cs_to_str:N ##1} }
+ }{
+ \token_if_letter:NTF ##1
+ {##1}
{
- \token_if_active:NTF ##1
- {##1}
+ \str_case:nnF {##1}
{
- \token_if_parameter:NTF ##1
- {
- \int_compare:nNnTF { \l_tmpa_int } = { 0 }
+ { @ } { \\ }
+ { & } { \space }
+ }{
+ \token_if_active:NTF ##1
+ {##1}
+ {
+ \token_if_parameter:NTF ##1
{
- \c_hash_str
- \int_incr:N \l_tmpa_int
+ \int_compare:nNnTF { \l_tmpa_int } = { 0 }
+ { \c_hash_str \int_incr:N \l_tmpa_int }
+ { \int_zero:N \l_tmpa_int }
}
- { \int_zero:N \l_tmpa_int }
+ { ##1 {} }
}
- { ##1 {} }
}
}
}
@@ -417,7 +408,7 @@ and the derived file cooking-units.sty.
}
\cs_new_eq:NN \__table_default_midrule: \__table_midrule:
-\cs_new:Npn \_cook_use:n #1
+\cs_new:Npn \__cu_use:n #1
{ \cs_if_exist_use:cF { __cookingunits_#1 } {\ERRORcommandNOTexist} }
\NewDocumentCommand \CreateTableForLanguages { s >{\TrimSpaces} m }
@@ -445,55 +436,64 @@ and the derived file cooking-units.sty.
{ THEEND } { \\ \bottomrule }
}{
\__table_midrule:
- \texttt{##1}
- &
- \clist_if_in:NnTF \l_list_of_textunits_clist {##1}
- { \l_translation_does_not_exist_tl }
- {
- \_cook_use:n { translate_let:nNnV } {#1} \l_tmpa_tl {##1} \c__cookingunits_postfix_unit_tl
- \tl_if_in:NnTF \l_tmpa_tl \q__cookingunits_no_translation
- { \l_translation_does_not_exist_tl }
- { \l_tmpa_tl }
- }
- &
- \_cook_use:n { translate_let:nNnV } {#1} \l_tmpa_tl {##1} \c__cookingunits_postfix_unitname_tl
- \tl_if_in:NnTF \l_tmpa_tl \q__cookingunits_no_translation
- { \l_translation_does_not_exist_tl }
- { \l_tmpa_tl }
- &
- \_cook_use:n { translate_let:nNnV } {#1} \l_tmpa_tl {##1} \c__cookingunits_postfix_unitname_tl
- \_cook_use:n { translate_let:nNnV } {#1} \l_tmpb_tl {##1} \c__cookingunits_postfix_unitname_pl_tl
- \tl_if_eq:NNF \l_tmpa_tl \l_tmpb_tl
- {
- \tl_if_in:NnTF \l_tmpb_tl \q__cookingunits_no_translation
- { \l_translation_does_not_exist_tl }
- { (\l_tmpb_tl) }
- }
- &
- \_cook_use:n { translate_let:nNnV } {#1} \l_tmpa_tl {##1} \c__cookingunits_postfix_gender_tl
- \tl_if_in:NnTF \l_tmpa_tl \q__cookingunits_no_translation
- { \l_translation_does_not_exist_tl }
- { \l_tmpa_tl }
+ \__cookingunits_doc_print_table_row:nn {#1} {##1}
}
}
}
-\NewDocumentCommand \CreateTableForPhrases { >{\TrimSpaces} m }
+\cs_new:Npn \__cookingunits_doc_print_table_row:nn #1#2
{
- \tl_set:Nn \l_tmpa_tl {#1}
- \__cookingunits_phrase_list_get_for:NNTF \l_tmpa_prop \l_tmpa_tl
+ \texttt{#2}
+ &
+ \clist_if_in:NnTF \l_list_of_textunits_clist {#2}
+ { \l_translation_does_not_exist_tl }
+ {
+ \__cu_use:n { culang_let_for:nnnN } {#1} { unit-symbol } {#2} \l_tmpa_tl
+ \tl_if_in:NnTF \l_tmpa_tl \q__cookingunits_no_translation
+ { \l_translation_does_not_exist_tl }
+ { \l_tmpa_tl }
+ }
+ &
+ \__cu_use:n { culang_let_for:nnnN } {#1} { name } {#2} \l_tmpa_tl
+ \tl_if_in:NnTF \l_tmpa_tl \q__cookingunits_no_translation
+ { \l_translation_does_not_exist_tl }
+ { \l_tmpa_tl }
+ &
+ \__cu_use:n { culang_let_for:nnnN } {#1} { name } {#2} \l_tmpa_tl
+ \__cu_use:n { culang_let_for:nnnN } {#1} { name-pl } {#2} \l_tmpb_tl
+ \str_if_eq:NNF \l_tmpa_tl \l_tmpb_tl
{
- \__cookingunits_translate_let:VNnV \l_tmpa_tl \l_tmpa_seq
- { phrase-clist } \c__cookingunits_postfix_phrase_tl
+ \tl_if_in:NnTF \l_tmpb_tl \q__cookingunits_no_translation
+ { \l_translation_does_not_exist_tl }
+ { (\l_tmpb_tl) }
+ }
+ &
+ \__cu_use:n { culang_let_for:nnnN } {#1} { gender } {#2} \l_tmpa_tl
+ \tl_if_in:NnTF \l_tmpa_tl \q__cookingunits_no_translation
+ { \l_translation_does_not_exist_tl }
+ { \l_tmpa_tl }
+ }
+
+\NewDocumentCommand \CreateTableForPhrases { >{\TrimSpaces} m }
+ {
+ \seq_clear:N \l_tmpa_seq
+ \__cu_use:n { culang_let_for:nnnN } {#1} { phrase } { phrase-prop } \l_tmpa_prop
+ \prop_if_exist:NTF \l_tmpa_prop
+ {
+ \tl_if_eq:NNTF \q__cooking_units_no_translation \l_tmpa_prop
+ { \ERRORCreateTablePhraseII }
+ {
+ \prop_get:NnN \l_tmpa_prop { seq } \l_tmpa_seq
+ }
}
- { \ERRORCreateTable }
+ { \ERRORCreateTablePhraseI }
\seq_gput_right:Nn \l_tmpa_seq { THEEND }
\cs_gset_eq:NN \__table_midrule: \__table_default_midrule:
- \begin{tabular}{ l l l l l }
- \toprule
- \meta{Phrase-key} & phrase & (plural) & gender
+ \begin{tabular}{ l l l l l }
+ \toprule
+ \meta{Phrase-key} & phrase & (plural) & gender
\CreatePhraseTableRow {#1}
- \end{tabular}
+ \end{tabular}
}
\NewDocumentCommand \CreatePhraseTableRow { m }
@@ -507,16 +507,15 @@ and the derived file cooking-units.sty.
}{
\__table_midrule:
##1
- &
- \prop_get:NnN \l__cookingunits_phrase_prop {##1} \l_tmpa_tl
- \tl_gset:NV \l_tmpa_tl \l_tmpa_tl %% Damit global
- \l_tmpa_tl
- &
- \prop_get:NnN \l__cookingunits_phrase_prop {##1-pl} \l_tmpb_tl
- \tl_if_eq:NNF \l_tmpa_tl \l_tmpb_tl { \l_tmpb_tl }
- &
- \__cookingunits_translate_let:nNnV {#1}
- \l_tmpa_tl { ##1 -phrase-gender } \c__cookingunits_postfix_gender_tl
+ &
+ \prop_get:NnN \l_tmpa_prop {##1} \l_tmpa_tl
+ \tl_gset:NV \l_tmpa_tl \l_tmpa_tl %% Damit global
+ \l_tmpa_tl
+ &
+ \prop_get:NnN \l_tmpa_prop {##1-pl} \l_tmpb_tl
+ \tl_if_eq:NNF \l_tmpa_tl \l_tmpb_tl { \l_tmpb_tl }
+ &
+ \prop_get:NnN \l_tmpa_prop {##1-gender} \l_tmpa_tl
\l_tmpa_tl
}
}
@@ -593,29 +592,41 @@ and the derived file cooking-units.sty.
culabel,
curef,
cudefinephrase,
- declarecookingderivatives
+ declarecookingderivatives,
+ , cudefinekeychain
+ , cuaddtokeychain
+ , cudeclareunitgroup
+ , cusetoptionfor
+ , usepackage
}
}
-\newcommand\eneunit[3]{\sfrac{#1\,#2${}^2$}{#3${}^2$}}
-%% Can overflow and takes too long, hard code it
-%\declarecookingderivatives{kg,m,s}{#1*#2-#3}{ (#1)*(#2)^2/(#3)^2 } {\eneunit{#1}{#2}{#3}}
-\newcookingunit[\eneunit{kg}{m}{s}]{kg*m-s}
-\newcookingunit[\eneunit{oz}{in}{min}]{oz*in-min}
\newcookingunit {st}
\newcookingunit [\ensuremath{ {} ^ { \circ } }\kern-\scriptspace R{\text{\o}}] {Ro}
\newcookingunit {ft}
+\newcookingunit {km}
-\cuaddkeys {lb}
- {
- {st} { 1/14 } %% 1 lb are 1/14 st
- }
+%\cuaddkeys {lb}
+% {
+% {st} { 1/14 } %% 1 lb are 1/14 st
+% }
+\cuaddtokeychain
+ {
+ {lb} { 14 }
+ {st} { 1 }
+ }
\cuaddtokeys {m} {ft} {0.3048}
+\cuaddtokeys {m} {km} {1000}
\cuaddsinglekeys {C}
{
{Ro} { #1*21/40 + 7.5 }
}
+\newcommand\eneunit[3]{\sfrac{#1\,#2${}^2$}{#3${}^2$}}
+%% Can overflow and takes too long, hard code it
+\declarecookingderivatives{kg,m,s}{#1*#2:#3}{ (#1)*(#2)^2/(#3)^2 } {\eneunit{#1}{#2}{#3}}
+\declarecookingderivatives{m,s}{#1:#2}{ (#1)/(#2) } {\sfrac{#1}{#2}}
+
\cusetup
@@ -772,7 +783,7 @@ and the derived file cooking-units.sty.
% \changes {2018/06/05} {1.40} {Bugfix (\texttt{label-not-defined}): Add |'#1'|.}
% \changes {2018/06/05} {1.40} {Bugfix (\texttt{unit-change}): \opt{convert-to-eV}
% can be again used as a local argument.}
-% \changes {2018/06/05} {1.40} {Change order of boolean testing for |\@@_calc_references:NN|.}
+% \changes {2018/06/05} {1.40} {Change order of boolean testing for |\@@_calc_references_and_store_in:N|.}
% \changes {2018/06/05} {1.40} {Bugfix (\texttt{phrases}): Use the phrase from the first amount to check
% the second (and don't parse through the second amount).}
%
@@ -782,6 +793,16 @@ and the derived file cooking-units.sty.
% \changes {2018/09/24} {1.45} {New section in documentation.}
% \changes {2018/09/24} {1.45} {Remove exhaustive expansion from internals (shouldn't change anything for users).}
%
+% \changes {2021/03/21} {2.00} {Overall reworking of internal code.}
+% \changes {2021/03/21} {2.00} {Much better error handling.}
+% \changes {2021/03/21} {2.00} {Remove exhaustive expansion from translations. Shouldn't really change anything.}
+% \changes {2021/03/21} {2.00} {New options: \opt{definition/symbol}, \opt{definition/gender}, \opt{definition/set-option}, \opt{definition/add-to-group}. }
+% \changes {2021/03/21} {2.00} {Adding keys to unit definition.}
+% \changes {2021/03/21} {2.00} {Updatet |\declarecookingderivatives|.}
+% \changes {2021/03/21} {2.00} {New commands: |\cudefinekeychain|, |\cuaddtokeychain|}
+% \changes {2021/03/21} {2.00} {New joke options: \opt{nothing-special}, \opt{going-bonkers}, \opt{fully-bonkers} and \opt{xD-lol}.}
+% \changes {2021/03/21} {2.00} {New commands to define keys: \mycs{cudefinekeychain} and \mycs{cuaddtokeychain}.}
+% \changes {2021/03/21} {2.00} {Using commands as unit-keys now works.}
%
%
%
@@ -798,26 +819,26 @@ and the derived file cooking-units.sty.
%
% \maketitle
%
+%
% \begin{documentation}
% \begin{abstract}
% This package enables user to globally format units, to switch
% between them and change your recipes to a given
% number of persons.
%
-% For not implemented units or differences between Imperial and U.S.\ unit
-% you may have a look at \cref{sec:other-units}.
+% For not implemented units or differences between Imperial and U.S.\ unit
+% you may have a look at \cref{sec:other-units}.
%
% It should be used for light-hearted things like
% cookery books (and not e.g. scientific texts; use e.g.\ \pkg{siunitx} for those).
%
-% Please read through the section \enquote{Important Changes}
+% ^^A Please read through the section \enquote{Important Changes}
% \end{abstract}
%
% \tableofcontents
%
% \section{Introduction}
%
-%
% While writing on a cookery book I used -- for some reasons whatsoever --
% three different units for weight: kilogram (kg), gram (g) and
% decagram (dag, or older: dkg). Later my mother told me that she
@@ -830,30 +851,10 @@ and the derived file cooking-units.sty.
% more pleasant than \LaTeXe) and here it is.
%
%
-% \begin{comment}
-% \subsection{Overview}
-% \begin{description}
-% \item[Language] I am now using the \pkg{translations} package
-% and I hope it makes things easier. As such, declaring the used language
-% through class options shouldn't be necessary anymore.
-% \item[Phrases] This package now supports the usage of \enquote{phrases}
-% (words used instead of certain integers) (which I think are called \enquote{counting
-% measures} in english, but I am not sure).
-% \item[\cCutext] If no translation is found for a specific language,
-% \cCutext\ are replaced by \mycs{cunum} with a warning is given.
-% \item[Commands] Currently, it seems that allowing \meta{label}
-% to be set by arrow-brackets was not the best idea as it leads to problems
-% if they are made active (e.g. \pkg{babel} and option \opt{spanish}). As such,
-% |<| is not allowed as a \enquote{special-sign} anymore as this package
-% tries to \enquote{fix} this idea (at least make it work). If any problems occur
-% (for this specific case or in general) please feel free to contact me.
-% \end{description}
-% \end{comment}
%
%
%
% \subsection{Supported languages}
-% \cookingunitsToDo{Passt.}
% \begin{itemize}
% \item German
% \item English
@@ -865,9 +866,9 @@ and the derived file cooking-units.sty.
%
% \section {The Commands}
% \label{sec:commands}
-% \cookingunitsToDo{Passt.}
+%
%
-% This package offers the following commands for unit printing (and
+% This package offers the following commands for number/unit printing (and
% converting):
%
% \begin{itemize}
@@ -885,7 +886,7 @@ and the derived file cooking-units.sty.
% added and defined, see \cref{sec:pred-units} and
% \cref{sec:def-units} for further information.}. It furthermore
% allows the sign \texttt{?} to be used as a placeholder for not known
-% amounts and raises a warning to remind that this amount needs a
+% amounts and raises a warning to remind you that this amount needs a
% check-up\footnote{You can customize this behavior, see
% \cref{sec:options}}. \oarg{space} adds a space between the number
% and the unit using \lstinline|\phantom|.
@@ -932,7 +933,6 @@ and the derived file cooking-units.sty.
%^^A \lstinline|\Cutext| capitalizing the first letter (using package
%^^A \pkg{fmtcount}).
%
-%
% \begin{cuexamplecode}
% \cutext{1}{l} \\
% \Cutext{1}{l} \\
@@ -940,7 +940,7 @@ and the derived file cooking-units.sty.
% \cutext{12}{l} \\
% \Cutext{13}{l}
% \end{cuexamplecode}
-% and using (e.g.) package option \opt{use-fmtcount-numerals=true}
+% and using (e.g.)\ package option \opt{use-fmtcount-numerals=true}
% \cusetup{print-numerals=true}
% \begin{cuexamplecode}
% \cutext{1}{l} \\
@@ -984,8 +984,9 @@ and the derived file cooking-units.sty.
% by a word; such as \enquote{12} becoming \enquote{dozen}\footnote{At least I think})
% which can be activated by the option \opt{use-phrases}
% (as I don't know any english phrases, I switched the language to german for the following examples)
-% \begin{myde}
+%^^A \begin{myde}
% \begin{cuexamplecode}
+% \selectlanguage{ngerman} @
% \cusetup{use-phrases=true} @
% \cuam{11} \\
% \cuam{12} \\
@@ -996,12 +997,12 @@ and the derived file cooking-units.sty.
% \cuam{18} \\
% \cuam{60}
% \end{cuexamplecode}
-% \end{myde}
+%^^A \end{myde}
%
%
% \section{Label \& refs: Changing the amount of the recipe}
% \label{sec:labeletref}
-% \cookingunitsToDo{Also not much to change}
+%
%
% What if you don't want to change units, but the amounts of the recipe because
% you cook not for 4 persons, but for 2 and don't like to do the math?
@@ -1061,86 +1062,18 @@ and the derived file cooking-units.sty.
%
%
%
-% \begin{comment}
-% \section{Some Interesting options}
-% \cookingunitsToDo{This section is horrible, change or delete as a whole, but later}
-% This package has some options which might be of interest and to highlight them, this section exists. All options can be
-% found in \cref{sec:options}.
-%
-%
-%\subsection{Numerals}
-% \begin{cuinterest}{use-fmtcount-numerals, use-numerals-below, print-numerals}
-% As seen above, you can use the \emph{package}-option
-% \opt{use-fmtcount-numerals} to print integers used by \cCutext{} below
-% \opt{use-numerals-below} (13 by default) by \pkg{fmtcount}.
-% You can still decide if numerals should be printed or not with \opt{print-numerals}.
-%
-% \begin{cunote}
-% \opt{use-fmtcount-numerals} is a package option as it needs to load
-% \pkg{fmtcount} which is not loaded by default.
-% \end{cunote}
-%
-% \end{cuinterest}
-%
-% \subsection{Phrases}
-% \begin{cuinterest}{use-phrases}
-% In (I presume) all languages there exist phrases for a given
-% amount or a number of things (think it is called \enquote{counting measurement}).
-% In German you may say instead of
-% \enquote{12}: \enquote{ein Dutzend}. Using this option you can tell this
-% package to replace predefined integers used in \mycs{cuam}
-% by phrases for the currently used language
-% (to define new ones, see \cref{sec:phrases})
-%
-% Using (for example) language \opt{ngerman} (or \opt{naustrian}, etc.) with
-% package option \opt{use-phrases=true} gives:
-% \begin{myde}
-% \begin{cuexamplecode}
-% \cusetup{use-phrases=true} @
-% \cuam{12} \\
-% \cuam{24} \\
-% \cuam{12--24} \\
-% \cuam{12--13} \\
-% \cuam{18} \\
-% \cuam{60}
-% \end{cuexamplecode}
-% \end{myde}
-% This of course also works with the \emph{package}-option \opt{use-fmtcount-numerals}:
-% \begin{myde}
-% \cusetup{print-numerals=true}
-% \begin{cuexamplecode}
-% \cusetup{use-phrases=true} @
-% \cuam{12} \\
-% \cuam{24} \\
-% \cuam{12--24} \\
-% \cuam{12--13} \\
-% \cuam{18} \\
-% \cuam{60}
-% \end{cuexamplecode}
-% \end{myde}
-%
-%
-% \begin{cunote}
-% Currently only the lower-case variant for \opt{use-fmtcount-numerals} is
-% supported. Furthermore this feature is only available for \mycs{cuam}.
-% \end{cunote}
-%
-% \end{cuinterest}
-%
-% \end{comment}
-%
-%
%
%
%
%
%
%\subsection{Rounding temperatures}
+%
%
% By default temperatures are rounded to integers (using \opt{round-precision=0}).
-% Since 1.30 it is possible to round amounts to a negative precision.
+% Since v1.30 it is possible to round amounts to a negative precision.
% If you want to round temperatures to the tens see the following
-% example (\opt{set-option-for-\meta{unit}} is described in \cref{sec:opt:unit-spec}).
+% example (\mycs{cusetoptionfor} is described in \cref{sec:opt:unit-spec}).
%
% \begin{cuexamplecode}
% \cunum{182}{C} \\
@@ -1148,10 +1081,6 @@ and the derived file cooking-units.sty.
% \cunum[C=Re]{180}{C} \\
% \cunum[C=K]{180}{C} \\
% \cusetoptionfor{C,F,K,Re}{ round-precision = -1 } @
-%^^A \cusetup{set-option-for-C = { round-precision = -1 } } @
-%^^A \cusetup{set-option-for-F = { round-precision = -1 } } @
-%^^A \cusetup{set-option-for-Re = { round-precision = -1 } } @
-%^^A \cusetup{set-option-for-K = { round-precision = -1 } } @
% \cunum{182}{C} \\
% \cunum[C=F]{180}{C} \\
% \cunum[C=Re]{180}{C} \\
@@ -1160,38 +1089,27 @@ and the derived file cooking-units.sty.
%
% \section{Predefined units \& some notes}
% \label{sec:pred-units}
-% \cookingunitsToDo{Passt.}
-% \begin{comment}
-% In \cref{tab:def-units} and \cref{tab:some-more-units} (and \cref{tab:strange-units})
-% you can find
-% all predefined units. In \cref{sec:Translations} all translations available
-% are listed.
-% \end{comment}
+%
+%
%
% In \cref{tab:def-units} and you can find all predefined units which can be
% transformed into each other (sorted by group). Other predefined units
-% (which cannot be used for transformation) are shown in \cref{tab:some-more-units}.
+% (which cannot be used for transformations) are shown in \cref{tab:some-more-units}.
% \Cref{tab:strange-units} pretty much exists just for fun.
%
%
-% \begin{table}[htbp]
+% \begin{table}[htb]
% \centering
% \caption{^^A
-%^^A The first column shows a list of predefined unit-keys.
-%^^A The column \enquote{default} shows the abbreviation used if
-%^^A for given language no translation is defined. The translations used for \cCutext\
-%^^A are shown in \cref{sec:Translations}.
-%^^A Note that \enquote{electron volt} exists just for fun.
-%^^A
% This table shows all units which can be transformed into each other, sorted
% by group. The columns \enquote{default} show the abbreviations used if
-% for given language no translation is defined. The translations used for \cCutext\
+% no translation is defined for the given language. The translations used for \cCutext\
% are shown in \cref{sec:Translations}.
% Note that \enquote{electron volt} exists just for fun.
% }
% \smallskip
% \begin{tabular}{ lll @{\hspace{1cm}} lll }
-% \toprule
+% \toprule
% description & key & default & description & key & default \\ \midrule
% \PrintUnit {kg} & \PrintUnit{m} \\
% \PrintUnit {dag} & \PrintUnit{dm} \\
@@ -1216,14 +1134,16 @@ and the derived file cooking-units.sty.
% \label{tab:def-units}
% \end{table}
%
-% \begin{table}[htbp]
+% \begin{table}[htb]
% \centering
% \caption{A (not only) spoonful of (more or less) country and
% language dependent units. Please note that sometimes a
% translation is nearly impossible as a unit
% (e.g. \enquote{saltspoonful}) may not exist in another language
% (like german; at least I never heard of it). So please only use
-% units known to you.}
+% units known to you. For \enquote{tablespoon} and \enquote{teaspoon}
+% I used the german abbreviations \enquote{EL} and \enquote{TL} (because I forgot to
+% change them initially).}
% \smallskip
% \begin{tabular}{ lll }
% \toprule
@@ -1240,7 +1160,7 @@ and the derived file cooking-units.sty.
% \label{tab:some-more-units}
% \end{table}
%
-% \begin{table}[htbp]
+% \begin{table}[htb]
% \centering
% \caption{List of (not really) nonsense units (exist just for fun, there will be
% no support for those units; unless -- of course -- you really want it).}
@@ -1261,50 +1181,85 @@ and the derived file cooking-units.sty.
%
% \section{Defining units}
% \label{sec:def-units}
-% \cookingunitsToDo{Passt.}
+%
+%
% New units can be defined using
% \begin{itemize}
-% \item \mycs{declarecookingunit}\oarg{symbol}\marg{unit-key}
-% \item \mycs{newcookingunit}\oarg{symbol}\marg{new-unit-key}
-% \item \mycs{providecookingunit}\oarg{symbol}\marg{new-unit-key}
-% \end{itemize}
+% \item \mycs{declarecookingunit}\oarg{symbol/key-val-list}\marg{unit-key}
+% \item \mycs{newcookingunit}\oarg{symbol/key-val-list}\marg{unit-key}
+% \item \mycs{providecookingunit}\oarg{symbol/key-val-list}\marg{unit-key}
+% \end{itemize}
%
% \begin{function}{\declarecookingunit,\newcookingunit,\providecookingunit}
% \begin{syntax}
-% \mycs{declarecookingunit}\oarg{symbol}\marg{unit-key}
-% \mycs{newcookingunit}\oarg{symbol}\marg{new-unit-key}
-% \mycs{providecookingunit}\oarg{symbol}\marg{unit-key}
+% \mycs{declarecookingunit}\oarg{symbol/key-val-list}\marg{unit-key}
+% \mycs{newcookingunit}\oarg{symbol/key-val-list}\marg{unit-key}
+% \mycs{providecookingunit}\oarg{symbol/key-val-list}\marg{unit-key}
% \end{syntax}
-% These commands define the unit \meta{unit-key}. If the
-% key is not the same as the printed symbol use \oarg{symbol}.
-% Note that \meta{unit-key} can neither contain |/| nor |,|.
%
-% Please note due to the current implementation catcodes may cause
-% trouble. For example using |:| inside \meta{unit-key} may cause
-% the key to \enquote{not be defined} in the document. If that happens
-% try removing or changing the \meta{unit-key}.
+% These commands define the unit \meta{unit-key}. Note that \meta{unit-key}
+% can neither contain |/| nor |,|; but it is allowed to be a command since v2.00
+% (see examples below).
%
+% If the key is not the same as the printed symbol use the optional argument.
+% It can either contain the symbol you want printed or a key-value list (see below)
+% for more advanced adjustments.
+%
% \mycs{newcookingunit} raises an error if the unit is already defined,
% \mycs{declarecookingunit} creates or (if given) overwrites \meta{symbol}
% and \mycs{providecookingunit} does nothing if the unit is already
% defined.
%
-% All units have male gender |m| by default.
+% All units have male gender |m| by default (unless you change it using a key below).
%
% Some examples:
-% \begin{lstlisting}
+% \begin{lstlisting}[commentstyle=\color{black}]
% \declarecookingunit{kg}
% \declarecookingunit{g}
% \declarecookingunit[Msp.] {Msp}
% \declarecookingunit[\ensuremath{{}^{\circ}}\kern-\scriptspace C] {C}
+% \declarecookingunit{\%} % can use commands now
% \end{lstlisting}
%
% \end{function}
+%
% \begin{cunote}
% The definition of the printed degree Celsius is
% copied and pasted from (a maybe older version of) \pkg{siunitx}.
% \end{cunote}
%
+% \begin{function}{symbol, gender, set-option, add-to-group, natural-unit}
+%
+% \begin{syntax}
+% symbol = \marg{symbol}
+% gender = \marg{m/f/n}
+% set-option = \marg{key-val-list}
+% add-to-group = \marg{group}
+% natural-unit = \marg{true/false}
+% \end{syntax}
+%
+% Those keys can only be used in the optional argument of
+% \mycs{declarecookingunit}, \mycs{newcookingunit} or \mycs{providecookingunit}.
+% They can be used to define some properties of the unit during its initialization.
+%
+% \opt{symbol} allows you to set the printed symbol of the unit. A similar effect can be
+% achieved by just using the optional argument. Use this option if you want to
+% use other keys during the definition. This symbol is used as a fallback for all
+% langauges, if no explicit symbol is found for said langauge.
+%
+% \opt{gender} sets the gender of the unit (default ist |m|). Allowed is |m|, |f| or |n|.
+% Note that this sets the default gender for all languages.
+%
+% \opt{set-option} allows to add some key-vals to the specific unit which are
+% activated once the unit is used. See \cpageref{code:set-option}.
+%
+% \opt{add-to-group} adds the unit defined to \meta{group}. See \cref{sec:opt:unit-spec}
+% for more information.
+%
+% \opt{natural-unit} is a simple true/false switch. If |true| the unit will be specified to be
+% a \enquote{natural-unit}. This is more or less a joke option.
+% \end{function}
+%
%
%
% \begin{function}{\declarecookingderivatives}
@@ -1314,7 +1269,7 @@ and the derived file cooking-units.sty.
% \end{syntax}
%
% \emph{This function is experimental}. Defines new units which are a combination
-% of the units given in \meta{unit-list} \emph{and} their linked-units.
+% of the units given in \meta{unit-list} \emph{and} their key-chain.
% \meta{unit-key}, \meta{mathematical-relation} and \meta{unit-symbol}
% accept |#1| to |#n| as arguments with $n$ being the number of units
% given in \meta{unit-list}. $n$ \emph{cannot} be greater than $8$ (and it will
@@ -1326,91 +1281,97 @@ and the derived file cooking-units.sty.
%
% \end{function}
%
-% \begin{cunote}
-% Due to catcodes (and my inability to deal with them properly)
-% there can be problems when using |:|
-% (and probably other signs) inside \meta{unit-key}.
-% \end{cunote}
-%
% \begin{cuexample}
% Your homework is to change the unit of energy \si{\kg\m\squared\per\s\squared}
% into \si{\ounce\inch\squared\per\minute\squared}. To check if you are correct
% you use \mycs{declarecookingderivatives}:
% \begin{lstlisting}
-% \declarecookingderivatives{kg,m,s}{#1*#2-#3}
+% \declarecookingderivatives{kg,m,s}{#1*#2:#3}
% { (#1)*(#2)^2/(#3)^2 } {\sfrac{#1\,#2${}^2$}{#3${}^2$}}
% \end{lstlisting}
%
-% Using |\cunum[kg*m-s=oz*in-min]{1}{kg*m-s}| shows that
-% \cunum{1}{kg*m-s} is equal to \cunum{196829101.34}{oz*in-min}.
-% (Note: This is \emph{really} experimental and it can easily happen that
-% an \enquote{overflow-error} occurs) (like for me which is why I hard-coded the
-% results after testing).
+% Using |\cunum[kg*m:s=oz*in:min]{1}{kg*m:s}| shows that
+% \cunum{1}{kg*m:s} is equal to \cunum[kg*m:s=oz*in:min]{1}{kg*m:s}.
+%^^A\cunum{196829101.34}{oz*in:min}
+%
+%^^A \cunum[m:s=km:h]{1}{m:s}
%
% \end{cuexample}
%
+% \begin{cunote}
+% As this is a bit more experimental and can easily lead to overflow-errors,
+% no actual \LaTeX\ keys are created with \mycs{declarecookingderivatives}.
+% Internally the keys and possible values are stored in a \emph{huge} property list.
+% If an unknown key is encountered, it checks if said key can be found in the
+% property list.
+% \end{cunote}
+%
+%
+%
%
%
% \section{Defining options to change units}
% \label{sec:defining-opt}
-% \cookingunitsToDo{Passt.}
-% Options (to change units) can be newly defined or added to already existing keys (units)
+%
+%
+%
+% Options (to change units) can be newly defined or added to already existing ones
% using
% \begin{itemize}
-% \item \mycs{cudefinekeys}
+% \item \mycs{cudefinekeychain}
+%^^A \item \mycs{cudefinekeys}
% \item \mycs{cudefinesinglekey}
-% \item \mycs{cuaddkeys}
+% \item \mycs{cuaddtokeychain}
+%^^A \item \mycs{cuaddkeys}
% \item \mycs{cuaddsinglekeys}
-% \item \mycs{cuaddtokeys}
+%^^A \item \mycs{cuaddtokeys}
% \end{itemize}
-% I apologize for the (name) inconsistency between \mycs{cudefinekeys} and
-% \mycs{cudefinesinglekey} (although they are named similarly, they work differently).
%
-% \begin{function}{\cudefinekeys,\cudefinesinglekey}
-% \begin{syntax}
-% \mycs{cudefinekeys}\marg{unit-key-1}
-% \ \ \{
-% \ \ \ \ \marg{unit-key-2} \marg{$1$ unit-key-1 are \dots\ unit-key-2}
-% \ \ \ \ \marg{unit-key-3} \marg{$1$ unit-key-1 are \dots\ unit-key-3}
-% \ \ \ \ \marg{unit-key-4} \marg{$1$ unit-key-1 are \dots\ unit-key-4}
+%
+%
+% \begin{function}{\cudefinekeychain, \cudefinesinglekey }
+% \begin{syntax}
+% \mycs{cudefinekeychain}
+% \ \ \{
+% \ \ \ \ \marg{unit-key-1} \marg{value}
+% \ \ \ \ \marg{unit-key-2} \marg{... unit-key-2 are \meta{value} unit-key-1}
+% \ \ \ \ \marg{unit-key-3} \marg{... unit-key-3 are \meta{value} unit-key-1}
% \ \ \ \ \dots
-% \ \ \}
-%
+% \ \ \}
+%
% \mycs{cudefinesinglekey}\marg{unit-key-1}
% \ \ \{
% \ \ \ \ \marg{unit-key-2} \marg{$1$ unit-key-2 are \dots\ unit-key-1}
% \ \ \ \ \marg{unit-key-3} \marg{$1$ unit-key-3 are \dots\ unit-key-1}
% \ \ \ \ \dots
% \ \ \}
-% \end{syntax}
-%
+% \end{syntax}
% If you define new units (see \cref{sec:def-units}) and cannot add
-% them to already existing keys you can use
-% \lstinline|\cudefinekeys| or \lstinline|\cudefinesinglekey| respectively to
-% define new keys.
+% them to already existing keys you may use
+% \mycs{cudefinekeychain} or \mycs{cudefinesinglekey} respectively to
+% define new key-chains or single keys.
+%
+% \mycs{cudefinekeychain} collects the unit-key's given and defines a key-chain.
+% This allows you to change every unit into every other unit given in the list.
+% So \meta{unit-key-1} can take \meta{unit-key-1}, \meta{unit-key-2}, \meta{unit-key-3},
+% \dots\ as values; \meta{unit-key-2} can take \meta{unit-key-1}, \meta{unit-key-2},
+% \meta{unit-key-3}, \dots\ as values, etc. Please note that \meta{\dots} has to
+% be a number.
%
-% \lstinline|\cudefinekeys| takes \marg{unit-key-1} as a
-% \enquote{basis}, defines a key with the name \meta{unit-key-1} and
-% adds the values \meta{unit-key-1}, \meta{unit-key-2},
-% \meta{unit-key-3}, etc. Furthermore this command also defines the
-% keys \meta{unit-key-2}, \meta{unit-key-3}, etc. with the same
-% values as \meta{unit-key-1}. Please note that \meta{\dots} has to
-% be a number.
-%
% Sometimes it is not that easy and the conversion of one unit into
% another needs are more complicated formula (see for example
% temperatures). If that is the case use
-% \lstinline|\cudefinesinglekey|. As the name says it defines
-% \emph{only} the key \meta{unit-key-1} with the values
+% \mycs{cudefinesinglekey}. As the name says it defines
+% \emph{only} a single key \meta{unit-key-1} with the values
% \meta{unit-key-1}, \meta{unit-key-2}, etc. The advantage of this
% command is that now \meta{\dots} can be a formula and the
-% numerical input can be placed explicitly using \texttt{\#1}.
+% numerical input of \mycs{cunum}, etc.\ can be placed explicitly using \texttt{\#1}.
+% \end{function}
%
%
-% \end{function}
%
-% \begin{cuexample}
%
+% \begin{cuexample}
% This example defines following keys with their respective value:
% \begin{itemize}
% \item the key \myunit{kg} with the values \myunit{kg}, \myunit{dag},
@@ -1421,8 +1382,6 @@ and the derived file cooking-units.sty.
% \myunit{g} and \myunit{oz}
% \item the key \myunit{oz} with the values \myunit{kg}, \myunit{dag},
% \myunit{g} and \myunit{oz}
-% \item the key \myunit{d} with the values \myunit{d}, \myunit{h},
-% \myunit{min} and \myunit{s}
% \item \dots
% \end{itemize}
% \begin{align*}
@@ -1433,22 +1392,41 @@ and the derived file cooking-units.sty.
% \SI{1}{\kg}&= \SI{2.204 622 6}{\pound}
% \end{align*}
% \begin{lstlisting}
-% \cudefinekeys {kg}
+% \cudefinekeychain
% {
+% {kg} { 1 }
% {dag}{ 100 } %% 1 kg are 100 dag
% {g} { 1000 } %% 1 kg are 1000 g
% {oz} { 35.27399 } %% 1 kg are 35.27399 oz
% {lb} { 2.204 622 6 } %% 1 kg are 2.204 622 6 lb
% }
%
-% \cudefinekeys {d}
+% \cudefinekeychain
% {
+% {d} { 1 }
% {h} { 24 } %% 1 day are 24 hours
% {min}{ 1440 } %% 1 day are 1440 minutes
% {s} { 86400 } %% 1 day are 86400 seconds
% }
% \end{lstlisting}
+% \end{cuexample}
+%
+% \begin{cunote}
+% The value of the first item can be something different from $1$.
+% So something like this is also possible:
+% \begin{lstlisting}
+% \cudefinekeychain
+% {
+% {kg} { 0.4535924 }
+% {dag}{ 45.35924 }
+% {g} { 453,5924 }
+% {oz} { 16 }
+% {lb} { 1 }
+% }
+% \end{lstlisting}
+% \end{cunote}
%
+% \begin{cuexample}
% To convert degree Fahrenheit to degree Celsius, kelvin and degree R\'eamur one
% needs the formulas\footnote{See Wikipedia.}
% \begin{align*}
@@ -1459,7 +1437,7 @@ and the derived file cooking-units.sty.
% with $T_F$ being the input temperature in degree Fahrenheit and
% $T_C$ being the same temperature in degree Celsius, etc. Using
% \lstinline|\cudefinesinglekey| the key \myunit{F} with values
-% \myunit{C}, \myunit{K} and \myunit{Re} is defined:
+% \myunit{C}, \myunit{K} and \myunit{Re} is defined by:
%
% \begin{lstlisting}
% \cudefinesinglekey {F}
@@ -1477,14 +1455,13 @@ and the derived file cooking-units.sty.
%
%
%
-% \begin{function}{\cuaddkeys,\cuaddsinglekeys}
-%
+% \begin{function}{\cuaddtokeychain,\cuaddsinglekeys}
% \begin{syntax}
-% \mycs{cuaddkeys}\marg{unit-key-1}
+% \mycs{cuaddtokeychain}
% \ \ \{
-% \ \ \ \ \marg{unit-key-2} \marg{$1$ unit-key-1 are \dots\ unit-key-2}
-% \ \ \ \ \marg{unit-key-3} \marg{$1$ unit-key-1 are \dots\ unit-key-3}
-% \ \ \ \ \marg{unit-key-4} \marg{$1$ unit-key-1 are \dots\ unit-key-4}
+% \ \ \ \ \marg{unit-key-1} \marg{value}
+% \ \ \ \ \marg{unit-key-2} \marg{... unit-key-2 are \meta{value} unit-key-1}
+% \ \ \ \ \marg{unit-key-3} \marg{... unit-key-3 are \meta{value} unit-key-1}
% \ \ \ \ \dots
% \ \ \}
%
@@ -1496,28 +1473,27 @@ and the derived file cooking-units.sty.
% \ \ \}
% \end{syntax}
%
-% These commands add \meta{unit-key-2}, etc. to the already defined
-% key \meta{unit-key-1}.
-%
-% \lstinline|\cuaddkeys| takes the already defined key
-% \marg{unit-key-1} as a \enquote{basis}, and adds
-% \meta{unit-key-2}, \meta{unit-key-3}, etc. to its
-% values. Furthermore it adds those new values to other keys linked
-% to \meta{unit-key-1} and defines the new keys \meta{unit-key-2},
-% etc.\ with the same values as \meta{unit-key-1}.
+% \mycs{cuaddtokeychain} first parses through its unit-list and searches for
+% a base unit key which is already in a key-chain
+% (aka.\ was defined by \mycs{cudefinekeychain}). The other units, not yet
+% part of a key-chain, are added to the same key-chain as the base unit.
+% So the newly added units are available as a key and a value for the other
+% units in the same key-chain. Note that \meta{...} must be a number.
%
%
% If the conversion is more complicated use
% \lstinline|\cuaddsinglekeys|. It adds \meta{unit-key-2}, etc.\ as
% values to \meta{unit-key-1}. The numerical input can be placed
-% using \myunit{\#1} (see \lstinline|\cudefinesinglekey|). This
-% command neither defines new keys nor does it add values to other
-% keys than \meta{unit-key-1}.
+% using \myunit{\#1} (see \mycs{cudefinesinglekey}). This
+% command neither defines new keys nor does it add values to
+% keys other than \meta{unit-key-1}.
%
%
% \end{function}
%
%
+%
+%
% \begin{cuexample}
% Suppose you are British (I am sorry, I can't think of another
% reason to use those units) and you want to implement 'stone' (yes,
@@ -1529,10 +1505,11 @@ and the derived file cooking-units.sty.
% latter one.
% \begin{lstlisting}
% \newcookingunit{st} %% defining new unit 'stone'
-% \cuaddkeys{lb} %% adding st to lb (could also add to kg, dag and oz)
-% {
-% {st} { 1/14 } %% 1 lb are 1/14 st as 14 lb are 1 st
-% }
+% \cuaddtokeychain
+% {
+% {lb} { 14 } %% unit already in a key-chain.
+% {st} { 1 } %% new unit. 1st = 14lb
+% }
% \end{lstlisting}
% \begin{cuexamplecode}
% \cunum[lb=st]{1}{lb} \\
@@ -1544,6 +1521,17 @@ and the derived file cooking-units.sty.
% \end{cuexamplecode}
% \end{cuexample}
%
+% \begin{cunote}
+% Of course using
+% \begin{lstlisting}
+% \cuaddtokeychain
+% {
+% {st} { 1/14 } %% 1lb = 1/14st
+% {lb} { 1 } %% unit already in a key-chain.
+% }
+% \end{lstlisting}
+% is also possible
+% \end{cunote}
%
% \begin{cuexample}
% Now you want to add degree R{\o}mer and convert Celsius to degree
@@ -1555,14 +1543,11 @@ and the derived file cooking-units.sty.
% \begin{lstlisting}
% %% defining new unit 'degree R{\o}mer'
% \newcookingunit [\ensuremath{ {} ^ { \circ } }\kern-\scriptspace R{\o}] {Ro}
-% \cuaddsinglekeys {C} %% adds value 'Ro' to 'C'.
+% \cuaddsinglekeys {C} %% adds value 'Ro' to key 'C'.
% {
% {Ro} { #1 * 21/40 + 7.5 }
% }
-% \cusetup %% round to integer automatically
-% {
-% set-option-for-Ro = { round-precision = 0 }
-% }
+% \cusetoptionfor{Ro}{ round-precision = 0 } %% round to integer automatically
% \end{lstlisting}
% \begin{cuexamplecode}
% \cunum{10}{C} \\
@@ -1578,55 +1563,65 @@ and the derived file cooking-units.sty.
%
%
%
+%
%
%
-% \begin{function}{\cuaddtokeys}
-% \begin{syntax}
-% \mycs{cuaddtokeys} \marg{unit-key-1} \marg{unit-key-2} \marg{$1$ unit-key-2 are \dots\ unit-key-1}
-% \end{syntax}
-% Works similar to \mycs{cuaddkeys} regarding the definition of keys.
-% \end{function}
%
-% \begin{cuexample}
-% Continuing the example from before, this time with \lstinline|\cuaddtokeys|:
-% \begin{lstlisting}
-% \newcookingunit{st} %% defining (again) new unit 'stone'
-% \cuaddtokeys {lb} {st} { 14 } %% 1 st are 14 lb
-% \end{lstlisting}
-% \begin{cuexamplecode}
-% \cunum[lb=st]{1}{lb} \\
-% \cunum[st=lb]{1}{st} \\
-% \cunum[st=g]{1}{st} \\
-% \cunum[st=kg]{1}{st} \\
-% \cunum[kg=st]{1}{kg} \\
-% \cunum[st=kg]{16}{st}
-% \end{cuexamplecode}
-% \end{cuexample}
%
-% \begin{comment}
-% \begin{cuexample}
-% Implementation of \myunit{stick}. From https://cooking.stackexchange.com/questions/784/translating-cooking-terms-between-us-uk-au-ca-nz
-% we know that
-% \[ \SI{1}{\stick} = \SI{0.25}{\lb} \]
%
-% There are two ways to implement \myunit{stick}:
-% either use \mycs{cuaddkeys} or \mycs{cuaddtokeys}.
+% \subsection{Obsolete Commands}
%
-% The easier way (in this case) is \mycs{cuaddtokeys} which is pretty straight forward:
-% \begin{lstlisting}
-% \cuaddtokeys { lb } { st } { 0.25 }
-% \end{lstlisting}
-% \dots\ and finished
-%
-% \end{cuexample}
-% \end{comment}
+% \begin{function}{cudefinekeys}
+% \begin{syntax}
+% \mycs{cudefinekeys}\marg{unit-key-1}
+% \ \ \{
+% \ \ \ \ \marg{unit-key-2} \marg{$1$ unit-key-1 are \dots\ unit-key-2}
+% \ \ \ \ \marg{unit-key-3} \marg{$1$ unit-key-1 are \dots\ unit-key-3}
+% \ \ \ \ \marg{unit-key-4} \marg{$1$ unit-key-1 are \dots\ unit-key-4}
+% \ \ \ \ \dots
+% \ \ \}
+% \end{syntax}
%
+% \emph{This command is going to be obsolete at one point. It is advised to use
+% \mycs{cudefinekeychain} instead.}
%
+% \mycs{cudefinekeys} takes \marg{unit-key-1} as a
+% \enquote{basis}, defines a key with the name \meta{unit-key-1} and
+% adds the values \meta{unit-key-1}, \meta{unit-key-2},
+% \meta{unit-key-3}, etc. Furthermore this command also defines the
+% keys \meta{unit-key-2}, \meta{unit-key-3}, etc. with the same
+% values as \meta{unit-key-1}. Please note that \meta{\dots} has to
+% be a number.
+% \end{function}
%
%
%
+% \begin{function}{\cuaddkeys,\cuaddtokeys}
+% \begin{syntax}
+% \mycs{cuaddkeys}\marg{unit-key-1}
+% \ \ \{
+% \ \ \ \ \marg{unit-key-2} \marg{$1$ unit-key-1 are \dots\ unit-key-2}
+% \ \ \ \ \marg{unit-key-3} \marg{$1$ unit-key-1 are \dots\ unit-key-3}
+% \ \ \ \ \marg{unit-key-4} \marg{$1$ unit-key-1 are \dots\ unit-key-4}
+% \ \ \ \ \dots
+% \ \ \}
%
+% \mycs{cuaddtokeys} \marg{unit-key-1} \marg{unit-key-2} \marg{$1$ unit-key-2 are \dots\ unit-key-1}
+% \end{syntax}
%
+% \emph{Those commands are going to be obsolete at one point. It is advised to use
+% \mycs{cuaddtokeychain} instead.}
+%
+%
+% \lstinline|\cuaddkeys| takes the already defined key
+% \marg{unit-key-1} as a \enquote{basis}, and adds
+% \meta{unit-key-2}, \meta{unit-key-3}, etc. to its
+% values. Furthermore it adds those new values to other keys linked
+% to \meta{unit-key-1} and defines the new keys \meta{unit-key-2},
+% etc.\ with the same values as \meta{unit-key-1}.
+%
+% Works similar to \mycs{cuaddkeys} regarding the definition of keys.
+% \end{function}
%
%
%
@@ -1636,7 +1631,7 @@ and the derived file cooking-units.sty.
%
% \section{Language support}
% \label{sec:language}
-% \cookingunitsToDo{Passt.}
+%
%
% Unit names and symbols depend on the language. To change the
% name and symbol for given language you can use \lstinline|\cudefinename|;
@@ -1658,11 +1653,10 @@ and the derived file cooking-units.sty.
% you may also use the keys \opt{one(m)}, \opt{one(f)} and
% \opt{one(n)}. Integers below a certain
% value (see option \opt{use-numerals-below}) are written-out. The
-% only problem is the written-out \enquote{1} mostly depends on the
+% problem is that the written-out \enquote{1} depends on the
% gender of the word following (e.g. \enquote{ein Baum} (m),
-% \enquote{eine Pflanze} (f) and \enquote{ein Auto} (n)). To set the
-% written-out \enquote{1} to be correct with the gender of the used unit, use
-% these keys (see also examples below)
+% \enquote{eine Pflanze} (f) and \enquote{ein Auto} (n)). Use those keys
+% to set the specific gender of \enquote{1} (see also examples below).
% \end{function}
%
% \begin{function}{\cudefinename}
@@ -1688,7 +1682,7 @@ and the derived file cooking-units.sty.
% \lstinline|\Cutext| is equal to $1$.
%
% \meta{gender} can be \texttt{m} (maskulin), \texttt{f} (feminin) or
-% \texttt{n} (neutrum). If not given \texttt{m} is used as default.
+% \texttt{n} (neutrum). If not given, \texttt{m} is used as default.
% \end{function}
%
% \begin{lstlisting}
@@ -1807,7 +1801,7 @@ and the derived file cooking-units.sty.
%
% Each language has synonyms for certain (integer) numbers. This package
% supports those phrases and they can be implemented with the following
-% command and used by \mycs{cuam}:
+% command to be used by \mycs{cuam}:
%
% \begin{function}{\cudefinephrase}
% \begin{syntax}
@@ -1821,11 +1815,12 @@ and the derived file cooking-units.sty.
%
% This command pairs for a given \marg{Language} (see package \pkg{translations})
% the number \marg{integer-1}
-% with \marg{phrase-1} (\& plural and gender). The package then checks if the amount
+% with \marg{phrase-1} (\& \meta{phrase-1-plural} and \meta{gender-1}).
+% Afterwards the package can check if an amount
% given in \mycs{cuam} is either this number or a \emph{multiple} of it.
%
% If the behavior of checking for a multiple is not wanted, you can use the optional
-% star \texttt{*} for a given \marg{integer}
+% star \texttt{*}.
%
% \meta{gender} can be \opt{m}, \opt{f} or \opt{n}. It is \opt{m} by default.
%
@@ -1833,9 +1828,6 @@ and the derived file cooking-units.sty.
% the phrase with the highest number is used (if used at all).
%
% Furthermore, it chooses star (|*|) phrases over non-star phrases.
-% \begin{cunote}
-% Numbers with the optional star |*| are stored as negative numbers.
-% \end{cunote}
% \end{function}
% \begin{cuexample}
% The following example creates some phrases for the language
@@ -1857,17 +1849,20 @@ and the derived file cooking-units.sty.
% }
% \end{lstlisting}
% Let's just use them (german language activated!):
-% \begin{myde}
+%^^A \begin{myde}
% \begin{cuexamplecode}
+% \selectlanguage{ngerman} @
% \cusetup{use-phrases=true} @
% \cuam{12} \\
% \cuam{24} \\
+% \cuam{25} \\
% \cuam{60} \\
% \cuam{120} \\
+% \cuam{121} \\
% \cuam{6} \\
% \cuam{18}
% \end{cuexamplecode}
-% \end{myde}
+%^^A \end{myde}
%
% As you can see, \enquote{Schock} ($60$) is preferred over \enquote{Dutzend} ($12$)
% as it linked to the higher number. Furthermore, for $6$ the phrase \enquote{halbes
@@ -1880,7 +1875,6 @@ and the derived file cooking-units.sty.
% \section{Options}
% \label{sec:options}
%
-% \cookingunitsToDo{Done. Passr.}
%
% Options in \pkg{cooking-units} can mostly be set globally using
% \lstinline|\cusetup| or locally using the optional argument of the
@@ -1897,7 +1891,7 @@ and the derived file cooking-units.sty.
%
%
% \begin{function}{\cusetoptionfor,\cuaddoptionfor,\cuclearoptionfor}
-%
+% \label{code:set-option}
% \begin{syntax}
% \mycs{cusetoptionfor}\marg{unit-list}\marg{options}
% \mycs{cuaddoptionfor}\marg{unit-list}\marg{options}
@@ -2044,7 +2038,7 @@ and the derived file cooking-units.sty.
% \mycs{cudeclareunitgroup} \marg{group-name} \marg{unit-list}
% \end{syntax}
% Defines the group \meta{group-name} containing the list \meta{unit-list}.
-% This allows the usage of |\meta{group-name}=\meta{unit-key}| to
+% This allows the usage of \texttt{\meta{group-name}=\meta{unit-key}} to
% change all units in the group \meta{group-name} to \meta{unit-key}
% (which has to be part of \meta{unit-list}).
% \end{function}
@@ -2090,33 +2084,34 @@ and the derived file cooking-units.sty.
% \ \dots
% \ \}
% \end{syntax}
+% \emph{This option is going to be obsolete at one point.}
% Adds each \meta{unit-key} in \meta{unit-keys-list} to \meta{group}.
% The key-val equivalent of \mycs{cuaddtounitgroup}.
% \end{function}
-% \begin{cuexample}
-% The same as above:
-% This example adds the unit \myunit{st} to the group \mygroup{weight}
-% and \myunit{Ro} to \mygroup{temperature}.
-% \begin{lstlisting}
-% \cusetup
-% {
-% add-unit-to-group = { weight = {st} , temperature = {Ro} }
-% }
-% \end{lstlisting}
-%
-% \cusetup{ add-unit-to-group = { weight = {st} } }
-%
-% \begin{cuexamplecode}
-% \cusetup{weight=g} @
-% \cunum{1}{kg} \\
-% \cunum{1}{dag} \\
-% \cunum{1}{g} \\
-% \cunum{1}{oz} \\
-% \cunum{1}{lb} \\
-% \cunum{1}{stick} \\
-% \cunum{1}{st}
-% \end{cuexamplecode}
-% \end{cuexample}
+%^^A \begin{cuexample}
+%^^A The same as above:
+%^^A This example adds the unit \myunit{st} to the group \mygroup{weight}
+%^^A and \myunit{Ro} to \mygroup{temperature}.
+%^^A \begin{lstlisting}
+%^^A \cusetup
+%^^A {
+%^^A add-unit-to-group = { weight = {st} , temperature = {Ro} }
+%^^A }
+% ^^A\end{lstlisting}
+%^^A
+%^^A \cusetup{ add-unit-to-group = { weight = {st} } }
+%^^A
+%^^A \begin{cuexamplecode}
+%^^A \cusetup{weight=g} @
+%^^A \cunum{1}{kg} \\
+%^^A \cunum{1}{dag} \\
+%^^A \cunum{1}{g} \\
+%^^A \cunum{1}{oz} \\
+%^^A \cunum{1}{lb} \\
+%^^A \cunum{1}{stick} \\
+%^^A \cunum{1}{st}
+%^^A \end{cuexamplecode}
+%^^A \end{cuexample}
%
%
%
@@ -2125,6 +2120,7 @@ and the derived file cooking-units.sty.
% set-option-for-\meta{unit-key} = \marg{ key1 = value1, \dots\ }
% add-option-for-\meta{unit-key} = \marg{ key1 = value1, \dots\ }
% \end{syntax}
+% \emph{This option is going to be obsolete at one point.}
% Sets and adds \meta{key1=value1,\dots} to a specific
% \meta{unit-key},
% \opt{erase-all-options} (see below) is used to erase all options for all
@@ -2147,24 +2143,23 @@ and the derived file cooking-units.sty.
%
% \end{function}
%
-% \begin{cuexample}
-% The following rounds the values to integers for \myunit{F}, \myunit{C},
-% \myunit{K} and \myunit{Re}:
-% \begin{lstlisting}
-% \cusetup
-% {
-% set-option-for-F = { round-precision = 0 } ,
-% set-option-for-C = { round-precision = 0 } ,
-% set-option-for-K = { round-precision = 0 } ,
-% set-option-for-Re = { round-precision = 0 }
-% }
-% \end{lstlisting}
-% although note that it would be easier to simply write
-% \begin{lstlisting}
-% \cusetoptionfor {F,C,K,Re} { round-precision = 0 }
-% \end{lstlisting}
-%
-% \end{cuexample}
+%^^A \begin{cuexample}
+%^^A The following rounds the values to integers for \myunit{F}, \myunit{C},
+%^^A \myunit{K} and \myunit{Re}:
+%^^A \begin{lstlisting}
+%^^A \cusetup
+%^^A {
+%^^A set-option-for-F = { round-precision = 0 } ,
+%^^A set-option-for-C = { round-precision = 0 } ,
+%^^A set-option-for-K = { round-precision = 0 } ,
+%^^A set-option-for-Re = { round-precision = 0 }
+%^^A }
+%^^A \end{lstlisting}
+%^^A although note that it would be easier to simply write
+%^^A \begin{lstlisting}
+%^^A \cusetoptionfor {F,C,K,Re} { round-precision = 0 }
+%^^A \end{lstlisting}
+%^^A \end{cuexample}
%
%
% \begin{function}{set-option-for, add-option-for}
@@ -2182,6 +2177,7 @@ and the derived file cooking-units.sty.
% \ \dots
% \ \}
% \end{syntax}
+% \emph{This option is going to be obsolete at one point.}
% Sets/adds each \meta{keys=vals} to the specific \meta{unit-key}. Works pretty much
% the same way their \opt{set-option-for-\meta{unit-key}} and
% \opt{add-option-for-\meta{unit-key}} counterparts.
@@ -2190,27 +2186,28 @@ and the derived file cooking-units.sty.
% \mycs{cuaddoptionfor}.
% \end{function}
%
-% \begin{cuexample}
-% The following example does the same as the example above:
-% \begin{lstlisting}
-% \cusetup
-% {
-% set-option-for =
-% {
-% F = { round-precision = 0 } ,
-% C = { round-precision = 0 } ,
-% K = { round-precision = 0 } ,
-% Re = { round-precision = 0 }
-% }
-% }
-% \end{lstlisting}
-% \end{cuexample}
+%^^A \begin{cuexample}
+%^^A The following example does the same as the example above:
+%^^A \begin{lstlisting}
+%^^A \cusetup
+%^^A {
+%^^A set-option-for =
+%^^A {
+%^^A F = { round-precision = 0 } ,
+%^^A C = { round-precision = 0 } ,
+%^^A K = { round-precision = 0 } ,
+%^^A Re = { round-precision = 0 }
+%^^A }
+%^^A }
+%^^A \end{lstlisting}
+%^^A \end{cuexample}
%
% \begin{function}{erase-all-options, erase-all-options-for}
% \begin{syntax}
% erase-all-options
% erase-all-options-for = \marg{unit-key1, unit-key2, \dots}
% \end{syntax}
+% \emph{This option is going to be obsolete at one point.}
% Erase options added to units. \opt{erase-all-options} erases all options
% for \emph{all} \meta{unit-key}s.
%
@@ -2222,18 +2219,18 @@ and the derived file cooking-units.sty.
%
% \end{function}
%
-% \begin{cuexample}
-% The following code erases all attached options from \myunit{C}, \myunit{F},
-% \myunit{K} and \myunit{Re}:
-%
-% \begin{lstlisting}
-% \cusetup{ erase-all-options-for = {C, F, K, Re} }
-% \end{lstlisting}
-% It's the same as
-% \begin{lstlisting}
-% \cuclearoptionfor {C, F, K, Re}
-% \end{lstlisting}
-% \end{cuexample}
+%^^A \begin{cuexample}
+%^^A The following code erases all attached options from \myunit{C}, \myunit{F},
+%^^A \myunit{K} and \myunit{Re}:
+%^^A
+%^^A \begin{lstlisting}
+%^^A \cusetup{ erase-all-options-for = {C, F, K, Re} }
+%^^A \end{lstlisting}
+%^^A It's the same as
+%^^A \begin{lstlisting}
+%^^A \cuclearoptionfor {C, F, K, Re}
+%^^A \end{lstlisting}
+%^^A \end{cuexample}
%
%
%
@@ -2395,7 +2392,8 @@ and the derived file cooking-units.sty.
% \begin{syntax}
% set-cutext-translation-message = \meta{error/warning/none}
% \end{syntax}
-% If a translation for \cCutext\ is not available the commands are replaced
+% If a translation for \cCutext\ is not available for the language,
+% the commands are replaced
% by \mycs{cunum}. Currently -- if this is happening -- a warning is shown,
% you may change the behavior of the message (error, warning or not showing at all)
% using this option.
@@ -2406,14 +2404,14 @@ and the derived file cooking-units.sty.
% print-numerals = \meta{true/false}
% \end{syntax}
%
-% Prints numerals for integers smaller then \opt{use-numerals-below} if
+% Prints numerals for integers smaller than \opt{use-numerals-below} if
% set to \true. If set to \false\ no numerals are printed.
%
% If you use the package option \opt{use-fmtcount-numerals} this option
% is automatically set to \true.
%
% If you want to use another package, just set this option to \true\ and
-% use \opt{numeral-function} and \opt{Numeral-function}.
+% use \opt{numeral-function} and \opt{Numeral-function}).
%
%^^A If the package option \opt{use-fmtcount-numerals} is set to \true\ you can
%^^A deactivate the printing of numerals by setting \opt{print-numerals} to
@@ -2526,7 +2524,7 @@ and the derived file cooking-units.sty.
%
%
%
-% \begin{function}{range-sign}
+% \begin{function}{range-sign, cunum-range-sign, cutext-range-sign}
% \begin{syntax}
% range-sign = \marg{string}
% cunum-range-sign = \marg{string}
@@ -2542,7 +2540,7 @@ and the derived file cooking-units.sty.
% The default for \meta{string} is \texttt{-{}-} (for both).
% \end{function}
%
-% Since version 1.45 there also exits the language symbol \opt{cutext-range-sign}
+% Since version 1.45 there also exists the language symbol \opt{cutext-range-sign}
% (see \cref{sec:language}). If the \emph{option} \opt{cutext-range-sign} is set
% the language symbol will be ignored.
%
@@ -2583,9 +2581,10 @@ and the derived file cooking-units.sty.
% \end{function}
%
% \begin{cuexample}
-% \begin{myde}
+%^^A \begin{myde}
% For the German language:
% \begin{cuexamplecode}
+% \selectlanguage{ngerman} @
% \cuam{12} \\
% \cuam{12--24} \\
% \cuam{36} \\
@@ -2598,7 +2597,7 @@ and the derived file cooking-units.sty.
% \cuam{12--24} \\
% \cuam{36} \\
% \end{cuexamplecode}
-% \end{myde}
+%^^A \end{myde}
% \end{cuexample}
%
%
@@ -2610,8 +2609,7 @@ and the derived file cooking-units.sty.
% \end{syntax}
% Rounds the amount automatically to \meta{integer} digits after the
% colon. Note that units like \myunit{C}, \myunit{F}, \myunit{K} and
-% \myunit{Re} are still rounded to integers due to
-% \texttt{set-option-for-<unit-key>}.
+% \myunit{Re} are still rounded to integers due to \mycs{cusetoptionfor}.
% \end{function}
%
%
@@ -2631,7 +2629,7 @@ and the derived file cooking-units.sty.
% \end{cuexamplecode}
%
% \begin{cunote}
-% Also negative numbers are allowed.
+% Negative numbers are also allowed.
% \begin{cuexamplecode}
% \cusetoptionfor{C,F}{round-precision=-1} @
% \cunum{-271,2}{C} \\
@@ -2710,7 +2708,7 @@ and the derived file cooking-units.sty.
% \cunum{1_1/2}{kg} \\
% \cunum[kg=g]{1_1/2}{kg} \\
% \cunum[kg=g]{-1_1/2}{kg} \\
-% \cunum[kg=g]{1_?/2}{kg} \\
+% \cunum[kg=g]{1_2/?}{kg} \\
% \end{cuexamplecode}
%
%
@@ -2731,7 +2729,7 @@ and the derived file cooking-units.sty.
% \cunum[kg=g]{1/3}{kg} \\
% \cunum{1_1/2}{kg} \\
% \cunum[kg=g]{1_1/2}{kg} \\
-% \cunum[kg=g]{1_?/2}{kg} \\
+% \cunum[kg=g]{1_?/3}{kg} \\
% \end{cuexamplecode}
%
%
@@ -2813,13 +2811,12 @@ and the derived file cooking-units.sty.
% cutext-space = \marg{string}
% \end{syntax}
% \meta{string} is inserted between the numeral part and the unit part
-% when using \cCutext. By default it is set to \cs{space}. Use this option
-% if you want to e.g.\ insert an unbreakable space.
+% when using \cCutext. By default it is set an unbreakable space |~|.
% \end{function}
% \begin{cuexamplecode}
% \cutext{1}{kg}\\
% \Cutext{10}{kg}\\
-% \cusetup { cutext-space = ~ } @
+% \cusetup { cutext-space = \space } @
% \cutext{1}{kg}\\
% \Cutext{10}{kg}\\
% \cusetup { cutext-space = {} } @
@@ -2836,16 +2833,17 @@ and the derived file cooking-units.sty.
% phrase-space = \marg{string}
% \end{syntax}
% \meta{string} is inserted between the numeral part and the phrase part
-% while using \mycs{cuam}. By default it is set to \cs{space}. Use this option
-% if you want to e.g.\ insert an unbreakable space.
+% while using \mycs{cuam}. By default it is set to the unbreakable space |~|. Use this option
+% if you want to e.g.\ insert a normal space.
% \end{function}
-% \begin{myde}
+%^^A \begin{myde}
% \cusetup{use-phrases=true}
% (Switching to german)
% \begin{cuexamplecode}
+% \selectlanguage{ngerman} @
% \cuam{12}\\
% \cuam{144}\\
-% \cusetup { phrase-space = ~ } @
+% \cusetup { phrase-space = \space } @
% \cuam{12}\\
% \cuam{144}\\
% \cusetup { phrase-space = {} } @
@@ -2856,7 +2854,7 @@ and the derived file cooking-units.sty.
% \cuam{144}\\
% \end{cuexamplecode}
% \cusetup{use-phrases=false}
-% \end{myde}
+%^^A \end{myde}
%
% \begin{function}{amount-unit-space}
% \begin{syntax}
@@ -2909,32 +2907,31 @@ and the derived file cooking-units.sty.
% \curef{anotherrecipe}~persons \\
% \cunum<anotherrecipe>{1}{kg}\\
% \cuam<anotherrecipe>{1}\\
-% \cutext<anotherrecipe>{1}{kg}\\
-% \curef{anotherrecipe}~persons \\ @
+% \Cutext[ref=anotherrecipe]{10}{kg}\\
+% &
% \cusetup{ recalculate-amount = true } @
% \curef{anotherrecipe}~persons \\
% \cunum<anotherrecipe>{1}{kg}\\
% \cuam<anotherrecipe>{1}\\
-% \cutext<anotherrecipe>{1}{kg}\\
-% \Cutext[ref=anotherrecipe]{10}{kg}\\ @
-% \cusetup { set-number-of-persons = 3 } @
+% \Cutext[ref=anotherrecipe]{10}{kg}\\
+% &
+% \cusetup { set-number-of-persons = 3 } @
% \curef{anotherrecipe}~persons \\
-% \cunum<anotherrecipe>{1}{kg}\\
-% \cuam<anotherrecipe>{1}\\
-% \cutext<anotherrecipe>{1}{kg}\\
-% \Cutext[ref=anotherrecipe]{10}{kg}\\ @
+% \cunum<anotherrecipe>{1}{kg} \\
+% \cuam<anotherrecipe>{1} \\
+% \Cutext[ref=anotherrecipe]{10}{kg}\\
+% &
% \cusetup { set-number-of-persons = 2 } @
% \curef{anotherrecipe}~persons \\
% \cunum<anotherrecipe>{1}{kg}\\
% \cuam<anotherrecipe>{1}\\
-% \cutext<anotherrecipe>{1}{kg}\\
-% \Cutext[ref=anotherrecipe]{10}{kg}\\ @
+% \cutext<anotherrecipe>{10}{kg}\\
+% &
% \cusetup { set-number-of-persons = 1 } @
-% \curef{anotherrecipe}~person \\
+% \curef{anotherrecipe}~persons \\
% \cunum<anotherrecipe>{1}{kg}\\
-% \cuam<anotherrecipe>{1}\\
-% \cutext<anotherrecipe>{1}{kg}\\
-% \Cutext[ref=anotherrecipe]{10}{kg}\\
+% \cuam<anotherrecipe>{1}\\
+% \Cutext[ref=anotherrecipe]{10}{kg}\\
% \end{cuexamplecode}
%
%
@@ -2972,7 +2969,7 @@ and the derived file cooking-units.sty.
% \curef{Schinken} \\
% \cusetup { recalculate-amount = true } @
% \cusetup{get-label=Schinken} \\
-% \curef{Schinken} \\
+% \curef{Schinken}
% \end{cuexamplecode}
%
% \begin{cunote}
@@ -3124,7 +3121,7 @@ and the derived file cooking-units.sty.
% Converts (nearly) every unit in \cref{tab:def-units}
% to electron volt or the respective derivative (if possible). Note that this
% option is:
-% a) experimental and probably will forever be and b) just a joke, you are not
+% a) experimental and probably will forever be and (b) just a joke, you are not
% supposed to use this units in a cookery book (and as you see this package
% doesn't support the arrangement of such huge numbers). Also you may
% want to check the values if you really want to use them, just to be sure
@@ -3143,6 +3140,7 @@ and the derived file cooking-units.sty.
% \cunum{1}{s}
% \end{cuexamplecode}
%
+%
% \begin{function}{add-natural-unit}
% \begin{syntax}
% add-natural-unit = \meta{unit-key}
@@ -3167,12 +3165,39 @@ and the derived file cooking-units.sty.
% \cunum[kg=g]{1}{kg} \\
% \cunum{1.5}{J} \\
% \cunum{180}{C} \\
-% \cunum{15}{s}
+% \cunum{15/4}{s} \\
+% \cunum{1--2}{min} \\
+% \cunum{?}{l}
% \end{cuexamplecode}
%
%
+% \begin{function}{nothing-special, going-bonkers, fully-bonkers, xD-lol}
+% \begin{syntax}
+% nothing-special = \meta{true/false}
+% going-bonkers = \meta{true/false}
+% fully-bonkers = \meta{true/false}
+% xD-lol = \meta{true/false}
+% \end{syntax}
+% Options that do \dots\ stuff. The four stages of madness in option for.
+%
+% \begin{description}
+% \item[nothing-special] is your default. The package behaves as intended.
+%
+% \item[going-bonkers] is a bit more strange. It converts an unit into another random unit
+% (if it can) and does so throughout the document. So if |unit-A| is converted
+% into |unit-B|, it is going to be converted this way the entire document through.
+% For an unit to be converted it must have a key, see \cref{sec:defining-opt}.
+%
%
+% \item[fully-bonkers] converts one unit into another random unit (if it can) and does so for
+% each unit it encounters. So |unit-A| might be converted into |unit-B| the first time,
+% but |unit-C| the second. Each conversion picks a random unit for the conversion
+% (but the conversion itself makes sense, e.g.\ |kg| into |g|, but not into |cm|).
%
+% \item[xD-lol] is pure insanity. A unit is transformed into another, if it makes sense
+% or not, and its value is replaced by a random number.
+% \end{description}
+% \end{function}
%
%
%
@@ -3222,6 +3247,7 @@ and the derived file cooking-units.sty.
%\clearpage
%
% \section{Bens Einheitensammelsurium (Bens unit Almanac)}
+% \label{sec:unit-almanac}
%
% Units are a fascinating mess. There are so many different ones which are different and
% the few ones which are the same (in name at least) are \emph{also} different, depending on
@@ -3246,21 +3272,6 @@ and the derived file cooking-units.sty.
% am not including units which I found in the internet is that I would like to
% see those units in their \enquote{natural environment}.
%
-% \begin{comment}
-% \begin{tabular}{lllllll}
-% \toprule
-% unit & original & abréviation & type & source \\ \midrule
-%
-% Batman & & & weight\\
-%^^A Rottel\txtupde & Sicilian: \emph{rotolo} && length & \cite{Gattopardo}\\
-%^^A Rute\txtupde & Sicilian: \emph{canna} & & weight & \cite{Gattopardo}\\
-% rotolo\txtupsic & Rottel\txtupde && length & \cite{Gattopardo}\\
-% canna\txtupsic & rod\txtupen, Rute\txtupde & & weight & \cite{Gattopardo}\\
-% \bottomrule
-% \end{tabular}
-%
-% {\footnotesize \txtupde German }
-% \end{comment}
%
% \begin{description}
%
@@ -3355,13 +3366,6 @@ and the derived file cooking-units.sty.
% \end{description}
%
%
-% \begin{comment}
-% Fun Wikipedia articles:
-% \begin{itemize}
-% \item Old Austrian units: https://en.wikipedia.org/wiki/Obsolete_Austrian_units_of_measurement
-% \end{itemize}
-% \end{comment}
-%
%
%
%
@@ -3525,8 +3529,8 @@ and the derived file cooking-units.sty.
%\end{center}
%
%
-%
-%
+% If you ever encounter in a german cookery book the word \enquote{Packerl},
+% check out its entry in \cref{sec:unit-almanac}.
%
%
%
@@ -3657,7 +3661,7 @@ and the derived file cooking-units.sty.
%
%
%
-% \end{documentation}
+%\end{documentation}
%
%
%
@@ -3699,14 +3703,14 @@ and the derived file cooking-units.sty.
% \begin{macrocode}
\ProvidesExplPackage
{cooking-units}
- {2020/01/13}
- {1.46}
+ {2021/05/16}
+ {2.00}
{Ein Paket fuer Kocheinheiten}
% \end{macrocode}
%
% Checking if \pkg{expl3} is up-to-date, otherwise abort the loading of the package.
% \begin{macrocode}
-\@ifpackagelater { expl3 } { 2018/08/23 }
+\@ifpackagelater { expl3 } { 2021/05/07 }
{ }
{
\PackageError { cooking-units } { Support~package~expl3~too~old }
@@ -3727,7 +3731,7 @@ and the derived file cooking-units.sty.
%
% Checking if \pkg{translations} is up-to-date, otherwise abort the loading of the package.
% \begin{macrocode}
-\@ifpackagelater { translations } { 2017/08/31 }
+\@ifpackagelater { translations } { 2021/01/17 }
{ }
{
\PackageError { cooking-units } { Support~package~translations~too~old }
@@ -3748,6 +3752,12 @@ and the derived file cooking-units.sty.
Please \ replace \ the \ option.
\msg_see_documentation_text:n { cooking-units }
}
+\msg_new:nnnn { cooking-units } { key-unknown }
+ { The~key~'#1'~is~unknown~and~is~being~ignored. }
+ {
+ The~module~'#2'~does~not~have~a~key~called~'#1'.\\
+ Check~that~you~have~spelled~the~key~name~correctly.
+ }
% \end{macrocode}
% \begin{macrocode}
\bool_new:N \g_@@_opt_numeral_bool
@@ -3761,6 +3771,9 @@ and the derived file cooking-units.sty.
use-numerals .default:n = { false },
use-fmtcount-numerals .bool_gset:N = \g_@@_opt_numeral_bool ,
use-fmtcount-numerals .default:n = { false },
+ unknown .code:n = { \msg_error:nnxx { cooking-units } { key-unknown }
+ { \l_keys_path_str } { cooking-units }
+ }
}
% \end{macrocode}
% Now process the package options \dots
@@ -3778,9 +3791,9 @@ and the derived file cooking-units.sty.
use-numerals .code:n =
{
\msg_warning:nnnn { cooking-units } { Option-deprecated } { use-numerals } { use-fmtcount-numerals }
- \msg_error:nnn { cooking-units } { load-time-option } { fmtcount }
+ \msg_error:nnn { cooking-units } { load-time-option } { use-fmtcount-numerals }
} ,
- use-fmtcount-numerals .code:n = { \msg_error:nnn { cooking-units } { load-time-option } { fmtcount } } ,
+ use-fmtcount-numerals .code:n = { \msg_error:nnn { cooking-units } { load-time-option } { use-fmtcount-numerals } } ,
}
% \end{macrocode}
%
@@ -3788,33 +3801,28 @@ and the derived file cooking-units.sty.
%
% \subsection {Defining Variables}
%
-% \begin{macro}
-% {
-% \tl_replace_all:NVn,
-% \tl_replace_once:NVn ,
-% \tl_if_in:nVTF ,
-% \tl_if_in:NVTF ,
-% \tl_if_in:NVT ,
-% \fp_compare:vNnT ,
-% \prop_get:cVc ,
-% \tl_set_rescan:NnV,
-% \msg_error:nnnV, \msg_error:nnV, \msg_warning:nnV,
-% \prop_put:cnx
-% }
+% \begin{macro} { cs variants }
% Some variations of commands we will need later.
% \begin{macrocode}
+\cs_generate_variant:Nn \msg_redirect_name:nnn { nnV }
\cs_generate_variant:Nn \tl_replace_all:Nnn { NVn }
\cs_generate_variant:Nn \tl_replace_once:Nnn { NVn }
\cs_generate_variant:Nn \tl_if_in:nnTF { nV }
\cs_generate_variant:Nn \tl_if_in:NnTF { NVTF }
\cs_generate_variant:Nn \tl_if_in:NnT { NVT }
\cs_generate_variant:Nn \fp_compare:nNnT { vNnT }
-\cs_generate_variant:Nn \prop_get:NnN { cVc }
+\cs_generate_variant:Nn \prop_get:NnN { cVc, Nnc }
+\cs_generate_variant:Nn \prop_get:NnNF { Nnc }
\cs_generate_variant:Nn \tl_set_rescan:Nnn { NnV }
\cs_generate_variant:Nn \msg_error:nnnn { nnnV }
\cs_generate_variant:Nn \msg_error:nnn { nnV }
\cs_generate_variant:Nn \msg_warning:nnn { nnV }
\cs_generate_variant:Nn \prop_put:Nnn { cnx }
+\cs_generate_variant:Nn \seq_remove_all:Nn { NV }
+\cs_generate_variant:Nn \prop_gput:Nnn { Nnv, Nxv }
+\cs_generate_variant:Nn \prop_get:NnN { cnc }
+\cs_generate_variant:Nn \prg_new_conditional:Npnn { c }
+\cs_generate_variant:Nn \text_uppercase:n { x }
% \end{macrocode}
% \end{macro}
%
@@ -3828,11 +3836,22 @@ and the derived file cooking-units.sty.
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_set_amount:Nn,\@@_set_unit:Nn}
+% \begin{macro}{\l_@@_unit_argument_spec_tl , \l_@@_unit_argument_spec_tl }
% Allows for potential parsing of amount and or unit.
% \begin{macrocode}
+\tl_new:N \l_@@_unit_argument_spec_tl
+\tl_new:N \l_@@_expand_amount_tl
+\tl_set:Nn \l_@@_unit_argument_spec_tl { n }
+\tl_set:Nn \l_@@_expand_amount_tl { n }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_set_amount:Nn , \@@_set_unit:Nn , \@@_to_unit:n }
+% Definitions to set the amount and the unit. Made so that it can be changed globally.
+% By default, the amount is just taken as is while the unit is changed into a string.
+% \begin{macrocode}
\cs_new_eq:NN \@@_set_amount:Nn \tl_set:Nn
-\cs_new_eq:NN \@@_set_unit:Nn \tl_set:Nn
+\cs_new_eq:NN \@@_set_unit:Nn \str_set:Nn
+\cs_new_eq:NN \@@_to_unit:n \tl_to_str:n
% \end{macrocode}
% \end{macro}
%
@@ -3849,6 +3868,8 @@ and the derived file cooking-units.sty.
\cs_set_eq:NN \@@_print_numeral:n \numberstringnum
\cs_set_eq:NN \@@_print_Numeral:n \Numberstringnum
}
+\cs_generate_variant:Nn \@@_print_numeral:n { V }
+\cs_generate_variant:Nn \@@_print_Numeral:n { V }
% \end{macrocode}
% \end{macro}
%
@@ -3878,39 +3899,60 @@ and the derived file cooking-units.sty.
% \end{macrocode}
% \end{macro}
%
-%
+% \begin{macro} { \g_@@_convert_bonkers_remember_prop , \g_@@_convert_to_eV_remember_prop }
+% If the unit is changed in a \enquote{not normal} way, store
+% some things in one of the two lists. They are just used as shortcuts
+% to remember which unit is changed into which. They are one level above
+% |\g_@@_master_changer_prop|.
+% \begin{macrocode}
+\prop_new:N \g_@@_convert_to_eV_remember_prop
+\prop_new:N \g_@@_convert_bonkers_remember_prop
+% \end{macrocode}
+% \end{macro}
%
% \begin{macro}
% {
-% \l_@@_number_tmpa_tl,
-% \l_@@_number_tmpb_tl,
-% \l_@@_mixed_fraction_tl,
-% \l_@@_original_amount_tl,
-% \l_@@_original_unit_tl,
-% \l_@@_option_unit_tl,
-% \l_@@_language_tl,
-% \l_@@_cunum_range_sign_tl,
-% \l_@@_cutext_range_sign_tl,
-% \l_@@_value_unit_space_tl,
-% \l_@@_input_digits_tl ,
-% \l_@@_input_decimal_mark_tl,
-% \l_@@_input_value_signs_tl,
-% \l_@@_input_allowed_special_signs_tl ,
-% \g_@@_input_str_hash_one_tl ,
-% \l_@@_input_range_sign_tl,
-% \l_@@_cutext_space_tl,
-% \l_@@_cuphrase_space_tl,
-% \l_@@_translation_tmpa_tl,
-% \l_@@_cutext_last_value_tl,
-% \l_@@_phantom_tl,
-% \l_@@_phrase_phrase_tl,
-% \l_@@_unit_letter_not_allowed_tl,
-% \l_@@_input_fraction_sign_tl,
-% \l_@@_input_mixed_fraction_sign_tl,
-% \l_@@_list_of_units_tl,
-% \l_@@_list_of_values_tl,
-% \l_@@_cunum_hook_tl , \l_@@_cutext_hook_tl ,
-% \l_@@_Cutext_hook_tl , \l_@@_cuam_hook_tl
+% , \l_@@_number_tmpa_tl
+% , \l_@@_number_tmpb_tl
+% , \l_@@_mixed_fraction_tl
+% , \l_@@_original_amount_tl
+% , \l_@@_original_unit_tl
+% , \l_@@_option_unit_tl
+% , \l_@@_language_tl
+% , \l_@@_cunum_range_sign_tl
+% , \l_@@_cutext_range_sign_tl
+% , \l_@@_value_unit_space_tl
+% , \l_@@_input_digits_tl
+% , \l_@@_input_decimal_mark_tl
+% , \l_@@_input_value_signs_tl
+% , \l_@@_input_allowed_special_signs_tl
+% , \g_@@_input_str_hash_one_tl
+% , \l_@@_input_range_sign_tl
+% , \l_@@_cutext_space_tl
+% , \l_@@_cutext_numeral_space_tl
+% , \l_@@_cuphrase_space_tl
+% , \l_@@_translation_tmpa_tl
+% , \l_@@_cutext_last_value_tl
+% , \l_@@_phantom_tl
+% , \l_@@_phrase_text_tl
+% , \l_@@_unit_letter_not_allowed_tl
+% , \l_@@_input_fraction_sign_tl
+% , \l_@@_input_mixed_fraction_sign_tl
+% , \l_@@_list_of_units_tl
+% , \l_@@_list_of_values_tl
+% , \l_@@_allwed_integer_math_operators_tl
+% , \l_@@_curr_group_tl
+% , \l_@@_curr_unit_tl
+% , \l_@@_cmd_hook_tl
+% , \l_@@_cunum_hook_tl
+% , \l_@@_cutext_hook_tl
+% , \l_@@_Cutext_hook_tl
+% , \l_@@_cuam_hook_tl
+% , \l_@@_new_key_base_tl
+% , \l_@@_decided_unit_tl
+% , \l_@@_stored_units_tl
+% , \l_@@_stored_formula_tl
+% , \l_@@_base_tl
% }
% Quite a lot of tl's.
% \begin{macrocode}
@@ -3931,18 +3973,28 @@ and the derived file cooking-units.sty.
\tl_new:N \g_@@_input_str_hash_one_tl
\tl_new:N \l_@@_input_range_sign_tl
\tl_new:N \l_@@_cutext_space_tl
+\tl_new:N \l_@@_cutext_numeral_space_tl
\tl_new:N \l_@@_cuphrase_space_tl
\tl_new:N \l_@@_translation_tmpa_tl
\tl_new:N \l_@@_cutext_last_value_tl
\tl_new:N \l_@@_phantom_tl
-\tl_new:N \l_@@_phrase_phrase_tl
+\tl_new:N \l_@@_phrase_text_tl
\tl_new:N \l_@@_unit_letter_not_allowed_tl
\tl_new:N \l_@@_input_fraction_sign_tl
\tl_new:N \l_@@_input_mixed_fraction_sign_tl
\tl_new:N \l_@@_list_of_units_tl
\tl_new:N \l_@@_list_of_values_tl
+\tl_new:N \l_@@_allwed_integer_math_operators_tl
+\tl_new:N \l_@@_curr_group_tl
+\tl_new:N \l_@@_curr_unit_tl
+\tl_new:N \l_@@_new_key_base_tl
+\tl_new:N \l_@@_decided_unit_tl
+\tl_new:N \l_@@_stored_units_tl
+\tl_new:N \l_@@_stored_formula_tl
+\tl_new:N \l_@@_base_tl
% \end{macrocode}
% \begin{macrocode}
+\tl_new:N \l_@@_cmd_hook_tl
\tl_new:N \l_@@_cunum_hook_tl
\tl_new:N \l_@@_cutext_hook_tl
\tl_new:N \l_@@_Cutext_hook_tl
@@ -3964,16 +4016,19 @@ and the derived file cooking-units.sty.
\tl_set:Nn \l_@@_input_allowed_special_signs_tl { ? }
\tl_gset_rescan:Nnn \g_@@_input_str_hash_one_tl
{ \char_set_catcode_letter:N \# } {#1}
+\tl_set:Nn \l_@@_allwed_integer_math_operators_tl { +-()*/ }
% \end{macrocode}
% \begin{macrocode}
\tl_set:Nn \l_@@_cunum_range_sign_tl { -- }
\tl_set:Nn \l_@@_cutext_range_sign_tl { }
\tl_set:Nn \l_@@_value_unit_space_tl { \thinspace }
-\tl_set:Nn \l_@@_cutext_space_tl { \space }
+\tl_set:Nn \l_@@_cutext_space_tl { ~ }
+\tl_set:Nn \l_@@_cutext_numeral_space_tl { \space }
\tl_set:Nn \l_@@_cuphrase_space_tl { \space }
\tl_set:Nn \l_@@_unit_letter_not_allowed_tl { , / }
% \end{macrocode}
%
+% \begin{macro}{\c_@@_minus_tl}
% Flat out stolen from \pkg{siunitx}.
% \begin{macrocode}
\AtBeginDocument {
@@ -4001,6 +4056,7 @@ and the derived file cooking-units.sty.
{ }
}
% \end{macrocode}
+% \end{macro}
%
% \begin{macro}{ \l_@@_mixed_frac_dim }
% The dimension between the fraction and the mixed fraction part is
@@ -4054,18 +4110,20 @@ and the derived file cooking-units.sty.
% \end{macro}
%
%
-% \begin{macro}{ \l_@@_phrase_number_tl }
-% Stores the current \enquote{phrase number}. For \enquote{Dutzend} this would
-% be \enquote{12}, etc.
+% \begin{macro}{ \l_@@_phrase_number_tl , \l_@@_phrase_gender_tl }
+% Stores the current \enquote{phrase number} (and gender).
+% For \enquote{Dutzend} this would
+% be \enquote{12}, etc. The second stores the gender (m, f or n)
% \begin{macrocode}
\int_new:N \l_@@_phrase_number_tl
+\int_new:N \l_@@_phrase_gender_tl
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{ \l_@@_list_of_defined_keys_clist , \g_@@_list_of_defined_units_clist }
-% Sequence of defined units and keys. Units are defined
+% Sequence of defined units and keys. Units are defined
% globally as they create new commands, keys do not do that
-% (I think). Could be my mistake.
+% (I think). Could be my mistake.
% \begin{macrocode}
\seq_new:N \l_@@_list_of_defined_keys_seq
\seq_new:N \g_@@_list_of_defined_units_seq
@@ -4093,27 +4151,35 @@ and the derived file cooking-units.sty.
% \end{macro}
%
%
-% \begin{macro}{\l_@@_number_of_iterations_seq, \l_@@_derivative_unit_list_seq ,
-% \l_@@_derivative_symbol_list_seq , \l_@@_derivative_value_list_seq
+% \begin{macro}{
+% , \g_@@_stored_derived_unit_symbol_seq
+% , \g_@@_stored_derived_formula_seq
+% , \g_@@_stored_derived_unit_print_seq
% }
% Variables used in \mycs{declarecookingderivatives}.
% \begin{macrocode}
-\seq_new:N \l_@@_number_of_iterations_seq
-\seq_new:N \l_@@_derivative_unit_list_seq
-\seq_new:N \l_@@_derivative_symbol_list_seq
-\seq_new:N \l_@@_derivative_value_list_seq
+\seq_new:N \g_@@_stored_derived_unit_symbol_seq
+\seq_new:N \g_@@_stored_derived_formula_seq
+\seq_new:N \g_@@_stored_derived_unit_print_seq
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\l_@@_max_depth_int, \l_@@_curr_depth_int}
-% Also some variables used in \mycs{declarecookingderivatives}.
+%
+% \begin{macro}{\l_@@_nr_of_units_int, \l_@@_depth_int}
+% Also some variables used in \mycs{declarecookingderivatives}. (And for one check during
+% definitions of keys).
% \begin{macrocode}
-\int_new:N \l_@@_max_depth_int
-\int_new:N \l_@@_curr_depth_int
+\int_new:N \l_@@_nr_of_units_int
+\int_new:N \l_@@_depth_int
% \end{macrocode}
% \end{macro}
%
-%
+% \begin{macro}{\g_@@_natural_units_seq }
+% Remembers which unit foes to which natural unit.
+% \begin{macrocode}
+\seq_new:N \g_@@_natural_units_seq
+% \end{macrocode}
+% \end{macro}
%
% \begin{macro} { \l_@@_temperatures_to_check_seq }
% \changes {1.02h} {New.}
@@ -4139,82 +4205,85 @@ and the derived file cooking-units.sty.
% \end{macrocode}
% \end{macro}
%
+% \begin{macro} { \l_@@_derived_units_prop }
+% Stores \emph{via} key-value all defined derived units as keys
+% and the formula to calculate the derived unit as value..
+% \begin{macrocode}
+\prop_new:N \l_@@_derived_units_prop
+% \end{macrocode}
+% \end{macro}
+%
%
%
% \begin{macro}
% {
-% \l_@@_minus_bool,
-% \l_@@_round_number_bool,
-% \l_@@_error_bool,
-% \l_@@_unit_error_bool,
-% \l_@@_eval_fractions_bool,
-% \l_@@_convert_fractions_bool,
-% \l_@@_draft_bool,
-% \l_@@_round_to_int_bool,
-% \l_@@_special_sign_bool,
-% \l_@@_single_key_bool,
-% \l_@@_check_temperature_bool,
-% \l_@@_convert_to_eV_bool,
-% \l_@@_cutext_uppercase_word_bool,
-% \l_@@_using_cutext_bool,
-% \l_@@_cuam_old_bool,
-% \l_@@_change_number_of_persons_bool,
-% \l_@@_calc_because_ref_was_given_bool,
-% \l_@@_lokal_persons_bool,
-% \l_@@_cutext_to_cunum_bool,
-% \l_@@_cutext_old_bool,
-% \l_@@_cutext_keep_unit_bool,
-% \l_@@_round_commercial_bool,
-% \l_@@_use_phrases_bool,
-% \l_@@_lokal_phrase_bool,
-% \l_@@_print_numeral_bool,
-% \l_@@_lokal_numeral_bool,
-% \l_@@_round_precision_negative_bool,
-% \l_@@_fourty_two_bool,
-% \l_@@_phrase_negative_bool ,
-% \l_@@_range_in_input_bool, \l_@@_lokal_fraction_bool ,
-% \l_@@_print_fraction_bool, \l_@@_check_decimal_bool ,
+% , \l_@@_pckopt_eval_fractions_bool
+% , \l_@@_pckopt_convert_fractions_bool
+% , \l_@@_pckopt_draft_bool
+% , \l_@@_pckopt_round_to_int_bool
+% , \l_@@_pckopt_check_temperature_bool
+% , \l_@@_pckopt_convert_to_eV_bool
+% , \l_@@_pckopt_cuam_old_bool
+% , \l_@@_pckopt_recalculate_amount_bool
+% , \l_@@_pckopt_cutext_to_cunum_bool
+% , \l_@@_pckopt_cutext_old_bool
+% , \l_@@_pckopt_cutext_keep_unit_bool
+% , \l_@@_pckopt_round_commercial_bool
+% , \l_@@_pckopt_use_phrases_bool
+% , \l_@@_pckopt_round_precision_negative_bool
+% , \l_@@_pckopt_fourty_two_bool
+% , \l_@@_pckopt_bonkers_bool
+% , \l_@@_minus_bool
+% , \l_@@_round_number_bool
+% , \l_@@_single_key_bool
+% , \l_@@_cutext_uppercase_word_bool
+% , \l_@@_reference_given_bool
+% , \l_@@_lokal_recalc_for_people_bool
+% , \l_@@_lokal_phrase_bool
+% , \l_@@_lokal_change_unit_bool
+% , \l_@@_pckopt_print_numeral_bool
+% , \l_@@_lokal_numeral_bool
+% , \l_@@_phrase_negative_bool
+% , \l_@@_cutext_last_amount_equ_one_bool
+% , \l_@@_symbol_was_set_by_key_bool
+% , \l_@@_contains_valid_key_bool
+% , \l_@@_check_decimal_bool
+% , \l_@@_unit_error_bool
% }
% Some booleans we need later.
% \begin{macrocode}
+\bool_new:N \l_@@_pckopt_eval_fractions_bool
+\bool_new:N \l_@@_pckopt_convert_fractions_bool
+\bool_new:N \l_@@_pckopt_draft_bool
+\bool_new:N \l_@@_pckopt_round_to_int_bool
+\bool_new:N \l_@@_pckopt_check_temperature_bool
+\bool_new:N \l_@@_pckopt_convert_to_eV_bool
+\bool_new:N \l_@@_pckopt_cuam_old_bool
+\bool_new:N \l_@@_pckopt_recalculate_amount_bool
+\bool_new:N \l_@@_pckopt_cutext_to_cunum_bool
+\bool_new:N \l_@@_pckopt_cutext_old_bool
+\bool_new:N \l_@@_pckopt_cutext_keep_unit_bool
+\bool_new:N \l_@@_pckopt_round_commercial_bool
+\bool_new:N \l_@@_pckopt_use_phrases_bool
+\bool_new:N \l_@@_pckopt_round_precision_negative_bool
+\bool_new:N \l_@@_pckopt_fourty_two_bool
+\bool_new:N \l_@@_pckopt_bonkers_bool
\bool_new:N \l_@@_minus_bool
\bool_new:N \l_@@_round_number_bool
-\bool_new:N \l_@@_error_bool
-\bool_new:N \l_@@_unit_error_bool
-\bool_new:N \l_@@_eval_fractions_bool
-\bool_new:N \l_@@_convert_fractions_bool
-\bool_new:N \l_@@_draft_bool
-\bool_new:N \l_@@_round_to_int_bool
-\bool_new:N \l_@@_special_sign_bool
\bool_new:N \l_@@_single_key_bool
-\bool_new:N \l_@@_check_temperature_bool
-\bool_new:N \l_@@_convert_to_eV_bool
\bool_new:N \l_@@_cutext_uppercase_word_bool
-\bool_new:N \l_@@_using_cutext_bool
-\bool_new:N \l_@@_cuam_old_bool
-\bool_new:N \l_@@_change_number_of_persons_bool
-\bool_new:N \l_@@_calc_because_ref_was_given_bool
-\bool_new:N \l_@@_lokal_persons_bool
-\bool_new:N \l_@@_cutext_to_cunum_bool
-\bool_new:N \l_@@_cutext_old_bool
-\bool_new:N \l_@@_cutext_keep_unit_bool
-\bool_new:N \l_@@_round_commercial_bool
-\bool_new:N \l_@@_use_phrases_bool
+\bool_new:N \l_@@_reference_given_bool
+\bool_new:N \l_@@_lokal_recalc_for_people_bool
\bool_new:N \l_@@_lokal_phrase_bool
-\bool_new:N \l_@@_print_numeral_bool
+\bool_new:N \l_@@_lokal_change_unit_bool
+\bool_new:N \l_@@_pckopt_print_numeral_bool
\bool_new:N \l_@@_lokal_numeral_bool
-\bool_new:N \l_@@_round_precision_negative_bool
-\bool_new:N \l_@@_fourty_two_bool
\bool_new:N \l_@@_phrase_negative_bool
-% \end{macrocode}
-%
-% While rewriting the code I searched for those
-% booleans a lot.
-% \begin{macrocode}
-\bool_new:N \l_@@_range_in_input_bool
-\bool_new:N \l_@@_lokal_fraction_bool
-\bool_new:N \l_@@_print_fraction_bool
+\bool_new:N \l_@@_cutext_last_amount_equ_one_bool
+\bool_new:N \l_@@_symbol_was_set_by_key_bool
+\bool_new:N \l_@@_contains_valid_key_bool
\bool_new:N \l_@@_check_decimal_bool
+\bool_new:N \l_@@_unit_error_bool
% \end{macrocode}
% \end{macro}
%
@@ -4222,8 +4291,8 @@ and the derived file cooking-units.sty.
%
% Setting some of them to \true\ or another boolean respectively.
% \begin{macrocode}
-\bool_set_false:N \l_@@_cutext_keep_unit_bool
-\bool_set_eq:NN \l_@@_print_numeral_bool \g_@@_opt_numeral_bool
+\bool_set_false:N \l_@@_pckopt_cutext_keep_unit_bool
+\bool_set_eq:NN \l_@@_pckopt_print_numeral_bool \g_@@_opt_numeral_bool
% \end{macrocode}
%
%
@@ -4238,20 +4307,30 @@ and the derived file cooking-units.sty.
% Checking value if a translation is avaiable.
% \begin{macrocode}
\quark_new:N \q_@@_no_translation
+%\cs_new:Npn \q_@@_no_translation { asdasd\ewhkerhjkwejhk }
% \end{macrocode}
%\end{macro}
%
%
% \begin{macro}{
-% \l_@@_tmpa_tl , \l_@@_tmpb_tl , \l_@@_tmp_unit_tl ,
-% \l_@@_tmpa_fp ,
-% \l_@@_tmpa_clist ,
-% \l_@@_tmpa_prop , \l_@@_tmpb_prop ,
-% \l_@@_tmpa_seq ,
-% \l_@@_tmpa_int , \l_@@_tmpb_int ,
+% , \l_@@_scrap_tl
+% , \l_@@_tmpa_tl
+% , \l_@@_tmpb_tl
+% , \l_@@_tmp_unit_tl
+% , \l_@@_tmpa_fp
+% , \l_@@_tmpa_clist
+% , \l_@@_tmpa_prop
+% , \l_@@_tmpb_prop
+% , \l_@@_tmpa_seq
+% , \l_@@_tmpb_seq
+% , \l_@@_tmpa_int
+% , \l_@@_tmpb_int
+% , \l_@@_tmpa_bool
+% , \l_@@_tmpb_bool
% }
% Some temporal stores which are used throughout the code.
% \begin{macrocode}
+\tl_new:N \l_@@_scrap_tl
\tl_new:N \l_@@_tmpa_tl
\tl_new:N \l_@@_tmpb_tl
\tl_new:N \l_@@_tmp_unit_tl
@@ -4260,8 +4339,11 @@ and the derived file cooking-units.sty.
\prop_new:N \l_@@_tmpa_prop
\prop_new:N \l_@@_tmpb_prop
\seq_new:N \l_@@_tmpa_seq
+\seq_new:N \l_@@_tmpb_seq
\int_new:N \l_@@_tmpa_int
\int_new:N \l_@@_tmpb_int
+\bool_new:N \l_@@_tmpa_bool
+\bool_new:N \l_@@_tmpb_bool
% \end{macrocode}
%\end{macro}
%
@@ -4322,8 +4404,9 @@ and the derived file cooking-units.sty.
% \begin{macrocode}
erase-all-options .code:n =
{
- \exp_args:Nx \cuclearoptionfor { \seq_use:Nn \g_@@_list_of_defined_units_seq { , } }
- },
+ \clist_set_from_seq:NN \l_@@_tmpa_clist \g_@@_list_of_defined_units_seq
+ \@@_clear_options_for:V \l_@@_tmpa_clist
+ },
erase-all-options .value_forbidden:n = { true } ,
% \end{macrocode}
% \end{macro}
@@ -4334,11 +4417,7 @@ and the derived file cooking-units.sty.
% \begin{macrocode}
erase-all-options-for .code:n =
{
- \cuclearoptionfor {#1}
-% \keyval_parse:NNn
-% \@@_erase_options_for:n
-% \@@_erase_options_for_error:nn
-% {#1}
+ \@@_clear_options_for:n {#1}
},
erase-all-options-for .value_required:n = { true } ,
% \end{macrocode}
@@ -4353,7 +4432,7 @@ and the derived file cooking-units.sty.
% Don't want any \mycs{cutext} (or \mycs{Cutext}) in your
% document? Use this option!
% \begin{macrocode}
- cutext-to-cunum .bool_set:N = \l_@@_cutext_to_cunum_bool ,
+ cutext-to-cunum .bool_set:N = \l_@@_pckopt_cutext_to_cunum_bool ,
cutext-to-cunum .default:n = { false } ,
cutext-to-cunum .groups:n = { change-command } ,
% \end{macrocode}
@@ -4362,7 +4441,7 @@ and the derived file cooking-units.sty.
% \begin{macro}{ cutext-change-unit }
% Do not wanna change units in \mycs{cutext}? Use this option.
% \begin{macrocode}
- cutext-change-unit .bool_set_inverse:N = \l_@@_cutext_keep_unit_bool ,
+ cutext-change-unit .bool_set_inverse:N = \l_@@_pckopt_cutext_keep_unit_bool ,
cutext-change-unit .default:n = { true } ,
cutext-change-unit .groups:n = { change-unit } ,
% \end{macrocode}
@@ -4377,21 +4456,23 @@ and the derived file cooking-units.sty.
{
\int_case:nn { \l_keys_choice_int }
{
- { 1 } { \bool_set_false:N \l_@@_cuam_old_bool }
- { 2 } { \bool_set_true:N \l_@@_cuam_old_bool }
+ { 1 } { \bool_set_false:N \l_@@_pckopt_cuam_old_bool }
+ { 2 } { \bool_set_true:N \l_@@_pckopt_cuam_old_bool }
}
} ,
cuam-version .default:n = { new } ,
+ cuam-version .groups:n = { parse } ,
cutext-version .choices:nn =
{ new , old }
{
\int_case:nn { \l_keys_choice_int }
{
- { 1 } { \bool_set_false:N \l_@@_cutext_old_bool }
- { 2 } { \bool_set_true:N \l_@@_cutext_old_bool }
+ { 1 } { \bool_set_false:N \l_@@_pckopt_cutext_old_bool }
+ { 2 } { \bool_set_true:N \l_@@_pckopt_cutext_old_bool }
}
} ,
cutext-version .default:n = { new } ,
+ cutext-version .groups:n = { parse } ,
% \end{macrocode}
% \end{macro}
%
@@ -4400,26 +4481,29 @@ and the derived file cooking-units.sty.
expand-both .choices:nn =
{ n , o , f , x }
{
- \cs_set_eq:Nc \@@_set_unit:Nn { tl_set:N \l_keys_choice_tl }
- \cs_set_eq:Nc \@@_set_amount:Nn { tl_set:N \l_keys_choice_tl }
+ \tl_set_eq:NN \l_@@_unit_argument_spec_tl \l_keys_choice_tl
+ \tl_set_eq:NN \l_@@_expand_amount_tl \l_keys_choice_tl
} ,
expand-both .default:n = { n } ,
+ expand-both .groups:n = { parse } ,
% \end{macrocode}
% \begin{macrocode}
expand-amount .choices:nn =
{ n , o , f , x }
{
- \cs_set_eq:Nc \@@_set_amount:Nn { tl_set:N \l_keys_choice_tl }
+ \tl_set_eq:NN \l_@@_expand_amount_tl \l_keys_choice_tl
} ,
expand-amount .default:n = { n } ,
+ expand-amount .groups:n = { parse } ,
% \end{macrocode}
% \begin{macrocode}
expand-unit .choices:nn =
{ n , o , f , x }
{
- \cs_set_eq:Nc \@@_set_unit:Nn { tl_set:N \l_keys_choice_tl }
+ \tl_set_eq:NN \l_@@_unit_argument_spec_tl \l_keys_choice_tl
} ,
expand-unit .default:n = { n } ,
+ expand-unit .groups:n = { parse } ,
% \end{macrocode}
% \end{macro}
%
@@ -4442,6 +4526,7 @@ and the derived file cooking-units.sty.
}
\use:n { \tl_set:Nn \l_@@_input_allowed_special_signs_tl {#1} }
} ,
+ set-special-sign .groups:n = { parse } ,
% \end{macrocode}
%\end{macro}
%\begin{macro}{ add-special-sign }
@@ -4460,6 +4545,7 @@ and the derived file cooking-units.sty.
}
} ,
add-special-sign .default:n = { } ,
+ add-special-sign .groups:n = { parse } ,
% \end{macrocode}
%\end{macro}
%
@@ -4470,21 +4556,21 @@ and the derived file cooking-units.sty.
set-unknown-message .choices:nn =
{ error , warning , none }
{
- \msg_redirect_name:nnn { cooking-units } { amount-not-known }
- { \l_keys_choice_tl }
+ \msg_redirect_name:nnV { cooking-units } { amount-not-known }
+ \l_keys_choice_tl
} ,
set-unknown-message .default:n = { warning } ,
% \end{macrocode}
%\end{macro}
%
-% \begin{macro}{ set-unknown-message }
+% \begin{macro}{ set-cutext-translation-message }
% Sets the message for a special-sign to error, warning or none.
% \begin{macrocode}
set-cutext-translation-message .choices:nn =
{ error , warning , none }
{
- \msg_redirect_name:nnn { cooking-units } { cutext-no-translation-available }
- { \l_keys_choice_tl }
+ \msg_redirect_name:nnV { cooking-units } { cutext-no-translation-available }
+ \l_keys_choice_tl
} ,
set-cutext-translation-message .default:n = { warning } ,
% \end{macrocode}
@@ -4494,7 +4580,7 @@ and the derived file cooking-units.sty.
% \begin{macro}{ print-numerals }
% A not very good name, but I couldn't think of a better name.
% \begin{macrocode}
- print-numerals .bool_set:N = \l_@@_print_numeral_bool ,
+ print-numerals .bool_set:N = \l_@@_pckopt_print_numeral_bool ,
print-numerals .default:n = { true } ,
% \end{macrocode}
% \end{macro}
@@ -4510,8 +4596,9 @@ and the derived file cooking-units.sty.
%\begin{macro}{ parse-number }
% Parse the input? If no the input is printed as is (after some safety parsing).
% \begin{macrocode}
- parse-number .bool_set_inverse:N = \l_@@_draft_bool ,
+ parse-number .bool_set_inverse:N = \l_@@_pckopt_draft_bool ,
parse-number .default:n= { true } ,
+ parse-number .groups:n = { parse } ,
% \end{macrocode}
%\end{macro}
%
@@ -4535,7 +4622,7 @@ and the derived file cooking-units.sty.
% \begin{macro}{ use-phrases }
% Do not wanna use phrases in \mycs{cuam}? Use this option!
% \begin{macrocode}
- use-phrases .bool_set:N = \l_@@_use_phrases_bool ,
+ use-phrases .bool_set:N = \l_@@_pckopt_use_phrases_bool ,
use-phrases .default:n = { true } ,
% \end{macrocode}
% \end{macro}
@@ -4555,7 +4642,7 @@ and the derived file cooking-units.sty.
\int_compare:nNnTF {#1} < { 0 }
{ \bool_set_true:N }
{ \bool_set_false:N }
- \l_@@_round_precision_negative_bool
+ \l_@@_pckopt_round_precision_negative_bool
} ,
round-precision .default:n = { 2 } ,
% \end{macrocode}
@@ -4564,7 +4651,7 @@ and the derived file cooking-units.sty.
%\begin{macro}{ round-to-int }
% Rounding the results to an integer.
% \begin{macrocode}
- round-to-int .bool_set:N = \l_@@_round_to_int_bool ,
+ round-to-int .bool_set:N = \l_@@_pckopt_round_to_int_bool ,
round-to-int .choices:nn =
{ true , false }
{
@@ -4575,7 +4662,7 @@ and the derived file cooking-units.sty.
}{
}
- \use:c { bool_set_ \l_keys_choice_tl :N } \l_@@_round_to_int_bool
+ \use:c { bool_set_ \l_keys_choice_tl :N } \l_@@_pckopt_round_to_int_bool
} ,
round-to-int .default:n = { false } ,
% \end{macrocode}
@@ -4585,13 +4672,15 @@ and the derived file cooking-units.sty.
% Choosing between \enquote{normal} rounding to even
% and commercial rounding and sets the boolean accordingly.
% \begin{macrocode}
+% TODO: uodate doch und so
round-half .choices:nn =
- { default , commercial }
+ { default , commercial , up }
{
\int_case:nn { \l_keys_choice_int }
{
- { 1 } { \bool_set_false:N \l_@@_round_commercial_bool }
- { 2 } { \bool_set_true:N \l_@@_round_commercial_bool }
+ { 1 } { \bool_set_false:N \l_@@_pckopt_round_commercial_bool }
+ { 2 } { \bool_set_true:N \l_@@_pckopt_round_commercial_bool }
+ { 3 } { \bool_set_true:N \l_@@_pckopt_round_commercial_bool }
}
},
round-half .default:n = { default },
@@ -4601,7 +4690,7 @@ and the derived file cooking-units.sty.
%\begin{macro}{ eval-fraction }
% If set to true the fractions are evaluated.
% \begin{macrocode}
- eval-fraction .bool_set:N = \l_@@_eval_fractions_bool ,
+ eval-fraction .bool_set:N = \l_@@_pckopt_eval_fractions_bool ,
eval-fraction .default:n = { false } ,
% \end{macrocode}
%\end{macro}
@@ -4609,7 +4698,7 @@ and the derived file cooking-units.sty.
%\begin{macro}{ convert-fraction }
% If set to true the fractions are evaluated \emph{if} the unit is transformed!
% \begin{macrocode}
- convert-fraction .bool_set:N = \l_@@_convert_fractions_bool ,
+ convert-fraction .bool_set:N = \l_@@_pckopt_convert_fractions_bool ,
convert-fraction .default:n = { true } ,
% \end{macrocode}
%\end{macro}
@@ -4645,11 +4734,20 @@ and the derived file cooking-units.sty.
%\end{macro}
%
% \begin{macro}{ cutext-space }
-% The space used in \mycs{cutext} between the number (or numeral)
+% The space used in \mycs{cutext} between the \emph{number}
% and unit.
% \begin{macrocode}
cutext-space .tl_set:N = \l_@@_cutext_space_tl ,
- cutext-space .default:n = { \space } ,
+ cutext-space .default:n = { ~ } ,
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{ cutext-space }
+% The space used in \mycs{cutext} between the \emph{numeral}
+% and unit.
+% \begin{macrocode}
+ cutext-numeral-space .tl_set:N = \l_@@_cutext_numeral_space_tl ,
+ cutext-numeral-space .default:n = { \space } ,
% \end{macrocode}
% \end{macro}
%
@@ -4657,7 +4755,7 @@ and the derived file cooking-units.sty.
% Same as before, but for phrases
% \begin{macrocode}
phrase-space .tl_set:N = \l_@@_cuphrase_space_tl ,
- phrase-space .default:n = { \space } ,
+ phrase-space .default:n = { ~ } ,
% \end{macrocode}
% \end{macro}
%
@@ -4679,7 +4777,7 @@ and the derived file cooking-units.sty.
% is not enough; it is also needed to tell the package to
% recalculate the amounts.
% \begin{macrocode}
- recalculate-amount .bool_set:N = \l_@@_change_number_of_persons_bool ,
+ recalculate-amount .bool_set:N = \l_@@_pckopt_recalculate_amount_bool ,
recalculate-amount .default:n = { false } ,
% \end{macrocode}
% \end{macro}
@@ -4704,7 +4802,7 @@ and the derived file cooking-units.sty.
% \mycs{curef} as a key.
% \begin{macrocode}
get-label .code:n = \@@_curef:n {#1} ,
- label .value_required:n = { true } ,
+ get-label .value_required:n = { true } ,
% \end{macrocode}
% \end{macro}
%
@@ -4725,7 +4823,7 @@ and the derived file cooking-units.sty.
% Weird option. Checking the temperature, if the temperature is below the absolute zero temperature
% it raises an error.
% \begin{macrocode}
- check-temperature .bool_set:N = \l_@@_check_temperature_bool ,
+ check-temperature .bool_set:N = \l_@@_pckopt_check_temperature_bool ,
check-temperature .default:n = { true } ,
% \end{macrocode}
%
@@ -4751,9 +4849,9 @@ and the derived file cooking-units.sty.
% As this is a unit transformation, it needs to be inside the
% group.
% \begin{macrocode}
- convert-to-eV .bool_set:N = \l_@@_convert_to_eV_bool ,
+ convert-to-eV .bool_set:N = \l_@@_pckopt_convert_to_eV_bool ,
convert-to-eV .default:n = { true } ,
- convert-to-eV .groups:n = { change-unit } ,
+% convert-to-eV .groups:n = { change-unit } ,
% \end{macrocode}
%\end{macro}
%
@@ -4764,10 +4862,10 @@ and the derived file cooking-units.sty.
\seq_set_from_clist:Nn \l_@@_tmpa_seq {#1}
\seq_map_inline:Nn \l_@@_tmpa_seq
{
- \@@_error_if_unit_not_defined:nF {##1}
+ \@@_error_if_unit_not_defined:nNF {##1} \l_@@_curr_unit_tl
{
- \seq_if_in:NnF \g_@@_natural_units_seq {##1}
- { \seq_gput_right:Nn \g_@@_natural_units_seq {##1} }
+ \seq_if_in:NVF \g_@@_natural_units_seq \l_@@_curr_unit_tl
+ { \seq_gput_right:NV \g_@@_natural_units_seq \l_@@_curr_unit_tl }
}
}
} ,
@@ -4778,9 +4876,10 @@ and the derived file cooking-units.sty.
% \begin{macro}{ 42 }
% \begin{macrocode}
42 .choice: ,
- 42 / true .code:n = { \bool_set_true:N \l_@@_fourty_two_bool } ,
+ 42 / true .code:n = { \bool_set_true:N \l_@@_pckopt_fourty_two_bool } ,
42 / false .code:n = { \msg_fatal:nnn { cooking-units } { 42-is-...-wrong? } } ,
42 .default:n = { true } ,
+ 42 .groups:n = { parse } ,
% \end{macrocode}
% \end{macro}
%
@@ -4808,6 +4907,7 @@ and the derived file cooking-units.sty.
% \begin{macrocode}
input-range-sign .tl_set:N = \l_@@_input_range_sign_tl ,
input-range-sign .default:n = { -- } ,
+ input-range-sign .groups:n = { parse } ,
% \end{macrocode}
%\end{macro}
%
@@ -4839,6 +4939,11 @@ and the derived file cooking-units.sty.
cutext-add-hook .code:n = { \tl_put_right:Nn \l_@@_cutext_hook_tl {#1} } ,
Cutext-add-hook .code:n = { \tl_put_right:Nn \l_@@_Cutext_hook_tl {#1} } ,
cuam-add-hook .code:n = { \tl_put_right:Nn \l_@@_cuam_hook_tl {#1} } ,
+ cunum-add-hook .groups:n = { parse } ,
+ cutext-add-hook .groups:n = { parse } ,
+ Cutext-add-hook .groups:n = { parse } ,
+ cuam-add-hook .groups:n = { parse } ,
+ commands-add-hook .groups:n = { parse } ,
% \end{macrocode}
% \end{macro}
%
@@ -4879,6 +4984,165 @@ and the derived file cooking-units.sty.
%
%
%
+% \begin{macro}{symbol}
+% To be implemented. Key used during definition of new units.
+% Defines the printed symbol of the unit (both do the same).
+% \begin{macrocode}
+ definition / symbol .code:n =
+ {
+ \bool_set_true:N \l_@@_contains_valid_key_bool
+ \bool_set_true:N \l_@@_symbol_was_set_by_key_bool
+ \tl_set:cn { l_@@_default_unit_ \l_@@_original_unit_tl _tl } {#1}
+ },
+ definition / symbol .value_required:n = { true } ,
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{gender}
+% To be implemented. Key used during definition of new units.
+% Defines the gender of the unit.
+% \begin{macrocode}
+ definition / gender .code:n =
+ {
+ \bool_set_true:N \l_@@_contains_valid_key_bool
+ \@@_if_gender_error:nTF {#1}
+ { \@@_culang_def_base:nVn { gender } \l_@@_original_unit_tl { m } }
+ { \@@_culang_def_base:nVn { gender } \l_@@_original_unit_tl {#1} }
+ },
+ definition / gender .value_required:n = { true } ,
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{set-option}
+% To be implemented. Key used during definition of new units.
+% Adds options to a specific key during definition of unit.
+% \begin{macrocode}
+ definition / set-option .code:n =
+ {
+ \bool_set_true:N \l_@@_contains_valid_key_bool
+ \@@_set_options_for:Vn \l_@@_original_unit_tl {#1}
+ },
+ definition / set-option .value_required:n = { true } ,
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{add-to-group}
+% To be implemented. Key used during definition of new units.
+% Adds unit to given group.
+% \begin{macrocode}
+ definition / add-to-group .code:n =
+ {
+ \bool_set_true:N \l_@@_contains_valid_key_bool
+ \@@_add_to_unit_group:nV {#1} \l_@@_original_unit_tl
+ },
+ definition / add-to-group .value_required:n = { true } ,
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{natural-unit}
+% To be implemented. Key used during definition of new units.
+% Defines this unit as a natural unit.
+% \begin{macrocode}
+ definition / natural-unit .code:n =
+ {
+ \bool_set_true:N \l_@@_contains_valid_key_bool
+ \seq_if_in:NVF \g_@@_natural_units_seq \l_@@_original_unit_tl
+ { \seq_gput_right:NV \g_@@_natural_units_seq \l_@@_original_unit_tl }
+ },
+ definition / natural-unit .default:n = { true } ,
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{unit-names}
+% To be implemented. Key used during definition of new units.
+% Defines written out unit name for \cCutext for given language.
+% Also suspended. Would need to give language and it would be too
+% complicated (I think)
+% \begin{macrocode}
+% definition / unit-names .code:n = { },
+% \end{macrocode}
+% \end{macro}
+%
+%
+% You get here during the definition of a new unit if you use the optional
+% argument. As symbols cannot contain |=| the argument |#1| is going
+% to be empty. I also assume that none of the above keys are used as an
+% unit-symbol. If |#1| is non-empty (aka.\ the key has a value) throw an error.
+% \begin{macrocode}
+ definition / unknown .code:n =
+ {
+ \tl_if_empty:nF {#1}
+ {
+ \msg_error:nnxx
+ { cooking-units }
+ { definition-key-mistyped? }
+ \l_keys_key_str
+ {#1}
+ }
+ },
+% \end{macrocode}
+%
+%
+%
+% \begin{macro}{nothing-special}
+% Stage 0 of being bonkers. Do nothing special in this one. Reset everything.
+% \begin{macrocode}
+ nothing-special .code:n =
+ {
+ \prop_gclear:N \g_@@_master_changer_prop
+ \prop_gclear:N \g_@@_convert_bonkers_remember_prop
+ \bool_set_false:N \l_@@_pckopt_bonkers_bool
+ \tl_set_eq:NN \l_@@_bonkers_state_tl \c_@@_bonkers_state_normal_tl
+ },
+ nothing-special .value_forbidden:n = { true } ,
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{going-bonkers}
+% Stage 1 of being bonkers.
+% \begin{macrocode}
+ going-bonkers .code:n =
+ {
+ \prop_gclear:N \g_@@_convert_bonkers_remember_prop
+ \bool_set_true:N \l_@@_pckopt_bonkers_bool
+ \tl_set_eq:NN \l_@@_bonkers_state_tl \c_@@_bonkers_state_going_tl
+ },
+ going-bonkers .value_forbidden:n = { true } ,
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{fully-bonkers}
+% Stage 2 of being bonkers.
+% \begin{macrocode}
+ fully-bonkers .code:n =
+ {
+ \prop_gclear:N \g_@@_master_changer_prop
+ \prop_gclear:N \g_@@_convert_bonkers_remember_prop
+ \bool_set_true:N \l_@@_pckopt_bonkers_bool
+ \tl_set_eq:NN \l_@@_bonkers_state_tl \c_@@_bonkers_state_fully_tl
+ },
+ fully-bonkers .value_forbidden:n = { true } ,
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{xD-lol}
+% Stage 3 of being bonkers.
+% \begin{macrocode}
+ xD-lol .code:n =
+ {
+ \prop_gclear:N \g_@@_master_changer_prop
+ \prop_gclear:N \g_@@_convert_bonkers_remember_prop
+ \bool_set_true:N \l_@@_pckopt_bonkers_bool
+ \tl_set_eq:NN \l_@@_bonkers_state_tl \c_@@_bonkers_state_xD_tl
+ },
+ xD-lol .value_forbidden:n = { true } ,
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%
%
%
%
@@ -4887,6 +5151,7 @@ and the derived file cooking-units.sty.
% Ending the definition of keys.
% \begin{macrocode}
}
+%\keys_set:nn { cooking-units } {#2}
% \end{macrocode}
% \end{macro}
%
@@ -4894,7 +5159,6 @@ and the derived file cooking-units.sty.
%
%
%
-%
% \subsection {Messages}
%
% Defining messages.
@@ -4977,6 +5241,18 @@ and the derived file cooking-units.sty.
\msg_see_documentation_text:n {cooking-units}
}
% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\msg_new:nnnn { cooking-units } { symbol-and-special-keys-error }
+ { You \ cannot \ use \ special-key \ '#1' \ with \ symbol \ '#2' \ definitions. }
+ {
+ You \ cannot \ redefine \ a \ symbol \ of \ a \ special-key.
+ \msg_see_documentation_text:n {cooking-units}
+ }
+% \end{macrocode}
+%
+%
% If fractions are evaluated division by zero is not allowed.
% \begin{macrocode}
\msg_new:nnnn { cooking-units } { Division-by-zero }
@@ -5032,6 +5308,19 @@ and the derived file cooking-units.sty.
}
% \end{macrocode}
%
+% Error message for an undefined key.
+% \begin{macrocode}
+\msg_new:nnnn { cooking-units } { Key-chain-unit-not-found }
+ {
+ It \ appears \ that \ \token_to_str:N \cuaddtokeychain\ was \ not \ able \ to \ find
+ a \ key-chain-unit. Define \ key-chains \ first \ using \token_to_str:N \cudefinekeychain.
+ }
+ {
+ No \ key-chain-unit\ was \ found, \ perhaps \ you \ misspelled \ it?
+ \msg_see_documentation_text:n {cooking-units}
+ }
+% \end{macrocode}
+%
% If the temperature is too low print this error message.
% Now prints all units for which a zero-point is defined.
% \begin{macrocode}
@@ -5061,6 +5350,17 @@ and the derived file cooking-units.sty.
\msg_see_documentation_text:n {cooking-units}
}
% \end{macrocode}
+% If for an unit-key the value is wrong the following error message is shown.
+% \begin{macrocode}
+\msg_new:nnnn { cooking-units } { key-no-knows-value }
+ {
+ It \ appears \ that \ the \ key \ '#1' \ does \ not \ accept \ the \ value
+ '#2'. \ Are \ you \ sure \ it \ is \ in \ the \ same \ key-chain?
+ }{
+ The \ key \ accepts \ only \ a \ fixed \ set \ of \ choices. \
+ \msg_see_documentation_text:n {cooking-units}
+ }
+% \end{macrocode}
% Adding a message for unit-groups.
% \begin{macrocode}
\msg_new:nnnn { cooking-units } { group-choice-not-allowed }
@@ -5137,6 +5437,17 @@ and the derived file cooking-units.sty.
% \end{macrocode}
%
% \begin{macrocode}
+\msg_new:nnnn { cooking-units } { Adding-single-to-multi-key-or-vice-verca }
+ {
+ You \ are \ trying \ to \ add \ a \ single-key \ to \ a \ multi-key \
+ or \ vice-versa.
+ }{
+ This \ is \ not \ allowed!
+ \msg_see_documentation_text:n { cooking-units }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
\msg_new:nnnn { cooking-units } { Value-not-allowed }
{
The \ key-list \ in \ '#1' \ does \ not \ take \ a \ value.
@@ -5258,6 +5569,16 @@ and the derived file cooking-units.sty.
}
% \end{macrocode}
%
+% \begin{macrocode}
+\msg_new:nnnn { cooking-units } { formula-in-non-singlekeys }
+ {
+ The \ conversion \ value \ '#1' \ seems \ to \ be \ a \ formula. \
+ This \ is \ not \ allowed \ for \ NON-\ singlekeys!
+ }{
+ \msg_see_documentation_text:n { cooking-units }
+ }
+% \end{macrocode}
+%
%
% \begin{macrocode}
\msg_new:nnnn { cooking-units } { <-not-allowed-as-special-sign }
@@ -5284,6 +5605,18 @@ and the derived file cooking-units.sty.
%
%
% \begin{macrocode}
+\msg_new:nnnn { cooking-units } { no-natural-unit-known }
+ {
+ It \ seems\ that \ I \ cannot \ convert \ '#1' \ in \ a \ natural \
+ unit \ as \ there \ is \ no \ conversion-factor \ defined.
+ }{
+ Not \ converting \ the \unit.
+ \msg_see_documentation_text:n { cooking-units }
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
\msg_new:nnnn { cooking-units } { curef-not-inside-list }
{
'#1' \ cannot \ be \ removed \ from \ the \ 'forbidden \ unit' \ list \ because
@@ -5356,6 +5689,13 @@ and the derived file cooking-units.sty.
\msg_see_documentation_text:n { cooking-units }
}
%
+\msg_new:nnnn { cooking-units } { unknown-unit-option }
+ {
+ The \ unit-option \ '#1' \ is \ not \ defined.
+ }{
+ Please \ define \ the \ key \ '#1' \ via \ \newcukeysadd \ and \ friends.
+ \msg_see_documentation_text:n { cooking-units }
+ }
\msg_new:nnnn { cooking-units } { unknown-option }
{
The \ option \ '#1' \ is \ not \ defined.
@@ -5363,6 +5703,13 @@ and the derived file cooking-units.sty.
Perhaps \ you \ misspelled \ the \ option.
\msg_see_documentation_text:n { cooking-units }
}
+\msg_new:nnnn { cooking-units } { unknown-choice }
+ {
+ The \ choice \ '#2' \ for \ key \ '#1' \ is \ not \ defined.
+ }{
+ Perhaps \ you \ misspelled \ the \ choice.
+ \msg_see_documentation_text:n { cooking-units }
+ }
% \end{macrocode}
%
%
@@ -5371,52 +5718,102 @@ and the derived file cooking-units.sty.
{
This \ error \ shouldn't \ show. \ This \ means \ I
\ (the \ package \ author) \ screwed
- \ up. \ The \ error \ code \ is \ '#1'.
+ \ up. \ The \ error \ code \ is \ '#1'. \
+ Addition \ is \ '#2'.
}{
Please \ send \ me \ a \ bug \ report.
\msg_see_documentation_text:n { cooking-units }
}
% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\msg_new:nnnn { cooking-units } { definition-key-mistyped? }
+ {
+ This \ message \ shows \ during \ the \ definition \ of \ unit-keys. \
+ You \ may \ have \ mistyped \ the \ key \ '#1'. \ You \ may \ see \
+ this \ message \ because \ you \ have \ used \ a \ '=' \ sign \ in \ the \
+ optional \ argument. \ If \ this \ is \ the \ case \ and \ you \ still \ want
+ \ to \ use \ '=' \ in \ a \ symbol, \ please \ wrap \ the \ symbol
+ \ in \ two \ braces: \ {{#1=#2}}.
+ }{
+ Or \ try \ using \ the \ 'symbol' \ option.
+ \msg_see_documentation_text:n { cooking-units }
+ }
+% \end{macrocode}
% \end{macro}
%
% \section {Helper Macros}
%
% The name says it all.
%
+%
+%
+%
%\begin{macro}
% {
-% \@@_error_if_unit_not_defined:n,
+% \@@_if_unit_defined:nN,
+% \@@_error_if_unit_not_defined:nNTF,
% \@@_error_if_unit_not_defined:nTF,
% \@@_error_if_unit_not_defined:VTF,
% }
% A little helper macro. Checks if the unit is defined, if not raise an error.
% \begin{macrocode}
-\prg_new_protected_conditional:Npnn \@@_error_if_unit_not_defined:n #1 { TF, T, F }
+\prg_new_protected_conditional:Npnn \@@_if_unit_defined:nN #1 #2 { TF , T }
+ {
+ \@@_set_unit:Nn #2 {#1}
+ \seq_if_in:NVTF \g_@@_list_of_defined_units_seq #2
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\prg_new_protected_conditional:Npnn \@@_error_if_unit_not_defined:nN #1#2 { TF, T, F }
{
- \seq_if_in:NnTF \g_@@_list_of_defined_units_seq {#1}
+ \@@_if_unit_defined:nNTF {#1} #2
{ \prg_return_false: }
{
\msg_error:nnn { cooking-units } { unknown-unit } {#1}
\prg_return_true:
}
}
-\cs_new:Npn \@@_error_if_unit_not_defined:n #1
- { \@@_error_if_unit_not_defined:nTF {#1} { } { } }
+\prg_new_protected_conditional:Npnn \@@_error_if_unit_not_defined:n #1 { TF, T, F }
+ {
+ \@@_error_if_unit_not_defined:nNTF {#1} \l_@@_scrap_tl
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
\cs_generate_variant:Nn \@@_error_if_unit_not_defined:nTF { V }
% \end{macrocode}
%\end{macro}
%
%
+%
+% \begin{macro} { \@@_if_unit_has_a_key:n, \@@_if_unit_has_a_key:V }
+% A little helper macro. Checks if the unit is defined, if not raise an error.
+% \begin{macrocode}
+\prg_new_protected_conditional:Npnn \@@_if_unit_has_a_key:n #1 { T , F, TF }
+ {
+ \keys_if_exist:nnTF { cooking-units } {#1}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\prg_generate_conditional_variant:Nnn \@@_if_unit_has_a_key:n { V } { T, TF }
+% \end{macrocode}
+%\end{macro}
+%
+%
+% \begin{macro} { \@@_seq_use_msg:N, \@@_seq_use_msg:c }
+% Used in error messages for units. Prints the units in a comma-seperated list.
% \begin{macrocode}
\cs_new:Npn \@@_seq_use_msg:N #1
{ \seq_use:Nnnn #1 { ' , ~ ' } { ' , ~ ' } { ' ~ and ~ ' } }
\cs_generate_variant:Nn \@@_seq_use_msg:N { c }
% \end{macrocode}
+% \end{macro}
%
%
-%
-% \begin{macro}{ \@@_if_integer:n }
-% Checking if the input consists only of numbers.
+% \begin{macro}{ \@@_if_integer:n , \@@_if_integer:V , \@@_if_evaluation_is_integer:nN }
+% Checking if the input consists only of numbers; or only of numbers and
+% the allowed math operators
% \begin{macrocode}
\prg_new_protected_conditional:Npnn \@@_if_integer:n #1 { TF , F }
{
@@ -5424,71 +5821,115 @@ and the derived file cooking-units.sty.
{
\tl_if_in:NnF \l_@@_input_digits_tl {##1}
{
- \tl_map_break:n { \use_iii:nnn }
+ \tl_map_break:n { \use_i:nn \prg_return_false: }
}
}
- \use_i:nn \prg_return_true: \prg_return_false:
+ \prg_return_true:
}
\cs_generate_variant:Nn \@@_if_integer:nTF { V }
-\cs_generate_variant:Nn \@@_if_integer:nF { V }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{ \@@_if_integer:n }
-% Checking if the input consists only of numbers.
-% \begin{macrocode}
-\cs_new:Npn \@@_bool_set_if_integers:NNN #1#2#3
+\prg_new_protected_conditional:Npnn \@@_if_evaluation_is_integer:n #1 { TF , T , F }
{
- \@@_if_integer:VTF #2
- { \bool_set_true:N #1 }
- { \bool_set_false:N #1 }
- \bool_lazy_and:nnT
- { \l_@@_range_in_input_bool } {#1}
+ \tl_concat:NNN \l_@@_tmpa_tl
+ \l_@@_input_digits_tl \l_@@_allwed_integer_math_operators_tl
+ \tl_map_inline:nn {#1}
{
- \@@_if_integer:VF #3
- { \bool_set_false:N #1 }
+ \tl_if_in:NnF \l_@@_tmpa_tl {##1}
+ { \tl_map_break:n { \use_iii:nnn } }
}
+ \use_i:nn
+ { \prg_return_true: }
+ { \prg_return_false: }
}
% \end{macrocode}
% \end{macro}
%
%
%
-% \begin{macro}[TF]{ \@@_fp_if_equal_one:n}
-% \begin{macro}[TF]{ \@@_int_if_equal_one:n}
+% \begin{macro}{ \@@_if_integers:NNTF }
+% Checking if the input consists only of numbers, which works correctly for ranges.
% \begin{macrocode}
-\prg_new_conditional:Npnn \@@_fp_if_equal_one:n #1 { TF }
- {
- \fp_compare:nNnTF {#1} = { 1.0 }
- { \prg_return_true: }
- { \prg_return_false: }
- }
-\prg_new_conditional:Npnn \@@_int_if_equal_one:n #1 { TF }
+\prg_new_conditional:Npnn \@@_if_integers:NN #1#2 { TF }
{
- \int_compare:nNnTF {#1} = { 1 }
- { \prg_return_true: }
+ \@@_if_integer:VTF #1
+ {
+ \@@_if_print_type_equal:nTF { range }
+ {
+ \@@_if_integer:VTF #2
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ { \prg_return_true: }
+ }
{ \prg_return_false: }
}
% \end{macrocode}
-% \end{macro} \end{macro}
+% \end{macro}
%
%
+% \begin{macro}{ \@@_if_contains_decimal:NTF , \@@_check_for_decimal:w }
+% A fast check if |#1| contains a decimal point. This is only
+% used for already parsed input, so the input is already safe to check.
+%
+% If |#1| does not contain a decimal point, |\@@_check_for_decimal:w|
+% |#2| is equal to |\q_nil|, the test is true and the false branch is executed.
%
-% \begin{macro}{}
+% If |#1| does contain a decimal point, |#2| is going equal to |<...>.\q_nil|
+% where |<...>| is the stuff after the decimal point. The test is false, thus the
+% true branch is ignored (ignoring all other tokens in |#2|).
% \begin{macrocode}
-\prg_new_conditional:Npnn \@@_change_cutext_to_cunum:n #1 { TF }
+\prg_new_conditional:Npnn \@@_if_contains_decimal:N #1 { TF }
{
- \keys_set_groups:nnn { cooking-units } { change-command } {#1}
- \bool_if:NTF \l_@@_cutext_to_cunum_bool
+ \exp_after:wN \@@_check_for_decimal:w #1 . \q_nil . \q_stop
+ }
+\cs_new:Npn \@@_check_for_decimal:w #1 . #2 . \q_stop
+ {
+ \if_meaning:w \q_nil #2
+ \exp_after:wN \prg_return_false:
+ \else:
+ \exp_after:wN \prg_return_true:
+ \fi:
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_if_contain_decimals:NNTF}
+% Same as |\@@_if_integers:NNTF| only for decimal points.
+% \begin{macrocode}
+\prg_new_conditional:Npnn \@@_if_contain_decimals:NN #1#2 { TF }
+ {
+% \@@_if_contains_decimal:NTF #1
+% {
+% \@@_if_print_type_equal:nTF { range }
+% {
+% \@@_if_contains_decimal:NTF #2
+% { \prg_return_true: }
+% { \prg_return_false: }
+% }
+% { \prg_return_true: }
+% }
+% { \prg_return_false: }
+ \@@_if_contains_decimal:NTF #1
{ \prg_return_true: }
- { \prg_return_false: }
+ {
+ \@@_if_print_type_equal:nTF { range }
+ {
+ \@@_if_contains_decimal:NTF #2
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ { \prg_return_false: }
+ }
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{ \@@_check_if_correct_gender_input:n }
+%
+%
+%
+%
+%
+% \begin{macro}{ \@@_if_gender_error:n }
% \begin{macrocode}
-\prg_new_conditional:Npnn \@@_if_gender_error:n #1 { TF }
+\prg_new_conditional:Npnn \@@_if_gender_error:n #1 { TF, F , T }
{
\str_case:nnTF {#1}
{
@@ -5497,145 +5938,233 @@ and the derived file cooking-units.sty.
{ n } { }
}
{ \prg_return_false: }
- {
+ {
\msg_error:nnn { cooking-units } { unknown-gender } {#1}
\prg_return_true:
- }
+ }
}
-\cs_new:Npn \@@_check_if_correct_gender_input:n #1
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%
+%
+% \begin{macro}{\@@_error_if_group_not_defined:nN, \@@_error_if_group_not_defined:n}
+% \begin{macrocode}
+\prg_new_conditional:Npnn \@@_error_if_group_not_defined:nN #1#2 { F, T , TF }
{
- \str_case:nnF {#1}
- {
- { m } { }
- { f } { }
- { n } { }
- } { \msg_error:nnn { cooking-units } { unknown-gender } {#1} }
+ \@@_set_unit:Nn #2 {#1}
+ \seq_if_exist:cTF { l_@@_group_ #2 _seq }
+ { \prg_return_false: }
+ {
+ \msg_error:nn { cooking-units} { group-key-unknown }
+ \prg_return_true:
+ }
+ }
+\prg_new_conditional:Npnn \@@_error_if_group_not_defined:n #1 { F }
+ {
+ \seq_if_exist:cTF { l_@@_group_ \@@_to_unit:n {#1} _seq }
+ { \prg_return_false: }
+ {
+ \msg_error:nn { cooking-units} { group-key-unknown }
+ \prg_return_true:
+ }
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_define_clear_unit_group:nn,\@@_add_to_unit_group_error:n,\@@_add_to_unit_group:nn}
+%
+%
+% \begin{macro}{\@@_define_clear_unit_group:n}
% \begin{macrocode}
-\cs_new:Npn \@@_define_clear_unit_group:nn #1#2
+\cs_new:Npn \@@_define_clear_unit_group:n #1
{
- \seq_clear_new:c { l_@@_group_ #1 _seq }
- \keys_define:nn { cooking-units }
+ \@@_set_unit:Nn \l_@@_tmpa_tl {#1}
+ \seq_clear_new:c { l_@@_group_ \l_@@_tmpa_tl _seq }
+ \keys_define:nn { cooking-units }
{
#1 .code:n = { \@@_unit_group_convert_units:nn {#1} {##1} } ,
#1 .groups:n = { change-unit } ,
}
}
+% \end{macrocode}
+% \end{macro}
%
-\cs_new:Npn \@@_add_to_unit_group_error:n #1
- { \msg_error:nnn { cooking-units } { No-Value-given } { add-unit-to-group } }
%
-\cs_new:Npn \@@_add_to_unit_group:nn #1#2
+% \begin{macro}{\@@_unit_group_convert_units:nn}
+% \begin{macrocode}
+\cs_new:Npn \@@_unit_group_convert_units:nn #1#2
{
- \@@_error_if_group_not_defined:nF {#1}
+ \bool_set_true:N \l_@@_tmpa_bool
+ \@@_error_if_group_not_defined:nNT {#1} \l_@@_curr_group_tl
+ { \bool_set_false:N \l_@@_tmpa_bool }
+ \@@_error_if_unit_not_defined:nNT {#2} \l_@@_curr_unit_tl
+ { \bool_set_false:N \l_@@_tmpa_bool }
+ \bool_if:NT \l_@@_tmpa_bool
{
- \clist_map_inline:nn {#2}
+ \seq_if_in:cVTF { l_@@_group_ \l_@@_curr_group_tl _seq } \l_@@_curr_unit_tl
{
- \@@_error_if_unit_not_defined:nF {##1}
- {
- \seq_if_in:cnF { l_@@_group_ #1 _seq } {##1}
- { \seq_put_right:cn { l_@@_group_ #1 _seq } {##1} }
- }
+ \seq_map_inline:cn { l_@@_group_ \l_@@_curr_group_tl _seq }
+ { \@@_keys_set:nnn { cooking-units } {##1} {#2} }
+ }{
+ \msg_error:nnxxx
+ { cooking-units }
+ { group-choice-not-allowed }
+ { \l_@@_curr_group_tl } { \l_@@_curr_unit_tl }
+ { \@@_seq_use_msg:c { l_@@_group_ \l_@@_curr_group_tl _seq } }
}
}
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_error_if_group_not_defined:n}
+%
+%
+% \begin{macro}{\@@_add_to_unit_group_error:n , \@@_add_to_unit_group:nn }
% \begin{macrocode}
-\prg_new_conditional:Npnn \@@_error_if_group_not_defined:n #1 { F }
- {
- \seq_if_exist:cTF { l_@@_group_ #1 _seq }
- { \prg_return_false: }
- {
- \msg_error:nn { cooking-units} { group-key-unknown }
- \prg_return_true:
- }
- }
+\cs_new:Npn \@@_add_to_unit_group_error:n #1
+ { \msg_error:nnn { cooking-units } { No-Value-given } { add-unit-to-group } }
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_unit_group_convert_units:nn}
-% Didn't feel like intending the groups, as such use |\use_none:nnnnn(nnn)|.
-% (Always wanted to use those |\use_none:|)
% \begin{macrocode}
-\cs_new:Npn \@@_unit_group_convert_units:nn #1#2
+\cs_new:Npn \@@_add_to_unit_group:nn #1#2
{
- \@@_error_if_group_not_defined:nF {#1}
+ \@@_error_if_group_not_defined:nNF {#1} \l_@@_curr_group_tl
{
- \@@_error_if_unit_not_defined:nF {#2}
+ \clist_map_inline:nn {#2}
{
- \seq_if_in:cnTF { l_@@_group_ #1 _seq } {#2}
+ \@@_error_if_unit_not_defined:nNF {##1} \l_@@_curr_unit_tl
{
- \seq_map_inline:cn { l_@@_group_ #1 _seq }
- { \@@_keys_set:nnn { cooking-units } {##1} {#2} }
- }{
- \msg_error:nnxxx
- { cooking-units }
- { group-choice-not-allowed }
- {#1} {#2}
- { \@@_seq_use_msg:c { l_@@_group_ #1 _seq } }
+ \seq_if_in:cVF { l_@@_group_ \l_@@_curr_group_tl _seq } \l_@@_curr_unit_tl
+ {
+ \seq_put_right:cV
+ { l_@@_group_ \l_@@_curr_group_tl _seq }
+ \l_@@_curr_unit_tl
+ }
}
}
}
}
+\cs_generate_variant:Nn \@@_add_to_unit_group:nn { nV }
% \end{macrocode}
% \end{macro}
%
%
+%
+%
% \begin{macro}{\@@_convert_to_eV:}
% Still work in progress. Will probably forever be. Changes all
% predefined units into natural units (except for those who cannot
% be changed, like |Msp.| for example).
%
% \begin{macrocode}
-\seq_new:N \g_@@_natural_units_seq
-\prop_new:N \g_@@_convert_to_eV_remember_prop
-\seq_gset_from_clist:Nn \g_@@_natural_units_seq
+\cs_new:Npn \@@_seq_get_overlap:NNTF #1#2 #3#4
{
- eV ,
- eVc-2 ,
- hbareV-1 ,
- chbareV-1 ,
- (chbareV-1)3 ,
+ \seq_map_inline:Nn #1
+ {
+ \seq_if_in:NnT #2 {##1}
+ { #3 \seq_map_break:n { \use_none:nn } }
+ }
+ \use:n {#4}
}
+% \end{macrocode}
+% \begin{macrocode}
\cs_new:Npn \@@_keys_set:nnn #1#2#3
{ \keys_set:nn {#1} { #2 = #3 } }
\cs_generate_variant:Nn \@@_keys_set:nnn { nVV , nVn }
-\cs_new:Npn \@@_convert_to_eV:
+% \end{macrocode}
+% \begin{macrocode}
+\cs_new:Npn \@@_convert_to_eV:N #1
{
- \tl_set_eq:Nc \l_@@_tmp_unit_tl { l_@@_base_key_unit_ \l_@@_original_unit_tl _tl }
- \tl_if_empty:NF \l_@@_tmp_unit_tl
+ \prop_get:NVNTF \g_@@_convert_to_eV_remember_prop
+ #1 \l_@@_tmpa_tl
+ { \@@_keys_set:nVV { cooking-units } #1 \l_@@_tmpa_tl }
{
- \prop_get:NVNTF \g_@@_convert_to_eV_remember_prop
- \l_@@_original_unit_tl \l_@@_tmpa_tl
- { \@@_keys_set:nVV { cooking-units } \l_@@_original_unit_tl \l_@@_tmpa_tl }
+% #1 is already a string
+ \@@_if_unit_has_a_key:VTF #1
{
- \prop_get:cnNTF { l_@@_cukeys_ \l_@@_tmp_unit_tl _prop } { Liste } \l_@@_tmpa_seq
+ \tl_set_eq:Nc \l_@@_tmp_unit_tl { l_@@_base_key_unit_ #1 _tl }
+ \prop_get:cnNT { l_@@_new_cukeys_ \l_@@_tmp_unit_tl _prop }
+ { Liste } \l_@@_tmpa_seq
{
- \seq_map_inline:Nn \g_@@_natural_units_seq
+ \@@_seq_get_overlap:NNTF \g_@@_natural_units_seq \l_@@_tmpa_seq
{
- \seq_if_in:NnT \l_@@_tmpa_seq {##1}
- {
- \prop_gput:NVn \g_@@_convert_to_eV_remember_prop
- \l_@@_original_unit_tl {##1}
- \@@_keys_set:nVn { cooking-units } \l_@@_original_unit_tl {##1}
- \seq_map_break:
- }
+ \prop_gput:NVn \g_@@_convert_to_eV_remember_prop #1 {##1}
+ \@@_keys_set:nVn { cooking-units } #1 {##1}
}
+ { \msg_warning:nnx { cooking-units } { no-natural-unit-known } {#1} }
}
- { \msg_error:nnn { cooking-units } { internal-error } { convert-to-eV } }
}
+ { \msg_warning:nnx { cooking-units } { Key-not-defined } {#1} }
}
}
% \end{macrocode}
%\end{macro}
%
+% \begin{macrocode}
+\cs_new:Npn \@@_changing_unit_bonkers:N #1
+ {
+ \prop_get:NVNTF \g_@@_convert_bonkers_remember_prop
+ #1 \l_@@_tmpa_tl
+ { \@@_keys_set:nVV { cooking-units } #1 \l_@@_tmpa_tl }
+ {
+ \tl_case:NnF \l_@@_bonkers_state_tl
+ {
+ \c_@@_bonkers_state_going_tl { \@@_convert_going_bonkers:N #1 }
+ \c_@@_bonkers_state_fully_tl { \@@_convert_fully_bonkers:N #1 }
+ \c_@@_bonkers_state_xD_tl { \@@_convert_xD_bonkers:N #1 }
+ }
+ { \@@_create_internal_error:nN { going-bonkers } \l_@@_bonkers_state_tl }
+ }
+ }
+\cs_new:Npn \@@_convert_going_bonkers:N #1
+ {
+ \@@_if_unit_has_a_key:VT #1
+ {
+ \@@_prepare_going_bonkers:N #1
+ \keys_set:nn { cooking-units } { eval-fraction = true }
+ \@@_keys_set:nVV { cooking-units } #1 \l_@@_tmpa_tl
+ \prop_gput:NVV \g_@@_convert_bonkers_remember_prop #1 \l_@@_tmpa_tl
+ }
+ }
+\cs_new:Npn \@@_convert_fully_bonkers:N #1
+ {
+ \@@_if_unit_has_a_key:VT #1
+ {
+ \@@_prepare_going_bonkers:N #1
+ \keys_set:nn { cooking-units }
+ { eval-fraction = true , curef-clear-forbidden-units = true }
+ \prop_put:NVV \l_@@_change_unit_prop {#1} \l_@@_tmpa_tl
+ \@@_cukeys_calculate_change_value:VVV #1 \l_@@_tmpa_tl \l_@@_tmp_unit_tl
+ }
+ }
+\cs_new:Npn \@@_prepare_going_bonkers:N #1
+ {
+ \tl_set_eq:Nc \l_@@_tmp_unit_tl { l_@@_base_key_unit_ #1 _tl }
+ \prop_get:cnN { l_@@_new_cukeys_ \l_@@_tmp_unit_tl _prop } { Liste } \l_@@_tmpa_seq
+ \bool_set_false:N \l_@@_tmpa_bool
+ \bool_until_do:Nn \l_@@_tmpa_bool
+ {
+ \tl_set:Nf \l_@@_tmpa_tl { \seq_rand_item:N \l_@@_tmpa_seq }
+ \seq_if_in:NVF \g_@@_natural_units_seq \l_@@_tmpa_tl
+ { \bool_set_true:N \l_@@_tmpa_bool }
+ }
+ }
+\cs_new:Npn \@@_convert_xD_bonkers:N #1
+ {
+ \keys_set:nn { cooking-units } { eval-fraction = true , curef-clear-forbidden-units = true }
+ \bool_set_false:N \l_@@_tmpa_bool
+ \bool_until_do:Nn \l_@@_tmpa_bool
+ {
+ \tl_set:Nx \l_@@_tmpa_tl { \seq_rand_item:N \g_@@_list_of_defined_units_seq }
+ \@@_if_no_unit_marker:NF \l_@@_tmpa_tl
+ { \bool_set_true:N \l_@@_tmpa_bool }
+ }
+ \prop_put:NVV \l_@@_change_unit_prop {#1} \l_@@_tmpa_tl
+ \tl_set:cf { l_@@_unit_change_ #1 _tl } { \fp_eval:n { rand() * randint(255) } }
+ }
+% \end{macrocode}
%
%
%
@@ -5643,7 +6172,7 @@ and the derived file cooking-units.sty.
% I am using this construction often enough, so \dots\ yeah.
% \begin{macrocode}
\cs_new:Npn \@@_tl_eval:Nn #1#2 { \tl_set:Nf #1 { \fp_eval:n {#2} } }
-\cs_generate_variant:Nn \@@_tl_eval:Nn { Nv }
+\cs_generate_variant:Nn \@@_tl_eval:Nn { Nv, cn }
% \end{macrocode}
% \end{macro}
%
@@ -5653,16 +6182,15 @@ and the derived file cooking-units.sty.
% I am using this construction often enough, so \dots\ yeah.
% Note that if the evaluation is |true|, the path taken is the |false| one.
% \begin{macrocode}
-\prg_new_conditional:Npnn \@@_change_unit: { TF , T }
+\prg_new_conditional:Npnn \@@_change_unit: { TF }
{
- \bool_lazy_any:nTF
- {
- { \l_@@_lokal_fraction_bool }
- { \l_@@_special_sign_bool }
- { \l_@@_draft_bool }
- }
+ \@@_if_print_type_equal:nTF { fraction }
{ \prg_return_false: }
- { \prg_return_true: }
+ {
+ \@@_if_state_equal:nTF { special_sign }
+ { \prg_return_false: }
+ { \prg_return_true: }
+ }
}
% \end{macrocode}
% \end{macro}
@@ -5681,43 +6209,36 @@ and the derived file cooking-units.sty.
}
\cs_new:Npn \@@_temperatures_to_check_define:nn #1#2
{
- \@@_error_if_unit_not_defined:nF {#1}
+ \@@_error_if_unit_not_defined:nNF {#1} \l_@@_curr_unit_tl
{
- \fp_if_exist:cTF { l_@@_ #1 _min_fp }
- {
-% \msg_warning:nnn { cooking-units } { Minimum-already-defined } {#1}
- \fp_set:cn { l_@@_ #1 _min_fp } {#2}
- }{
- \seq_put_right:Nn \l_@@_temperatures_to_check_seq {#1}
- \fp_new:c { l_@@_ #1 _min_fp }
- \fp_set:cn { l_@@_ #1 _min_fp } {#2}
+ \fp_if_exist:cF { l_@@_ \l_@@_curr_unit_tl _min_fp }
+ {
+ \seq_put_right:NV \l_@@_temperatures_to_check_seq \l_@@_curr_unit_tl
+ \fp_new:c { l_@@_ \l_@@_curr_unit_tl _min_fp }
}
+ \fp_set:cn { l_@@_ \l_@@_curr_unit_tl _min_fp } {#2}
}
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{ \@@_set_options_for_error:n , \@@_set_options_for:nn }
+% \begin{macro}{ \@@_set_options_for_error:n }
% \begin{macrocode}
\cs_new:Npn \@@_set_options_for_error:n #1
{
\@@_error_if_unit_not_defined:n {#1}
\msg_error:nnn { cooking-units } { No-Value-given } { set-option-for }
}
-\cs_new:Npn \@@_set_options_for:nn #1#2
- { \cusetoptionfor {#1} {#2} }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{ \@@_add_options_for_error:n , \@@_add_options_for:nn }
+% \begin{macro}{ \@@_add_options_for_error:n }
% \begin{macrocode}
\cs_new:Npn \@@_add_options_for_error:n #1
{
\@@_error_if_unit_not_defined:n {#1}
\msg_error:nnn { cooking-units } { No-Value-given } { add-option-for }
}
-\cs_new:Npn \@@_add_options_for:nn #1#2
- { \cuaddoptionfor {#1} {#2} }
% \end{macrocode}
% \end{macro}
%
@@ -5728,7 +6249,7 @@ and the derived file cooking-units.sty.
{
#1
, \l_@@_round_precision_int
- \bool_if:NT \l_@@_round_commercial_bool
+ \bool_if:NT \l_@@_pckopt_round_commercial_bool
{ , #1 }
}
% \end{macrocode}
@@ -5738,12 +6259,9 @@ and the derived file cooking-units.sty.
% \begin{macrocode}
\cs_new:Npn \@@_label_and_persons:n #1
{
- \tl_if_in:nnTF {#1} { * }
- {
- \@@_label_and_persons_times_persons:ww #1 \q_stop
- }{
- \msg_error:nnn { cooking-units} { Number-of-persons-missing } {#1}
- }
+ \str_if_in:nnTF {#1} { * }
+ { \@@_label_and_persons_times_persons:ww #1 \q_stop }
+ { \msg_error:nnn { cooking-units} { Number-of-persons-missing } {#1} }
}
% \end{macrocode}
% \end{macro}
@@ -5760,13 +6278,13 @@ and the derived file cooking-units.sty.
\cs_new:Npn \@@_culabel:nn #1#2
{
\int_if_exist:cTF { g_@@_number_of_persons_ #1 _int }
+ { \msg_error:nnn { cooking-units } { label-already-defined } {#1} }
{
- \msg_error:nnn { cooking-units } { label-already-defined } {#1}
- }{
- \@@_if_integer:nTF {#2}
+ \@@_if_evaluation_is_integer:nTF {#2}
{
+ \int_set:Nn \l_@@_tmpa_int {#2}
\int_new:c { g_@@_number_of_persons_ #1 _int }
- \int_gset:cn { g_@@_number_of_persons_ #1 _int } {#2}
+ \int_gset_eq:cN { g_@@_number_of_persons_ #1 _int } \l_@@_tmpa_int
}
{ \msg_error:nnn { cooking-units } { Number-of-persons-is-not-an-integer } {#2} }
}
@@ -5780,7 +6298,7 @@ and the derived file cooking-units.sty.
{
\int_if_exist:cTF { g_@@_number_of_persons_ #1 _int }
{
- \bool_set_true:N \l_@@_calc_because_ref_was_given_bool
+ \bool_set_true:N \l_@@_reference_given_bool
\int_set_eq:Nc \l_@@_local_number_of_persons_int
{ g_@@_number_of_persons_ #1 _int }
}
@@ -5795,7 +6313,7 @@ and the derived file cooking-units.sty.
{
\int_if_exist:cTF { g_@@_number_of_persons_ #1 _int }
{
- \bool_if:NTF \l_@@_change_number_of_persons_bool
+ \bool_if:NTF \l_@@_pckopt_recalculate_amount_bool
{ \int_use:N \l_@@_wanted_number_of_persons_int }
{ \int_use:c { g_@@_number_of_persons_ #1 _int } }
}{ \msg_error:nnn { cooking-units } { label-not-defined } {#1} }
@@ -5813,27 +6331,21 @@ and the derived file cooking-units.sty.
%
%
%
-% \begin{macro}{ \@@_bool_reverse:N, \@@_check_minus_remove_and_reverse:NN }
+% \begin{macro}{ \@@_check_minus_remove_and_reverse:NN }
% Can probably optimize this as the sign is always at the first place
% (this is done after cheking the input, so the assumption is safe), but yeah \dots
% \begin{macrocode}
-\cs_new:Npn \@@_bool_reverse:N #1
- {
- \bool_if:NTF #1
- { \bool_set_false:N }
- { \bool_set_true:N }
- #1
- }
\cs_new:Npn \@@_check_minus_remove_and_reverse:NN #1#2
{
\quark_if_nil:NF #2
{
+ %% Maybe simplify by a command?
\tl_if_in:NnT #2 { - }
{
\tl_remove_once:Nn #2 { - }
- \@@_bool_reverse:N #1
+ \bool_if:NTF #1 { \bool_set_false:N } { \bool_set_true:N } #1
}
- \@@_check_minus_remove_and_reverse:NN #1
+ \@@_check_minus_remove_and_reverse:NN #1
}
}
% \end{macrocode}
@@ -5841,108 +6353,306 @@ and the derived file cooking-units.sty.
%
%
%
-% \subsection{Language Macros}
+%
+%
+%
+%
+%
%
% \begin{macrocode}
-\tl_const:Nn \c_@@_postfix_unit_tl { ( cu-unit ) }
-\tl_const:Nn \c_@@_postfix_unit_pl_tl { ( cu-unit-pl ) }
-\tl_const:Nn \c_@@_postfix_unitname_tl { ( cu-unitname ) }
-\tl_const:Nn \c_@@_postfix_unitname_pl_tl { ( cu-unitname-pl ) }
-\tl_const:Nn \c_@@_postfix_gender_tl { ( cu-unitgender ) }
-\tl_const:Nn \c_@@_postfix_phrase_tl { ( cu-unitphrase ) }
+\cs_new:Npn \@@_add_forbidden_unit:n #1
+ {
+ \seq_set_from_clist:Nn \l_@@_tmpa_seq {#1}
+ \seq_map_inline:Nn \l_@@_tmpa_seq
+ {
+ \@@_error_if_unit_not_defined:nNF {##1} \l_@@_curr_unit_tl
+ {
+ \seq_if_in:NVF \l_@@_curef_do_not_change_seq \l_@@_curr_unit_tl
+ { \seq_put_right:NV \l_@@_curef_do_not_change_seq \l_@@_curr_unit_tl }
+ }
+ }
+ }
+\cs_new:Npn \@@_remove_forbidden_unit:n #1
+ {
+ \seq_set_from_clist:Nn \l_@@_tmpa_seq {#1}
+ \seq_map_inline:Nn \l_@@_tmpa_seq
+ {
+ \@@_error_if_unit_not_defined:nNF {##1} \l_@@_curr_unit_tl
+ {
+ \seq_if_in:NVTF \l_@@_curef_do_not_change_seq \l_@@_curr_unit_tl
+ { \seq_remove_all:NV \l_@@_curef_do_not_change_seq \l_@@_curr_unit_tl }
+ {
+ \msg_warning:nnnn { cooking-units } { curef-not-inside-list } {##1}
+ { \@@_seq_use_msg:N \l_@@_curef_do_not_change_seq }
+ }
+ }
+ }
+ }
+\cs_new:Npn \@@_clear_forbidden_unit:
+ { \seq_clear:N \l_@@_curef_do_not_change_seq }
% \end{macrocode}
%
-% \begin{macro}{\@@_deftranslation_base:nnn, \@@_deftranslation_base:xVn }
-% \begin{macro}{\@@_deftranslation_to:nnnn , \@@_deftranslation_to:VxVv,\@@_deftranslation_to:VxVV,\@@_deftranslation_to:VxVn}
+%
+%
+%
+%
+%
% \begin{macrocode}
-\cs_new:Npn \@@_deftranslation_base:nnn #1#2#3
+\NewDocumentCommand \cudeclareunitgroup { m m }
{
- \declaretranslationfallback { #1 #2 } {#3}
+ \@@_define_clear_unit_group:n {#1}
+ \@@_add_to_unit_group:nn {#1} {#2}
}
-\cs_new:Npn \@@_deftranslation_to:nnnn #1#2#3#4
+\NewDocumentCommand \cuaddtounitgroup { m m }
{
- \declaretranslation {#1} { #2 #3 } {#4}
+ \@@_add_to_unit_group:nn {#1} {#2}
+ }
+\NewDocumentCommand \cuclearunitgroup { m }
+ {
+ \@@_error_if_group_not_defined:nF {#1}
+ { \@@_define_clear_unit_group:n {#1} }
}
-\cs_generate_variant:Nn \@@_deftranslation_base:nnn { xV }
-\cs_generate_variant:Nn \@@_deftranslation_to:nnnn { VxVv, VxVV , VxVn }
% \end{macrocode}
-% \end{macro}
-% \end{macro}
%
%
%
-% \begin{macro}{\@@_newtranslation:xxn }
-% \begin{macro}{\@@_newtranslation:nxxn }
+%
+%
+%
+%
+%
+% \begin{macro}{ \cusetoptionfor , \cuaddoptionfor , \cuclearoptionfor}
+% \pkg{cooking-units} allows to attach options to units. Every time the unit
+% is used, the option is executed (technically it is similar or equal to a hook).
+% Using these commands, one can set (overwrites all previous options),
+% add or clear options for a unit or a list of units.
% \begin{macrocode}
-\cs_new:Npn \@@_newtranslation_base:nnn #1#2#3
+\NewDocumentCommand \cusetoptionfor { m m }
+ { \@@_set_options_for:nn {#1} {#2} }
+\NewDocumentCommand \cuaddoptionfor { m m }
+ { \@@_add_options_for:nn {#1} {#2} }
+\NewDocumentCommand \cuclearoptionfor { m }
+ { \@@_clear_options_for:n {#1} }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_set_options_for:nn , \@@_add_options_for:nn , \@@_clear_options_for:n}
+% These commands are quite similar, excpet for a few details.
+% First, store the unit or list of units |#1| and the list of options |#2|.
+% At the end, for each unit in |#1| a clist will be created (if not already existing)
+% where the options will be put \emph{via} |\clist_set:cn|, |\clist_put_right:cn|
+% or will be cleared (see there).
+%
+% E.g.\ |\clist_set:cn| will get something like |\clist_set:cV {...unit...clist} \clist_containing_options_clist|.
+% As |\clist_clear:c| does not take a second argument, we will eat it \emph{via}
+% |\use_i_ii:nnn|.
+% \begin{macrocode}
+\cs_new:Npn \@@_set_options_for:nn #1#2
+ {
+ \@@_map_trough_valid_unit_options:nnn {#1} {#2} { \clist_set:cV }
+ }
+\cs_new:Npn \@@_add_options_for:nn #1#2
{
- \definetranslationfallback { #1 #2 } {#3}
+ \@@_map_trough_valid_unit_options:nnn {#1} {#2} { \clist_put_right:cV }
}
-\cs_new:Npn \@@_newtranslation_to:nnnn #1#2#3#4
+\cs_new:Npn \@@_clear_options_for:n #1
{
- \definetranslation {#1} { #2 #3 } {#4}
+ \@@_map_trough_valid_unit_options:nnn {#1} { \q_no_value } { \clist_clear:c }
}
-\cs_generate_variant:Nn \@@_newtranslation_base:nnn { nVn }
-\cs_generate_variant:Nn \@@_newtranslation_to:nnnn { nnVn }
+\cs_generate_variant:Nn \@@_set_options_for:nn { V }
+\cs_generate_variant:Nn \@@_clear_options_for:n { V }
% \end{macrocode}
% \end{macro}
+%
+% \begin{macro}{\@@_map_trough_valid_unit_options:nnn}
+% The first thing is command does is to map through the given unit list |#1|
+% and check if the unit(s) exist or not. If they exist, store them in the sequence
+% |\l_@@_tmpa_seq| for later use. Else, ignore it and print a warning.
+%
+% If |#2| is a |\q_no_value| we know that there is no need to map through |#2|.
+% Whatever the command |#3| does, it does so only to the clist
+% |l_@@_unit_option_ <unit> _clist|.
+%
+% If |#2| is anything else, follow the |else| branch. After veryfing that |#2|
+% is non-empty map through the option list given in |#2|. All valid keys
+% (and their agrument) is stored in |\l_@@_tmpa_clist|.
+% Afterwards, the clist for each unit in |\l_@@_tmpa_seq| is modified by the command
+% in |#3| and is given the list of options |\l_@@_tmpa_clist| as an argument.
+% (Note: |\l_@@_tmpa_clist| can be empty).
+% \begin{macrocode}
+\cs_new:Npn \@@_map_trough_valid_unit_options:nnn #1#2 #3
+ {
+ \seq_clear:N \l_@@_tmpa_seq
+ \clist_clear:N \l_@@_tmpa_clist
+ \clist_map_inline:nn {#1}
+ {
+ \@@_error_if_unit_not_defined:nNF {##1} \l_@@_curr_unit_tl
+ { \seq_put_right:NV \l_@@_tmpa_seq \l_@@_curr_unit_tl }
+ }
+ \quark_if_no_value:nTF {#2}
+ {
+ \seq_map_inline:Nn \l_@@_tmpa_seq
+ { #3 { l_@@_unit_option_ ##1 _clist } }
+ }{
+ \tl_if_empty:nF {#2}
+ { \@@_unit_options_check_validity:n {#2} }
+ \seq_map_inline:Nn \l_@@_tmpa_seq
+ { #3 { l_@@_unit_option_ ##1 _clist } \l_@@_tmpa_clist }
+ }
+ }
+% \end{macrocode}
% \end{macro}
%
-%
-% \begin{macro}{\@@_translate:nn , \@@_translate:xV }
-% \begin{macro}{\@@_translate_let:Nnn , \@@_translate_let:NnV }
-% \begin{macro}{\@@_translate_let:nNnn , \@@_translate_let:VNnV }
+% \begin{macro}{ \@@_unit_options_check_validity:n }
+% If the list of options is non-empty, we parse over them using
+% |\keyval_parse:NNn|. For this we need two commands, one for keys
+% with argument, one without arguments. All the commands do is to check
+% if the key given does exist. And if they do, store them in |\l_@@_tmpa_clist|.
% \begin{macrocode}
-\cs_new:Npn \@@_translate:nn #1#2
+\cs_new:Npn \@@_unit_options_check_validity:n #1
{
- \GetTranslation { #1 #2 }
+ \keyval_parse:NNn
+ \@@_unit_options_check_validity_aux_i:n
+ \@@_unit_options_check_validity_aux_ii:nn
+ {#1}
}
-\cs_new:Npn \@@_translate_let:Nnn #1#2#3
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{ \@@_unit_options_check_validity_aux_i:n ,
+% \@@_unit_options_check_validity_aux_ii:nn }
+% Check if the key exist; if it is then put it in |\l_@@_tmpa_clist| (just the key, or with the value).
+% Sadly, checking if the value |#2| can be accepted by the key is not really testable.
+% \begin{macrocode}
+\cs_new:Npn \@@_unit_options_check_validity_aux_i:n #1
{
- \SaveTranslation {#1} { #2 #3 }
+ \keys_if_exist:nnTF { cooking-units } {#1}
+ { \clist_put_right:Nn \l_@@_tmpa_clist {#1} }
+ { \msg_error:nnn { cooking-units } { unknown-option } {#1} }
}
-\cs_new:Npn \@@_translate_let:nNnn #1#2#3#4
+\cs_new:Npn \@@_unit_options_check_validity_aux_ii:nn #1#2
{
- \SaveTranslationFor {#2} {#1} { #3 #4 }
+ \keys_if_exist:nnTF { cooking-units } {#1}
+ {
+ \clist_put_right:Nn \l_@@_tmpa_clist { #1= {#2} }
+% \keys_if_choice_exist:nnnTF { cooking-units } {#1} {#2}
+% { \clist_put_right:Nn \l_@@_tmpa_clist { #1= {#2} } }
+% { \msg_error:nnnn { cooking-units } { unknown-choice } {#1} {#2} }
+ }
+ { \msg_error:nnn { cooking-units } { unknown-option } {#1} }
}
-\cs_generate_variant:Nn \@@_translate:nn { VV, nV }
-\cs_generate_variant:Nn \@@_translate_let:Nnn { NnV }
-\cs_generate_variant:Nn \@@_translate_let:nNnn { VNnV, nNnV }
% \end{macrocode}
% \end{macro}
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+% \subsection{Language Macros}
+%
+%
+% The following commands are just wrapper around the commands from the
+% \pkg{translations} package.
+%
+% \begin{macro}{ \@@_culang_def_base:nnn , \@@_culang_def_base:nnv , \@@_culang_def_base:nVn}
+% \begin{macrocode}
+\cs_new:Npn \@@_culang_def_base:nnn #1#2#3
+ { \declaretranslationfallback { #2 - #1 (@@) } {#3} }
+\cs_generate_variant:Nn \@@_culang_def_base:nnn { nnv, nVn }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{ \@@_culang_def_for:nnnn, \@@_culang_def_for:VnnV , \@@_culang_def_for:Vnnn }
+% \begin{macrocode}
+\cs_new:Npn \@@_culang_def_for:nnnn #1#2#3#4
+ { \declaretranslation {#1} { #3 - #2 (@@) } {#4} }
+\cs_generate_variant:Nn \@@_culang_def_for:nnnn { VnnV, V }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{ \@@_culang_print:nn , \@@_culang_print:nV }
+% \begin{macrocode}
+\cs_new:Npn \@@_culang_print:nn #1#2
+ { \GetTranslation { #2 - #1 (@@) } }
+\cs_generate_variant:Nn \@@_culang_print:nn { nV }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{ \@@_culang_let:nnN }
+% \begin{macrocode}
+\cs_new:Npn \@@_culang_let:nnN #1#2#3
+ { \SaveTranslation #3 { #2 - #1 (@@) } }
+% \end{macrocode}
% \end{macro}
+%
+% \begin{macro}{ \@@_culang_let_for:nnnN , \@@_culang_let_for:VnnN }
+% \begin{macrocode}
+\cs_new:Npn \@@_culang_let_for:nnnN #1#2#3#4
+ { \SaveTranslationFor #4 {#1} { #3-#2 (@@) } }
+\cs_generate_variant:Nn \@@_culang_let_for:nnnN { V }
+% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[TF]{\@@_unitname_get:Nn,\@@_unitname_get:Nx }
+% \begin{macro}[TF]{ \@@_culang_if_translation_exists_for:nnn, \@@_culang_if_translation_exists_for:Vnn}
% \begin{macrocode}
-\prg_new_conditional:Npnn \@@_unitname_get:Nn #1#2 { F }
+\cs_new:Npn \@@_culang_if_translation_exists_for:nnnTF #1#2#3
+ { \IfTranslation {#1} { #3 - #2 (@@) } }
+\cs_generate_variant:Nn \@@_culang_if_translation_exists_for:nnnTF { V }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%
+% \begin{macro}[TF, F]{\@@_culang_unitname_let:Nn , \@@_culang_unitname_let:NV }
+% \begin{macrocode}
+\prg_new_conditional:Npnn \@@_culang_unitname_let:Nn #1#2 { TF, F , T }
{
- \@@_translate_let:NnV #1 {#2} \c_@@_postfix_unitname_tl
+ \@@_culang_let:nnN { name } {#2} #1
\tl_if_eq:NNTF #1 \q_@@_no_translation
{ \prg_return_false: }
{ \prg_return_true: }
}
-\cs_generate_variant:Nn \@@_unitname_get:NnF { Nx }
+\cs_generate_variant:Nn \@@_culang_unitname_let:NnTF { NV, Nx }
+\cs_generate_variant:Nn \@@_culang_unitname_let:NnT { Nx }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_translate_one_and_check_existance:Nx }
-% As |#2| is already going to be expanded, using |\@@_translate_let:NnV| is safe.
+% \begin{macro}{ \@@_culang_one_let:Nn , \@@_culang_one_let:NV ,
+% \@@_culang_one_let_by_gender:Nn , \@@_culang_one_let_by_gender:NV
+% }
% \begin{macrocode}
-\cs_new:Npn \@@_translate_one_and_check_existance:Nn #1#2
+\prg_new_conditional:Npnn \@@_culang_one_let:Nn #1#2 { T }
{
- \@@_translate_let:NnV #1 {#2} \c_@@_postfix_gender_tl
- \@@_unitname_get:NxF #1 { one (#1) }
- {
- \@@_translate_let:NnV #1 {#2} \c_@@_postfix_gender_tl
- \msg_error:nnn { cooking-units } { Translation-not-available } { one (#1) }
+ \@@_culang_let:nnN { gender } {#2} \l_@@_tmpa_tl
+ \@@_culang_one_let_by_gender:NVTF #1 \l_@@_tmpa_tl
+ { \prg_return_true: }
+ {
+ \tl_set:Nn #1 { 1 }
+ \prg_return_false:
}
}
-\cs_generate_variant:Nn \@@_translate_one_and_check_existance:Nn { Nx }
+\cs_generate_variant:Nn \@@_culang_one_let:NnT { NV }
+\prg_new_conditional:Npnn \@@_culang_one_let_by_gender:Nn #1#2 { TF }
+ {
+ \@@_culang_unitname_let:NnTF #1 { one (#2) }
+ { \prg_return_true: }
+ {
+ \msg_error:nnx { cooking-units } { Translation-not-available } { one (#2) }
+ \prg_return_false:
+ }
+ }
+\cs_generate_variant:Nn \@@_culang_one_let_by_gender:NnTF { NV }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{ decimal-mark, one(m), one(f), one(n) }
+% \begin{macro}{ \g_@@_allowed_special_keys_seq }
% Defining the translation for the decimal-mark. Note that those
% 'phrases' are stored inside
% \verb|\g_@@_allowed_special_keys_seq|.
@@ -5950,6 +6660,7 @@ and the derived file cooking-units.sty.
% \begin{macrocode}
\seq_gset_from_clist:Nn \g_@@_allowed_special_keys_seq
{
+ cutext-range-sign ,
decimal-mark ,
one (m) ,
one (f) ,
@@ -5957,36 +6668,37 @@ and the derived file cooking-units.sty.
}
% \end{macrocode}
% \end{macro}
+%
% \begin{macrocode}
-\@@_newtranslation_base:nVn { decimal-mark } \c_@@_postfix_unitname_tl { . }
-\@@_newtranslation_base:nVn { decimal-mark } \c_@@_postfix_unitname_pl_tl { \q_@@_no_translation }
-\@@_newtranslation_to:nnVn { German } { decimal-mark } \c_@@_postfix_unitname_tl { , }
+\@@_culang_def_base:nnn { name } { decimal-mark } { . }
+\@@_culang_def_base:nnn { name-pl } { decimal-mark } { \q_@@_no_translation }
+\@@_culang_def_for:nnnn { German } { name-pl } { decimal-mark } { , }
% \end{macrocode}
% Note that the plural versions just exist for completing the set.
% \begin{macrocode}
-\@@_newtranslation_base:nVn { one (m) } \c_@@_postfix_unitname_tl { \q_@@_no_translation }
-\@@_newtranslation_base:nVn { one (f) } \c_@@_postfix_unitname_tl { \q_@@_no_translation }
-\@@_newtranslation_base:nVn { one (n) } \c_@@_postfix_unitname_tl { \q_@@_no_translation }
-\@@_newtranslation_base:nVn { one (m) } \c_@@_postfix_unitname_pl_tl { \q_@@_no_translation }
-\@@_newtranslation_base:nVn { one (f) } \c_@@_postfix_unitname_pl_tl { \q_@@_no_translation }
-\@@_newtranslation_base:nVn { one (n) } \c_@@_postfix_unitname_pl_tl { \q_@@_no_translation }
+\@@_culang_def_base:nnn { name } { one (m) } { \q_@@_no_translation }
+\@@_culang_def_base:nnn { name } { one (f) } { \q_@@_no_translation }
+\@@_culang_def_base:nnn { name } { one (n) } { \q_@@_no_translation }
+\@@_culang_def_base:nnn { name-pl } { one (m) } { \q_@@_no_translation }
+\@@_culang_def_base:nnn { name-pl } { one (f) } { \q_@@_no_translation }
+\@@_culang_def_base:nnn { name-pl } { one (n) } { \q_@@_no_translation }
% \end{macrocode}
% \begin{macrocode}
-\@@_newtranslation_to:nnVn { English } { one (m) } \c_@@_postfix_unitname_tl { one }
-\@@_newtranslation_to:nnVn { English } { one (f) } \c_@@_postfix_unitname_tl { one }
-\@@_newtranslation_to:nnVn { English } { one (n) } \c_@@_postfix_unitname_tl { one }
+\@@_culang_def_for:nnnn { English } { name } { one (m) } { one }
+\@@_culang_def_for:nnnn { English } { name } { one (f) } { one }
+\@@_culang_def_for:nnnn { English } { name } { one (n) } { one }
% \end{macrocode}
% \begin{macrocode}
-\@@_newtranslation_to:nnVn { German } { one (m) } \c_@@_postfix_unitname_tl { ein }
-\@@_newtranslation_to:nnVn { German } { one (f) } \c_@@_postfix_unitname_tl { eine }
-\@@_newtranslation_to:nnVn { German } { one (n) } \c_@@_postfix_unitname_tl { ein }
+\@@_culang_def_for:nnnn { German } { name } { one (m) } { ein }
+\@@_culang_def_for:nnnn { German } { name } { one (f) } { eine }
+\@@_culang_def_for:nnnn { German } { name } { one (n) } { ein }
% \end{macrocode}
%
% \begin{macrocode}
-\@@_newtranslation_base:nVn { cutext-range-sign } \c_@@_postfix_unitname_tl { -- }
-\@@_newtranslation_base:nVn { cutext-range-sign } \c_@@_postfix_unitname_pl_tl { \q_@@_no_translation }
-\@@_newtranslation_to:nnVn { German } { cutext-range-sign } \c_@@_postfix_unitname_tl { ~bis~ }
-\@@_newtranslation_to:nnVn { English } { cutext-range-sign } \c_@@_postfix_unitname_tl { ~to~ }
+\@@_culang_def_base:nnn { name } { cutext-range-sign } { -- }
+\@@_culang_def_base:nnn { name-pl } { cutext-range-sign } { \q_@@_no_translation }
+\@@_culang_def_for:nnnn { German } { name } { cutext-range-sign } { ~bis~ }
+\@@_culang_def_for:nnnn { English } { name } { cutext-range-sign } { ~to~ }
% \end{macrocode}
%
%
@@ -5996,130 +6708,622 @@ and the derived file cooking-units.sty.
% (\mycs{cunum}, \cCutext, \mycs{cuam}), hence the name.
%
%
-% \begin{macro}{\@@_initialise_default:n ,
-% \@@_initialise_unit_change:n ,
-% \@@_initialise_after_unit_change:nn
-% }
-% Functions shared by all initialization functions:
+% \subsection{Enums \& States}
+%
+% These variables decide what the main commands (\cs{cunum}, etc.) should do.
+% Is there an error? Special-sign? Fraction? Range? Which command is used?
+% This is defined here.
+%
+% \begin{macro}{ \@@_def_new_type:nnn , \@@_def_new_type_aux:cnn , \@@_def_new_type_aux:Nnn}
+% Defines my variants, all in one handy command (well, two commands).
+% |#1| is the base name of the new state. |#2| are the conditions for
+% |\prg_new_conditional|. |#3| are the possible states, given as a comma list.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_initialise_default:n #1
+\cs_new:Npn \@@_def_new_type:nnn #1#2#3
{
- \@@_set_unit:Nn \l_@@_original_unit_tl {#1}
- \bool_set_false:N \l_@@_error_bool
- \@@_error_if_unit_not_defined:VTF \l_@@_original_unit_tl
+ \tl_new:c { l_@@_ #1 _tl }
+ \clist_map_inline:nn {#3}
+ { \tl_const:cn { c_@@_ #1 _ ##1 _tl } {##1} }
+ \@@_def_new_type_aux:cnn { l_@@_ #1 _tl } {#1} {#2}
+ }
+% \end{macrocode}
+% Defines the commands |@@_set_<base name>_to:n| and (if wanted)
+% |@@_if_ <base name> _equal:n|. For maybe optimization (not sure why)
+% I decided that |#1| is the token varable which stores the state we are currently
+% in.
+% \begin{macrocode}
+\cs_new:Npn \@@_def_new_type_aux:Nnn #1#2#3
+ {
+ \cs_new:cpn { @@_set_ #2 _to:n } ##1
{
- \bool_set_true:N \l_@@_unit_error_bool
- \cs_set_eq:NN \@@_print_correct_unit: \@@_print_default_unit:
- }
- { \bool_set_false:N \l_@@_unit_error_bool }
- \bool_set_false:N \l_@@_special_sign_bool
- \bool_set_false:N \l_@@_range_in_input_bool
- \bool_set_false:N \l_@@_lokal_fraction_bool
- \bool_set_false:N \l_@@_minus_bool
+ \tl_if_exist:cF { c_@@_#2_ ##1 _tl } { \tl_show:n { ERROR-set-#2-##1 } }
+ \tl_set_eq:Nc #1 { c_@@_#2_ ##1 _tl }
+ }
+ \tl_if_empty:nF {#3}
+ {
+ \prg_new_conditional:cpnn { @@_if_ #2 _equal:n } ##1 {#3}
+ {
+ \tl_if_exist:cF { c_@@_#2_ ##1 _tl } { \tl_show:n { ERROR-check-#2-##1 } }
+ \tl_if_eq:NcTF #1 { c_@@_#2_ ##1 _tl }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ }
}
+\cs_generate_variant:Nn \@@_def_new_type_aux:Nnn { c }
+% \end{macrocode}
+% \end{macro}
+%
+% Defining some states.
+% \begin{macrocode}
+\@@_def_new_type:nnn { state } { TF , T , F , p }
+ { normal , special_sign , 42 , error }
+\@@_def_new_type:nnn { cmd_type } { TF , T , p }
+ { cunum , cCutext , cuam }
+\@@_def_new_type:nnn { parse_and_process_type } { TF , T }
+ { number , range , fraction }
+\@@_def_new_type:nnn { print_type } { TF , T }
+ { unknown , number , range , fraction }
+\@@_def_new_type:nnn { bonkers_state } { }
+ { normal , going , fully , xD }
% \end{macrocode}
-% Some units have options added to them. To get those options it is first
-% needed to know which unit will be used at all. Therefore units will
-% be changed first and afterwards the other options are processed.
%
-% |\l_@@_convert_to_eV_bool| must be checked after processing the keys
-% as the option \opt{convert-to-eV} is set during this process.
+% Setting a default state..
% \begin{macrocode}
-\cs_new_protected:Npn \@@_initialise_unit_change:n #1
+\tl_set_eq:NN \l_@@_bonkers_state_tl \c_@@_bonkers_state_normal_tl
+% \end{macrocode}
+%
+%
+% \subsection{The main stuff}
+%
+% \begin{macro} { \@@_expand_unit_input:Nn , \@@_expand_amount_input:Nn }
+% \begin{macrocode}
+\cs_new:Npn \@@_expand_unit_input:Nn #1#2
{
- \tl_if_empty:nF {#1}
- { \keys_set_groups:nnn { cooking-units } { change-unit } {#1} }
- \bool_if:NT \l_@@_convert_to_eV_bool
- { \@@_convert_to_eV: }
- \prop_get:NVNF \l_@@_change_unit_prop \l_@@_original_unit_tl \l_@@_option_unit_tl
- { \tl_set_eq:NN \l_@@_option_unit_tl \l_@@_original_unit_tl }
+ \cs_if_exist_use:c { exp_args:NN \l_@@_unit_argument_spec_tl }
+ \@@_set_unit:Nn #1 {#2}
+ }
+\cs_new:Npn \@@_expand_amount_input:Nn #1#2
+ {
+ \cs_if_exist_use:c { exp_args:NN \l_@@_expand_amount_tl }
+ \@@_set_amount:Nn #1 {#2}
}
% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{ \@@_do_the_stuff:nnnnn , \@@_do_the_stuff:nnnnn }
+% Main command shared by |\cunum|, etc.\ It reads the input
+% parses options and decides (depending on which command was used)
+% what to do with the stuff and how to print it.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_initialise_after_unit_change:nn #1#2
+\bool_new:N \l_@@_skip_first_part_bool
+\cs_new:Npn \@@_do_the_stuff:nnnnnn #1#2#3#4#5#6
{
+% #1 -- label
+% #2 -- options
+% #3 -- amount
+% #4 -- space
+% #5 -- unit
+ \@@_initialice_accordingly:nnnn {#1} {#4} {#2} {#5}
+ \@@_use_hook_accordingly:
+ \@@_parse_the_amount:n {#3}
+ \@@_general_checkups:
+ \@@_if_state_equal:nTF { normal }
+ { \@@_process_amount_normally:n {#2} }
+ { \@@_process_amount_special: }
+ \@@_new_print_amount_correctly:
+ \@@_new_print_unit_correctly:
+ }
+\cs_generate_variant:Nn \@@_do_the_stuff:nnnnnn { nnnnV }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_initialice_accordingly:nnnn , \@@_initialice_addon_cutext: }
+% This cs first initializes stuff that is equal for all commands, then
+% does command-specific things. The default stuff includes checking if the
+% unit is valid, setting some bools, sets options (including change of units), etc.
+%
+% For |\cunum| we set the space used for |\phantom|, for |\cuam| we do nothing.
+% \begin{macrocode}
+\cs_new:Npn \@@_initialice_accordingly:nnnn #1#2#3#4
+ {
+ \@@_initialize_new_default:nnn {#1} {#3} {#4}
+ \@@_initialize_new_default_units:
+ \tl_case:NnF \l_@@_cmd_type_tl
+ {
+ \c_@@_cmd_type_cunum_tl { \tl_set:Nn \l_@@_phantom_tl {#2} }
+ \c_@@_cmd_type_cCutext_tl { \@@_initialice_addon_cutext: }
+ \c_@@_cmd_type_cuam_tl { }
+ }
+ { \@@_create_internal_error:nN { init-acc } \l_@@_cmd_type_tl }
+ }
+% \end{macrocode}
+% For \cCutext\ we first check if the user wants to use \cCutext\ at all.
+% If not, change it to |\cunum|.
+% \begin{macrocode}
+\cs_new:Npn \@@_initialice_addon_cutext:
+ {
+ \bool_if:NT \l_@@_pckopt_cutext_to_cunum_bool
+ { \@@_set_cmd_type_to:n { cunum } }
+ \bool_set_false:N \l_@@_cutext_last_amount_equ_one_bool
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{ \@@_initialize_new_default:nnn , \@@_initialize_new_default:nnV ,
+% \@@_intialize_new_default_units:
+% }
+% Shared by all commands and (nearly) first thing done. Sets the options,
+% sets the unit (and expands it if necessary), checks if unit is defined.
+% For |\cuam| the unit is a special |\c_@@_no_unit_marker_tl|. I could just check
+% if |\cuam| is used, but I think this is more general. If the marker is used
+% we do nothing, else we we check how the units change.
+% \begin{macrocode}
+\cs_new:Npn \@@_initialize_new_default:nnn #1#2#3
+ {
+ \tl_clear:N \l_@@_option_unit_tl
+ \tl_if_empty:nF {#2} { \keys_set:nn { cooking-units } {#2} }
\IfNoValueF {#1}
{ \@@_reference_label_and_persons:n {#1} }
- \clist_if_empty:cF { l_@@_unit_option_ \l_@@_option_unit_tl _clist }
+ \@@_expand_unit_input:Nn \l_@@_original_unit_tl {#3}
+ \@@_error_if_unit_not_defined:VTF \l_@@_original_unit_tl
+ {
+ \@@_set_state_to:n { error }
+ \bool_set_true:N \l_@@_unit_error_bool
+ }
+ { \@@_set_state_to:n { normal } }
+ \@@_set_parse_and_process_type_to:n { number }
+ \@@_set_print_type_to:n { unknown }
+ \tl_clear:N \l_@@_phantom_tl
+ \@@_initialize_new_default_units:
+ }
+% \end{macrocode}
+% First, convert the original unit to eV or a bonkers unit if necessary.
+% If we have an unit-change, store the wanted unit in |\l_@@_option_unit_tl|.
+% \begin{macrocode}
+\cs_new:Npn \@@_initialize_new_default_units:
+ {
+ \@@_if_no_unit_marker:NTF \l_@@_original_unit_tl
+ { \tl_set_eq:NN \l_@@_option_unit_tl \l_@@_original_unit_tl }
+ { \@@_intialize_new_default_units_aux: }
+ }
+\cs_new:Npn \@@_intialize_new_default_units_aux:
+ {
+ \bool_if:NTF \l_@@_pckopt_bonkers_bool
+ { \@@_changing_unit_bonkers:N \l_@@_original_unit_tl }
+ {
+ \bool_if:NT \l_@@_pckopt_convert_to_eV_bool
+ { \@@_convert_to_eV:N \l_@@_original_unit_tl }
+ }
+ \prop_get:NVNF \l_@@_change_unit_prop \l_@@_original_unit_tl \l_@@_option_unit_tl
+ { \tl_set_eq:NN \l_@@_option_unit_tl \l_@@_original_unit_tl }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_initialise_new_after_parsing:n}
+% As the name suggests, this one is used \emph{after} parsing the amount.
+% This is done in order to know if there is an error, if the unit needs
+% to be changed and if this command needs to be called at all.
+%
+% It is kinda difficult to decide which unit is the correct one, as it may change
+% due to unit-options. In theory this could lead to an infinite loop,
+% so I decide in this place how things are printed and which unit
+% is used.
+%
+% Well, in the end I only decide if a fraction is printed or not. The case of error or
+% special signs were already sorted out.
+%
+% To make sure the lokal options override the unit-options, we set
+% the options again after unit-options.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_initialise_new_after_parsing:n #1
+ {
+ \clist_if_empty:cF { l_@@_unit_option_ \l_@@_decided_unit_tl _clist }
{
\keys_set_filter:nnv
{ cooking-units }
{ change-unit }
- { l_@@_unit_option_ \l_@@_option_unit_tl _clist }
+ { l_@@_unit_option_ \l_@@_decided_unit_tl _clist }
+ \tl_if_empty:nF {#1} { \keys_set:nn { cooking-units } {#1} }
}
- \tl_if_empty:nF {#2}
- { \keys_set_filter:nnn { cooking-units } { change-unit } {#2} }
- \bool_lazy_and:nnTF
- { \l_@@_calc_because_ref_was_given_bool } { \l_@@_change_number_of_persons_bool }
- { \bool_set_true:N \l_@@_lokal_persons_bool }
- { \bool_set_false:N \l_@@_lokal_persons_bool }
- \bool_set_eq:NN \l_@@_lokal_numeral_bool \l_@@_print_numeral_bool
+ \bool_set_eq:NN \l_@@_lokal_numeral_bool \l_@@_pckopt_print_numeral_bool
}
+\cs_new:Npn \@@_decide_unit:
+ {
+ \@@_change_unit:TF
+ { \tl_set_eq:NN \l_@@_decided_unit_tl \l_@@_option_unit_tl }
+ { \tl_set_eq:NN \l_@@_decided_unit_tl \l_@@_original_unit_tl }
+ }
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\@@_new_setup_bools_for_process_and_prints:}
+% Determines some stuff for later use in the processing/printing department.
+% It checks if the amount needs to be recalculated; and if fractions should be
+% printed or not.
+% \begin{macrocode}
+\cs_new:Npn \@@_new_setup_bools_for_process_and_prints:
+ {
+ \bool_set_false:N \l_@@_lokal_recalc_for_people_bool
+ \bool_lazy_and:nnT
+ { \l_@@_reference_given_bool }
+ { \l_@@_pckopt_recalculate_amount_bool }
+ {
+ \int_compare:nNnF
+ { \l_@@_wanted_number_of_persons_int }
+ =
+ { \l_@@_local_number_of_persons_int }
+ { \bool_set_true:N \l_@@_lokal_recalc_for_people_bool }
+ }
+ \@@_if_print_type_equal:nT { fraction }
+ {
+ \bool_lazy_or:nnTF
+ { \l_@@_pckopt_eval_fractions_bool }
+ { \l_@@_lokal_recalc_for_people_bool }
+ { \@@_set_print_type_to:n { number } }
+ {
+% "Convert" fractions \emph{only} if a unit change is requested.
+ \bool_lazy_and:nnT
+ { \l_@@_pckopt_convert_fractions_bool }
+ { ! \tl_if_eq_p:NN \l_@@_option_unit_tl \l_@@_original_unit_tl }
+ { \@@_set_print_type_to:n { number } }
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
%
-% \begin{macro}{ \@@_print_input:N , \@@_print_correct_unit: ,
-% \@@_post_process_input:NN , \@@_pre_process_input:NN}
-% Wrapper macro for printing the (not)calculated output. Note that if no
-% calculation happens in \mycs{cutext} (and \mycs{Cutext}) \cs{l_@@_option_unit_tl}
-% is set to \cs{l_@@_original_unit_tl} (the unit given in the second argument of
-% \mycs{cutext} or \mycs{Cutext}) by default.
+% \begin{macro}{ \@@_use_hook_accordingly: }
+% Hooks are straightforward. I know which command I used and thus set the
+% respective hook.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_print_input:N #1 { }
-\cs_new_protected:Npn \@@_print_correct_unit: { }
-\cs_new_protected:Npn \@@_do_not_process_input:NN #1#2 { }
-\cs_new_eq:NN \@@_pre_process_input:NN \@@_do_not_process_input:NN
-\cs_new_eq:NN \@@_post_process_input:NN \@@_do_not_process_input:NN
+\cs_new:Npn \@@_use_hook_accordingly:
+ {
+ \l_@@_cmd_hook_tl
+ \tl_case:NnF \l_@@_cmd_type_tl
+ {
+ \c_@@_cmd_type_cunum_tl { \l_@@_cunum_hook_tl }
+ \c_@@_cmd_type_cCutext_tl
+ {
+ \bool_if:NTF \l_@@_cutext_uppercase_word_bool
+ { \l_@@_Cutext_hook_tl }
+ { \l_@@_cutext_hook_tl }
+ }
+ \c_@@_cmd_type_cuam_tl { \l_@@_cuam_hook_tl }
+ }
+ { \@@_create_internal_error:nN { use-hook-acc } \l_@@_cmd_type_tl }
+ }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro} { \@@_set_process_and_print_for_cunum: ,
-% \@@_set_process_and_print_for_cutext: ,
-% \@@_set_process_and_print_for_cuam:
-% }
-% It is handy to set the \enquote{print} and \enquote{process}
-% command all in one go. It's also less messy to use.
+%
+%
+% \begin{macro}{ \@@_general_checkups: }
+% Doing some general stuff and tests which are done before further processing
+% the amount.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_set_process_and_print_for_cunum:
- {
- \cs_set_eq:NN \@@_print_input:N \@@_print_numerical_input:N
- \cs_set_eq:NN \@@_print_correct_unit: \@@_cunum_print_correct_unit:
- \cs_set_eq:NN \@@_pre_process_input:NN \@@_do_not_process_input:NN
- \cs_set_eq:NN \@@_post_process_input:NN \@@_do_not_process_input:NN
+\cs_new:Npn \@@_general_checkups:
+ {
+ \tl_set_eq:NN \l_@@_print_type_tl \l_@@_parse_and_process_type_tl
+ \@@_if_state_equal:nT { normal }
+ { \@@_new_setup_bools_for_process_and_prints: }
+ \@@_decide_unit:
+ \@@_if_cmd_type_equal:nT { cCutext }
+ { \@@_cutext_check_if_translation_available: }
}
-\cs_new_protected:Npn \@@_set_process_and_print_for_cutext:
- {
- \cs_set_eq:NN \@@_print_input:N \@@_cutext_print_input:N
- \cs_set_eq:NN \@@_print_correct_unit: \@@_cutext_print_correct_unitname:
- \cs_set_eq:NN \@@_pre_process_input:NN \@@_cutext_pre_process_input:NN
- \cs_set_eq:NN \@@_post_process_input:NN \@@_cutext_post_process_input:NN
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@@_process_amount_normally:n}
+% This command is called after parsing the amount if no special-sign, error
+% or so is encountered. First, initialize some stuff that is going to be important.
+% Afterwards, if \cCutext\ is used, check if a translation is available.
+% Then process the input depending on which case (number, range, fraction) we had.
+% \begin{macrocode}
+\cs_new:Npn \@@_process_amount_normally:n #1
+ {
+ \@@_initialise_new_after_parsing:n {#1}
+ \tl_case:NnF \l_@@_parse_and_process_type_tl
+ {
+ \c_@@_parse_and_process_type_number_tl \@@_new_process_number_in_input:
+ \c_@@_parse_and_process_type_range_tl \@@_new_process_range_in_input:
+ \c_@@_parse_and_process_type_fraction_tl \@@_new_process_fraction_in_input:
+ }
+ { \@@_create_internal_error:nN { process_the_input } \l_@@_parse_and_process_type_tl }
}
-\cs_new_protected:Npn \@@_set_process_and_print_for_cuam:
- {
- \cs_set_eq:NN \@@_print_input:N \@@_cuam_print_numerical_input:N
- \cs_set_eq:NN \@@_print_correct_unit: \@@_cuam_print_correct_unitphrase:
- \cs_set_eq:NN \@@_pre_process_input:NN \@@_do_not_process_input:NN
- \cs_set_eq:NN \@@_post_process_input:NN \@@_cuam_post_process_input:NN
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}
+% This is called if the state is not \enquote{normal}. So the whole \enquote{process}
+% part is skipped. If a special sign was detected, print a warining. If
+% the 42-bool is true, change the amount accordingly. Nothing else is done.
+% \begin{macrocode}
+\cs_new:Npn \@@_process_amount_special:
+ {
+ \@@_if_state_equal:nT { special_sign }
+ { \msg_warning:nnV { cooking-units } { amount-not-known } \l_@@_original_amount_tl }
+ \bool_if:NT \l_@@_pckopt_fourty_two_bool
+ { \@@_prepare_fourty_two_amount: }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{ \@@_prepare_fourty_two_amount: }
+% Simply replaces all variables with |42|. We can change all (except for the mixed fraction tl)
+% as we know if we are going to print a \enquote{number}, \enquote{range} or
+% \enquote{fraction}.
+% \begin{macrocode}
+\cs_new:Npn \@@_prepare_fourty_two_amount:
+ {
+ \tl_set:Nn \l_@@_number_tmpa_tl { 42 }
+ \tl_set:Nn \l_@@_number_tmpb_tl { 42 }
+ \tl_if_empty:NF \l_@@_mixed_fraction_tl
+ { \tl_set:Nn \l_@@_mixed_fraction_tl { 42 } }
+ \@@_if_state_equal:nT { special_sign }
+ {
+ \tl_put_right:Nn \l_@@_number_tmpa_tl { (!) }
+ \tl_put_right:Nn \l_@@_number_tmpb_tl { (!) }
+ \tl_if_empty:NF \l_@@_mixed_fraction_tl
+ { \tl_put_right:Nn \l_@@_mixed_fraction_tl { (!) } }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsubsection{Process the input}
+%
+% \begin{macro}{ \@@_new_process_number_in_input: }
+% Straightforward. The number only consists of a number. Thus
+% calculate the things necessary and post process it depending on the command
+% (|\cunum|, etc.)\ used.
+% \begin{macrocode}
+\cs_new:Npn \@@_new_process_number_in_input:
+ {
+ \@@_calculate_and_store_in:N \l_@@_number_tmpa_tl
+ \@@_post_process_accordingly:NN \l_@@_number_tmpa_tl \q_no_value
}
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{ \@@_new_process_range_in_input: }
+% Same as before, this time with two variables.
+% \begin{macrocode}
+\cs_new:Npn \@@_new_process_range_in_input:
+ {
+ \@@_calculate_and_store_in:N \l_@@_number_tmpa_tl
+ \@@_calculate_and_store_in:N \l_@@_number_tmpb_tl
+ \@@_post_process_accordingly:NN \l_@@_number_tmpa_tl \l_@@_number_tmpb_tl
+ }
+% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{ \@@_new_process_range_in_input: }
+% Here we are a bit more complicated, but not much.
+% For fractions, we generally do not calculate the several numbers.
%
+% First, remove the minus signs from the numbers (if any).
+% Afterwards check if the printing type is a \enquote{number} (\enquote{range} is
+% not possible). If a \enquote{number} is requested, convert the fraction
+% to a number (simply by calculating the fraction). If we have a fraction, nothing
+% else needs to be done.
+% \begin{macrocode}
+\cs_new:Npn \@@_new_process_fraction_in_input:
+ {
+ \@@_process_and_remove_minus_in_fraction:NNNN \l_@@_minus_bool
+ \l_@@_mixed_fraction_tl
+ \l_@@_number_tmpa_tl
+ \l_@@_number_tmpb_tl
+ \@@_if_print_type_equal:nT { number }
+ {
+ \@@_convert_fraction_to_number_in_input:NNN
+ \l_@@_mixed_fraction_tl
+ \l_@@_number_tmpa_tl
+ \l_@@_number_tmpb_tl
+ }
+ }
+% \end{macrocode}
+% This command loops over each variable, removes the minus and reverses the
+% bool if needed.
+% \begin{macrocode}
+\cs_new:Npn \@@_process_and_remove_minus_in_fraction:NNNN #1 #2#3#4
+ {
+ \bool_set_false:N #1
+ \@@_check_minus_remove_and_reverse:NN
+ #1 #2#3#4
+ \q_nil
+ }
+% \end{macrocode}
+% Convert a fraction to a number. Check if the denominator is 0, if so, print an
+% error. Else, simply evaluate the fraction. If the minus bool is true,
+% add a minus sign on the left. Afterwards, process it as a number.
+% \begin{macrocode}
+\cs_new:Npn \@@_convert_fraction_to_number_in_input:NNN #1#2#3
+ {
+ \fp_compare:nNnTF {#3} = { 0 }
+ { \@@_create_error:n { Division-by-zero } }
+ {
+ \@@_tl_eval:Nn \l_@@_number_tmpa_tl { #1 + #2 / #3 }
+ \bool_if:NT \l_@@_minus_bool
+ { \tl_put_left:Nn \l_@@_number_tmpa_tl { - } }
+ \@@_new_process_number_in_input:
+ }
+ }
+% \end{macrocode}
+% \end{macro}
%
%
-% \begin{macro}{ \@@_print_numerical_input:N }
-% Prints the numerical output (if it is not a fraction).
+% \begin{macro}{ \@@_new_print_amount_correctly: }
+% After parsing, processing, etc.\ it is time to print the amount.
+% If an error was raised, simply print the \enquote{unparsed} original amount.
+%
+% Else, print the amount depending on \enquote{number}, \enquote{range}
+% or \enquote{fraction}. \enquote{number} and \enquote{range} are printed
+% according to the command used (|\cunum|, etc.). Fractions are printed
+% indipendently from the commands.
+% \begin{macrocode}
+\cs_new:Npn \@@_new_print_amount_correctly:
+ {
+ \@@_if_state_equal:nTF { error }
+ { \l_@@_original_amount_tl }
+ {
+ \tl_case:NnF \l_@@_print_type_tl
+ {
+ \c_@@_print_type_number_tl
+ {
+ \@@_print_number_accordingly:N
+ \l_@@_number_tmpa_tl
+ }
+ \c_@@_print_type_range_tl
+ {
+ \@@_print_range_accordingly:NN
+ \l_@@_number_tmpa_tl
+ \l_@@_number_tmpb_tl
+ }
+ \c_@@_print_type_fraction_tl
+ {
+ \@@_culang_let:nnN { name } { decimal-mark } \l_@@_translation_tmpa_tl
+ \tl_replace_once:Nnn \l_@@_mixed_fraction_tl { . } \l_@@_translation_tmpa_tl
+ \tl_replace_once:Nnn \l_@@_number_tmpa_tl { . } \l_@@_translation_tmpa_tl
+ \tl_replace_once:Nnn \l_@@_number_tmpb_tl { . } \l_@@_translation_tmpa_tl
+ \@@_print_fractions:Nnn
+ \l_@@_mixed_fraction_tl
+ \l_@@_number_tmpa_tl
+ \l_@@_number_tmpb_tl
+ }
+ }
+ { \@@_create_internal_error:nN { print_the_input } \l_@@_print_type_tl }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{ \@@_new_print_unit_correctly: , \@@_print_unit_in_case_of_error: }
+% Prints the unit. In case of error, print the unit more or less directly.
+% Even in case of error there needs to be the correct spacing, etc.
+%
+% Else, parse the unit depending on the command used. For |\cuam| no unit
+% is printed, but a phrase can be required.
+% \begin{macrocode}
+\cs_new:Npn \@@_new_print_unit_correctly:
+ {
+ \@@_if_state_equal:nTF { error }
+ { \@@_print_unit_in_case_of_error: }
+ {
+ \tl_case:NnF \l_@@_cmd_type_tl
+ {
+ \c_@@_cmd_type_cunum_tl { \@@_cunum_print_correct_unit: }
+ \c_@@_cmd_type_cCutext_tl { \@@_cutext_print_correct_unitname: }
+ \c_@@_cmd_type_cuam_tl { \@@_cuam_print_correct_unitphrase: }
+% \c_@@_cmd_type_cucomp_tl { \@@_cunum_print_correct_unit: }
+ }
+ { \@@_create_internal_error:nN { print-unit-acc } \l_@@_cmd_type_tl }
+ }
+ }
+% \end{macrocode}
+% Prints the unit in case of error. Make sure the unit is printed correctly
+% with the correct spacing. If the unit is unknown, just print the input.
+% \begin{macrocode}
+\cs_new:Npn \@@_print_unit_in_case_of_error:
+ {
+ \tl_if_empty:NF \l_@@_phantom_tl { \phantom { \l_@@_phantom_tl } }
+ \tl_use:N \l_@@_value_unit_space_tl
+ \bool_if:NTF \l_@@_unit_error_bool
+ { \l_@@_original_unit_tl }
+ { \@@_culang_print:nV { unit-symbol } \l_@@_original_unit_tl }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro} { \@@_print_number_accordingly:N }
+% Prints the input |#1| according to the used command.
+% This command is
+% also used in ranges.
+% \begin{macrocode}
+\cs_new:Npn \@@_print_number_accordingly:N #1
+ {
+ \tl_case:NnF \l_@@_cmd_type_tl
+ {
+ \c_@@_cmd_type_cunum_tl { \@@_print_numerical_input:N #1 }
+ \c_@@_cmd_type_cCutext_tl { \@@_cutext_print_input:N #1 }
+ \c_@@_cmd_type_cuam_tl { \@@_cuam_print_numerical_input:N #1 }
+ }
+ { \@@_create_internal_error:nN { print-input-acc } \l_@@_cmd_type_tl }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro} { \@@_print_range_accordingly:NN , \@@_print_range_sign: }
+% Prints ranges. It simply prints the numbers twice, inbetween a range sign.
+% \begin{macrocode}
+\cs_new:Npn \@@_print_range_accordingly:NN #1#2
+ {
+ \@@_print_number_accordingly:N #1
+ \@@_print_range_sign:
+ \@@_print_number_accordingly:N #2
+ }
+% \end{macrocode}
+% \begin{macrocode}
+\cs_new:Npn \@@_print_range_sign:
+ {
+ \@@_if_cmd_type_equal:nTF { cunum }
+ { \tl_use:N \l_@@_cunum_range_sign_tl }
+ {
+ \bool_lazy_or:nnTF
+ { \@@_if_cmd_type_equal_p:n { cCutext } }
+ { \l_@@_lokal_numeral_bool }
+ {
+ \bool_set_false:N \l_@@_cutext_uppercase_word_bool
+ \tl_if_empty:NTF \l_@@_cutext_range_sign_tl
+ { \@@_culang_print:nn { name } { cutext-range-sign } }
+ { \tl_use:N \l_@@_cutext_range_sign_tl }
+ }
+ { \tl_use:N \l_@@_cunum_range_sign_tl }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
%
-% Changed \lstinline|\l_@@_tmpa_tl| by |\l_@@_translation_tmpa_tl|, it's better that way.
+% \begin{macro}{ \@@_post_process_accordingly:NN }
+% After evaluating and changing the amounts (due to unit changing, rounding, etc.)
+% we post process the input (only for numbers and ranges). For |\cunum| nothing
+% needs to be done. For \cCutext\ and |\cuam| we post process the values accordingly
+% (checking if integer, etc.)
+% \begin{macrocode}
+\cs_new:Npn \@@_post_process_accordingly:NN #1#2
+ {
+ \tl_case:NnF \l_@@_cmd_type_tl
+ {
+ \c_@@_cmd_type_cunum_tl { }
+ \c_@@_cmd_type_cCutext_tl { \@@_cutext_post_process_input:NN #1#2 }
+ \c_@@_cmd_type_cuam_tl { \@@_cuam_post_process_input:NN #1#2 }
+% \c_@@_cmd_type_cucomp_tl { }
+ }{
+ \@@_create_internal_error:nN { post-process } \l_@@_cmd_type_tl
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{ \@@_print_numerical_input:N }
+% The base printing command for numbers. Makes sure the minus sign
+% and decimal-mark are correct.
% \begin{macrocode}
\cs_new_protected:Npn \@@_print_numerical_input:N #1
{
\tl_if_in:NnT #1 { . }
{
- \@@_translate_let:NnV \l_@@_translation_tmpa_tl
- { decimal-mark } \c_@@_postfix_unitname_tl
+ \@@_culang_let:nnN { name } { decimal-mark } \l_@@_translation_tmpa_tl
\tl_replace_once:Nnn #1 { . } { \l_@@_translation_tmpa_tl }
}
\tl_replace_once:Nnn #1 { - } \c_@@_minus_tl
@@ -6158,88 +7362,48 @@ and the derived file cooking-units.sty.
% \end{macro}
%
%
-% \begin{macro}{ \@@_print_ranges:NN }
-% \begin{macrocode}
-\cs_new:Npn \@@_print_ranges:NN #1#2
- {
- \@@_print_input:N #1
- \bool_if:NTF \l_@@_using_cutext_bool
- {
-% \tl_use:N \l_@@_cutext_range_sign_tl
- \tl_if_empty:NTF \l_@@_cutext_range_sign_tl
- { \@@_translate:nV { cutext-range-sign } \c_@@_postfix_unitname_tl }
- { \tl_use:N \l_@@_cutext_range_sign_tl }
- \bool_set_false:N \l_@@_cutext_uppercase_word_bool
- }
- { \tl_use:N \l_@@_cunum_range_sign_tl }
- \@@_print_input:N #2
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
%
%
% \subsection {Parsing and checking numbers}
%
-% This subsection contains macros for splitting an checking the input.
+% This subsection contains macros for splitting and checking the input.
%
% \begin{macro}{\@@_create_error:n, \@@_create_error_and_stop:n , \@@_create_error:nn }
+% Create error messages and set case to \enquote{error}.
% \begin{macrocode}
+\cs_new:Npn \@@_create_internal_error:nN #1#2
+ {
+ \@@_set_case_to:n { error }
+ \msg_error:nnnV { cooking-units } { internal-error } {#1} #2
+ }
\cs_new:Npn \@@_create_error:n #1
{
- \bool_set_true:N \l_@@_error_bool
+ \@@_set_case_to:n { error }
\msg_error:nnV { cooking-units } {#1} \l_@@_original_amount_tl
}
\cs_new:Npn \@@_create_error_and_stop:n #1
{
- \bool_set_true:N \l_@@_error_bool
- \msg_error:nnV { cooking-units } {#1} \l_@@_original_amount_tl
+ \@@_create_error:n {#1}
\use_none_delimit_by_q_nil:w
}
\cs_new:Npn \@@_create_error:nn #1#2
{
- \bool_set_true:N \l_@@_error_bool
+ \@@_set_case_to:n { error }
\msg_error:nnnV { cooking-units } {#1} {#2} \l_@@_original_amount_tl
}
% \end{macrocode}
% \end{macro}
%
-% The following command is needed after the parsing. It further processes
-% the parsed input and prints. The actual parsing and printing process (|\@@_process_tmp|)
-% depends on the command (|\cunum|, etc.) used.
+% \begin{macro} { \@@_parse_the_amount:n }
+% Does what the name suggests. |#1| is the input given by the user without changes.
+% It is then stored in |\l_@@_original_amount_tl| (which can be expanded, etc.).
+% Afterwards we rescan the input to remove spaces and make sure \_ and ? have
+% correct catcodes (last one can be active; screws some stuff up if it is so).
+% Then decides what's supposed to happen next.
% \begin{macrocode}
-\cs_new:Npn \@@_process_tmp: { }
-\cs_new:Npn \@@_process_and_print_input:
+\cs_new:Npn \@@_parse_the_amount:n #1
{
- \bool_lazy_or:nnTF
- { \l_@@_error_bool }
- { \l_@@_unit_error_bool }
- { \l_@@_original_amount_tl }
- { \@@_process_tmp: }
- }
-% \end{macrocode}
-% If there is an error or there is a special case (like \opt{42=true}) these commands
-% are used.
-% \begin{macrocode}
-\cs_new:Npn \@@_process_default: { \l_@@_original_amount_tl }
-\cs_new:Npn \@@_print_default_unit:
- {
- \tl_if_empty:NF \l_@@_phantom_tl { \phantom { \l_@@_phantom_tl } }
- \,\l_@@_original_unit_tl
- }
-% \end{macrocode}
-%
-% \begin{macro}{ \@@_parse_input:n }
-% Rescans the input to get rid of spaces and to make \_ and ? inactive
-% (french with babel makes |?| active and changes the definition of it).
-% \lstinline|--| is replaced by \lstinline|\q_@@_range| and the input is parsed
-% (if not empty). Afterwards the units are printed.
-% \begin{macrocode}
-\cs_new:Npn \@@_parse_input:n #1
- {
- \@@_set_amount:Nn \l_@@_original_amount_tl {#1}
+ \@@_expand_amount_input:Nn \l_@@_original_amount_tl {#1}
\tl_set_rescan:NnV \l_@@_original_amount_tl
{
\char_set_catcode_letter:N \_ %
@@ -6248,114 +7412,144 @@ and the derived file cooking-units.sty.
} \l_@@_original_amount_tl
\bool_lazy_any:nTF
{
- { \l_@@_fourty_two_bool }
- { \l_@@_draft_bool }
{ \tl_if_empty_p:N \l_@@_original_amount_tl }
- }{
- \cs_set_eq:NN \@@_process_tmp: \@@_process_default:
- \tl_if_empty:NT \l_@@_original_amount_tl
- { \msg_error:nnV { cooking-units } { empty-amount } \l_@@_original_amount_tl }
- \bool_if:NT \l_@@_fourty_two_bool
- { \tl_set:Nn \l_@@_original_amount_tl { 42 } }
- }{
- \tl_set_eq:NN \l_@@_tmpa_tl \l_@@_original_amount_tl
- \@@_split_input:N \l_@@_tmpa_tl
+ { \l_@@_pckopt_draft_bool }
}
+ { \@@_prepare_just_print_input: }
+ { \@@_split_and_parse_input: }
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_split_and_parse_input: }
+% If the weitd option \opt{42} is used, set the state to \enquote{42}.
+% Copy the original amount and prepapre to split the input.
+% \begin{macrocode}
+\cs_new:Npn \@@_split_and_parse_input:
+ {
+ \bool_if:NT \l_@@_pckopt_fourty_two_bool
+ { \@@_set_state_to:n { 42 } }
+ \tl_set_eq:NN \l_@@_tmpa_tl \l_@@_original_amount_tl
+ \@@_prepare_to_split_input:N \l_@@_tmpa_tl
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_prepare_just_print_input: }
+% If we decide the input is just to be printed, set it to \enquote{error}
+% (because I am lazy and do not want to create another case to check).
+% \begin{macrocode}
+\cs_new:Npn \@@_prepare_just_print_input:
+ {
+ \@@_set_state_to:n { error }
+ \tl_if_empty:NT \l_@@_original_amount_tl
+ { \@@_create_error:nn { cooking-units } { empty-amount } }
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{ \@@_split_input:N , \@@_process_and_print_input: , \@@_process_tmp: }
-% I would need to check for |/| and |_| anyway. So let's do it here
-% and use the booleans for error-checking.
+% \begin{macro}{ \@@_prepare_to_split_input:N}
+% Adapts the state into \enquote{range} or \enquote{fraction} if needed.
+% By default it is set to \enquote{number}. Ranges and Fractions are not allowed
+% together. Afterwards, split the input. If we encounter an error, we can use
+% |\use_none_delimit_by_q_nil:w| during the code to jump to this point.
+% This makes bailing out from the command more easy.
% \begin{macrocode}
-\cs_new:Npn \@@_split_input:N #1
+\cs_new:Npn \@@_prepare_to_split_input:N #1
{
\tl_if_in:NVT #1 \l_@@_input_range_sign_tl
{
\tl_replace_once:NVn #1 \l_@@_input_range_sign_tl { \q_@@_range }
- \bool_set_true:N \l_@@_range_in_input_bool
+ \@@_set_parse_and_process_type_to:n { range }
}
\tl_if_in:NnT #1 { / }
{
- \bool_set_true:N \l_@@_lokal_fraction_bool
- \bool_if:NT \l_@@_range_in_input_bool
+ \@@_if_parse_and_process_type_equal:nT { range }
{ \@@_create_error_and_stop:n { fraction-not-allowed-with-range } }
+ \@@_set_parse_and_process_type_to:n { fraction }
}
- \@@_split:N #1
+ \@@_split_and_parse:N #1
\use_none_delimit_by_q_nil:w \q_nil
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{ \@@_split_input:}
-% Splits the input into fractions or ranges.
-% Errors are already checked at this point.
+%
+% \begin{macro}{ \@@_split_and_parse:}
+% Splits the input into fractions or ranges (or numbers).
% \begin{macrocode}
-\cs_new:Npn \@@_split:N #1
+\cs_new:Npn \@@_split_and_parse:N #1
{
- \bool_if:NTF \l_@@_lokal_fraction_bool
- { \@@_split_fraction:V }
+ \tl_case:NnF \l_@@_parse_and_process_type_tl
{
- \bool_if:NTF \l_@@_range_in_input_bool
- { \@@_split_range:V }
- { \@@_split_number:V }
- }
+ \c_@@_parse_and_process_type_number_tl { \@@_split_and_parse_number:V }
+ \c_@@_parse_and_process_type_range_tl { \@@_split_and_parse_range:V }
+ \c_@@_parse_and_process_type_fraction_tl { \@@_split_and_parse_fraction:V }
+ }
+ { \@@_create_internal_error:nN { split } \l_@@_parse_and_process_type_tl }
#1
}
% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{ \@@_split_and_parse_number:n }
+% Gets the input , parses it and stores it into |\l_@@_number_tmpa_tl|.
% \begin{macrocode}
-\cs_new:Npn \@@_split_number:n #1
+\cs_new:Npn \@@_split_and_parse_number:n #1
{
- \cs_set_eq:NN \@@_process_tmp: \@@_process_number_in_input:
\@@_parse_input_and_safe_in:nN {#1} \l_@@_number_tmpa_tl
}
% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{ \@@_split_and_parse_range:n , \@@_split_and_parse_range_aux:ww }
+% Splits the input along |\q_@@_range|, parses the two parts and that's it.
% \begin{macrocode}
-\cs_new:Npn \@@_split_range:n #1
+\cs_new:Npn \@@_split_and_parse_range:n #1
{
- \cs_set_eq:NN \@@_process_tmp: \@@_process_range_in_input:
- \@@_split_range_aux:ww #1 \q_stop
+ \@@_split_and_parse_range_aux:ww #1 \q_stop
}
-\cs_new:Npn \@@_split_range_aux:ww #1 \q_@@_range #2 \q_stop
+\cs_new:Npn \@@_split_and_parse_range_aux:ww #1 \q_@@_range #2 \q_stop
{
\@@_parse_input_and_safe_in:nN {#1} \l_@@_number_tmpa_tl
\@@_parse_input_and_safe_in:nN {#2} \l_@@_number_tmpb_tl
}
% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{ \@@_split_and_parse_fraction:n , \@@_split_and_parse_fraction_mixed:ww , \@@_split_and_parse_fraction_frac:ww }
+% A bit more tricky. We check first if a mixed fraction part exists. If not the function
+% get's |\q_nil|. Then we read the nominator and denominator. Inbetween we check
+% for errors
% \begin{macrocode}
-\cs_new:Npn \@@_split_fraction:n #1
+\cs_new:Npn \@@_split_and_parse_fraction:n #1
{
- \cs_set_eq:NN \@@_process_tmp: \@@_process_generel_fraction_in_input:
- \@@_split_fraction_mixed:ww
+ \@@_split_and_parse_fraction_mixed:ww
#1 \q_stop / \q_recursion_tail _ \q_nil \q_stop
\q_recursion_stop
-% \end{macrocode}
-% At this point we have all information we need to determine whatever or not
-% the fractions should be evaluated or if the units should be changed.
-% \begin{macrocode}
- \bool_lazy_or:nnT
- { \l_@@_lokal_persons_bool }{ \l_@@_eval_fractions_bool }
- { \bool_set_false:N \l_@@_lokal_fraction_bool }
- \bool_if:NT \l_@@_convert_fractions_bool
- {
- \tl_if_eq:NNF \l_@@_original_unit_tl \l_@@_option_unit_tl
- { \bool_set_false:N \l_@@_lokal_fraction_bool }
- }
}
+% \end{macrocode}
+% Gets the mixed fraction part (if it exists). If |#2| is |\q_nil| the part does not
+% exist. |#1| must then be of part |a/b|.
%
-\cs_new:Npn \@@_split_fraction_mixed:ww #1 _ #2 \q_stop
+% If |#2| is \emph{not} |\q_nil| it contains the fraction part with |a/b|.
+% Parse the mixed fraction part and store it. Seperate |#2|.
+% \begin{macrocode}
+\cs_new:Npn \@@_split_and_parse_fraction_mixed:ww #1 _ #2 \q_stop
{
\quark_if_nil:nTF {#2}
{
\tl_clear:N \l_@@_mixed_fraction_tl
- \@@_split_fraction_frac:ww #1 \q_stop
+ \@@_split_and_parse_fraction_frac:ww #1 \q_stop
}{
\@@_parse_input_and_safe_in:nN {#1} \l_@@_mixed_fraction_tl
- \@@_split_fraction_frac:ww #2 \q_stop
+ \@@_split_and_parse_fraction_frac:ww #2 \q_stop
}
}
-\cs_new:Npn \@@_split_fraction_frac:ww #1 / #2 \q_stop
+% \end{macrocode}
+% Seperates nominator and denominator. If |#2| is equal to |\q_recursion_tail|
+% we probably had a construction like |a/b_c|, which is wrong. If so, create an error.
+% If everything is correct, parse the input and store it.
+% \begin{macrocode}
+\cs_new:Npn \@@_split_and_parse_fraction_frac:ww #1 / #2 \q_stop
{
\quark_if_recursion_tail_stop_do:nn {#2}
{ \@@_create_error:n { fraction-wrong-order } }
@@ -6364,17 +7558,21 @@ and the derived file cooking-units.sty.
\use_none_delimit_by_q_recursion_stop:w
}
% \end{macrocode}
+% \end{macro}
+% \begin{macro}{ \@@_split_and_parse_number:V ,
+% \@@_split_and_parse_range:V , \@@_split_and_parse_fraction:V }
+% Some variants.
% \begin{macrocode}
-\cs_generate_variant:Nn \@@_split_number:n { V }
-\cs_generate_variant:Nn \@@_split_range:n { V }
-\cs_generate_variant:Nn \@@_split_fraction:n { V }
+\cs_generate_variant:Nn \@@_split_and_parse_number:n { V }
+\cs_generate_variant:Nn \@@_split_and_parse_range:n { V }
+\cs_generate_variant:Nn \@@_split_and_parse_fraction:n { V }
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{ \@@_parse_input_and_safe_in:nN }
-% Used to check the input. \lstinline|\l_@@_tmpa_tl| is cleared
-% at the beginning. At first it checks if the first token
-% is a sign or not. The parsed input is stored into \lstinline|\l_@@_tmpa_tl|.
+% Parses through |#1| and makes sure it is correct. This includes checking if there
+% is only one decimal sign and other stuff. The \enquote{correct}
+% parsed stuff is stored in |\l_@@_tmpa_tl|.
% \begin{macrocode}
\cs_new:Npn \@@_parse_input_and_safe_in:nN #1 #2
{
@@ -6382,21 +7580,20 @@ and the derived file cooking-units.sty.
\bool_set_false:N \l_@@_check_decimal_bool
\cs_set_eq:NN \@@_parse:N \@@_start_loop:N
\tl_map_function:nN {#1} \@@_parse:N
- \bool_if:NTF \l_@@_error_bool
- { }
+ \@@_if_state_equal:nF { error }
{ \tl_set_eq:NN #2 \l_@@_tmpa_tl }
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{ \@@_start_loop:Nw }
+% \begin{macro}{ \@@_start_loop:N }
% This function seperates the input into two parts with the first
-% part being the first token. This token is checked whetever or not
+% part being the first token. This token is checked if or if not
% it is a sign. If it is a sign it is put into
% \lstinline|\l_@@_tmpa_tl|, if not it is checked normally by
% \lstinline|\@@_parse_input_loop_aux:N|. \#2 (the other
% tokens) is then given to \lstinline|\tl_map_function:nN|. This
-% also works if the input only conists of one token with \#2 being
+% also works if the input only consists of one token with \#2 being
% empty (hopefully).
% \begin{macrocode}
\cs_new:Npn \@@_start_loop:N #1
@@ -6404,19 +7601,18 @@ and the derived file cooking-units.sty.
\cs_set_eq:NN \@@_parse:N \@@_parse_input_loop_aux:N
\tl_if_in:NnTF \l_@@_input_value_signs_tl {#1}
{ \tl_put_right:Nn \l_@@_tmpa_tl {#1} }
- {
- \tl_map_function:nN {#1} \@@_parse:N
- }
+ { \tl_map_function:nN {#1} \@@_parse:N }
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{ \@@_parse_input_loop_aux:N }
+% \begin{macro}{ \@@_parse_input_loop_aux:N , \@@_check_which_error:n , \@@_check_repitition:N }
% Parses the input. It also is more or less (more less then more) copied from
% \texttt{siunitx}. Checks if the input consists only of numbers,
-% one decimal-sign and the allowed special input. If an allowed
-% token is found the boolean \lstinline|\l_@@_special_sign_bool| is
-% set to true.
+% one decimal-sign and the allowed special input.
+% In other cases, raise an error. Note that the state special-sign
+% can only be set if there is no error.
+%
% \begin{macrocode}
\cs_new:Npn \@@_parse_input_loop_aux:N #1
{
@@ -6429,13 +7625,12 @@ and the derived file cooking-units.sty.
\tl_put_right:Nn \l_@@_tmpa_tl { . }
}{
\tl_if_in:NnTF \l_@@_input_allowed_special_signs_tl {#1}
- {
- \bool_set_true:N \l_@@_special_sign_bool
+ {
+ \@@_if_state_equal:nF { error }
+ { \@@_set_state_to:n { special_sign } }
\tl_put_right:Nn \l_@@_tmpa_tl {#1}
- }{
- \bool_set_true:N \l_@@_error_bool
- \@@_check_error:n {#1}
}
+ { \@@_check_which_error:n {#1} }
}
}
}
@@ -6447,14 +7642,14 @@ and the derived file cooking-units.sty.
% for |_| without |/| would happen before parsing starts). Therefore
% all |/| and |_| in the input \emph{must} (hopefully) be inside a second time.
% \begin{macrocode}
-\cs_new:Npn \@@_check_error:n #1
+\cs_new:Npn \@@_check_which_error:n #1
{
\tl_if_in:NnTF \l_@@_input_fraction_sign_tl {#1}
{ \@@_create_error:n { Second-fraction-sign-not-allowed } }
{
\tl_if_in:NnTF \l_@@_input_mixed_fraction_sign_tl {#1}
{
- \bool_if:NTF \l_@@_lokal_fraction_bool
+ \@@_if_parse_and_process_type_equal:nTF { fraction }
{ \@@_create_error:n { Second-mixed-fraction-sign-not-allowed } }
{ \@@_create_error:n { missing-slash } }
}
@@ -6462,6 +7657,8 @@ and the derived file cooking-units.sty.
}
}
% \end{macrocode}
+% Back then this contained more checks, but now it just checks
+% if we have a second error decimal sign.
% \begin{macrocode}
\cs_new:Npn \@@_check_repitition:N #1
{
@@ -6473,196 +7670,91 @@ and the derived file cooking-units.sty.
% \end{macro}
%
%
-% \begin{macro}{\@@_process_number_in_input:}
-% If no fractions and ranges are used this macro activated.
-% It just checks the input, stores the checked (and a bit
-% changed) input into a macro. This macro is given to another
-% function to calculate the input and print it.
-% \begin{macrocode}
-\cs_new:Npn \@@_process_number_in_input:
- {
- \@@_process_and_print_number_in_input:N \l_@@_number_tmpa_tl
- }
-\cs_new:Npn \@@_process_and_print_number_in_input:N #1
- {
- \@@_pre_process_input:NN #1 \q_no_value
- \@@_calculate_and_store_in:N #1
- \@@_post_process_input:NN #1 \q_no_value
- \@@_print_input:N #1
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{ \@@_process_range_in_input: }
-% Is used if a \lstinline|\q_@@_range| is found inside the input.
-% Seperates the input, checks it and prints it (after calculating
-% it). Furthermore a boolean is set to true, is used to check for
-% errors (ergo if fractions are used).
-%
-% Set |\l_@@_cutext_uppercase_word_bool| to false
-% so that the second numeral is not capitalized.
-% \begin{macrocode}
-\cs_new:Npn \@@_process_range_in_input:
- {
- \@@_pre_process_input:NN \l_@@_number_tmpa_tl \l_@@_number_tmpb_tl
- \@@_calculate_and_store_in:N \l_@@_number_tmpa_tl
- \@@_calculate_and_store_in:N \l_@@_number_tmpb_tl
- \@@_post_process_input:NN \l_@@_number_tmpa_tl \l_@@_number_tmpb_tl
- \@@_print_ranges:NN \l_@@_number_tmpa_tl \l_@@_number_tmpb_tl
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{ \@@_process_generel_fraction_in_input: }
-% This function prints both mixed and normal fractions. Those was done
-% by two functions beforehand, but they shared mostly the same code, so I
-% managed to fuse them.
-%
-% The first part removes the minus sign. It cycles through the variables
-% (|\l_@@_mixed_fraction_tl| can be emtpy) and removes the minus signs.
-% It furthermore saves how many minuses are used by reversing a bool.
-% If a minus sign is found, the bool is reversed to true (from false). Another
-% minus: minus and minus is plus, reverse bool again (to false this time), etc.
-%
-% Afterwards: Is a fraciton printed, or is the input evaluated. Printing is
-% straight forward.
-%
-% Due to how mixed fractions are evaluated, one can just evaluate the
-% absolute values of the inputs and add a minus sign on the left side afterwards
-% (if necessary).
-% \begin{align}
-% \cuam{1_2/3} &= 1 + 2/3 \\
-% \cuam{-1_2/3} &= -1 - 2/3 = - ( 1 + 2/3 )
-% \end{align}
-%
-% If |\l_@@_mixed_fraction_tl| is empty the calculation just evaluates to
-% |+\l_@@_number_tmpa_tl / \l_@@_number_tmpb_tl|, which is also valid.
%
-% \begin{macrocode}
-\cs_new:Npn \@@_process_generel_fraction_in_input:
- {
- \@@_check_minus_remove_and_reverse:NN
- \l_@@_mixed_fraction_tl
- \l_@@_number_tmpa_tl
- \l_@@_number_tmpb_tl
- \q_nil
- \bool_lazy_or:nnTF
- { \l_@@_lokal_fraction_bool }
- { \l_@@_special_sign_bool }
- {
- \bool_if:NT \l_@@_special_sign_bool
- {
- \msg_warning:nnV { cooking-units } { amount-not-known } \l_@@_original_amount_tl
- }
- \@@_print_fractions:Nnn
- \l_@@_mixed_fraction_tl
- { \l_@@_number_tmpa_tl }
- { \l_@@_number_tmpb_tl }
- }{
- \fp_compare:nNnT { \l_@@_number_tmpb_tl } = { 0 }
- { \msg_error:nnV { cooking-units } { Division-by-zero } \l_@@_original_amount_tl }
- \@@_tl_eval:Nn \l_@@_number_tmpa_tl
- {
- \l_@@_mixed_fraction_tl +
- \l_@@_number_tmpa_tl / \l_@@_number_tmpb_tl
- }
- \bool_if:NT \l_@@_minus_bool
- { \tl_put_left:Nn \l_@@_number_tmpa_tl { - } }
- \@@_process_and_print_number_in_input:N \l_@@_number_tmpa_tl
- }
- }
-% \end{macrocode}
-% \end{macro}
%
-%
%
+% \subsection {Formatiere \& Calculiere}
%
%
%
-% \subsection {Formatiere \& Calculiere}
%
% \begin{macro}{ \@@_calculate_and_store_in:N }
%
% \changes {v0.98a} {2016/06/11} {Added warning to show if an unknown value is used.}
%
-% After parsing the input, it is given to this function. If a not
-% allowed token is found (and \lstinline|\l_@@_error_bool| is set to
-% true) it just prints the input. Otherwise it checks if a allowed sign was
-% found. If so it is just stored inside \lstinline|\l_@@_tmpa_tl|,
-% otherwise it is calulcated and stored in \lstinline|\l_@@_tmpa_tl|. The input
-% \#1 can be either a token or a number.
+% The main calculation command. The split amount is given to this
+% command. It is seperated into several smaller macros. Unit-changing
+% the amount, referencing, rounding and temperature checks are done
+% here. Note that we are only here if the state is \enquote{normal}.
% \begin{macrocode}
\cs_new:Npn \@@_calculate_and_store_in:N #1
{
- \bool_if:NTF \l_@@_special_sign_bool
- {
- \msg_warning:nnV { cooking-units } { amount-not-known } #1
- }{
- \bool_lazy_and:nnTF
- { \l_@@_using_cutext_bool } { \l_@@_cutext_keep_unit_bool }
- { \tl_set_eq:NN \l_@@_tmpa_tl #1 }
- { \@@_calculate_input_and_store_in:nN {#1} \l_@@_tmpa_tl }
- \@@_calc_references:NN \l_@@_tmpa_tl \l_@@_tmpa_tl
- \@@_round_calculated_input:NV \l_@@_tmpa_tl \l_@@_tmpa_tl
- \@@_check_temperature_limit:N \l_@@_tmpa_tl
- \tl_set_eq:NN #1 \l_@@_tmpa_tl
- }
+ \@@_calculate_input_and_store_in:N #1
+ \@@_calc_references_and_store_in:N #1
+ \@@_round_calculated_input_and_store_in:N #1
+ \@@_check_temperature_limit:N #1
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{ \@@_calculate_input_and_store_in:nN }
-% Well \dots\ this function calculates the input. First checks if the
-% wanted conversion contains a \lstinline|\l_@@_tmpa_fp| (ergo a \#1 in
-% the key definition). If true the conversion token (which already has
-% \lstinline|\l_@@_tmpa_fp| in its input) is executed, else the input
-% number is multiplicated with the conversion token.
+% \begin{macro}{ \@@_calculate_input_and_store_in:NN }
+% Well \dots\ this function calculates the input.
+% First check if the units need to be changes at all (if no unit change
+% is wanted, |\l_@@_option_unit_tl| is set to |\l_@@_original_unit_tl| at the
+% beginning. If we are in one case were no unit change is happening
+% (\enquote{special-sign}, \enquote{error}, \enquote{fraction}) we wouldn't be
+% here in the first place, so need to worry about this.
+%
+% As the input is parsed and good for evaluation, store it in
+% |\l_@@_tmpa_fp|.
+%
+% If the key definition contained a |#1| (aka, is a single key),
+% it was replaced by |\l_@@_tmpa_fp|.
+% Thus simply evaluate the tl if one or more |\l_@@_tmpa_fp| are inside.
+%
+% If no |\l_@@_tmpa_fp| is found, we have a simple multiplication with the
+% current amount.
% \begin{macrocode}
-\cs_new:Npn \@@_calculate_input_and_store_in:nN #1#2
+\cs_new:Npn \@@_calculate_input_and_store_in:N #1
{
- \fp_set:Nn \l_@@_tmpa_fp {#1}
- \tl_if_in:cnTF { l_@@_unit_change_ \l_@@_original_unit_tl _tl } { \l_@@_tmpa_fp }
- {
- \@@_tl_eval:Nv #2 { l_@@_unit_change_ \l_@@_original_unit_tl _tl }
- }{
- \@@_tl_eval:Nn #2
- { \l_@@_tmpa_fp * \tl_use:c { l_@@_unit_change_ \l_@@_original_unit_tl _tl } }
+ \tl_if_eq:NNF \l_@@_decided_unit_tl \l_@@_original_unit_tl
+ {
+ \fp_set:Nn \l_@@_tmpa_fp {#1}
+ \tl_if_in:cnTF { l_@@_unit_change_ \l_@@_original_unit_tl _tl } { \l_@@_tmpa_fp }
+ {
+ \@@_tl_eval:Nv #1 { l_@@_unit_change_ \l_@@_original_unit_tl _tl }
+ }{
+ \@@_tl_eval:Nn #1
+ { \l_@@_tmpa_fp * \tl_use:c { l_@@_unit_change_ \l_@@_original_unit_tl _tl } }
+ }
}
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{ \@@_calc_references:NN,\@@_calc_references_aux:NN }
-% As comparing integers is faster then checking if something is inside
-% the sequence, first (after the boolean) check if there needs to be a calculation
-% at all.
+% \begin{macro}{ \@@_calc_references_and_store_in:N,\@@_calc_references_and_store_in_aux:N }
+% All necessary checks were already done at the beginning.
+% so we know that a reference was given and that the wanted number of
+% persons is different then the one given by |\culabel|. Before
+% evaluation, check if the unit is one of those that cannot be changed.
% \begin{macrocode}
-\cs_new:Npn \@@_calc_references:NN #1#2
+\cs_new:Npn \@@_calc_references_and_store_in:N #1
{
- \bool_if:NT \l_@@_lokal_persons_bool
+ \bool_if:NT \l_@@_lokal_recalc_for_people_bool
{
- \int_compare:nNnF
- { \l_@@_wanted_number_of_persons_int }
- =
- { \l_@@_local_number_of_persons_int }
- {
- \tl_set_eq:NN \l_@@_tmpb_tl \l_@@_original_unit_tl
- \seq_if_in:NVTF \l_@@_curef_do_not_change_seq \l_@@_tmpb_tl
- { \msg_error:nnV { cooking-units } { curef-forbidden-unit } \l_@@_tmpb_tl }
- { \@@_calc_references_aux:NN #1 #2 }
- }
+ \seq_if_in:NVTF \l_@@_curef_do_not_change_seq \l_@@_decided_unit_tl
+ { \msg_error:nnV { cooking-units } { curef-forbidden-unit } \l_@@_decided_unit_tl }
+ { \@@_calc_references_and_store_in_aux:N #1 }
}
}
% \end{macrocode}
-% I hope that by putting |#2| to the front of the calculation, it will increase the
-% precision of the calculation (not that it is necessary). I don't really know if this
-% makes sense, but \dots\ eh.
+% Just calculate the stuff
% \begin{macrocode}
-\cs_new:Npn \@@_calc_references_aux:NN #1#2
+\cs_new:Npn \@@_calc_references_and_store_in_aux:N #1
{
\@@_tl_eval:Nn #1
{
- #2 *
+ #1 *
\l_@@_wanted_number_of_persons_int /
\l_@@_local_number_of_persons_int
}
@@ -6670,13 +7762,33 @@ and the derived file cooking-units.sty.
% \end{macrocode}
% \end{macro}
%
+%
+% \begin{macro}{ \@@_round_calculated_input_and_store_in:Nn,\@@_round_calculated_input_and_store_in:NV }
+% After calculation, the numbers are rounded (if needed).
+% If the rounding precision is negative (can be), just set the bool to true and go
+% to the rounding function.
+% Else check if the number needs rounding at all.
+% Afterwards, round if necessary
+% \begin{macrocode}
+\cs_new:Npn \@@_round_calculated_input_and_store_in:N #1
+ {
+ \bool_if:NTF \l_@@_pckopt_round_precision_negative_bool
+ { \bool_set_true:N \l_@@_round_number_bool }
+ { \@@_check_number_for_rounding:V #1 }
+ \bool_if:NT \l_@@_round_number_bool
+ { \@@_tl_eval:Nn #1 { round ( \@@_rounding_function:n {#1} ) } }
+ }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\@@_check_number_for_rounding:n,\@@_check_number_after_dot_aux:ww}
% Check if rounding is needed. The auxilary function splits the number into
% the integer and non-integer part ($12.45$ to $12$ and $45$).
-%
-% If the non-integer part exists its number of digits $n$ are counted checked
-% if it is smaller then $a$, which depends on |\l_@@_round_to_int_bool|.
-%
+%
+% Set |\l_@@_round_number_bool| to |false| in case of no decimal places found.
+%
+% If the rounding precision is positive, use the helper function to split the
+% amount.
% \begin{macrocode}
\cs_new:Npn \@@_check_number_for_rounding:n #1
{
@@ -6684,39 +7796,26 @@ and the derived file cooking-units.sty.
\@@_check_number_after_dot_aux:ww #1 . \q_recursion_tail .
\q_recursion_stop
}
+\cs_generate_variant:Nn \@@_check_number_for_rounding:n { V }
+% \end{macrocode}
+% The function splitting the amount. So $a.b$ is split into $a$ and $b$.
+% If $b$ does not exist (so the amount is an integer), no rounding is needed.
+% If $b$ does exist, count how many tokens it conists of (e.g.\ $12$ = 2 tokens;
+% $1755$ = 4 tokens). If the number of tokens is larger then the wanted round precision,
+% round the input.
+% \begin{macrocode}
\cs_new:Npn \@@_check_number_after_dot_aux:ww #1 . #2 .
{
- \quark_if_recursion_tail_stop_do:nn {#2}
- {
- \bool_if:NT \l_@@_round_precision_negative_bool
- { \bool_set_true:N \l_@@_round_number_bool }
- }
- \int_compare:nNnT
- { \tl_count:n {#2} } >
- { \l_@@_round_precision_int }
- { \bool_set_true:N \l_@@_round_number_bool }
+ \quark_if_recursion_tail_stop:n {#2}
+ \int_compare:nNnT
+ { \tl_count:n {#2} } >
+ { \l_@@_round_precision_int }
+ { \bool_set_true:N \l_@@_round_number_bool }
\use_none_delimit_by_q_recursion_stop:w
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{ \@@_round_calculated_input:Nn,\@@_round_calculated_input:NV }
-% After calculating the numbers are rounded (if needed, safed inside \cs{l_tmpa_bool}).
-% We test at first if
-% the input needs to be rounded by comparing the number of tokens after the
-% decimal with the round precision. Afterwards the
-% input is expanded and stored in \#1. If rounding needs to be done it happens now.
-% \begin{macrocode}
-\cs_new:Npn \@@_round_calculated_input:Nn #1#2
- {
- \@@_check_number_for_rounding:n {#2}
- \bool_if:NTF \l_@@_round_number_bool
- { \@@_tl_eval:Nn #1 { round ( \@@_rounding_function:n {#2} ) } }
- { \tl_set:Nn #1 {#2} }
- }
-\cs_generate_variant:Nn \@@_round_calculated_input:Nn { NV }
-% \end{macrocode}
-% \end{macro}
%
%
%
@@ -6727,25 +7826,24 @@ and the derived file cooking-units.sty.
%
% \begin{macro}{\@@_check_temperature_limit:N}
% If \lstinline|check_temperature_bool| is set to true it now checks
-% if the value is below the absolute temperature. \lstinline|\clist_if_in:nVT|
-% is needed due to \myunit{Re}, a \lstinline|\tl_if_in:nVT| would also check for \myunit{R}
-% and \myunit{e} instead of only \myunit{Re}.
+% if the value is below the absolute temperature. Maybe this should be done
+% before rounding?
% \begin{macrocode}
\cs_new:Npn \@@_check_temperature_limit:N #1
{
- \bool_if:NT \l_@@_check_temperature_bool
+ \bool_if:NT \l_@@_pckopt_check_temperature_bool
{
- \seq_if_in:NVT \l_@@_temperatures_to_check_seq \l_@@_option_unit_tl
+ \seq_if_in:NVT \l_@@_temperatures_to_check_seq \l_@@_decided_unit_tl
{
\fp_compare:vNnT
- { l_@@_ \l_@@_option_unit_tl _min_fp } > {#1}
- {
+ { l_@@_ \l_@@_decided_unit_tl _min_fp } > {#1}
+ {
\msg_error:nnxx { cooking-units }
{ Temperature-too-low }
- { #1 \space \l_@@_option_unit_tl }
+ { #1 \space \l_@@_decided_unit_tl }
{
- \fp_use:c { l_@@_ \l_@@_option_unit_tl _min_fp }
- \space \l_@@_option_unit_tl
+ \fp_use:c { l_@@_ \l_@@_decided_unit_tl _min_fp }
+ \space \l_@@_decided_unit_tl
}
}
}
@@ -6763,35 +7861,39 @@ and the derived file cooking-units.sty.
%
%
%
+% \subsection {Main commands helper}
%
-%
+% \begin{macro}{ \@@_if_arrow_grab_until_close_do:nnTF ,
+% \@@_grab_arrows_for_safety_do_afterwards:nN }
+% I really do not like this constuction, but due to catcodes it can happen
+% that the main commands are unable to get the first command inside <>.
+% In order to fix this, I use this bloody construction.
% \begin{macrocode}
-\cs_new_nopar:Npn \@@_grab_arrows_for_safety_do_afterwards:nN #1#2
- {
- \str_if_eq:nnTF {#2} { > }
- {
- \tl_put_right:Nx \l_@@_tmpa_tl { \tl_to_str:N > }
- \exp_last_unbraced:NV #1 \l_@@_tmpa_tl
- }{
- \tl_put_right:Nn \l_@@_tmpa_tl {#2}
- \@@_grab_arrows_for_safety_do_afterwards:nN {#1}
- }
- }
\cs_new_nopar:Npn \@@_if_arrow_grab_until_close_do:nnTF #1#2#3#4
{
\str_if_eq:nnTF {#1} { < }
- {
+ {
\tl_if_in:NoT \l_@@_input_allowed_special_signs_tl { < }
{ \msg_error:nn { cooking-units } { <-not-allowed-as-special-sign } }
\tl_clear:N \l_@@_tmpa_tl
\tl_put_right:Nx \l_@@_tmpa_tl { \tl_to_str:N < }
- \@@_grab_arrows_for_safety_do_afterwards:nN
- {#3} #2
+ \@@_grab_arrows_for_safety_do_afterwards:nN {#3} #2
}
{#4}
}
+\cs_new_nopar:Npn \@@_grab_arrows_for_safety_do_afterwards:nN #1#2
+ {
+ \str_if_eq:nnTF {#2} { > }
+ {
+ \tl_put_right:Nx \l_@@_tmpa_tl { \tl_to_str:N > }
+ \exp_last_unbraced:NV #1 \l_@@_tmpa_tl
+ }{
+ \tl_put_right:Nn \l_@@_tmpa_tl {#2}
+ \@@_grab_arrows_for_safety_do_afterwards:nN {#1}
+ }
+ }
% \end{macrocode}
-%
+% \end{macro}
%
%
% \subsection {\mycs{cunum}}
@@ -6815,44 +7917,19 @@ and the derived file cooking-units.sty.
%
%
% \begin{macro}{ \@@_cunum:nnnnn }
+% The \enquote{helper} command. It essentially only sets
+% the command type to \enquote{cunum} and calls the command that does
+% everything else.
% \begin{macrocode}
\cs_new:Npn \@@_cunum:nnnnn #1#2#3#4#5
{
- \@@_cunum_initialise:nnnnn {#1} {#2} {#3} {#4} {#5}
- \l_@@_cunum_hook_tl
- \@@_parse_input:n {#3}
- \@@_process_and_print_input:
- \@@_print_correct_unit:
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{ \@@_cunum_initialise:nnnn }
-% Lots of things to do in this function. It checks if the unit is defined or not,
-% sets the keys for converting the unit and sets the optional unit (the unit
-% our input is converted to) accordingly, sets the options again (to get the
-% option-specific options) and \dots\ yeah.
-%
-% First parses the change of unit ('set groups'), afterwards set
-% the predefined options for the new unit. Afterwards
-% set the 'normal' options given by the optional argument.
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_cunum_initialise:nnnnn #1#2#3#4#5
- {
- \@@_set_process_and_print_for_cunum:
- \tl_set:Nn \l_@@_phantom_tl {#4}
- \@@_initialise_default:n {#5}
- \@@_initialise_unit_change:n {#2}
- \@@_initialise_after_unit_change:nn {#1} {#2}
+ \@@_set_cmd_type_to:n { cunum }
+ \@@_do_the_stuff:nnnnnn {#1} {#2} {#3} {#4} {#5} { }
}
% \end{macrocode}
% \end{macro}
%
%
-%
-%
% \begin{macro}{ \@@_cunum_print_correct_unit: }
% The invisible space is added by a \lstinline|\phantom|, afterwards
% \lstinline|value_unit_space_tl| is used (which is set to
@@ -6864,9 +7941,7 @@ and the derived file cooking-units.sty.
{
\tl_if_empty:NF \l_@@_phantom_tl { \phantom { \l_@@_phantom_tl } }
\tl_use:N \l_@@_value_unit_space_tl
- \@@_change_unit:TF
- { \@@_translate:VV \l_@@_option_unit_tl \c_@@_postfix_unit_tl }
- { \@@_translate:VV \l_@@_original_unit_tl \c_@@_postfix_unit_tl }
+ \@@_culang_print:nV { unit-symbol } \l_@@_decided_unit_tl
}
% \end{macrocode}
% \end{macro}
@@ -6875,8 +7950,10 @@ and the derived file cooking-units.sty.
% \section { cutext \& Cutext }
%
%
-% A better implemantation of \opt{cutext-to-cunum}, but
-% sufficient for now.
+% \begin{macro}{\cutext}
+% The other main command It is essentially similar to \mycs{cunum},
+% only that we also need to take care of uppercasing the word if necessary
+% (which it is not for this command).
% \begin{macrocode}
\NewDocumentCommand \cutext { d<> O{} m m }
{
@@ -6884,17 +7961,16 @@ and the derived file cooking-units.sty.
{ \cutext }
{
\group_begin:
- \@@_change_cutext_to_cunum:nTF {#2}
- { \@@_cunum:nnnnn {#1} {#2} {#3} { } {#4} }
- {
- \bool_set_false:N \l_@@_cutext_uppercase_word_bool
- \@@_cutext:nnnn {#1} {#2} {#3} {#4}
- }
+ \bool_set_false:N \l_@@_cutext_uppercase_word_bool
+ \@@_cutext:nnnn {#1} {#2} {#3} {#4}
\group_end:
}
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\Cutext}
+% Here we do need the uppercasing.
% \begin{macrocode}
\NewDocumentCommand \Cutext { d<> O{} m m }
{
@@ -6902,159 +7978,185 @@ and the derived file cooking-units.sty.
{ \Cutext }
{
\group_begin:
- \@@_change_cutext_to_cunum:nTF {#2}
- { \@@_cunum:nnnnn {#1} {#2} {#3} { } {#4} }
- {
- \bool_set_true:N \l_@@_cutext_uppercase_word_bool
- \@@_cutext:nnnn {#1} {#2} {#3} {#4}
- }
+ \bool_set_true:N \l_@@_cutext_uppercase_word_bool
+ \@@_cutext:nnnn {#1} {#2} {#3} {#4}
\group_end:
}
}
% \end{macrocode}
+% \end{macro}
%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_cutext_initialise:nnn #1#2#3
- {
- \bool_set_true:N \l_@@_using_cutext_bool
- \@@_set_process_and_print_for_cutext:
- \@@_initialise_default:n {#3}
- \@@_initialise_unit_change:n {#2}
- \bool_if:NT \l_@@_cutext_keep_unit_bool
- { \tl_set_eq:NN \l_@@_option_unit_tl \l_@@_original_unit_tl }
- \@@_initialise_after_unit_change:nn {#1} {#2}
- \bool_if:NT \l_@@_fourty_two_bool
- { \tl_set:Nn \l_@@_cutext_last_value_tl { 42 } }
- }
-% \end{macrocode}
%
-%^^A #1: label, #2: Options, #3: Values, #4: unit
+% \begin{macro}{ \@@_cutext:nnnn }
+% Same as the \mycs{cunum} equivalent, just setting the command to
+% \enquote{cCutext}.
% \begin{macrocode}
\cs_new:Npn \@@_cutext:nnnn #1#2#3#4
{
- \@@_cutext_initialise:nnn {#1} {#2} {#4}
- \bool_if:NTF \l_@@_cutext_uppercase_word_bool
- { \l_@@_Cutext_hook_tl }
- { \l_@@_cutext_hook_tl }
- \bool_if:NTF \l_@@_cutext_old_bool
- { \@@_old_cutext:nnn {#2} {#3} {#4} }
- {
- \@@_parse_input:n {#3}
- \@@_process_and_print_input:
- }
- \@@_print_correct_unit:
+ \@@_set_cmd_type_to:n { cCutext }
+ \@@_do_the_stuff:nnnnnn {#1} {#2} {#3} { } {#4} { }
}
% \end{macrocode}
+% \end{macro}
%
%
%
-% \begin{macro} {\@@_cutext_print_input:Nn , \@@_cutext_print_input:NV}
+% \begin{macro} {\@@_cutext_print_input:N , \@@_cutext_print_input_aux:Nn , \@@_cutext_print_input_aux:NV }
% \changes {2016/06/11} {0.99} {New.}
%
-%
+% This prints the amount for the \enquote{cCutext} commands.
+% At first, check if a numeral should be used (\enquote{1} to \enquote{one}, etc.).
+% If not, just print the number. If a numeral should be used, make sure the correct
+% unit is used and go to the next command.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_cutext_print_input:Nn #1#2
+\cs_new_protected:Npn \@@_cutext_print_input:N #1
{
\bool_if:NTF \l_@@_lokal_numeral_bool
{
- \@@_int_if_equal_one:nTF {#1}
+ \@@_cutext_print_input_aux:NV #1 \l_@@_decided_unit_tl
+ }
+ { \@@_print_numerical_input:N #1 }
+ }
+% \end{macrocode}
+% If a numeral is used, make sure the correct one is printed.
+% If the amount is equal to \enquote{1}, get the gender correct \enquote{one}.
+% Else, print the numeral either in upperacse of lowercase.
+%
+% As we could be in a range, we cannot check via a bool if |#1| is 1.
+%
+% Furthermore, make sure the translation of \enquote{1} exists. If not,
+% set input it set to \enquote{1}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_cutext_print_input_aux:Nn #1#2
+ {
+ \int_compare:nNnTF {#1} = { 1 }
+ {
+ \@@_culang_one_let:NnT \l_@@_translation_tmpa_tl {#2}
{
- \@@_translate_one_and_check_existance:Nx \l_@@_translation_tmpa_tl {#2}
- \bool_if:NTF \l_@@_cutext_uppercase_word_bool
+ \bool_if:NT \l_@@_cutext_uppercase_word_bool
{
- \exp_args:Nx \tl_upper_case:n { \tl_head:V \l_@@_translation_tmpa_tl }
- \tl_tail:V \l_@@_translation_tmpa_tl
+ \text_uppercase:x { \tl_head:V \l_@@_translation_tmpa_tl }
+ \tl_tail:V
}
- { \l_@@_translation_tmpa_tl }
- }{
- \bool_if:NTF \l_@@_cutext_uppercase_word_bool
- { \@@_print_Numeral:n {#1} }
- { \@@_print_numeral:n {#1} }
}
+ \l_@@_translation_tmpa_tl
+ }{
+ \bool_if:NTF \l_@@_cutext_uppercase_word_bool
+ { \@@_print_Numeral:V #1 }
+ { \@@_print_numeral:V #1 }
}
- { \@@_print_numerical_input:N #1 }
- }
-\cs_generate_variant:Nn \@@_cutext_print_input:Nn { NV }
-\cs_new_protected:Npn \@@_cutext_print_input:N #1
- {
- \@@_change_unit:TF
- { \@@_cutext_print_input:NV #1 \l_@@_option_unit_tl }
- { \@@_cutext_print_input:NV #1 \l_@@_original_unit_tl }
}
+\cs_generate_variant:Nn \@@_cutext_print_input_aux:Nn { NV }
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\@@_cutext_print_correct_unitname:}
+% As the name suggests, it prints the unitname. At this point we already
+% know that a translation exists, so no bother checking again.
% \begin{macrocode}
\cs_new:Npn \@@_cutext_print_correct_unitname:
{
- \l_@@_cutext_space_tl
- \@@_change_unit:TF
- {
- \@@_fp_if_equal_one:nTF { \l_@@_cutext_last_value_tl }
- { \@@_translate:VV \l_@@_option_unit_tl \c_@@_postfix_unitname_tl }
- { \@@_translate:VV \l_@@_option_unit_tl \c_@@_postfix_unitname_pl_tl }
- }
- { \@@_translate:VV \l_@@_original_unit_tl \c_@@_postfix_unitname_pl_tl }
+ \bool_if:NTF \l_@@_lokal_numeral_bool
+ { \l_@@_cutext_numeral_space_tl }
+ { \l_@@_cutext_space_tl }
+ \bool_if:NTF \l_@@_cutext_last_amount_equ_one_bool
+ { \@@_culang_print:nV { name } \l_@@_decided_unit_tl }
+ { \@@_culang_print:nV { name-pl } \l_@@_decided_unit_tl }
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{ \@@_cutext_check_if_translation_available: }
+% Checks if a unitname of the current unit exists. If yes, continue.
+% here we can also decide if the unit should be kept the same or not
+% as we know that we stay in \enquote{cCutext}.
+% If not, change the command to \enquote{cunum}.
% \begin{macrocode}
-\cs_new:Npn \@@_cutext_pre_process_input:NN #1#2
+\cs_new:Npn \@@_cutext_check_if_translation_available:
{
- \@@_change_unit:TF
- { \tl_set_eq:NN \l_@@_tmpb_tl \l_@@_option_unit_tl }
- { \tl_set_eq:NN \l_@@_tmpb_tl \l_@@_original_unit_tl }
- \@@_unitname_get:NxF \l_@@_tmpa_tl \l_@@_tmpb_tl
- {
+ \bool_if:NTF \l_@@_pckopt_cutext_keep_unit_bool
+ { \tl_set_eq:NN \l_@@_curr_unit_tl \l_@@_original_unit_tl }
+ { \tl_set_eq:NN \l_@@_curr_unit_tl \l_@@_decided_unit_tl }
+ \@@_culang_unitname_let:NVTF \l_@@_scrap_tl \l_@@_curr_unit_tl
+ {
+ \bool_if:NT \l_@@_pckopt_cutext_keep_unit_bool
+ {
+ \tl_set_eq:NN \l_@@_decided_unit_tl \l_@@_original_unit_tl
+ \tl_set_eq:NN \l_@@_option_unit_tl \l_@@_original_unit_tl
+ }
+ }{
\msg_warning:nnx
{ cooking-units }
{ cutext-no-translation-available }
- \l_@@_tmpb_tl
- \bool_set_false:N \l_@@_using_cutext_bool
- \@@_set_process_and_print_for_cunum:
+ \l_@@_curr_unit_tl
+ \@@_set_cmd_type_to:n { cunum }
+ \@@_decide_unit:
}
}
-% \end{macrocode}
+% \end{macrocode}
+% \end{macro}
%
%
+% \begin{macro}{ \@@_cutext_post_process_input:NN }
+% |#1| is always a number, |#2| only is valid if we have a range.
+% For later, check if either |#1| or |#2| is equal to one.
%
+% Then (Than?) check if a numeral is requested. If yes, |#1| (and if range also |#2|)
+% need to be integers. If they are not, numerals cannot be used. If one or both
+% are integers, if they are below |\l_@@_print_numerals_below_int|.
% \begin{macrocode}
\cs_new:Npn \@@_cutext_post_process_input:NN #1#2
{
- \bool_if:NF \l_@@_special_sign_bool
- {
- \@@_cutext_post_process_input_aux:NN #1#2
+ \@@_if_parse_and_process_type_equal:nTF { range }
+ { \@@_cutext_check_if_amount_single:N #2 }
+ { \@@_cutext_check_if_amount_single:N #1 }
+ \bool_if:NT \l_@@_lokal_numeral_bool
+ {
+ \@@_if_contain_decimals:NNTF #1#2
+ { \bool_set_false:N \l_@@_lokal_numeral_bool }
+ { \@@_check_if_integer_can_be_numerals:NN #1#2 }
}
}
% \end{macrocode}
+% \end{macro}
+% \begin{macro} { \@@_cutext_check_if_amount_single:N }
+% Check if the input is equal to |#1|. Use fp as it is not necessary an integer.
+% Set the boolean according to the result.
% \begin{macrocode}
-\cs_new:Npn \@@_cutext_post_process_input_aux:NN #1#2
+\cs_new:Npn \@@_cutext_check_if_amount_single:N #1
{
- \bool_if:NTF \l_@@_range_in_input_bool
- { \tl_set_eq:NN \l_@@_cutext_last_value_tl #2 }
- { \tl_set_eq:NN \l_@@_cutext_last_value_tl #1 }
- \bool_if:NT \l_@@_lokal_numeral_bool
- { \@@_cutext_post_process_input_numerals:NN #1#2 }
+ \fp_compare:nNnTF {#1} = { 1.0 }
+ { \bool_set_true:N } { \bool_set_false:N }
+ \l_@@_cutext_last_amount_equ_one_bool
}
-\cs_new:Npn \@@_cutext_post_process_input_numerals:NN #1#2
+% \end{macrocode}
+% \end{macro}
+% \begin{macro} { \@@_check_if_integer_can_be_numerals:NN }
+% At this point we know that we have integers, so check if they are
+% below |\l_@@_print_numerals_below_int|. If they are, fine. Else,
+% set the boolean to false.
+% \begin{macrocode}
+\cs_new:Npn \@@_check_if_integer_can_be_numerals:NN #1#2
{
- \@@_bool_set_if_integers:NNN \l_@@_tmpa_bool #1 #2
- \bool_if:NTF \l_@@_tmpa_bool
+ \@@_if_parse_and_process_type_equal:nTF { range }
{
- \bool_if:NTF \l_@@_range_in_input_bool
+ \bool_lazy_all:nF
{
- \bool_lazy_and:nnF
- { \int_compare_p:nNn {#1} < { \l_@@_print_numerals_below_int } }
- { \int_compare_p:nNn {#2} < { \l_@@_print_numerals_below_int } }
- { \bool_set_false:N \l_@@_lokal_numeral_bool }
- }{
- \int_compare:nNnF {#1} < { \l_@@_print_numerals_below_int }
- { \bool_set_false:N \l_@@_lokal_numeral_bool }
+ { \int_compare_p:nNn {#1} < { \l_@@_print_numerals_below_int } }
+ { \int_compare_p:nNn {#2} < { \l_@@_print_numerals_below_int } }
+ { \int_compare_p:nNn {#1} > { 0 } }
+ { \int_compare_p:nNn {#2} > { 0 } }
}
+ { \bool_set_false:N \l_@@_lokal_numeral_bool }
+ }{
+ \bool_lazy_and:nnF
+ { \int_compare_p:nNn {#1} < { \l_@@_print_numerals_below_int } }
+ { \int_compare_p:nNn {#1} > { 0 } }
+ { \bool_set_false:N \l_@@_lokal_numeral_bool }
}
- { \bool_set_false:N \l_@@_lokal_numeral_bool }
}
% \end{macrocode}
+% \end{macro}
%
%
%
@@ -7066,15 +8168,25 @@ and the derived file cooking-units.sty.
%
% \section{cuam}
%
+% \begin{macro}{ \c_@@_no_unit_marker_tl , \@@_if_no_unit_marker:NTF }
+% A marker used for \mycs{cuam}. It essentially tells that no unit is used.
+% Define some commands to avoid some errors and add it to the unit list.
% \begin{macrocode}
-\tl_const:Nn \c_@@_cuam_marker_tl { @@_cunum }
-\tl_new:c { l_@@_unit_change_ \c_@@_cuam_marker_tl _tl }
-\tl_set:cn { l_@@_unit_change_ \c_@@_cuam_marker_tl _tl } { 1.0 }
-\clist_new:c { l_@@_unit_option_ \c_@@_cuam_marker_tl _clist }
+\tl_const:Nx \c_@@_no_unit_marker_tl { \@@_to_unit:n { @@_no_unit } }
+\prg_new_conditional:Npnn \@@_if_no_unit_marker:N #1 { TF , F }
+ {
+ \tl_if_eq:NNTF \c_@@_no_unit_marker_tl #1
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\seq_gput_right:NV \g_@@_list_of_defined_units_seq \c_@@_no_unit_marker_tl
+\tl_new:c { l_@@_unit_change_ \c_@@_no_unit_marker_tl _tl }
+\tl_set:cn { l_@@_unit_change_ \c_@@_no_unit_marker_tl _tl } { 1.0 }
+\clist_new:c { l_@@_unit_option_ \c_@@_no_unit_marker_tl _clist }
% \end{macrocode}
%
-% Replaces and extends \mycs{cufrac}.
% \begin{macro}{\cuam}
+% Replaces and extends \mycs{cufrac}. Essentially the same as the other commands.
% \begin{macrocode}
\NewDocumentCommand \cuam { d<> O{} m }
{
@@ -7089,41 +8201,20 @@ and the derived file cooking-units.sty.
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\@@_cuam:nnn}
+% Nothing really special happening here. Use |\c_@@_no_unit_marker_tl|
+% to tell the internal thing that we have a valid no-unit-exists case.
% \begin{macrocode}
\cs_new:Npn \@@_cuam:nnn #1#2#3
{
- \@@_cuam_initialise:nn {#1} {#2}
- \l_@@_cuam_hook_tl
- \bool_if:NTF \l_@@_cuam_old_bool
- { \@@_cuam_old:n {#3} }
- {
- \@@_parse_input:n {#3}
- \@@_process_and_print_input:
- \@@_print_correct_unit:
- }
+ \@@_set_cmd_type_to:n { cuam }
+ \@@_do_the_stuff:nnnnVn {#1} {#2} {#3} { } \c_@@_no_unit_marker_tl { }
}
% \end{macrocode}
+% \end{macro}
%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_cuam_initialise:nn #1#2
- {
- \@@_set_process_and_print_for_cuam:
- \tl_set_eq:NN \l_@@_original_unit_tl \c_@@_cuam_marker_tl
- \tl_set_eq:NN \l_@@_option_unit_tl \c_@@_cuam_marker_tl
- \bool_set_false:N \l_@@_lokal_phrase_bool
- \@@_initialise_after_unit_change:nn {#1} {#2}
- }
-% \end{macrocode}
+% \begin{macro}{\@@_cuam_post_process_input}
%
-% Important thing is: This whole process must not acticate if a
-% special sign is in the input. This is due to mathematical comparisons.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_cuam_post_process_input:NN #1#2
- {
- \bool_if:NF \l_@@_special_sign_bool
- { \@@_cuam_post_process_input_aux:NN #1 #2 }
- }
-% \end{macrocode}
%
% Just a helper macro to tidy up the main macro. The first thing to
% do is to check if the nummerical input consits of integers. This
@@ -7131,53 +8222,59 @@ and the derived file cooking-units.sty.
% Afterwards check if phrases are used and can be used at all. This needs
% to be done before the numeral check as it can change the input.
% \begin{macrocode}
-\cs_new:Npn \@@_cuam_post_process_input_aux:NN #1#2
+\cs_new_protected:Npn \@@_cuam_post_process_input:NN #1#2
{
- \@@_bool_set_if_integers:NNN \l_@@_tmpa_bool #1 #2
- \bool_lazy_and:nnT
- { \l_@@_use_phrases_bool } { \l_@@_tmpa_bool }
- { \@@_cuam_post_process_input_phrases:NN #1#2 }
- \bool_if:NT \l_@@_lokal_numeral_bool
- { \@@_cuam_post_process_input_numerals:NN #1#2 }
+ \@@_if_contain_decimals:NNTF #1#2
+ { \bool_set_false:N \l_@@_lokal_numeral_bool }
+ {
+ \bool_if:NT \l_@@_pckopt_use_phrases_bool
+ { \@@_cuam_post_process_input_phrases:NN #1#2 }
+ \bool_if:NT \l_@@_lokal_numeral_bool
+ { \@@_check_if_integer_can_be_numerals:NN #1#2 }
+ }
}
% \end{macrocode}
+% \end{macro}
+%\begin{macro}{ \@@_cuam_post_process_input_phrases:NN}
%
-% This command is more or less straightforward. Does a list of phrases exist
+% I really do not like this command, but I still do not have a bette idea
+% how to handle the whole thing.
+%
+% Does a list of phrases exist
% for the current language? If yes, parse the input and check if phrases are used.
% It is important for ranges to check both values and then decide if phrases
% are used or not.
% \begin{macrocode}
\cs_new:Npn \@@_cuam_post_process_input_phrases:NN #1#2
{
- \@@_get_phrase_for_current_langauge:NNT
- \l_@@_phrase_prop
- \l_@@_phrase_numbers_seq
+ \@@_culang_let:nnN { phrase } { phrase-prop } \l_@@_phrase_prop
+ \tl_if_eq:NNT \q_@@_no_translation \l_@@_phrase_prop
+ { \use_none_delimit_by_q_stop:w }
+ \prop_get:NnN \l_@@_phrase_prop { seq } \l_@@_phrase_numbers_seq
+%
+ \@@_cuam_post_process_input_phrases_aux:NNN
+ #1 \l_@@_tmpa_int \l_@@_phrase_number_tl
+ \bool_if:NF \l_@@_lokal_phrase_bool
+ { \use_none_delimit_by_q_stop:w }
+%
+ \@@_if_parse_and_process_type_equal:nTF { range }
{
- \@@_cuam_post_process_input_phrases_aux:NNN
- #1 \l_@@_tmpa_int \l_@@_phrase_number_tl
- \bool_if:NT \l_@@_lokal_phrase_bool
- {
- \bool_if:NTF \l_@@_range_in_input_bool
- {
- \bool_if:NF \l_@@_phrase_negative_bool
- {
- \@@_cuam_post_process_input_phrases_range:NN
- #2 \l_@@_tmpb_int
- \bool_if:NT \l_@@_lokal_phrase_bool
- {
- \tl_set:NV #1 \l_@@_tmpa_int
- \tl_set:NV #2 \l_@@_tmpb_int
- \@@_cuam_get_phrase_name:NVN
- \l_@@_phrase_phrase_tl \l_@@_phrase_number_tl \l_@@_tmpb_int
- }
- }
- }{
- \tl_set:NV #1 \l_@@_tmpa_int
- \@@_cuam_get_phrase_name:NVN
- \l_@@_phrase_phrase_tl \l_@@_phrase_number_tl \l_@@_tmpa_int
- }
- }
+ \bool_if:NT \l_@@_phrase_negative_bool
+ { \use_none_delimit_by_q_stop:w }
+ \@@_cuam_post_process_input_phrases_range:NN
+ #2 \l_@@_tmpb_int
+ \bool_if:NF \l_@@_lokal_phrase_bool
+ { \use_none_delimit_by_q_stop:w }
+ \tl_set:NV #1 \l_@@_tmpa_int
+ \tl_set:NV #2 \l_@@_tmpb_int
+ \@@_cuam_get_phrase_name:NVN
+ \l_@@_phrase_text_tl \l_@@_phrase_number_tl #2
+ }{
+ \tl_set:NV #1 \l_@@_tmpa_int
+ \@@_cuam_get_phrase_name:NVN
+ \l_@@_phrase_text_tl \l_@@_phrase_number_tl #1
}
+ \use_none_delimit_by_q_stop:w \q_stop
}
% \end{macrocode}
% \begin{macrocode}
@@ -7188,15 +8285,16 @@ and the derived file cooking-units.sty.
{
\int_compare:nNnF { \int_abs:n {##1} } > {#1}
{
- \int_compare:nNnTF {##1} < { 0 }
+ \prop_get:NnN \l_@@_phrase_prop { ##1-singlebool } \l_tmpa_tl
+ \int_compare:nNnTF { \l_tmpa_tl } = { 1 }
+ { \bool_set_true:N \l_@@_phrase_negative_bool }
{
- \bool_set_true:N \l_@@_phrase_negative_bool
- \int_set:Nn \l_tmpa_int { 1 }
+ \bool_set_false:N \l_@@_phrase_negative_bool
+ \tl_set:Nf \l_tmpa_tl { \int_div_truncate:nn {#1} {##1} }
}
- { \int_set:Nn \l_tmpa_int { \int_div_truncate:nn {#1} {##1} } }
- \int_compare:nNnT { \int_abs:n {##1} * \l_tmpa_int } = {#1}
+ \int_compare:nNnT { \int_abs:n {##1} * \l_tmpa_tl } = {#1}
{
- \int_set_eq:NN #2 \l_tmpa_int
+ \tl_set_eq:NN #2 \l_tmpa_tl
\tl_set:Nn #3 {##1}
\bool_set_true:N \l_@@_lokal_phrase_bool
\seq_map_break:
@@ -7206,8 +8304,11 @@ and the derived file cooking-units.sty.
}
\cs_new:Npn \@@_cuam_post_process_input_phrases_range:NN #1#2
{
- \int_set:Nn \l_tmpa_int { \int_div_truncate:nn {#1} { \l_@@_phrase_number_tl } }
- \int_compare:nNnTF { \l_@@_phrase_number_tl * \l_tmpa_int } = {#1}
+ \int_set:Nn \l_tmpa_int
+ {
+ \int_div_truncate:nn {#1} { \int_abs:n {\l_@@_phrase_number_tl } }
+ }
+ \int_compare:nNnTF { \int_abs:n {\l_@@_phrase_number_tl} * \l_tmpa_int } = {#1}
{
\int_set_eq:NN #2 \l_tmpa_int
\bool_set_true:N \l_@@_lokal_phrase_bool
@@ -7217,78 +8318,114 @@ and the derived file cooking-units.sty.
}
\cs_new:Npn \@@_cuam_get_phrase_name:NnN #1#2#3
{
- \@@_int_if_equal_one:nTF {#3}
+ \int_compare:nNnTF {#3} = { 1 }
{ \prop_get:NnN \l_@@_phrase_prop {#2} #1 }
{ \prop_get:NnN \l_@@_phrase_prop { #2-pl } #1 }
+ \prop_get:NnN \l_@@_phrase_prop { #2-gender } \l_@@_phrase_gender_tl
}
\cs_generate_variant:Nn \@@_cuam_get_phrase_name:NnN { NVN }
% \end{macrocode}
+% \end{macro}
%
%
-% Processing numerals. This function only happens if numerals are used
-% and because numerals have to be integers I can set the numeral boolean
-% false if there is no integer.
-%
-% Furthermore, due to knowing that we have integers we can use
-% |\int_compare_p:nNn| instead of the |fp|-equivalent.
+% \begin{macro}{\@@_cuam_print_numerical_input:N, \@@_cuam_print_numerical_input_aux:Nn, \@@_cuam_print_numerical_input_aux:NV }
+% Printing the numerical input for \mycs{cuam}. If both phrases and numerals
+% are requested, go to the helper macro. Else, just print the numerical input.
+% We need both to be true or else it can happen that numerals are used
+% without anything to follow it up (Instead of \enquote{zwei Dutzend} we simply would
+% have \enquote{zwei}).
% \begin{macrocode}
-\cs_new:Npn \@@_cuam_post_process_input_numerals:NN #1#2
+\cs_new_protected:Npn \@@_cuam_print_numerical_input:N #1
{
- \bool_if:NTF \l_@@_tmpa_bool
+ \bool_lazy_and:nnTF
+ { \l_@@_lokal_phrase_bool }
+ { \l_@@_lokal_numeral_bool }
{
- \bool_if:NTF \l_@@_range_in_input_bool
- {
- \bool_lazy_and:nnF
- { \int_compare_p:nNn {#1} < { \l_@@_print_numerals_below_int } }
- { \int_compare_p:nNn {#2} < { \l_@@_print_numerals_below_int } }
- { \bool_set_false:N \l_@@_lokal_numeral_bool }
- }{
- \int_compare:nNnF {#1} < { \l_@@_print_numerals_below_int }
- { \bool_set_false:N \l_@@_lokal_numeral_bool }
- }
+ \@@_cuam_print_numerical_input_aux:NV #1\l_@@_phrase_number_tl
}
- { \bool_set_false:N \l_@@_lokal_numeral_bool }
+ { \@@_print_numerical_input:N #1 }
}
% \end{macrocode}
-%
-%
-% Note: This command checks if \emph{both} a phrase and a numeral is
-% used to decide whetever or not to print numerals. This is due to
-% the $1$ being dependent (in some languages) depending on the gender
-% of the following word. Currently testing only |\l_@@_lokal_numeral_bool| doesn't
-% work due to the $1$ having a special parsing.
+% Currently \mycs{cuam} only allows for lowercase numerals.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_cuam_print_numerical_input:N #1
+\cs_new:Npn \@@_cuam_print_numerical_input_aux:Nn #1#2
{
- \bool_lazy_and:nnTF
- { \l_@@_lokal_phrase_bool }
- { \l_@@_lokal_numeral_bool }
+ \int_compare:nNnTF {#1} = { 1 }
{
- \@@_int_if_equal_one:nTF {#1}
- {
- \@@_translate_one_and_check_existance:Nx
- \l_@@_translation_tmpa_tl
- { \l_@@_phrase_number_tl -phrase-gender }
- \l_@@_translation_tmpa_tl
+ \@@_culang_one_let_by_gender:NVTF
+ \l_@@_translation_tmpa_tl \l_@@_phrase_gender_tl
+ { \l_@@_translation_tmpa_tl }
+ {
+ \@@_print_numeral:V #1
+ \bool_set_false:N \l_@@_lokal_numeral_bool
}
- { \exp_args:NV \@@_print_numeral:n #1 }
- }{ \@@_print_numerical_input:N #1 }
+ }
+ { \@@_print_numeral:V #1 }
}
+\cs_generate_variant:Nn \@@_cuam_print_numerical_input_aux:Nn { NV }
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro} { \@@_cuam_print_correct_unitphrase: }
+% THis one is thankfully straightforward.
% \begin{macrocode}
\cs_new:Npn \@@_cuam_print_correct_unitphrase:
{
\bool_if:NT \l_@@_lokal_phrase_bool
{
\l_@@_cuphrase_space_tl
- \l_@@_phrase_phrase_tl
+ \l_@@_phrase_text_tl
}
}
% \end{macrocode}
+% \end{macro}
%
%
%
+% \subsection{\mycs{cucomp}}
+%
+%
+% \begin{macrocode}
+%\NewDocumentCommand \cucomp { d<> O{} m m m }
+% {
+% \group_begin:
+% \@@_cucomp:nnnnn {#1} {#2} {#3} {#4} {#5}
+% \group_end:
+% }
+% \end{macrocode}
+% \begin{macrocode}
+%\cs_new:Npn \@@_cucomp:nnnnn #1#2 #3#4#5
+% {
+% \group_begin:
+% \@@_set_cmd_type_to:n { cunum }
+% \@@_do_the_stuff:nnnnnn {#1} {#2} {#3} { } {#4} { }
+% /
+% \@@_do_the_stuff:nnnnnn {#1} {#4=#5} {#3} { } {#4} { }
+% \group_end:
+% }
+% \end{macrocode}
+%
+% \begin{macrocode}
+%\cs_new:Npn \@@_do_cucomp_stuff:nnnnn #1#2 #3#4#5
+% {
+% \group_begin:
+% \@@_set_cmd_to:n { cucomp }
+% \@@_do_the_stuff:nnnnnn {#1} {#2} {#3} { } {#4}
+% \@@_do_the_stuff:nnnnnn {#1} {#2} {#3} { } {#5}
+% \group_end:
+% }
+% \end{macrocode}
+%
+% \begin{macrocode}
+%\cs_new:Npn \@@_new_process_compare_in_input:
+% {
+% \tl_set_eq:NN \l_@@_number_tmpb_tl \l_@@_number_tmpa_tl
+% \tl_set_eq:NN \l_@@_tmpa_unit_tl \l_@@_option_unit_tl
+% \@@_calculate_and_store_in:N \l_@@_number_tmpa_tl
+% \@@_calculate_and_store_in:N \l_@@_number_tmpb_tl
+% \@@_post_process_accordingly:NN \l_@@_number_tmpa_tl \q_no_value
+% }
+% \end{macrocode}
%
%
%
@@ -7296,458 +8433,699 @@ and the derived file cooking-units.sty.
%
% \subsection {Define Keys}
%
-% \begin{macro}{ \cudefinekeys }
+% \begin{macro}{ }
% Defining keys.
% \begin{macrocode}
-\NewDocumentCommand \cudefinekeys { m m }
- {
- \bool_set_false:N \l_@@_single_key_bool
- \@@_cukeys_define_keys_and_single_keys:nn {#1} {#2}
- }
+
+%% To be deleted. In order to remove error messages.
+%\newcommand \cudefinekeys {}
+%\newcommand \cudefinesinglekey {}
+%\newcommand \cuaddkeys {}
+%\newcommand \cuaddsinglekeys {}
+%\newcommand \cuaddtokeys {}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{ \cudefinesinglekey }
-% Again, but with the boolean set to true.
+%
+%
+%
+% \begin{macro}{ \cudefinekeys , \cudefinesinglekey }
+% Commands used for defining unit-keys. Their main differences
+% is in setting |\l_@@_single_key_bool| to the respective value
+% and for single-keys to rescan |#2| as it can contain |#1| in its argument.
+%
+% The other stuff is imply a intialization using the unit in |#1| as a base
+% and parsing the rest.
% \begin{macrocode}
+\NewDocumentCommand \cudefinekeys { m m }
+ {
+ \bool_set_false:N \l_@@_single_key_bool
+ \@@_initialice_cukeys_define:n {#1}
+ \@@_cukeys_prepare_parsing_keys:nn {#1} {#2}
+ }
\NewDocumentCommand \cudefinesinglekey { m m }
{
\bool_set_true:N \l_@@_single_key_bool
- \@@_cukeys_define_keys_and_single_keys:nn {#1} {#2}
+ \@@_initialice_cukeys_define:n {#1}
+ \tl_set_rescan:Nno \l_@@_tmpa_tl
+ { \char_set_catcode_letter:N \# } {#2}
+ \@@_cukeys_prepare_parsing_keys:nV {#1} \l_@@_tmpa_tl
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{ \@@_cukeys_define_keys_and_single_keys:nn }
-% First checks whetever the unit is defined or not, then clears some macros
-% which are needed later. Further procession depends on the boolean.
-% If more than one key is created, the value \lstinline|\l_@@_tmpa_fp| is set to one.
-% This is important for adding keys where \lstinline|\l_@@_tmpa_fp| is changed accordingly.
+% \begin{macro}{ \@@_initialice_cukeys_define:n }
+% Using |#1| as the base unit for the following keys we set some variables.
+% |\l_@@_tmpa_seq| will contain the parsed units; |\l_@@_tmpb_seq| the values.
+% We also make sure the unit |#1| is defined, else create an error.
+% Also of importance is to set |\l_@@_new_key_base_tl| to $1$. This variable
+% is important while adding keys as it sets the base conversion value so to speak.
% \begin{macrocode}
-\cs_new:Npn \@@_cukeys_define_keys_and_single_keys:nn #1#2
+\cs_new:Npn \@@_initialice_cukeys_define:n #1
{
- \@@_error_if_unit_not_defined:nTF {#1}
- { \bool_set_true:N } { \bool_set_false:N }
- \l_@@_unit_error_bool
- \tl_if_blank:nF {#2}
- {
- \prop_gclear:N \g_@@_master_changer_prop
- \prop_gclear:N \g_@@_convert_to_eV_remember_prop
- \seq_clear:N \l_@@_tmpa_seq
- \prop_clear:N \l_@@_tmpa_prop
- \prop_clear_new:c { l_@@_cukeys_ #1 _prop }
- \bool_if:NTF \l_@@_single_key_bool
- {
- \@@_cukeys_parse_and_create_single_key:nn {#1} {#2}
- }{
- \fp_set:Nn \l_@@_tmpa_fp { 1.0 }
- \tl_set:Nn \l_@@_original_unit_tl {#1}
- \@@_cukeys_parse_and_create_keys:nn {#1}
- {
- {#1} { 1.0 } #2
- }
- }
- }
+ \@@_set_state_to:n { normal }
+ \seq_clear:N \l_@@_tmpa_seq
+ \seq_clear:N \l_@@_tmpb_seq
+ \prop_clear:N \l_@@_tmpa_prop
+ \tl_set:Nn \l_@@_new_key_base_tl { 1 }
+ \@@_error_if_unit_not_defined:nNT {#1} \l_@@_original_unit_tl
+ { \@@_set_state_to:n { error } }
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{ \@@_cukeys_parse_and_create_keys:nn }
-% A simple parsing function using quarks (which are pretty handy).
-% At first parses the input, then creates the property lists for each key
-% (containing all the values) and at last defines the keys.
+%
+% \begin{macro}{\cudefinekeychain}
+% The command that is going to replace \mycs{cudefinekeys} and friends
+% (but \emph{not} the single key variants). Nothing going on here.
+% The biggest difference to \mycs{cudefinekeys} is that we do not know
+% the base key by default. Thus we make a short detour to grab the first unit
+% we encounter in |#1| (and its value) and the rest proceeeds as before.
% \begin{macrocode}
-\cs_new:Npn \@@_cukeys_parse_and_create_keys:nn #1#2
+\NewDocumentCommand \cudefinekeychain { m }
{
- \@@_cukeys_parse_input:nn #2
- \q_recursion_tail \q_recursion_tail \q_recursion_stop
- \bool_if:NF \l_@@_unit_error_bool
+ \bool_set_false:N \l_@@_single_key_bool
+ \@@_initialice_cukeychain_define:n {#1}
+ \@@_cukeys_prepare_parsing_keys:n {#1}
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_initialice_cukeychain_define:n}
+% Initializing the key-chain. First, grab the first unit in |#1|. This needs to
+% be done as the old code expects us to already know a base unit. Here the first
+% unit that is encountered is taken as the base unit. Its value is stored in |\l_@@_base_tl|.
+% This is needed to normalice the values in relation to the base unit. Remember,
+% the base unit is defined to be exactly |1|, thus all further values need to be
+% changed to reflect that. The normalization factor is stored inside |\l_@@_new_key_base_tl|.
+% |\l_@@_curr_unit_tl| is cleared to remind me, that it is not a unit per se
+% (as it is not set \emph{via} |\@@_set_unit:Nn|.
+% \begin{macrocode}
+\cs_new:Npn \@@_initialice_cukeychain_define:n #1
+ {
+ \@@_cukeychain_get_first_unit_aux:nn #1
+ \q_recursion_tail \q_recursion_tail \q_recursion_stop
+ \@@_if_state_equal:nF { error }
{
- \@@_cukeys_create_key_prop:n {#1}
- \clist_set_from_seq:NN \l_@@_tmpa_clist \l_@@_tmpa_seq
- \@@_cukeys_define_keys:V \l_@@_tmpa_clist
+ \exp_args:NV \@@_initialice_cukeys_define:n \l_@@_curr_unit_tl
+ \@@_tl_eval:Nn \l_@@_new_key_base_tl { 1 / (\l_@@_base_tl) }
+ \tl_clear:N \l_@@_curr_unit_tl
}
}
-\cs_generate_variant:Nn \@@_cukeys_parse_and_create_keys:nn { Vn }
% \end{macrocode}
% \end{macro}
-%
-% \begin{macro}{ \@@_cukeys_parse_input:nn }
-% Yeah \dots\ \lstinline|\l_@@_tmpa_clist| stores all the used unit-keys, while
-% the property list saves the relation to each other. This cycle is repeated until an
-% recursion tail is found. If you define a new key, \verb|\l_@@_tmpa_fp| is set to
-% 1 and changed later if a new key is added.
+% \begin{macro}{\@@_cukeychain_get_first_unit_aux:nn}
+% Nothing fancy here. Just grab the first unit and its value.
% \begin{macrocode}
-\cs_new:Npn \@@_cukeys_parse_input:nn #1#2
+\cs_new:Npn \@@_cukeychain_get_first_unit_aux:nn #1#2
{
- \quark_if_recursion_tail_stop:n {#1}
+ \quark_if_recursion_tail_stop_do:nn {#1}
+ { \@@_set_state_to:n { error } }
\quark_if_recursion_tail_stop_do:nn {#2}
- { \msg_error:nn { cooking-units } { missing-argument } }
- \@@_error_if_unit_not_defined:nF {#1}
{
- \seq_if_in:NnF \l_@@_tmpa_seq {#1}
- { \seq_put_right:Nn \l_@@_tmpa_seq {#1} }
- \prop_put:Nnx \l_@@_tmpa_prop {#1} { \fp_eval:n { (#2) * \l_@@_tmpa_fp } }
+ \msg_error:nn { cooking-units } { missing-argument }
+ \@@_set_state_to:n { error }
}
- \@@_cukeys_parse_input:nn
+ \tl_set:Nn \l_@@_curr_unit_tl {#1}
+ \tl_set:Nn \l_@@_base_tl {#2}
+ \use_none_delimit_by_q_recursion_stop:w
+ \@@_cukeychain_get_first_unit_aux:nn
}
-
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{ \@@_cukeys_create_key_prop:n }
%
-% \changes {2016/09/22} {1.02f} {Save 'Liste', 'prop' and 'Erstes Ding' to \cs{l_tmpb_prop} and set the unit-prop lists equal to \cs{l_tmpb_prop}.}
-% \changes {2016/09/22} {1.02g} {Do not need \cs{tl_clear_new:c} as token list is already defined.}
%
-% All linked unit-keys are stored within \lstinline|\l_@@_tmpa_clist| and are mapped
-% one after another. At first a property list is created (or cleared), this property list
-% stores the units linked to this unit, saves the created property list which contains the
-% numerical relation of each unit. \lstinline|Erstes Ding| (firsth thing) stores
-% the first unit used for defining the keys, it is needed later for adding keys.
-%
-% For each unit the other units are added in the cleared or newly created property list
-% as keys with their value being the correct numerical relation. For example:
%
-% \begin{align*}
-% \SI{1}{\kg}&= \SI{1}{\kg} \\
-% \SI{1}{\kg}&= \SI{100}{\deka\gram} \\
-% \SI{1}{\kg}&= \SI{1000}{\g} \\
-% \SI{1}{\kg}&= \SI{35.27399}{oz}
-% \end{align*}
%
-% Therefore the property list for \lstinline|kg| contains the keys and values:
-% \myunit{kg}=\myunit{1}
-% \myunit{dag}=\myunit{100}, \myunit{g}=\myunit{1000} and \myunit{oz}= \myunit{35.27399}.
%
-% For the next unit (\myunit{dag} in this case) a new property list is created, relation above
-% stored inside etc. The condition now is that \myunit{dag}=\texttt{1}, therefore every number
-% is divided the the number \texttt{100}:
%
-% \begin{align*}
-% \SI{1}{\deka\gram}&= \SI{0.01}{\kg} \\
-% \SI{1}{\deka\gram}&= \SI{1}{\deka\gram} \\
-% \SI{1}{\deka\gram}&= \SI{10}{\g} \\
-% \SI{1}{\deka\gram}&= \SI{0.3527399}{\oz}
-% \end{align*}
+% \begin{macro}{ \cuaddkeys , \cuaddtokeys , \cuaddsinglekeys }
+% Thanks to rewriting the code the |add| commands and the |define|
+% commands share a lot of code. The difference is the initialicing, which is a bit
+% different.
+% \begin{macrocode}
+\NewDocumentCommand \cuaddkeys { m m }
+ {
+ \bool_set_false:N \l_@@_single_key_bool
+ \@@_initialice_cukeys_add:n {#1}
+ \@@_cukeys_prepare_parsing_keys:nn {#1} {#2}
+ }
+\NewDocumentCommand \cuaddtokeys { m m m }
+ {
+ \bool_set_false:N \l_@@_single_key_bool
+ \@@_initialice_cukeys_add:n {#1}
+ \tl_set:Nn \l_@@_tmpa_tl { {#2} { \fp_eval:n { 1.0 / (#3) } } }
+ \@@_cukeys_prepare_parsing_keys:nV {#1} \l_@@_tmpa_tl
+ }
+\NewDocumentCommand \cuaddsinglekeys { m m }
+ {
+ \bool_set_true:N \l_@@_single_key_bool
+ \@@_initialice_cukeys_add:n {#1}
+ \tl_set_rescan:Nno \l_@@_tmpa_tl
+ { \char_set_catcode_letter:N \# } {#2}
+ \@@_cukeys_prepare_parsing_keys:nV {#1} \l_@@_tmpa_tl
+ }
+% \end{macrocode}
+% \end{macro}
%
-% Same for \myunit{g}:
+% \begin{macro}{ \@@_initialice_cukeys_add:n }
+% This one is quite different compared to |\@@_initialice_cukeys_define:n| as it
+% needs a bit more stuff to do.
%
-% \begin{align*}
-% \SI{1}{\g}&= \SI{0.001}{\kg} \\
-% \SI{1}{\g}&= \SI{0.1}{\deka\gram} \\
-% \SI{1}{\g}&= \SI{1}{\g} \\
-% \SI{1}{\g}&= \SI{0.03527399}{oz}
-% \end{align*}
+% The beginning is checking if |#1| exists and later if |#1| is a key at all.
+% If it not a key already we cannot add keys, in either case print an error and
+% go to the end.
%
-% and \myunit{oz}
+% If the checks passed without error we go to the \enquote{retrieving} step.
+% As we are adding (potentially) new keys to existing ones we need to retrive
+% the values we stored and got during the definition of keys.
%
-% \begin{align*}
-% \SI{1}{oz}&= \SI{0.0283495}{\kg} \\
-% \SI{1}{oz}&= \SI{2.83495}{\deka\gram} \\
-% \SI{1}{oz}&= \SI{28.3495}{\g} \\
-% \SI{1}{oz}&= \SI{1}{oz}
-% \end{align*}
+% First, get the |\l_@@_original_unit_tl|. This one is the unit given in the first argument
+% of either |cudefinekeys| or |\cudefinesinglekey|. It is the base unit
+% for those keys. Afterwards retrieve the other values. Get the property list
+% which stores the unit-value pairs, get the list of units we can transform the unit to
+% and -- to make sure -- make sure a single key is only added to a single key and vice versa.
%
+% Afterwards, this cs is done.
% \begin{macrocode}
-\cs_new:Npn \@@_cukeys_create_key_prop:n #1
+\cs_new:Npn \@@_initialice_cukeys_add:n #1
{
- \prop_set_eq:cN { l_@@_cukeys_ #1 _prop } \l_@@_tmpa_prop
- \prop_put:cnV { l_@@_cukeys_ #1 _prop } { Liste } \l_@@_tmpa_seq
- \seq_map_inline:Nn \l_@@_tmpa_seq
- {
- \tl_set_eq:cN { l_@@_base_key_unit_ ##1 _tl } \l_@@_original_unit_tl
- \tl_set:cn { l_@@_unit_change_ ##1 _tl } { 1.0 }
+ \seq_clear:N \l_@@_tmpa_seq
+ \seq_clear:N \l_@@_tmpb_seq
+ \@@_set_state_to:n { normal }
+ \@@_error_if_unit_not_defined:nNT {#1} \l_@@_curr_unit_tl
+ {
+ \@@_set_state_to:n { error }
+ \use_none_delimit_by_q_stop:w
+ }
+ \@@_if_unit_has_a_key:nF {#1}
+ {
+ \msg_error:nnx { cooking-units } { Key-not-defined } \l_@@_curr_unit_tl
+ \@@_set_state_to:n { error }
+ \use_none_delimit_by_q_stop:w
+ }
+ \tl_set_eq:Nc \l_@@_original_unit_tl { l_@@_base_key_unit_ \l_@@_curr_unit_tl _tl }
+ \prop_set_eq:Nc \l_@@_tmpa_prop { l_@@_new_cukeys_ \l_@@_original_unit_tl _prop }
+ \prop_get:NnN \l_@@_tmpa_prop {#1} \l_@@_new_key_base_tl
+ \prop_get:NnN \l_@@_tmpa_prop { Liste } \l_@@_tmpa_seq
+ \prop_get:NnN \l_@@_tmpa_prop { single } \l_@@_tmpa_tl
+ \int_compare:nNnF { \l_@@_single_key_bool } = { \l_@@_tmpa_tl }
+ {
+ \msg_error:nn { cooking-units } { Adding-single-to-multi-key-or-vice-verca }
+ \@@_set_state_to:n { error }
}
+ \use_none_delimit_by_q_stop:w \q_stop
}
+\cs_generate_variant:Nn \@@_initialice_cukeys_add:n { V }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{ \@@_cukeys_define_keys:n , \@@_cukeys_define_keys:V }
-% Defining the keys: It maps through the list of unit-keys and creates a
-% unit-key respectively.
+%
+% \begin{macro}{\cuaddtokeychain}
+% This command is going to replace \mycs{cuaddkeys} and \mycs{cuaddtokeys}.
+% It is similar to \mycs{cudefinekeychain}. Just with some more hoops before the keys
+% can be defined.
% \begin{macrocode}
-\cs_new:Npn \@@_cukeys_define_keys:n #1
+\NewDocumentCommand \cuaddtokeychain { m }
{
- \seq_map_inline:Nn \l_@@_tmpa_seq
- {
- \@@_cukeys_keys_define:nn {##1} {#1}
- }
+ \bool_set_false:N \l_@@_single_key_bool
+ \@@_initialice_cukeys_keychain_add:n {#1}
+ \@@_cukeys_prepare_parsing_keys:n {#1}
}
-\cs_new:Npn \@@_cukeys_keys_define:nn #1#2
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_initialice_cukeys_keychain_add:n}
+% Initiliazing the key-chain. Like \mycs{cudefinekeychain} we first need to get
+% the base unit. Afterwards, the \enquote{normal} initialization command is used
+% (with the found base key) and |\l_@@_new_key_base_tl| is normalized.
+% \begin{macrocode}
+\cs_new:Npn \@@_initialice_cukeys_keychain_add:n #1
{
- \seq_if_in:NnF \l_@@_list_of_defined_keys_seq {#1}
- { \seq_put_right:Nn \l_@@_list_of_defined_keys_seq {#1} }
- \keys_define:nn { cooking-units }
+ \@@_cukeys_keychain_get_first_valid_unit:n {#1}
+ \@@_if_state_equal:nF { error }
{
- #1 .choices:nn =
- {#2}
- {
- \@@_cukeys_define_keys_and_single_key_aux:n {#1}
- } ,
- #1 / unknown .code:n=
- {
- \seq_set_split:Nnn \l_tmpa_seq { , } {#2}
- \msg_error:nnxxx
- { cooking-units }
- { key-choice-unknown }
- {#1}
- {##1}
- { \@@_seq_use_msg:N \l_tmpa_seq }
- } ,
- #1 .default:n = {#1} ,
- #1 .groups:n = { change-unit }
+ \@@_initialice_cukeys_add:V \l_@@_curr_unit_tl
+ \@@_tl_eval:Nn \l_@@_new_key_base_tl { (\l_@@_new_key_base_tl) / (\l_@@_base_tl) }
}
}
-\cs_generate_variant:Nn \@@_cukeys_define_keys:n { V }
% \end{macrocode}
% \end{macro}
+% \begin{macro}{\@@_cukeys_keychain_get_first_valid_unit:n
+% , \@@_cukeys_keychain_get_first_valid_unit_aux:nn
+% }
%
-% \begin{macro}{\@@_cukeys_define_keys_and_single_key_aux:n}
-%^^A <<
+% Just a wrapper for the loop.
% \begin{macrocode}
-\prg_new_conditional:Npnn \@@_prop_get_master:nnN #1#2#3 { F }
- {
- \prop_get:NnNTF \g_@@_master_changer_prop { #1 ~->~ #2 } #3
- { \prg_return_true: }
- { \prg_return_false: }
- }
-\cs_generate_variant:Nn \@@_prop_get_master:nnNF { nVc }
-%
-\cs_new:Npn \@@_prop_gput_master:nnn #1#2#3
+\cs_new:Npn \@@_cukeys_keychain_get_first_valid_unit:n #1
{
- \prop_gput:Nnn \g_@@_master_changer_prop { #1 ~->~ #2 } {#3}
+ \@@_cukeys_keychain_get_first_valid_unit_aux:nn #1
+ \q_recursion_tail \q_recursion_tail \q_recursion_stop
}
-\cs_generate_variant:Nn \@@_prop_gput_master:nnn { nVV, nVv }
-%
-\cs_new:Npn \@@_cukeys_define_keys_and_single_key_aux:n #1
+% \end{macrocode}
+% Finding the base unit is a bit more complex than just taking the first
+% one found, but not by much. The idea is simple: Loop through the units
+% till one is found that has an existing key. This allows the user to set the
+% new unit(s) first in the loop and the base unit at last place (or an arbitrary place).
+% We set this unit to be the |\l_@@_original_unit_tl| and its value as |\l_@@_base_tl|
+% (not evaluated at this place). If a unit is found, break the loop.
+% \begin{macrocode}
+\cs_new:Npn \@@_cukeys_keychain_get_first_valid_unit_aux:nn #1#2
{
- \@@_prop_get_master:nVcF {#1} \l_keys_choice_tl { l_@@_unit_change_ #1_tl }
+ \quark_if_recursion_tail_stop_do:nn {#1}
{
- \prop_if_exist:cTF { l_@@_cukeys_ #1 _prop }
- {
- \prop_get:cVc
- { l_@@_cukeys_ #1 _prop }
- \l_keys_choice_tl
- { l_@@_unit_change_ #1_tl }
- \@@_prop_gput_master:nVv {#1} \l_keys_choice_tl { l_@@_unit_change_ #1_tl }
- }{
- \tl_set_eq:Nc \l_@@_tmpa_tl { l_@@_base_key_unit_ #1 _tl }
- \prop_set_eq:Nc \l_@@_tmpa_prop { l_@@_cukeys_ \l_@@_tmpa_tl _prop }
- \@@_tl_eval:Nn \l_@@_tmpb_tl
- {
- (\exp_args:NNV\prop_item:Nn \l_@@_tmpa_prop \l_keys_choice_tl) /
- (\prop_item:Nn \l_@@_tmpa_prop {#1})
- }
- \@@_prop_gput_master:nVV {#1} \l_keys_choice_tl \l_@@_tmpb_tl
- \tl_set:cV { l_@@_unit_change_ #1 _tl } \l_@@_tmpb_tl
- }
+ \msg_error:nn { cooking-units } { Key-chain-unit-not-found }
+ \@@_set_state_to:n { error }
}
- \prop_put:NnV \l_@@_change_unit_prop {#1} \l_keys_choice_tl
+ \quark_if_recursion_tail_stop_do:nn {#2}
+ {
+ \msg_error:nn { cooking-units } { missing-argument }
+ \@@_set_state_to:n { error }
+ }
+ \@@_if_unit_has_a_key:nT {#1}
+ {
+ \@@_error_if_unit_not_defined:nNT {#1} \l_@@_curr_unit_tl
+ { \@@_set_state_to:n { error } }
+ \tl_set_eq:NN \l_@@_original_unit_tl \l_@@_curr_unit_tl
+ \tl_set:Nn \l_@@_base_tl {#2}
+ \use_none_delimit_by_q_recursion_stop:w
+ }
+ \@@_cukeys_keychain_get_first_valid_unit_aux:nn
}
% \end{macrocode}
% \end{macro}
%
%
+%
+%
+%
+% \begin{macro}{ \@@_cukeys_prepare_parsing_keys:n
+% , \@@_cukeys_prepare_parsing_keys:nn
+% }
+% Just a wrapper. |#1| is the base unit and thus defined to be |1|.
% \begin{macrocode}
-\cs_new:Npn \@@_cukeys_parse_and_create_single_key:nn #1#2
+\cs_new:Npn \@@_cukeys_prepare_parsing_keys:nn #1#2
{
- \tl_set_rescan:Nnn \l_@@_tmpa_tl
- {
- \char_set_catcode_letter:N \# %
- \char_set_catcode_ignore:N\ %
- } { {#1} { 1.0 } #2 }
- \@@_cusinglekeys_parse_input:V \l_@@_tmpa_tl
- \bool_if:NF \l_@@_unit_error_bool
+ \@@_cukeys_prepare_parsing_keys:n { {#1} { 1.0 } #2 }
+ }
+% After initialising the variables we go to this command.
+% At first it seperates the input in |#1| into unit-value pairs via |\@@_cukeys_parse_keys|.
+% If no error happened, we go to the definition of keys.
+%
+% As we add new keys and potentially change the values of old ones we need
+% to globally clear |\g_@@_master_changer_prop|.
+\cs_new:Npn \@@_cukeys_prepare_parsing_keys:n #1
+ {
+ \@@_cukeys_parse_keys:n {#1}
+ \bool_lazy_or:nnF
+ { \int_compare_p:nNn \l_@@_nr_of_units_int = 0 }
+ { \@@_if_state_equal_p:n { error } }
{
- \@@_cusinglekeys_create_key_prop:n {#1}
- \clist_set_from_seq:NN \l_@@_tmpa_clist \l_@@_tmpa_seq
- \@@_cukeys_define_singlekey:nV {#1} \l_@@_tmpa_clist
+ \prop_gclear:N \g_@@_master_changer_prop
+ \@@_cukeys_prepare_lists:N \l_@@_original_unit_tl
+ \@@_new_cukeys_create_keys:V \l_@@_original_unit_tl
}
}
+\cs_generate_variant:Nn \@@_cukeys_prepare_parsing_keys:nn { nV }
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{ \@@_cukeys_parse_keys:nn , \@@_cukeys_parse_keys_aux:nn}
+% Seperates the input into key-value pairs. This cs doesn't do much as the main
+% stuff is done in |\@@_cukeys_parse_keys_aux:nn|.
% \begin{macrocode}
-\cs_new:Npn \@@_cusinglekeys_parse_input:n #1
+\cs_new:Npn \@@_cukeys_parse_keys:n #1
{
- \@@_cusinglekeys_parse_input_aux:nn #1
- \q_recursion_tail \q_recursion_tail \q_recursion_stop
+ \int_zero:N \l_@@_nr_of_units_int
+ \@@_cukeys_parse_keys_aux:nn #1
+ \q_recursion_tail \q_recursion_tail \q_recursion_stop
}
-\cs_generate_variant:Nn \@@_cusinglekeys_parse_input:n { V }
-%
-\cs_new:Npn \@@_cusinglekeys_parse_input_aux:nn #1#2
+% \end{macrocode}
+%
+% Note for the beginning:
+% Keys used for definining (#1) are converted into strings!
+% No need to keep catcodes. Just string everything!
+%
+% This command does a lot. The first is the stopping condition, then two
+% checks for error messages. Either a \enquote{missing-argument} or a \enquote{unit
+% not defined} thingy.
+%
+% The value is stored in |\l_@@_tmpb_tl|. Afterwards check if a |##1| is found inside.
+% If it is, replace |##1| by |\l_@@_tmpa_fp|. So we do not store a command with an
+% argument, but rather a formula with a variable inside, which we can set.
+% If on ther other side it contains a |##1|, but is not a single key, we raise an error.
+%
+% Afterwards -- if nor error -- we calculate the value in |\l_@@_tmpb_tl| if we have no
+% single key. Here |\l_@@_new_key_base_tl| comes into play. The idea is the following:
+% the base key is \enquote{kg} with \enquote{1}, furthermore we have the key
+% \enquote{dag} with value \enquote{100}. Now we add \enquote{g} to \enquote{dag}
+% with \enquote{10} ($1$ dag equals 10 g). In order to have the correct relation betwen
+% the base key \enquote{kg} and \enquote{g}, we set |\l_@@_new_key_base_tl| during
+% the initialization to \enquote{100}. Then the relation between \enquote{kg} and
+% \enquote{g} is correct with \enquote{(10)*100=1000}.
+%
+% Add the unit to the list of units; add the unit-value to the propery-list.
+% \begin{macrocode}
+\cs_new:Npn \@@_cukeys_parse_keys_aux:nn #1#2
{
\quark_if_recursion_tail_stop:n {#1}
\quark_if_recursion_tail_stop_do:nn {#2}
- { \msg_error:nn { cooking-units } { missing-argument } }
- \@@_error_if_unit_not_defined:nF {#1}
+ {
+ \msg_error:nn { cooking-units } { missing-argument }
+ \@@_set_state_to:n { error }
+ }
+ \@@_error_if_unit_not_defined:nNT {#1} \l_@@_option_unit_tl
+ { \@@_set_state_to:n { error } }
+%
+ \tl_set:Nn \l_@@_tmpb_tl {#2}
+ \tl_if_in:NVT \l_@@_tmpb_tl \g_@@_input_str_hash_one_tl
+ {
+ \bool_if:NTF \l_@@_single_key_bool
+ { \tl_replace_all:NVn \l_@@_tmpb_tl \g_@@_input_str_hash_one_tl { \l_@@_tmpa_fp } }
+ {
+ \msg_error:nnx { cooking-units } { formula-in-non-singlekeys } \l_@@_tmpb_tl
+ \@@_set_state_to:n { error }
+ }
+ }
+ \@@_if_state_equal:nF { error }
{
- \seq_if_in:NnF \l_@@_tmpa_seq {#1}
- { \seq_put_right:Nn \l_@@_tmpa_seq {#1} }
- \tl_set:Nn \l_@@_tmpa_tl {#2}
- \tl_replace_all:NVn \l_@@_tmpa_tl \g_@@_input_str_hash_one_tl { \l_@@_tmpa_fp }
- \prop_put:NnV \l_@@_tmpa_prop {#1} \l_@@_tmpa_tl
+ \int_incr:N \l_@@_nr_of_units_int
+ \bool_if:NF \l_@@_single_key_bool
+ { \@@_tl_eval:Nn \l_@@_tmpb_tl { (\l_@@_tmpb_tl) * (\l_@@_new_key_base_tl) } }
+ \seq_if_in:NVF \l_@@_tmpa_seq \l_@@_option_unit_tl
+ { \seq_put_right:NV \l_@@_tmpa_seq \l_@@_option_unit_tl }
+ \prop_put:NnV \l_@@_tmpa_prop {#1} \l_@@_tmpb_tl
}
- \@@_cusinglekeys_parse_input_aux:nn
+ \@@_cukeys_parse_keys_aux:nn
}
% \end{macrocode}
+% \end{macro}
%
-% \begin{macrocode}
-\cs_new:Npn \@@_cusinglekeys_create_key_prop:n #1
- {
- \tl_set:cn { l_@@_unit_change_ #1 _tl } { 1.0 }
- \tl_set:cn { l_@@_base_key_unit_ #1 _tl } {#1}
- \prop_set_eq:cN { l_@@_cukeys_ #1 _prop } \l_@@_tmpa_prop
- \prop_put:cnV { l_@@_cukeys_ #1 _prop } { Liste } \l_@@_tmpa_seq
+% \begin{macro}{ \@@_cukeys_prepare_lists:N }
+% At this point we can assume everything to be correct.
+% |#1| the main unit aka.\ the \enquote{original unit} or \enquote{base unit}.
+%
+% First we clear/create new the property list which will contains the conversion values for
+% for each unit. There we will safe the the values we collected in the last step,
+% the list of units in this set and if the key is single or not.
+%
+% For simplification, each unit in the key-list always points to the \enquote{base unit},
+% so \enquote{g}, \enquote{kg}, \enquote{dag}, etc.\ will all show to \enquote{kg}.
+% This is not needed if we have a single-key (due to how single-keys work).
+% Furhtermore, if no single-key, set the default transformation value to \enquote{1};
+% not sure if the last step is necessary, but eh.
+% \begin{macrocode}
+\cs_new:Npn \@@_cukeys_prepare_lists:N #1
+ {
+ \prop_clear_new:c { l_@@_new_cukeys_ #1 _prop }
+ \prop_set_eq:cN { l_@@_new_cukeys_ #1 _prop } \l_@@_tmpa_prop
+ \prop_put:cnV { l_@@_new_cukeys_ #1 _prop } { Liste } \l_@@_tmpa_seq
+ \prop_put:cnV { l_@@_new_cukeys_ #1 _prop } { single } \l_@@_single_key_bool
+ \tl_set:cn { l_@@_unit_change_ #1 _tl } { 1 }
+ \tl_set_eq:cN { l_@@_base_key_unit_ #1 _tl } #1
+ \bool_if:NF \l_@@_single_key_bool
+ {
+ \seq_map_inline:Nn \l_@@_tmpa_seq
+ {
+ \tl_set_eq:cN { l_@@_base_key_unit_ ##1 _tl } #1
+ \tl_set:cn { l_@@_unit_change_ ##1 _tl } { 1 }
+ }
+ }
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{ \@@_new_cukeys_create_keys:n , \@@_new_cukeys_create_keys:V }
+% Here we start creating the keys. If seperate into two cases:
+% Do we have a single-key or not. If yes, just create the key |#1|
+% and do what needs to be done. If not, we need to create a bunch of
+% keys for each unit in the list.
% \begin{macrocode}
-\cs_new:Npn \@@_cukeys_define_singlekey:nn #1#2
+\cs_new:Npn \@@_new_cukeys_create_keys:n #1
{
- \@@_cukeys_keys_define:nn {#1} {#2}
+% % #1: original_unit
+ \clist_set_from_seq:NN \l_@@_tmpa_clist \l_@@_tmpa_seq
+ \bool_if:NTF \l_@@_single_key_bool
+ {
+ \@@_new_cukeys_define_key:nVn
+ {#1} \l_@@_tmpa_clist {#1}
+ }{
+ \seq_map_inline:Nn \l_@@_tmpa_seq
+ {
+ \@@_new_cukeys_define_key:nVn
+ {##1} \l_@@_tmpa_clist {#1}
+ }
+ }
}
-\cs_generate_variant:Nn \@@_cukeys_define_singlekey:nn { nV }
+\cs_generate_variant:Nn \@@_new_cukeys_create_keys:n { V }
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{ \@@_new_cukeys_define_key:nnn , \@@_new_cukeys_define_key:nVn }
+% Now we define some key(s). |#1| is the unit and key-to-be-defined.
+% As |#1| is not expanded, this can contain control sequences, etc. not need for worry
+% here.
%
-% \section {Adding Keys}
+% We define the key |#1| with a list of choices |#2| (which is the list of units
+% collected in the parse step). |#3| plays an important role as it is the
+% \enquote{base unit}. We mainly need this to do some shortcuts later on.
+% So instead of getting the the base unit for \enquote{g} \emph{via}
+% |l_@@_base_key_unit_g_tl| (which would be \enquote{kg}), we give \enquote{kg}
+% directly as the argument |#3|. It was made sure that |#3| \emph{not} a
+% control sequence, but text.
%
+% In order to remind the user which choices each key have, define an error
+% message for unknown keys.
% \begin{macrocode}
-\NewDocumentCommand \cuaddkeys { m m }
+\cs_new:Npn \@@_new_cukeys_define_key:nnn #1#2#3
{
- \bool_set_false:N \l_@@_single_key_bool
- \@@_cukeys_add_keys_or_single_keys:nn {#1} {#2}
+ \@@_if_unit_has_a_key:nF {#1}
+ { \seq_put_right:Nn \l_@@_list_of_defined_keys_seq {#1} }
+ \keys_define:nn { cooking-units }
+ {
+ #1 .choices:nn =
+ {#2}
+ { \@@_change_unit_from_to:nVn {#1} \l_keys_choice_tl {#3} } ,
+ #1 / unknown .code:n=
+ {
+ \seq_set_split:Nnn \l_tmpa_seq { , } {#2}
+ \msg_error:nnxxx
+ { cooking-units }
+ { key-choice-unknown }
+ {#1}
+ {##1}
+ { \@@_seq_use_msg:N \l_tmpa_seq }
+ } ,
+ #1 .default:n = {#1} ,
+ #1 .groups:n = { change-unit }
+ }
}
+\cs_generate_variant:Nn \@@_new_cukeys_define_key:nnn { nVn }
% \end{macrocode}
+% \end{macro}
%
-% \begin{macrocode}
-\NewDocumentCommand \cuaddsinglekeys { m m }
- {
- \bool_set_true:N \l_@@_single_key_bool
- \@@_cukeys_add_keys_or_single_keys:nn {#1} {#2}
- }
-% \end{macrocode}
+% \begin{macro}{ \@@_change_unit_from_to:nnn }
+% Our main \enquote{get the conversion value} command.
+% |#1| is the current unit, |#2| is the unit it is converted into,
+% |#3| is the \enquote{base unit}, given in order to make some shortcuts.
%
+% |\l_@@_change_unit_prop| stores which unit should be converted into which by
+% a key-value list. If the unit is later used we restore the value from this property list.
+%
+% Now to the calculation. |\g_@@_master_changer_prop| stores the the conversion values
+% globally in a | <old-unit> ~->~ <new-unit>| way. If we already have a conversion
+% from |#1| to |#2| we simply restore this value and store it in |l_@@_unit_change_ #1_tl|.
+%
+% If the unit-change is requested for the first time we need to calculate the
+% conversion value first. Afterwards, store it (globally) into |\g_@@_master_changer_prop|
+% to not recalculate it in the future.
% \begin{macrocode}
-\NewDocumentCommand \cuaddtokeys { m m m }
+\cs_new:Npn \@@_change_unit_from_to:nnn #1#2#3
{
- \bool_set_false:N \l_@@_single_key_bool
- \tl_set:Nn \l_@@_tmpb_tl { {#2} { \fp_eval:n { 1.0 / (#3) } } }
- \@@_cukeys_add_keys_or_single_keys:nV {#1} \l_@@_tmpb_tl
+ \prop_put:Nnn \l_@@_change_unit_prop {#1} {#2}
+ \prop_get:NncF
+ \g_@@_master_changer_prop
+ { #1 ~->~ #2 }
+ { l_@@_unit_change_ #1_tl }
+ {
+ \@@_cukeys_calculate_change_value:nnn {#1} {#2} {#3}
+ \prop_gput:Nnv \g_@@_master_changer_prop
+ { #1 ~->~ #2 }
+ { l_@@_unit_change_ #1 _tl }
+ }
}
+\cs_generate_variant:Nn \@@_change_unit_from_to:nnn { nVn }
% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{ \@@_cukeys_calculate_change_value:nnn }
+% Great, an unit-change is requested for the first time, thus calculate
+% the conversion value.
%
+% First we check if the old unit |#1| is the same as the \enquote{base unit}
+% |#3|. This is a nice shortcut, as the property list is stored with |#3| as a base,
+% so direct retrival of the value is possible in this case.
%
+% If |#1| and |#3| are different, we need to do some work. First, get the list
+% of key-values |l_@@_new_cukeys_ #3 _prop| and store it in |\l_@@_tmpa_prop|.
+% Now eval.
%
+% Having unit |a| and wanting unit |b|, we need the value to go from |a| to |b|
+% which is done by the realtion $|b|/|a|$. This is checked easily as $|a|*|b|/|a|=|b|$.
+% Replace this by |#1| and |#2| and we get: |#2|=|#1|*|#2|/|#1|, which we
+% evaluate and store in |l_@@_unit_change_ #1 _tl|.
% \begin{macrocode}
-\cs_new:Npn \@@_cukeys_add_keys_or_single_keys:nn #1#2
+\cs_new:Npn \@@_cukeys_calculate_change_value:nnn #1 #2 #3
{
- \@@_error_if_unit_not_defined:nF {#1}
+ \str_if_eq:nnTF {#1} {#3}
{
- \seq_if_in:NnF \l_@@_list_of_defined_keys_seq {#1}
- { \msg_error:nnn { cooking-units } { Key-not-defined } {#1} }
- \tl_if_blank:nF {#2}
+ \prop_get:cnc { l_@@_new_cukeys_ #1 _prop } {#2} { l_@@_unit_change_ #1 _tl }
+ }{
+ \prop_set_eq:Nc \l_@@_tmpa_prop { l_@@_new_cukeys_ #3 _prop }
+ \@@_tl_eval:cn { l_@@_unit_change_ #1 _tl }
{
- \prop_gclear:N \g_@@_master_changer_prop
- \@@_cukeys_add_keys_and_single_key_aux:n {#1}
- \bool_if:NTF \l_@@_single_key_bool
- { \@@_cukeys_parse_and_create_single_key:nn {#1} {#2} }
- { \@@_cukeys_parse_and_create_keys:Vn \l_@@_original_unit_tl {#2} }
+ ( \prop_item:Nn \l_@@_tmpa_prop {#2} ) /
+ ( \prop_item:Nn \l_@@_tmpa_prop {#1} )
}
}
}
-\cs_generate_variant:Nn \@@_cukeys_add_keys_or_single_keys:nn { nV }
+\cs_generate_variant:Nn \@@_cukeys_calculate_change_value:nnn { VVV }
% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
%
-%^^A ((((
-% Now this does the following: 1) get the \enquote{original unit} (the unit used
-% in the first argument of |\cudefinekeys|) 2) Get the list of units already in the
-% list (It is important that the units are alway in the same order and one cannot
-% rely on the order of the property-lists 3) Get the property list of the
-% \enquote{original unit}. In the old code I simply stored the whole property list inside
-% another property list, but this shouldn't be done this way. So \dots\ simply
-% copy the original one. 4) As there is a unit added the unit it is added to
-% might not be the \enquote{original unit}. As such we need the conversion factor.
-% \begin{macrocode}
-\cs_new:Npn \@@_cukeys_add_keys_and_single_key_aux:n #1
- {
- \tl_set_eq:Nc \l_@@_original_unit_tl { l_@@_base_key_unit_ #1 _tl }
- \prop_set_eq:Nc \l_@@_tmpa_prop { l_@@_cukeys_ \l_@@_original_unit_tl _prop }
- \prop_get:NnN\l_@@_tmpa_prop { Liste } \l_@@_tmpa_seq
- \prop_get:NnN \l_@@_tmpa_prop {#1} \l_@@_tmpa_fp
- }
-% \end{macrocode}
%
%
% \section {Creating New Units}
%
%
%\begin{macro}{ \declarecookingunit , \newcookingunit , \providecookingunit }
+% Defining new units. Defining an unit is split into two parts: defining
+% the necassary tl's and clist's and seq's; and setting them. Depending on which
+% command is used, things are handled differently.
+%
+% We always make sure that the unit |#1| is first converted into a string.
% \begin{macrocode}
\NewDocumentCommand \declarecookingunit { o m }
{
- \seq_if_in:NnTF \g_@@_list_of_defined_units_seq {#2}
- { \msg_info:nnn { cooking-units } { redefine-unit } {#2} }
- { \@@_new_cooking_unit:nn {#1} {#2} }
- \@@_set_cooking_unit:nn {#1} {#2}
+ \@@_if_unit_defined:nNTF {#2} \l_@@_original_unit_tl
+ { \msg_info:nnx { cooking-units } { redefine-unit } { \l_@@_original_unit_tl } }
+ { \@@_new_cooking_unit:V \l_@@_original_unit_tl }
+ \@@_set_cooking_unit:nnV {#1} {#2} \l_@@_original_unit_tl
}
\NewDocumentCommand \newcookingunit { o m }
{
- \@@_new_cooking_unit:nn {#1} {#2}
- \@@_set_cooking_unit:nn {#1} {#2}
+ \@@_if_unit_defined:nNTF {#2} \l_@@_original_unit_tl
+ { \msg_error:nnV { cooking-units } { unit-already-defined } \l_@@_original_unit_tl }
+ {
+ \@@_new_cooking_unit:V \l_@@_original_unit_tl
+ \@@_set_cooking_unit:nnV {#1} {#2} \l_@@_original_unit_tl
+ }
}
\NewDocumentCommand \providecookingunit { o m }
{
- \seq_if_in:NnF \g_@@_list_of_defined_units_seq {#2}
+ \@@_if_unit_defined:nNT {#2} \l_@@_original_unit_tl
{
- \@@_new_cooking_unit:nn {#1} {#2}
- \@@_set_cooking_unit:nn {#1} {#2}
+ \@@_new_cooking_unit:V \l_@@_original_unit_tl
+ \@@_set_cooking_unit:nnV {#1} {#2} \l_@@_original_unit_tl
}
}
% \end{macrocode}
%\end{macro}
%
+%\begin{macro}{ \@@_new_cooking_unit:n }
+% Creates the token and other lists for the unit |#1| (which at this point is a string).
+% Nothing really expectional here.
% \begin{macrocode}
-\cs_new:Npn \@@_new_cooking_unit:nn #1#2
+\cs_new:Npn \@@_new_cooking_unit:n #1
{
- \seq_if_in:NnTF \g_@@_list_of_defined_units_seq {#2}
- { \msg_error:nnn { cooking-units } { unit-already-defined } {#2} }
+ \tl_map_inline:nn {#1}
{
- \tl_map_inline:nn {#2}
- {
- \tl_if_in:NnT \l_@@_unit_letter_not_allowed_tl {##1}
- { \msg_error:nnn { cooking-units } { character-not-allowed } {#2} }
- }
- \seq_gput_right:Nn \g_@@_list_of_defined_units_seq {#2}
- \tl_new:c { l_@@_unit_change_ #2 _tl }
- \tl_set:cn { l_@@_unit_change_ #2 _tl } { 1.0 }
- \clist_new:c { l_@@_unit_option_ #2 _clist }
- \keys_define:nn { cooking-units }
- {
- set-option-for-#2 .code:n = { \cusetoptionfor {#2} {##1} } ,
- add-option-for-#2 .code:n = { \cuaddoptionfor {#2} {##1} },
- }
- \tl_new:c { l_@@_base_key_unit_ #2 _tl }
- \tl_new:c { l_@@_default_unit_ #2 _tl }
+ \tl_if_in:NnT \l_@@_unit_letter_not_allowed_tl {##1}
+ { \msg_error:nnn { cooking-units } { character-not-allowed } {#1} }
+ }
+ \seq_gput_right:Nn \g_@@_list_of_defined_units_seq {#1}
+ \tl_new:c { l_@@_unit_change_ #1 _tl }
+ \tl_new:c { l_@@_base_key_unit_ #1 _tl }
+ \tl_new:c { l_@@_default_unit_ #1 _tl }
+ \clist_new:c { l_@@_unit_option_ #1 _clist }
+ \tl_set:cn { l_@@_unit_change_ #1 _tl } { 1 }
+ \keys_define:nn { cooking-units }
+ {
+ set-unit-hook-#1 .code:n = { \@@_set_options_for:nn {#1} {##1} } ,
+ add-unit-hook-#1 .code:n = { \@@_add_options_for:nn {#1} {##1} },
+ set-option-for-#1 .meta:n = { set-unit-hook-#1 = {##1} } ,
+ add-option-for-#1 .meta:n = { add-unit-hook-#1 = {##1} } ,
}
}
-\cs_new:Npn \@@_set_cooking_unit:nn #1#2
+\cs_generate_variant:Nn \@@_new_cooking_unit:n { V }
+% \end{macrocode}
+% \end{macro}
+%
+%\begin{macro}{ \@@_set_cooking_unit:nnn , \@@_set_cooking_unit:nnV }
+% Here we set the in the last step defined lists to their respective value.
+% |#3| is the unit-string; |#2| is the unit given by the user (as it can be a command
+% like |/%]; |#1| is either the wanted unit-symbol \emph{or} a key-val
+% list. Depending on that, we either set the printed symbol to |#1| or parse the
+% key-val list.
+%
+% This is done in a three step procedure (if |#1| is a value): First, check if
+% the head of |#1| is a group. This happens if the user embraces |#1| in two
+% curly brace pairs (e.g.\ |{{Test}}|). This is only needed if the user really wants
+% the symbol to contain |=|.
+%
+% If |#1| is not protected by braces it is parsed as key(s)
+% \begin{macrocode}
+\cs_new:Npn \@@_set_cooking_unit:nnn #1#2#3
{
- \IfNoValueTF {#1}
+ \@@_set_cooking_unit_base_translation:n {#3}
+ \bool_set_false:N \l_@@_symbol_was_set_by_key_bool
+ \bool_set_false:N \l_@@_contains_valid_key_bool
+ \IfNoValueF {#1}
+ {
+ \tl_if_head_is_group:nF {#1}
+ { \keys_set:nn { cooking-units / definition } {#1} }
+ }
+ \bool_if:NF \l_@@_symbol_was_set_by_key_bool
{
- \tl_set:cn { l_@@_default_unit_ #2 _tl } {#2}
- \@@_deftranslation_base:xVn {#2} \c_@@_postfix_unit_tl {#2}
- }{
- \tl_set:cn { l_@@_default_unit_ #2 _tl } {#1}
- \@@_deftranslation_base:xVn {#2} \c_@@_postfix_unit_tl {#1}
+ \IfNoValueTF {#1}
+ { \tl_set:cn { l_@@_default_unit_ #3 _tl } {#2} }
+ {
+ \bool_if:NTF \l_@@_contains_valid_key_bool
+ { \tl_set:cn { l_@@_default_unit_ #3 _tl } {#2} }
+ { \tl_set:cn { l_@@_default_unit_ #3 _tl } {#1} }
+ }
}
- \@@_deftranslation_base:xVn {#2} \c_@@_postfix_unitname_tl { \q_@@_no_translation }
- \@@_deftranslation_base:xVn {#2} \c_@@_postfix_unitname_pl_tl { \q_@@_no_translation }
- \@@_deftranslation_base:xVn {#2} \c_@@_postfix_gender_tl { m }
+ \@@_culang_def_base:nnv { unit-symbol } {#3} { l_@@_default_unit_ #3 _tl }
}
+\cs_generate_variant:Nn \@@_set_cooking_unit:nnn { nnV }
% \end{macrocode}
+% \end{macro}
%
+%\begin{macro}{ \@@_set_cooking_unit_base_translation:n }
+% Just an auxilary command. Sets the base translations to their default value.
+% \begin{macrocode}
+\cs_new:Npn \@@_set_cooking_unit_base_translation:n #1
+ {
+ \@@_culang_def_base:nnn { name } {#1} \q_@@_no_translation
+ \@@_culang_def_base:nnn { name-pl } {#1} \q_@@_no_translation
+ \@@_culang_def_base:nnn { gender } {#1} { m }
+ }
+% \end{macrocode}
+% \end{macro}
+%
%
%
% \begin{macro}{\declarecookingderivatives}
@@ -7767,149 +9145,229 @@ and the derived file cooking-units.sty.
% \end{macrocode}
% \end{macro}
%
-% The idea is the following. The relation between the units are given as
-% |(#1)/(#2)| (e.g.). The idea is the following:
-% \begin{enumerate}
-% \item The derivative contains two units.
-% \item The mathematical relationship is given by |(#1)/(#2)|
-% \item Define |\@@_tmp:w| to be |(#1)/(#2)|.
-% \item Parse through all values and store them in a list (e.g. |\l_tmpa_t|) as | {value-1}{value-2} |
-% \item Use |\exp_after:wN \@@_tmp:w \l_tmpa_t | to expand to |\@@_tmp:w {value-1} {value-2} |
-% \item Let |\@@_tmp:w| do its job.
-% \end{enumerate}
%
-% \begin{macro}{\@@_tl_set_list:Nnn, \@@_tl_set_list:NnV, \@@_tl_set_list:NVV, \@@_tl_set_list_aux:Nnnnnnnnn }
-% The following argument creates the list. I am a bit lazy here and don't quite know how
-% to do it \enquote{correctly}. And I know, there are too many |\q_nil|.
-% \begin{macrocode}
-\cs_new:Npn \@@_tl_set_list:Nnn #1#2#3
- {
- \@@_tl_set_list_aux:Nnnnnnnnn #1 {#2} #3
- \q_nil \q_nil \q_nil \q_nil \q_nil \q_nil \q_nil \q_nil \q_nil
- \q_recursion_stop
- }
-\cs_generate_variant:Nn \@@_tl_set_list:Nnn { NnV, NVV }
-\cs_new:Npn \@@_tl_set_list_aux:Nnnnnnnnn #1#2#3#4#5#6#7#8#9
- {
- \tl_set:Nf #1
- {
- \int_case:nn { \l_@@_curr_depth_int }
- {
- { 1 } { }
- { 2 } { {#3} }
- { 3 } { {#3}{#4} }
- { 4 } { {#3}{#4}{#5} }
- { 5 } { {#3}{#4}{#5}{#6} }
- { 6 } { {#3}{#4}{#5}{#6}{#7} }
- { 7 } { {#3}{#4}{#5}{#6}{#7}{#8} }
- { 8 } { {#3}{#4}{#5}{#6}{#7}{#8}{#9} }
- }
- {#2}
- }
- \use_none_delimit_by_q_recursion_stop:w
- }
-% \end{macrocode}
-% \end{macro}
% \begin{macro} { \@@_declare_cooking_derivative:nnnn }
% This command has the following parts:
% \begin{enumerate}
-% \item Get list of units in |#1|, count their number and store in |\l_@@_max_depth_int|
+% \item Get list of units in |#1|, check if they are defined,
+% count their number and store in |\l_@@_nr_of_units_int|
% \item Use |\cs_generate_from_arg_count:NNnn| to create the commands
-% \item Define lists |l_@@_tmp_ 1 ... \l_@@_max_depth_int |, same for prop. I know
-% that there is a better way to do it, but this \emph{is} experimental. In the end, it
-% safes a bit of brain-power for me.
-% \item The main part: Map trough all units in the |l_@@_cukeys_ <unit> _prop| lists.
-% \item Create key-porperty and define keys.
+% that store the final parsed unit-keys, unit-symbols und unit-formulas inside.
+% \item Prepare for the following loop.
+% \item The main part: Do the loop.
+% \item Declare keys and store their formula relation into a property-list.
+% \item Clean up.
% \end{enumerate}
% \begin{macrocode}
\cs_new:Npn \@@_declare_cooking_derivative:nnnn #1#2#3#4
{
- \prop_gclear:N \g_@@_master_changer_prop
- \seq_set_from_clist:Nn \l_@@_tmpa_seq {#1}
- \seq_clear:N \l_@@_number_of_iterations_seq
- \seq_clear:N \l_@@_derivative_unit_list_seq
- \seq_clear:N \l_@@_derivative_symbol_list_seq
- \seq_clear:N \l_@@_derivative_value_list_seq
- \int_set:Nn \l_@@_max_depth_int { \seq_count:N \l_@@_tmpa_seq }
- \int_set:Nn \l_@@_curr_depth_int { 1 }
+ \seq_clear:N \l_@@_list_of_units_seq
+ \@@_set_state_to:n { normal }
+ \clist_map_inline:nn {#1}
+ {
+ \@@_if_unit_defined:nNTF {##1} \l_@@_tmpa_tl
+ {
+ \@@_if_unit_has_a_key:VTF \l_@@_tmpa_tl
+ { \seq_put_right:NV \l_@@_list_of_units_seq \l_@@_tmpa_tl }
+ {
+ \tl_show:n { Error-no-key-defined } {##1}
+ \@@_set_state_to:n { error }
+ }
+ } { \@@_set_state_to:n { error } }
+ }
+ \@@_if_state_equal:nT { error }
+ { \use_none_delimit_by_q_recursion_stop:w }
+ \int_set:Nn \l_@@_nr_of_units_int { \seq_count:N \l_@@_list_of_units_seq }
+% \end{macrocode}
+% Now we generate the functions. The first takes the unit-keys and plugs it into
+% the formula |#2| (unit-key) and |#4| (unit-symbol).
+% The second function get's the nummerical values and stores it in a sequcence.
+% Example: \\
+% Assuming |kg|, |m| and |s| with unit key |#1*#2-#3|, formula |#1*#2/#3|
+% and symbol |#1\,\sfrac{#2}{#3}|. Looping through the units, the first
+% function creates |kg*m-s|, |kg*m-min|, \dots, |oz*in-h|; and |kg\,\sfrac{m}{s}|,
+% \dots, |oz\,\sfrac{in}{h}|.
+%
+% The second function creates their nummerical relation: for |kg|, |m| and |s|
+% this would be |1*1/86400|. |kg|, |in|, |s| would be |1*(36/0.9144)/86400|.
+% If we then transform the first ones |kg*m-s| into the second one |kg*in-s|
+% we will later calculate $ \frac{1*(36/0.9144)/86400}{1*1/86400} $ which will get
+% us the correct transformation. May explanation my not be very good,
+% but it makes sense (later).
+% \begin{macrocode}
+ \cs_generate_from_arg_count:NNnn \@@_create_unit:w \cs_set:Npn
+ { \l_@@_nr_of_units_int }
+ {
+ \seq_gpush:Nn \g_@@_stored_derived_unit_symbol_seq {#2}
+ \seq_gpush:Nn \g_@@_stored_derived_unit_print_seq {#4}
+ }
+ \cs_generate_from_arg_count:NNnn \@@_create_formula:w \cs_set:Npn
+ { \l_@@_nr_of_units_int }
+ {
+ \seq_gpush:Nn \g_@@_stored_derived_formula_seq {#3}
+ }
% \end{macrocode}
+% Preparing and startidoingng the loop.
% \begin{macrocode}
- \cs_generate_from_arg_count:NNnn \@@_tmp_unit_and_symbol_list:w \cs_set:Npn
- { \l_@@_max_depth_int }
- {
- \seq_put_right:Nn \l_@@_derivative_unit_list_seq {#2}
- \seq_put_right:Nn \l_@@_derivative_symbol_list_seq {#4}
- }
- \cs_generate_from_arg_count:NNnn \@@_tmp_value_list:w \cs_set:Npn
- { \l_@@_max_depth_int }
- { \seq_put_right:Nx \l_@@_derivative_value_list_seq { \fp_eval:n {#3} } }
+ \@@_prepare_sequence_loop:
+ \@@_step_loop_start:n { }
% \end{macrocode}
+% Now we create new cooking-units with the unit-keys and unit-symbols
+% we created \emph{via} loop. As we need a \enquote{master unit} we use
+% the most right unit in the derived unit list. This is because the most right one
+% is created by the other base units.
% \begin{macrocode}
- \int_step_inline:nn { \l_@@_max_depth_int }
- {
- \tl_set_eq:Nc \l_@@_original_unit_tl
- { l_@@_base_key_unit_ \seq_item:Nn \l_@@_tmpa_seq {##1} _tl }
- \prop_set_eq:Nc \l_@@_tmpa_prop { l_@@_cukeys_ \l_@@_original_unit_tl _prop }
- \prop_get:NnN \l_@@_tmpa_prop { Liste } \l_@@_tmpb_seq
- \int_set:Nn \l_@@_tmpa_int { \seq_count:N \l_@@_tmpb_seq }
-% \end{macrocode}
-% \begin{macrocode}
- \seq_put_right:NV \l_@@_number_of_iterations_seq \l_@@_tmpa_int
- \seq_clear_new:c { l_@@_tmp_ ##1 _seq }
- \prop_clear_new:c { l_@@_tmp_ ##1 _prop }
- \seq_set_eq:cN { l_@@_tmp_ ##1 _seq } \l_@@_tmpb_seq
- \prop_set_eq:cN { l_@@_tmp_ ##1 _prop } \l_@@_tmpa_prop
- }
+ \seq_get_right:NN \g_@@_stored_derived_unit_symbol_seq \l_@@_curr_unit_tl
+ \seq_map_inline:Nn \g_@@_stored_derived_unit_symbol_seq
+ {
+ \seq_pop:NN \g_@@_stored_derived_formula_seq \l_@@_tmpb_tl
+ \prop_put:NnV \l_@@_derived_units_prop {##1} \l_@@_tmpb_tl
+ \seq_pop:NN \g_@@_stored_derived_unit_print_seq \l_@@_tmpa_tl
% \end{macrocode}
+% First create the unit, \emph{then} set the reference to the base unit.
+% (Else it is not yet defined)
% \begin{macrocode}
- \seq_map_function:cN
- { l_@@_tmp_ \int_use:N \l_@@_curr_depth_int _seq }
- \@@_seq_step_function:n
+ \exp_args:NNx \declarecookingunit [ {symbol={\l_@@_tmpa_tl}} ] {##1}
+ \tl_set_eq:cN { l_@@_base_key_unit_ ##1 _tl } \l_@@_curr_unit_tl
+ }
% \end{macrocode}
+% Clean-up. Do not know if this is necessary, but eh.
% \begin{macrocode}
- \seq_get_left:NN \l_@@_derivative_unit_list_seq \l_@@_original_unit_tl
- \prop_clear_new:c { l_@@_cukeys_ \l_@@_original_unit_tl _prop }
+ \seq_gclear:N \g_@@_stored_derived_unit_symbol_seq
+ \seq_gclear:N \g_@@_stored_derived_unit_print_seq
+ \seq_gclear:N \g_@@_stored_derived_formula_seq
+ \cs_undefine:N \@@_create_unit:w
+ \cs_undefine:N \@@_create_formula:w
% \end{macrocode}
+% If we had an error beforehand, we would jump to this place ignoring everything
+% inbetween.
% \begin{macrocode}
- \int_zero:N \l_@@_tmpa_int
- \clist_set_from_seq:NN \l_@@_tmpa_clist \l_@@_derivative_unit_list_seq
- \seq_map_inline:Nn \l_@@_derivative_unit_list_seq
- {
- \int_incr:N \l_@@_tmpa_int
- \tl_set:Nx \l_@@_tmpa_tl { \seq_item:Nn \l_@@_derivative_symbol_list_seq { \l_@@_tmpa_int } }
- \exp_after:wN \declarecookingunit \exp_after:wN [ \l_@@_tmpa_tl ] {##1}
- \prop_put:cnx
- { l_@@_cukeys_ \l_@@_original_unit_tl _prop }
- {##1}
- { \seq_item:Nn \l_@@_derivative_value_list_seq { \l_@@_tmpa_int } }
- \tl_clear_new:c { l_@@_base_key_unit_ ##1 _tl }
- \tl_set_eq:cN { l_@@_base_key_unit_ ##1 _tl } \l_@@_original_unit_tl
- \exp_args:NnV \@@_cukeys_keys_define:nn {##1} \l_@@_tmpa_clist
- }
+ \use_none_delimit_by_q_recursion_stop:w
+ \q_recursion_stop
}
% \end{macrocode}
% \end{macro}
%
+% \begin{macro} { \@@_declare_cooking_derivative:nnnn }
% \begin{macrocode}
-\cs_new:Npn \@@_seq_step_function:n #1
- {
- \@@_tl_set_list:NnV \l_@@_list_of_units_tl {#1} \l_@@_list_of_units_tl
- \prop_get:cnN { l_@@_tmp_ \int_use:N \l_@@_curr_depth_int _prop } {#1} \l_@@_tmpa_tl
- \@@_tl_set_list:NVV \l_@@_list_of_values_tl \l_@@_tmpa_tl \l_@@_list_of_values_tl
- \int_compare:nNnTF { \l_@@_curr_depth_int } = { \l_@@_max_depth_int }
+\cs_new:Npn \@@_prepare_sequence_loop:
+ {
+ \seq_map_indexed_inline:Nn \l_@@_list_of_units_seq
{
- \exp_after:wN \@@_tmp_unit_and_symbol_list:w \l_@@_list_of_units_tl
- \exp_after:wN \@@_tmp_value_list:w \l_@@_list_of_values_tl
+ \prop_clear_new:c { l_@@_keys_ ##1 _prop }
+ \seq_clear_new:c { l_@@_list_ ##1 _seq }
+ \tl_set_eq:Nc \l_@@_curr_unit_tl { l_@@_base_key_unit_ ##2 _tl }
+ \prop_set_eq:cc { l_@@_keys_ ##1 _prop }
+ { l_@@_new_cukeys_ \l_@@_curr_unit_tl _prop }
+ \prop_get:cnc { l_@@_keys_ ##1 _prop } { Liste } { l_@@_list_ ##1 _seq }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro} { \@@_declare_cooking_derivative:nnnn }
+% \begin{macrocode}
+\cs_new:Npn \@@_step_loop_start:n #1
+ {
+ \tl_clear:N \l_@@_stored_units_tl
+ \tl_clear:N \l_@@_stored_formula_tl
+ \int_set:Nn \l_@@_depth_int { 1 }
+ \seq_map_function:cN
+ { l_@@_list_ \int_use:N \l_@@_depth_int _seq } \@@_seq_recursive_loop_function:n
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro} { \@@_declare_cooking_derivative:nnnn }
+% \begin{macrocode}
+\cs_new:Npn \@@_seq_recursive_loop_function:n #1
+ {
+ \group_begin:
+ \tl_put_right:Nn \l_@@_stored_units_tl { {#1} }
+ \tl_set_eq:Nc \l_@@_original_unit_tl { l_@@_base_key_unit_ #1 _tl }
+ \tl_put_right:Nx \l_@@_stored_formula_tl
+ { { (
+ \exp_not:N \prop_item:Nn
+ \exp_not:c { l_@@_new_cukeys_ \l_@@_original_unit_tl _prop } {#1}
+ ) } }
+ \int_compare:nNnTF { \l_@@_depth_int } = { \l_@@_nr_of_units_int }
+ {
+ \exp_after:wN \@@_create_unit:w \l_@@_stored_units_tl
+ \exp_after:wN \@@_create_formula:w \l_@@_stored_formula_tl
}{
- \int_incr:N \l_@@_curr_depth_int
+ \int_incr:N \l_@@_depth_int
\seq_map_function:cN
- { l_@@_tmp_ \int_use:N \l_@@_curr_depth_int _seq }
- \@@_seq_step_function:n
- \int_decr:N \l_@@_curr_depth_int
+ { l_@@_list_ \int_use:N \l_@@_depth_int _seq } \@@_seq_recursive_loop_function:n
}
+ \group_end:
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro} { \@@_declare_cooking_derivative:nnnn }
+% \begin{macrocode}
+\keys_define:nn { cooking-units }
+ {
+ unknown .code:n =
+ {
+ \@@_if_key_ais_derived_unit:VTF \l_keys_key_str
+ { \@@_convert_derived_unit:Vn \l_keys_key_str {#1} }
+ {
+ \msg_error:nnxx { cooking-units } { key-unknown }
+ { \l_keys_path_str } { cooking-units }
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro} { \@@_declare_cooking_derivative:nnnn }
+% \begin{macrocode}
+\prg_new_conditional:Npnn \@@_if_key_ais_derived_unit:n #1 { TF }
+ {
+ \tl_if_exist:cTF { l_@@_base_key_unit_ #1 _tl }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\cs_generate_variant:Nn \@@_if_key_ais_derived_unit:nTF { V }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro} { \@@_declare_cooking_derivative:nnnn }
+% The idea is the following. The relation between the units are given as
+% |(#1)/(#2)| (e.g.). The idea is the following:
+% \begin{enumerate}
+% \item The derivative contains two units.
+% \item The mathematical relationship is given by |(#1)/(#2)|
+% \item Define |\@@_tmp:w| to be |(#1)/(#2)|.
+% \item Parse through all values and store them in a list (e.g. |\l_tmpa_t|) as | {value-1}{value-2} |
+% \item Use |\exp_after:wN \@@_tmp:w \l_tmpa_t | to expand to |\@@_tmp:w {value-1} {value-2} |
+% \item Let |\@@_tmp:w| do its job.
+% \end{enumerate}
+% \begin{macrocode}
+\cs_new:Npn \@@_convert_derived_unit:nn #1#2
+ {
+ \tl_if_eq:ccTF
+ { l_@@_base_key_unit_ #1 _tl }
+ { l_@@_base_key_unit_ #2 _tl }
+ {
+ \prop_get:NnN \l_@@_derived_units_prop {#1} \l_@@_tmpa_tl
+ \prop_get:NnN \l_@@_derived_units_prop {#2} \l_@@_tmpb_tl
+ \prop_put:Nnn \l_@@_change_unit_prop {#1} {#2}
+ \@@_tl_eval:cn { l_@@_unit_change_ #1 _tl }
+ {
+ (\l_@@_tmpb_tl) / (\l_@@_tmpa_tl)
+ }
+ \prop_gput:Nnv \g_@@_master_changer_prop
+ { #1 ~->~ #2 }
+ { l_@@_unit_change_ #1 _tl }
+ }{
+ \msg_error:nnnn { cooking-units } { key-no-knows-value } {#1} {#2}
+ }
+ }
+\cs_generate_variant:Nn \@@_convert_derived_unit:nn { V }
+% \end{macrocode}
+% \end{macro}
%
%
%
@@ -7985,116 +9443,159 @@ and the derived file cooking-units.sty.
% \end{macrocode}
%
%
+% \begin{macro}{\cudefinename}
+% This command allows to (re)define \enquote{names} for units to be used
+% in \cCutext\ for given language. We need to sanitize the arrows (|<| and |>|)
+% in case they are active. Afterwards, parse through the list.
% \begin{macrocode}
\NewDocumentCommand \cudefinename { m m }
{
\tl_set:Nn \l_@@_language_tl {#1}
\@@_sanitize_arrows:n {#2}
- \exp_last_unbraced:NV
- \@@_cuname_parse_input:n \l_@@_sanitise_tl
- \q_recursion_tail \q_recursion_tail \q_recursion_stop
+ \exp_after:wN
+ \@@_parse_definename_start_cycle: \l_@@_sanitise_tl
+ \q_recursion_tail \q_recursion_tail \q_recursion_stop
}
% \end{macrocode}
+% \end{macro}
%
-%
+% \begin{macro}{\@@_parse_definename_start_cycle:}
+% Initializes the parse cycle. Set state to \enquote{normal} and clear some variables.
+% Start by grabbing the first argument which is the unit.
% \begin{macrocode}
-\cs_new:Npn \@@_cuname_parse_input:n #1
+\cs_new:Npn \@@_parse_definename_start_cycle:
+ {
+ \@@_set_state_to:n { normal }
+ \tl_clear:N \l_@@_curr_unit_tl
+ \prop_clear:N \l_@@_tmpa_prop
+ \bool_set_false:N \l_@@_tmpa_bool
+ \@@_parse_definename_unit:n
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{ \@@_parse_definename_unit:n }
+% Grab the unit. This can be either an actual unit (defined by |\newcookingunit| and Co.)
+% or it is one of the allowed \enquote{special-keys} like \enquote{decimal-marker},
+% etc. In case neither of those two is found, issue an error, but continue parsing
+% to catch more errors.
+%
+% The next optional argument is the unit-symbol, which can also be set by this
+% command. If it is not found, grab the next mandatory argument, which is the
+% unit-name.
+% \begin{macrocode}
+\cs_new:Npn \@@_parse_definename_unit:n #1
{
- \peek_meaning_ignore_spaces:NTF [
+ \quark_if_recursion_tail_stop:n {#1}
+ \seq_if_in:NnTF \g_@@_allowed_special_keys_seq {#1}
{
- \@@_cuname_parse_unit_symbol:nw {#1}
- }{
- \seq_if_in:NnTF \g_@@_allowed_special_keys_seq {#1}
- { \@@_cuname_parse_input_aux:nn {#1} }
- { \@@_cuname_parse_unit_symbol:nw {#1} [ \q_no_value ] }
+ \@@_set_unit:Nn \l_@@_curr_unit_tl {#1}
+ \bool_set_true:N \l_@@_tmpa_bool
+ }{
+ \@@_error_if_unit_not_defined:nNT {#1} \l_@@_curr_unit_tl
+ { \@@_set_state_to:n { error } }
}
+ \peek_meaning_ignore_spaces:NTF [
+ { \@@_parse_definename_optional_unitsymbol:w }
+ { \@@_parse_definename_singular:n }
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{ \@@_parse_definename_optional_unitsymbol:w }
+% The frst optional argument has be found; it is thus the unit-symbol.
+% Changing the unit-symbol is only allowed for actual units, so no \enquote{special-keys}
+% allowed. If we have an unit, store it into |\l_@@_tmpa_prop|.
% \begin{macrocode}
-\cs_new:Npn \@@_cuname_parse_unit_symbol:nw #1 [#2]
- {
- \quark_if_recursion_tail_stop:n {#1}
- \quark_if_recursion_tail_stop_do:nn {#2}
- { \msg_error:nn { cooking-units } { missing-argument } }
- \@@_error_if_unit_not_defined:nT {#1}
- { \use_none_delimit_by_q_recursion_stop:w }
- \quark_if_no_value:nTF {#2}
+\cs_new:Npn \@@_parse_definename_optional_unitsymbol:w [#1]
+ {
+ \bool_if:NTF \l_@@_tmpa_bool
{
- \@@_deftranslation_to:VxVv
- \l_@@_language_tl {#1}
- \c_@@_postfix_unit_tl
- { l_@@_default_unit_ #1 _tl }
- }{
- \@@_deftranslation_to:VxVn
- \l_@@_language_tl {#1}
- \c_@@_postfix_unit_tl {#2}
+ \@@_set_state_to:n { error }
+ \msg_error:nnxn { cooking-units } { symbol-and-special-keys-error }
+ \l_@@_curr_unit_tl {#1}
}
- \@@_cuname_parse_input_aux:nn {#1}
+ { \prop_put:Nnn \l_@@_tmpa_prop { unit-symbol } {#1} }
+ \@@_parse_definename_singular:n
}
% \end{macrocode}
+% \end{macro}
%
-%
+% \begin{macro}{ \@@_parse_definename_singular:n }
+% Parses the \enquote{name} of the unit (or special key).
+% Do an error check, store the input in the property list and go to the
+% next one, which is the plural form. The next (optional) argument is
+% the plural form of the \enquote{name}. If there is none, also use |#1| for plural.
% \begin{macrocode}
-\cs_new:Npn \@@_cuname_parse_input_aux:nn #1#2
+\cs_new:Npn \@@_parse_definename_singular:n #1
{
- \quark_if_recursion_tail_stop:n {#1}
- \quark_if_recursion_tail_stop_do:nn {#2}
+ \quark_if_recursion_tail_stop_do:nn {#1}
{ \msg_error:nn { cooking-units } { missing-argument } }
- \seq_if_in:NnF \g_@@_allowed_special_keys_seq {#1}
- {
- \@@_error_if_unit_not_defined:nT {#1}
- { \use_none_delimit_by_q_recursion_stop:w }
- }
- \@@_deftranslation_to:VxVn
- \l_@@_language_tl {#1}
- \c_@@_postfix_unitname_tl {#2}
+ \prop_put:Nnn \l_@@_tmpa_prop { name } {#1}
\peek_meaning_ignore_spaces:NTF [
- { \@@_cuname_parse_bracket:nw {#1} }
- { \@@_cuname_parse_bracket:nw {#1} [#2] }
+ { \@@_parse_definename_optional_plural:w }
+ { \@@_parse_definename_optional_plural:w [#1] }
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{ \@@_parse_definename_optional_plural:w }
+% Nothing new here. The next one is the gender. If no gender is found
+% I assume it to be male \enquote{m}.
% \begin{macrocode}
-\cs_new:Npn \@@_cuname_parse_bracket:nw #1 [#2]
+\cs_new:Npn \@@_parse_definename_optional_plural:w [#1]
{
- \seq_if_in:NnF \g_@@_allowed_special_keys_seq {#1}
- {
- \@@_deftranslation_to:VxVn \l_@@_language_tl {#1}
- \c_@@_postfix_unitname_pl_tl {#2}
- }
+ \prop_put:Nnn \l_@@_tmpa_prop { name-pl } {#1}
\peek_meaning_ignore_spaces:NTF <
- { \@@_cuname_parse_gender:nw {#1} }
- { \@@_cuname_parse_gender:nw {#1} <m> }
+ { \@@_parse_definename_optional_gender:w }
+ { \@@_parse_definename_optional_gender:w <m> }
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{ \@@_parse_definename_optional_plural:w }
+% Check if the gender is correct. Then store it in the property-list
+% and finish the cycle.
% \begin{macrocode}
-\cs_new:Npn \@@_cuname_parse_gender:nw #1 <#2>
+\cs_new:Npn \@@_parse_definename_optional_gender:w <#1>
{
-% \@@_check_if_correct_gender_input:n {#2}
-% \@@_deftranslation_to:VxVn
-% \l_@@_language_tl {#1}
-% \c_@@_postfix_gender_tl {#2}
- \@@_if_gender_error:nTF {#2}
- {
- \@@_deftranslation_to:VxVn
- \l_@@_language_tl {#1}
- \c_@@_postfix_gender_tl { m }
- }{
- \@@_deftranslation_to:VxVn
- \l_@@_language_tl {#1}
- \c_@@_postfix_gender_tl {#2}
- }
- \@@_cuname_parse_input:n
+ \@@_if_gender_error:nT {#1}
+ { \@@_set_state_to:n { error } }
+ \prop_put:Nnn \l_@@_tmpa_prop { gender } {#1}
+ \@@_parse_name_finish_cycle_and_start_new:VV
+ \l_@@_language_tl \l_@@_curr_unit_tl
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{ \@@_parse_name_finish_cycle_and_start_new:nn }
+% Now it makes sense why we used property list before.
+% Each unit has some basic definitions for each language (see |\newcookingunit| and Co.):
+% \enquote{unit-symbol}, \enquote{name}, \enquote{name\_pl} and \enquote{gender}.
%
+% So going through the property list (where we stored the given values)
+% we set for the given language and unit those definitions (\enquote{unit-symbol} only
+% if found).
%
-% \subsection {cudefinesymbol}
+% Afterwards, start the next cycle.
+% \begin{macrocode}
+\cs_new:Npn \@@_parse_name_finish_cycle_and_start_new:nn #1#2
+ {
+ \@@_if_state_equal:nT { normal }
+ {
+ \prop_map_inline:Nn \l_@@_tmpa_prop
+ { \@@_culang_def_for:nnnn {#1} {##1} {#2} {##2} }
+ }
+ \@@_parse_definename_start_cycle:
+ }
+\cs_generate_variant:Nn \@@_parse_name_finish_cycle_and_start_new:nn { VV }
+% \end{macrocode}
+% \end{macro}
%
+% \subsection {cudefinesymbol}
%
+% \begin{macro}{ \cudefinesymbol }
+% A small and rather straightforward command.
+% No special sanitizing here, just setting the language and parsing.
% \begin{macrocode}
\NewDocumentCommand \cudefinesymbol { m m }
{
@@ -8103,7 +9604,13 @@ and the derived file cooking-units.sty.
\q_recursion_tail \q_recursion_tail \q_recursion_stop
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{ \@@_cuprint_define_printed_unit:nn }
+% Sets the symbol for given units or \enquote{special keys}.
+% Nothing extraordinary is done here. We we have an unit we
+% set its \enquote{unit-symbol} for given language, for an \enquote{special key}
+% we set its name. Rinse and repeat.
% \begin{macrocode}
\cs_new:Npn \@@_cuprint_define_printed_unit:nn #1#2
{
@@ -8111,167 +9618,264 @@ and the derived file cooking-units.sty.
\quark_if_recursion_tail_stop_do:nn {#2}
{ \msg_error:nn { cooking-units } { missing-argument } }
\seq_if_in:NnTF \g_@@_allowed_special_keys_seq {#1}
+ { \@@_culang_def_for:Vnnn \l_@@_language_tl { name } }
{
- \@@_deftranslation_to:VxVn \l_@@_language_tl {#1}
- \c_@@_postfix_unitname_tl {#2}
- }{
- \@@_error_if_unit_not_defined:nF {#1}
- {
- \@@_deftranslation_to:VxVn
- \l_@@_language_tl {#1}
- \c_@@_postfix_unit_tl {#2}
- }
+ \@@_error_if_unit_not_defined:nTF {#1}
+ { \use_none:nn }
+ { \@@_culang_def_for:Vnnn \l_@@_language_tl { unit-symbol } }
}
+ {#1} {#2}
\@@_cuprint_define_printed_unit:nn
}
% \end{macrocode}
-%
+% \end{macro}
%
%
% \subsection {Phrases}
%
%
-% \begin{macrocode}
-\@@_newtranslation_base:nVn { phrase-prop } \c_@@_postfix_phrase_tl { \q_@@_no_translation }
-% \end{macrocode}
%
+% \begin{macro}{ \@@_cuprint_define_printed_unit:nn }
+% Defining phrases. Phrases (sadly) depend on the language.
+% The idea is going to be: Each language has its own property list
+% which is going to be stored for each language. Later, the property
+% list is recoverd for the language currently used. If no phrase is defined
+% the fallback |\q_@@_no_translation| is returned.
% \begin{macrocode}
-\prg_new_conditional:Npnn \@@_phrase_list_get_for:NN #1#2 { TF }
- {
- \@@_translate_let:VNnV #2 #1 { phrase-prop } \c_@@_postfix_phrase_tl
- \tl_if_eq:NNTF #1 \q_@@_no_translation
- { \prg_return_false: }
- { \prg_return_true: }
- }
-\prg_new_conditional:Npnn \@@_get_phrase_for_current_langauge:NN #1#2 { T }
- {
- \@@_translate_let:NnV #1 { phrase-prop } \c_@@_postfix_phrase_tl
- \tl_if_eq:NNTF #1 \q_@@_no_translation
- { \prg_return_false: }
- {
- \@@_translate_let:NnV #2 { phrase-clist } \c_@@_postfix_phrase_tl
- \prg_return_true:
- }
- }
+\@@_culang_def_base:nnn { phrase } { phrase-prop } { \q_@@_no_translation }
% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{ \cudefinephrase }
+% Defining some phrases. This command is just a wrapper for the
+% subcommand.
% \begin{macrocode}
\NewDocumentCommand \cudefinephrase { m m }
{
- \@@_cuphrase:nn {#1} {#2}
+ \@@_new_cuphrase_add:nn {#1} {#2}
}
-\cs_new:Npn \@@_cuphrase:nn #1#2
- {
- \tl_set:Nn \l_@@_language_tl {#1}
-% \end{macrocode}
-% \begin{macrocode}
- \@@_phrase_list_get_for:NNTF \l_@@_phrase_prop \l_@@_language_tl
- {
- \@@_translate_let:VNnV \l_@@_language_tl \l_@@_phrase_numbers_seq
- { phrase-clist } \c_@@_postfix_phrase_tl
- }{
- \prop_clear:N \l_@@_phrase_prop
- \seq_clear:N \l_@@_phrase_numbers_seq
- }
% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{ \@@_new_cuphrase_add:nn }
+% |#1| is the language, |#2| is something to be parsed.
+% I am also not quite happy with this construction, but it works.
+%
+% First, check if we already have existing phrases for the language.
+% If so, recover it, we add the parsed one to them. Else, clear
+% some variables.
+%
+% Next step, sanitize |<| and |>|. I hate this so much.
+%
+% Using |\@@_parse_phrase:V| we parse through the argument |#2|.
+% The results are added to |\l_@@_phrase_prop| and |\l_@@_phrase_numbers_seq|.
+%
+% By our rules, we prefer big numbers over small ones. For example,
+% 120 can be translated into \enquote{2 Schocks} ($2\times60$) or
+% \enquote{10 Dutzend} ($10\times12$). We prefer the bigger number first,
+% so we will always get \enquote{2 Schocks}. Thus we sort the numbers in the
+% sequence from highest to lowest. We also have negative numbers (phrases only
+% used for one specific number). We prefer the negative over the positive ones
+% if possible.
+%
+% Then store the variables and thats it.
% \begin{macrocode}
+\cs_new:Npn \@@_new_cuphrase_add:nn #1#2
+ {
+ \tl_set:Nn \l_@@_language_tl {#1}
+ \@@_culang_if_translation_exists_for:VnnTF \l_@@_language_tl
+ { phrase } { phrase-prop }
+ {
+ \@@_culang_let_for:VnnN \l_@@_language_tl { phrase } { phrase-prop }
+ \l_@@_phrase_prop
+ \prop_get:NnN \l_@@_phrase_prop { seq } \l_@@_phrase_numbers_seq
+ }{
+ \prop_clear:N \l_@@_phrase_prop
+ \seq_clear:N \l_@@_phrase_numbers_seq
+ }
\@@_sanitize_arrows:n {#2}
- \exp_last_unbraced:NV
- \@@_cuphrase_parse:n \l_@@_sanitise_tl
- \q_recursion_tail \q_recursion_tail \q_recursion_stop
+ \@@_parse_phrase:V \l_@@_sanitise_tl
+ \@@_new_cuphrase_sort_sequence:N \l_@@_phrase_numbers_seq
+ \prop_put:NnV \l_@@_phrase_prop { seq } \l_@@_phrase_numbers_seq
+ \@@_culang_def_for:VnnV
+ \l_@@_language_tl { phrase } { phrase-prop } \l_@@_phrase_prop
+ }
% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{ \@@_parse_phrase:n }
+% Wrapper around the parsing cycles. Nothing new.
% \begin{macrocode}
- \seq_sort:Nn \l_@@_phrase_numbers_seq
- {
- \int_compare:nNnTF { \int_abs:n {##1} } < { \int_abs:n {##2} }
- { \sort_return_swapped: }
- {
- \int_compare:nNnTF { \int_abs:n {##1} } = { \int_abs:n {##2} }
- {
- \int_compare:nNnTF {##1} < {##2}
- { \sort_return_same: }
- { \sort_return_swapped: }
- }{ \sort_return_same: }
- }
- }
+\cs_new:Npn \@@_parse_phrase:n #1
+ {
+ \@@_parse_phrase_start_cycle: #1
+ \q_recursion_tail \q_recursion_tail \q_recursion_stop
+ }
+\cs_generate_variant:Nn \@@_parse_phrase:n { V }
% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{ \@@_parse_phrase_start_cycle: }
+% Starts the parsing cycle. Clear some variables, set state to normal.
% \begin{macrocode}
- \@@_deftranslation_to:VxVV
- \l_@@_language_tl { phrase-prop }
- \c_@@_postfix_phrase_tl
- \l_@@_phrase_prop
- \@@_deftranslation_to:VxVV
- \l_@@_language_tl { phrase-clist }
- \c_@@_postfix_phrase_tl \l_@@_phrase_numbers_seq
- }
+\cs_new:Npn \@@_parse_phrase_start_cycle:
+ {
+ \@@_set_state_to:n { normal }
+ \bool_set_false:N \l_@@_tmpa_bool
+ \tl_clear:N \l_@@_curr_unit_tl
+ \prop_clear:N \l_@@_tmpa_prop
+ \@@_parse_stuff_mandatories_plus_star:nn
+ }
% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{ \@@_parse_stuff_mandatories_plus_star:nn }
+% Now. We have two cases: two mandatroy arguments following each other
+% (number plus phrase) \emph{or} number plus star plus phrase (so three arguments).
+% In order to not need explicetly test for the star I do the following:
+% Just grab the first two things. |#1| is always the number. |#2| can either be
+% the star |*| \emph{or} a phrase. If it is a star, set a boolean, and restart the command
+% with |#1| already given.
%
+% Then check if |#2| is a number (with a primitve test). Star-numbers are stored
+% negatively. This makes defining a property list easier for me.
%
+% Note that the key in the first |\l_@@_tmpa_prop| is empty. This is done
+% in order to not screw up the later |\prop_map_inline| loop. We also store
+% if the phrase is only used for one number (aka.\ if there is a star).
+%
+% Then, parse the optionals.
% \begin{macrocode}
-\cs_new:Npn \@@_cuphrase_parse:n #1
+\cs_new:Npn \@@_parse_stuff_mandatories_plus_star:nn #1#2
{
\quark_if_recursion_tail_stop:n {#1}
- \@@_if_integer:nF {#1}
- { \msg_error:nnn { cooking-units} { phrase-unit-not-an-integer } {#1} }
- \peek_meaning_remove_ignore_spaces:NTF *
+ \quark_if_recursion_tail_stop_do:nn {#2}
+ { \msg_error:nn { cooking-units } { missing-argument } }
+ \str_if_eq:nnTF {#2} { * }
{
- \int_set:Nn \l_@@_tmpa_int {-#1}
- \@@_cuphrase_parse_normal:Vn \l_@@_tmpa_int
+ \bool_set_true:N \l_@@_tmpa_bool
+ \@@_parse_stuff_mandatories_plus_star:nn {#1}
}{
- \int_set:Nn \l_@@_tmpa_int {#1}
- \@@_cuphrase_parse_normal:Vn \l_@@_tmpa_int
+ \@@_if_evaluation_is_integer:nTF {#1}
+ {
+ \int_set:Nn \l_@@_tmpa_int {#1}
+ \tl_set:NV \l_@@_curr_unit_tl \l_@@_tmpa_int
+ \bool_if:NT \l_@@_tmpa_bool
+ { \tl_put_left:Nn \l_@@_curr_unit_tl { - } }
+ }{
+ \@@_set_state_to:n { error }
+ \msg_error:nnn { cooking-units} { phrase-unit-not-an-integer } {#1}
+ }
+ \prop_put:Nnn \l_@@_tmpa_prop { } {#2}
+ \prop_put:NnV \l_@@_tmpa_prop { - singlebool } \l_@@_tmpa_bool
+ \@@_parse_phrase_optionals:n {#2}
}
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{ \@@_parse_phrase_optionals:n }
+% Get the plural form of the phrase. If the next token is an open bracket,
+% get the plural form, else set the plural form equal to the singular form.
% \begin{macrocode}
-\cs_new:Npn \@@_cuphrase_parse_normal:nn #1#2
+\cs_new:Npn \@@_parse_phrase_optionals:n #1
{
- \quark_if_recursion_tail_stop_do:nn {#2}
- { \msg_error:nn { cooking-units } { missing-argument } }
- \prop_put:Nnn \l_@@_phrase_prop {#1} {#2}
- \seq_if_in:NnF \l_@@_phrase_numbers_seq {#1}
- { \seq_push:Nn \l_@@_phrase_numbers_seq {#1} }
\peek_meaning_ignore_spaces:NTF [
- {
- \@@_chuphrase_parse_plural:nw {#1}
- }{
- \@@_chuphrase_parse_plural:nw {#1} [#2]
- }
+ { \@@_parse_stuff_plural:w }
+ { \@@_parse_stuff_plural:w [#1] }
}
-\cs_generate_variant:Nn \@@_cuphrase_parse_normal:nn { V }
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{ \@@_new_cuphrase_add:nn }
+% Store the pluarl form in the property list.
+% Next, parse gender. Pretty much the same as before. By default we use
+% a male gender.
% \begin{macrocode}
-\cs_new:Npn \@@_chuphrase_parse_plural:nw #1 [#2]
+\cs_new:Npn \@@_parse_stuff_plural:w [#1]
{
- \prop_put:Nnn \l_@@_phrase_prop { #1-pl } {#2}
+ \prop_put:Nnn \l_@@_tmpa_prop { -pl } {#1}
\peek_meaning_ignore_spaces:NTF <
+ { \@@_parse_stuff_gender:w }
+ { \@@_parse_stuff_gender:w <m> }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{ \@@_new_cuphrase_add:nn }
+% Check if the gender-input is correct, add it to the property list.
+% Then finish the cycle and start a new one.
+% \begin{macrocode}
+\cs_new:Npn \@@_parse_stuff_gender:w <#1>
+ {
+ \@@_if_gender_error:nTF {#1}
+ { \@@_set_state_to:n { error } }
+ { \prop_put:Nnn \l_@@_tmpa_prop { -gender } {#1} }
+ \@@_parse_phrase_finish_cycle_and_start_anew:V \l_@@_curr_unit_tl
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{ \@@_parse_phrase_finish_cycle_and_start_anew:n }
+% If not errors were found: Add the number to the other numbers (if not already inside).
+% Afterwards map through the property list and set the variations for each number.
+%
+% As an example, if we had \enquote{12}, |\l_@@_phrase_prop| would then contain
+% the keys \enquote{12}, \enquote{12-pl}, \enquote{12-gender}, \enquote{12-singlebool}.
+% \begin{macrocode}
+\cs_new:Npn \@@_parse_phrase_finish_cycle_and_start_anew:n #1
+ {
+ \@@_if_state_equal:nT { normal }
{
- \@@_chuphrase_parse_gender:nw {#1}
- }{
- \@@_chuphrase_parse_gender:nw {#1} < m >
+ \seq_if_in:NnF \l_@@_phrase_numbers_seq {#1}
+ { \seq_put_right:Nn \l_@@_phrase_numbers_seq {#1} }
+ \prop_map_inline:Nn \l_@@_tmpa_prop
+ {
+ \prop_put:Nnn \l_@@_phrase_prop { #1 ##1 } {##2}
+ }
}
+ \@@_parse_phrase_start_cycle:
}
+\cs_generate_variant:Nn \@@_parse_phrase_finish_cycle_and_start_anew:n { V }
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{ \@@_new_cuphrase_sort_sequence:N }
+% Sorting the sequence of numbers from highest to lowest (in absolute values).
+% And if two absolute values are equal, negative numbers are preferred over
+% positive ones.
% \begin{macrocode}
-\cs_new:Npn \@@_chuphrase_parse_gender:nw #1 <#2>
+\cs_new:Npn \@@_new_cuphrase_sort_sequence:N #1
{
- \@@_if_gender_error:nTF {#2}
+ \seq_sort:Nn #1
{
- \@@_deftranslation_to:VxVn
- \l_@@_language_tl { #1-phrase-gender }
- \c_@@_postfix_gender_tl { m }
- }{
- \@@_deftranslation_to:VxVn
- \l_@@_language_tl { #1-phrase-gender }
- \c_@@_postfix_gender_tl {#2}
- }
- \@@_cuphrase_parse:n
+ \int_set:Nn \l_@@_tmpa_int { \int_abs:n {##1} }
+ \int_set:Nn \l_@@_tmpb_int { \int_abs:n {##2} }
+ \int_compare:nNnTF { \l_@@_tmpa_int } < { \l_@@_tmpb_int }
+ { \sort_return_swapped: }
+ {
+ \int_compare:nNnTF { \l_@@_tmpa_int } > { \l_@@_tmpb_int }
+ { \sort_return_same: }
+ {
+ \prop_get:NnN \l_@@_phrase_prop { ##1 - singlebool } \l_@@_tmpa_int
+ \int_compare:nNnTF { \l_@@_tmpa_int } = { 1 }
+ { \sort_return_same: }
+ { \sort_return_swapped: }
+ }
+ }
+ }
}
% \end{macrocode}
+% \end{macro}
%
-%
+% \begin{macro}{ \cudefinephrase }
+% \begin{macrocode}
+%\NewDocumentCommand \cudefinephrase { m m }
+% {
+%% \@@_cuphrase:nn {#1} {#2}
+% }
+% \end{macrocode}
+% \end{macro}
%
%
% \subsection{Old stuff}
@@ -8293,7 +9897,7 @@ and the derived file cooking-units.sty.
% \begin{macrocode}
\cs_new:Npn \@@_old_cutext_default:nnn #1#2#3
{
- \bool_if:NTF \l_@@_draft_bool
+ \bool_if:NTF \l_@@_pckopt_draft_bool
{#2}
{
\tl_set:Nn \l_@@_cutext_last_value_tl {#2}
@@ -8313,19 +9917,21 @@ and the derived file cooking-units.sty.
{
\@@_old_cutext_if_numeral_is_int_and_parse_and_smaller_then_print_numerals:NTF #1
{
- \@@_int_if_equal_one:nTF {#1}
+ \int_compare:nNnTF {#1} = { 1 }
{
- \@@_translate_one_and_check_existance:Nx \l_@@_translation_tmpa_tl {#2}
- \bool_if:NTF \l_@@_cutext_uppercase_word_bool
+ \@@_culang_one_let:NnT \l_@@_translation_tmpa_tl {#2}
{
- \exp_args:Nx \tl_upper_case:n { \tl_head:V \l_@@_translation_tmpa_tl }
- \tl_tail:V \l_@@_translation_tmpa_tl
+ \bool_if:NT \l_@@_cutext_uppercase_word_bool
+ {
+ \text_uppercase:x { \tl_head:V \l_@@_translation_tmpa_tl }
+ \tl_tail:V
+ }
}
- { \l_@@_translation_tmpa_tl }
+ \l_@@_translation_tmpa_tl
}{
\bool_if:NTF \l_@@_cutext_uppercase_word_bool
- { \@@_print_Numeral:n {#1} }
- { \@@_print_numeral:n {#1} }
+ { \@@_print_Numeral:V #1 }
+ { \@@_print_numeral:V #1 }
}
}
{ \@@_print_numerical_input:N #1 }
@@ -8376,7 +9982,7 @@ and the derived file cooking-units.sty.
\char_set_catcode_letter:N \_ %
\char_set_catcode_ignore:N\ %
} {#1}
- \bool_if:NTF \l_@@_draft_bool
+ \bool_if:NTF \l_@@_pckopt_draft_bool
{ \l_@@_tmpa_tl }
{ \@@_cuam_old_parse:V \l_@@_tmpa_tl }
}
@@ -8487,137 +10093,6 @@ and the derived file cooking-units.sty.
% \end{macrocode}
%
%
-%
-%
-% \begin{macrocode}
-\cs_new:Npn \@@_add_forbidden_unit:n #1
- {
- \seq_set_from_clist:Nn \l_@@_tmpa_seq {#1}
- \seq_map_inline:Nn \l_@@_tmpa_seq
- {
- \@@_error_if_unit_not_defined:nF {##1}
- {
- \seq_if_in:NnF \l_@@_curef_do_not_change_seq {##1}
- { \seq_put_right:Nn \l_@@_curef_do_not_change_seq {##1} }
- }
- }
- }
-\cs_new:Npn \@@_remove_forbidden_unit:n #1
- {
- \seq_set_from_clist:Nn \l_@@_tmpa_seq {#1}
- \seq_map_inline:Nn \l_@@_tmpa_seq
- {
- \@@_error_if_unit_not_defined:nF {##1}
- {
- \seq_if_in:NnTF \l_@@_curef_do_not_change_seq {##1}
- { \seq_remove_all:Nn \l_@@_curef_do_not_change_seq {##1} }
- {
- \msg_warning:nnnn { cooking-units } { curef-not-inside-list } {##1}
- { \@@_seq_use_msg:N \l_@@_curef_do_not_change_seq }
- }
- }
- }
- }
-\cs_new:Npn \@@_clear_forbidden_unit:
- { \seq_clear:N \l_@@_curef_do_not_change_seq }
-% \end{macrocode}
-%
-%
-%
-%
-%
-%
-% \begin{macrocode}
-\NewDocumentCommand \cudeclareunitgroup { m m }
- {
- \@@_define_clear_unit_group:nn {#1} {#2}
- \@@_add_to_unit_group:nn {#1} {#2}
- }
-\NewDocumentCommand \cuaddtounitgroup { m m }
- {
- \@@_add_to_unit_group:nn {#1} {#2}
- }
-\NewDocumentCommand \cuclearunitgroup { m }
- {
- \@@_error_if_group_not_defined:nF {#1}
- { \@@_define_clear_unit_group:nn {#1} { } }
- }
-% \end{macrocode}
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-% Works better now.
-% \begin{macrocode}
-\NewDocumentCommand \cusetoptionfor { m m }
- {
- \@@_map_trough_valid_unit_options:nnn {#1} {#2}
- { \clist_set:cn { l_@@_unit_option_ ##1 _clist } {##2} }
- }
-\NewDocumentCommand \cuaddoptionfor { m m }
- {
- \@@_map_trough_valid_unit_options:nnn {#1} {#2}
- { \clist_put_right:cn { l_@@_unit_option_ ##1 _clist } {##2} }
- }
-\NewDocumentCommand \cuclearoptionfor { m }
- {
- \@@_map_trough_valid_unit_options:nnn {#1} { }
- { \clist_clear:c { l_@@_unit_option_ ##1 _clist } }
- }
-% \end{macrocode}
-% The reason I map trough the units twice is simply: I think it makes more
-% sense if an \enquote{unknown unit} error is shown before an
-% \enquote{unknown option} error (at least for me).
-% It is kinda stupid, but this is not really a heavily used function, so \dots\ yeah.
-%
-% Note: I cannot check if |\l_@@_tmpa_clist| is empty because one could
-% use |\cusetoptionfor{F,C,Re,K}{}| to clear the options of the given units.
-% \begin{macrocode}
-\cs_new:Npn \@@_tmp:w { }
-\cs_new:Npn \@@_map_trough_valid_unit_options:nnn #1#2 #3
- {
- \seq_clear:N \l_@@_tmpa_seq
- \clist_clear:N \l_@@_tmpa_clist
- \cs_set:Npn \@@_tmp:w ##1##2 {#3}
- \clist_map_inline:nn {#1}
- {
- \@@_error_if_unit_not_defined:nF {##1}
- { \seq_put_right:Nn \l_@@_tmpa_seq {##1} }
- }
- \tl_if_empty:nF {#2}
- { \@@_unit_options_check_validity:n {#2} }
- \seq_map_inline:Nn \l_@@_tmpa_seq
- { \exp_args:NnV \@@_tmp:w {##1} \l_@@_tmpa_clist }
- }
-\cs_new:Npn \@@_unit_options_check_validity:n #1
- {
- \keyval_parse:NNn
- \@@_unit_options_check_validity_aux_i:n
- \@@_unit_options_check_validity_aux_ii:nn
- {#1}
- }
-\cs_new:Npn \@@_unit_options_check_validity_aux_i:n #1
- {
- \keys_if_exist:nnTF { cooking-units } {#1}
- { \clist_put_right:Nn \l_@@_tmpa_clist {#1} }
- { \msg_error:nnn { cooking-units } { unknown-option } {#1} }
- }
-\cs_new:Npn \@@_unit_options_check_validity_aux_ii:nn #1#2
- {
- \keys_if_exist:nnTF { cooking-units } {#1}
- { \clist_put_right:Nn \l_@@_tmpa_clist { #1={#2} } }
- { \msg_error:nnn { cooking-units } { unknown-option } {#1} }
- }
-% \end{macrocode}
-%
-%
%
%
%
@@ -8646,7 +10121,10 @@ and the derived file cooking-units.sty.
\newcookingunit { oz }
\newcookingunit { lb }
\newcookingunit { stick }
-\newcookingunit [ \ensuremath{ \@@_frac:nn { eV } { c^2 } } ] { eVc-2 }
+\newcookingunit [
+ symbol={\ensuremath{ \@@_frac:nn { eV } { c^2 } } } ,
+ natural-unit
+ ] { eVc-2 }
% \end{macrocode}
%
% \begin{macrocode}
@@ -8661,7 +10139,10 @@ and the derived file cooking-units.sty.
\newcookingunit { h }
\newcookingunit { min }
\newcookingunit { s }
-\newcookingunit [ \ensuremath{ \@@_frac:nn { \hbar } { eV } } ] { hbareV-1 }
+\newcookingunit [
+ symbol={\ensuremath{ \@@_frac:nn { \hbar } { eV } } },
+ natural-unit
+ ] { hbareV-1 }
% \end{macrocode}
%
% \begin{macrocode}
@@ -8670,7 +10151,9 @@ and the derived file cooking-units.sty.
\newcookingunit { dm }
\newcookingunit { mm }
\newcookingunit { in }
-\newcookingunit [ \ensuremath{ \@@_frac:nn { c\hbar } { eV } } ] { chbareV-1 }
+\newcookingunit [
+ symbol={ \ensuremath{ \@@_frac:nn { c\hbar } { eV } } } , natural-unit
+ ] { chbareV-1 }
% \end{macrocode}
%
% \begin{macrocode}
@@ -8678,7 +10161,9 @@ and the derived file cooking-units.sty.
\newcookingunit { dl }
\newcookingunit { cl }
\newcookingunit { ml }
-\newcookingunit [ \ensuremath { \@@_frac:nn { c^3 \hbar^3 } { eV^3 } } ] { (chbareV-1)3 }
+\newcookingunit [
+ symbol={ \ensuremath { \@@_frac:nn { c^3 \hbar^3 } { eV^3 } } }, natural-unit
+ ] { (chbareV-1)3 }
% \end{macrocode}
%
% \begin{macrocode}
@@ -8686,7 +10171,7 @@ and the derived file cooking-units.sty.
\newcookingunit { kcal }
\newcookingunit { J }
\newcookingunit { kJ }
-\newcookingunit { eV }
+\newcookingunit [ natural-unit ] { eV }
% \end{macrocode}
%
% \begin{macrocode}
@@ -8905,15 +10390,25 @@ and the derived file cooking-units.sty.
%
%
% \begin{macrocode}
-\cudefinekeys { kg }
+\cudefinekeychain
{
+ { kg } { 1 }
{ dag }{ 100 }
{ g } { 1000 }
{ lb } { 1/0.45359237 }
{ oz } { 16/0.45359237 }
{ stick } { 4/0.45359237 }
- { eVc-2 } { 560958865.0e+27 } %% 560958865.0 +- 3.5 e+27
+ { eVc-2 } { 560958865.0e+27 } %% (560958865.0 +- 3.5) e+27
}
+%\cudefinekeys { kg }
+% {
+% { dag }{ 100 }
+% { g } { 1000 }
+% { lb } { 1/0.45359237 }
+% { oz } { 16/0.45359237 }
+% { stick } { 4/0.45359237 }
+% { eVc-2 } { 560958865.0e+27 } %% (560958865.0 +- 3.5) e+27
+% }
% \end{macrocode}
% \begin{macrocode}
\cudefinekeys { d }
@@ -8921,7 +10416,7 @@ and the derived file cooking-units.sty.
{ h } { 24 }
{ min }{ 1440 }
{ s } { 86400 }
- { hbareV-1 } { 151926746.1e+7 * 86400 } %% 151926746.1 +- 2.1 e+7
+ { hbareV-1 } { 151926746.1e+7 * 86400 } %% (151926746.1 +- 2.1) e+7
}
%\cuaddtokeys { s } { hbareV-1 } { 6.582119514e-16 }
% \end{macrocode}
@@ -8951,7 +10446,7 @@ and the derived file cooking-units.sty.
{ kJ }{ 1e-3 }
{ cal }{ 0.2388459 }
{ kcal }{ 0.2388459e-3 }
- { eV }{ 624150912.6e+10 } %% 624150912.6 +- 3.9 e+10
+ { eV }{ 624150912.6e+10 } %% (624150912.6 +- 3.9) e+10
}
%\cuaddtokeys { J } { eV } { 1.6021766208e-19 }
% \end{macrocode}
@@ -8992,7 +10487,7 @@ and the derived file cooking-units.sty.
\cudefinephrase { German }
{
% { 6 } * { halbes \ Dutzend } < n >
-% { 6 } { efkjwefjkl \ Dutzend } < n >
+% { 6 } { halbe \ Dutzend } < n >
{ 12 } { Dutzend } < n >
% { 60 } { Schock } < n >
% { 1728 } { Gro{\ss}gros } < n >
@@ -9023,6 +10518,20 @@ and the derived file cooking-units.sty.
} ,
round-precision = 2 ,
}
+
+
+% \NewDocumentCommand \cudefinekeys { } { \cudefinekeys }
+
+
+
+%\AtBeginDocument{
+%\keys_define:nn { cooking-units }
+% {
+% unknown .code:n = { \tl_show:N {\l_keys_key_str} }
+% }
+% \keys_set:nn { cooking-units } {#2}
+%
+%}
% \end{macrocode}
%
%
@@ -9064,8 +10573,8 @@ and the derived file cooking-units.sty.
% \bibitem{StickSource} \url{https://cooking.stackexchange.com/questions/784/translating-cooking-terms-between-us-uk-au-ca-nz}
%
% \end{thebibliography}
-%
-%
+%
+%
%
% \endinput
%
diff --git a/macros/latex/contrib/cooking-units/cooking-units.ins b/macros/latex/contrib/cooking-units/cooking-units.ins
index e20b719ad6..7298eb0e53 100644
--- a/macros/latex/contrib/cooking-units/cooking-units.ins
+++ b/macros/latex/contrib/cooking-units/cooking-units.ins
@@ -5,7 +5,7 @@
%% The original source files were:
%%
%% cooking-units.dtx (with options: `install')
-%% Copyright (C) 2016--2020 by Ben Vitecek (current Maintainer)
+%% Copyright (C) 2016--2021 by Ben Vitecek (current Maintainer)
%%
%% This file may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either
@@ -25,7 +25,7 @@
\input l3docstrip.tex
\askforoverwritefalse
\preamble
-Copyright (C) 2016--2020 by Ben Vitecek (current Maintainer)
+Copyright (C) 2016--2021 by Ben Vitecek (current Maintainer)
This file may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
diff --git a/macros/latex/contrib/cooking-units/cooking-units.pdf b/macros/latex/contrib/cooking-units/cooking-units.pdf
index ef512cc946..e65da308d7 100644
--- a/macros/latex/contrib/cooking-units/cooking-units.pdf
+++ b/macros/latex/contrib/cooking-units/cooking-units.pdf
Binary files differ
diff --git a/macros/latex/contrib/easybook/easybook.dtx b/macros/latex/contrib/easybook/easybook.dtx
index 7304189a36..174913a769 100644
--- a/macros/latex/contrib/easybook/easybook.dtx
+++ b/macros/latex/contrib/easybook/easybook.dtx
@@ -23,12 +23,12 @@
%
% \changes{v1.20}{2021/01/09}{修改和完善用户文档。}
% \changes{v1.20}{2021/01/09}{模板更改为使用 CC-BY 许可协议。}
-% \changes{v1.25x}{2021/05/03}{取消附带的示例文件,可查看历史版本及其它来源的使用样例。}
-% \changes{v1.25x}{2021/06/02}{将模块的代码独立出来为 \pkg{easybase} 宏包,适用于 \CTeX 文档类。}
+% \changes{v1.25z}{2021/05/03}{取消附带的示例文件,可查看历史版本及其它来源的使用样例。}
+% \changes{v1.25z}{2021/06/02}{将模块的代码独立出来为 \pkg{easybase} 宏包,适用于 \CTeX 文档类。}
%
% \title{\sffamily easybook 文档类手册}
% \author{瞿毅}
-% \date{2021/06/09\hskip\ccwd\relax v1.25x\thanks{\url{https://gitee.com/texl3/easybook}}}
+% \date{2021/06/10\hskip\ccwd\relax v1.25z\thanks{\url{https://gitee.com/texl3/easybook}}}
%
% \maketitle
% \begin{abstract}
@@ -134,7 +134,7 @@
% \end{syntax}
% 传递给 \cls{ctexbook} 设置字体,最好不要使用原有的 \opt{fontset} 选项,默认情况下使用自定义字体而不开启这个选项,可根据安装的字体及电脑系统选取。\opt{noto} 与 \opt{none} 选项的相关描述见小节 \ref{subsec:font settings},\opt{overleaf} 是一个各系统通用选项,会检测系统环境选取对应字体。
% \changes{v1.21}{2021/01/12}{默认字体与 \CTeX 一致,不再是自定义字体。}
-% \changes{v1.25x}{2021/05/04}{修复使用 \pkg{xeCJK} 与 \pkg{fontspec} 宏包的字体设置命令在 \hologo{LuaLaTeX} 下失效的问题。}
+% \changes{v1.25z}{2021/05/04}{修复使用 \pkg{xeCJK} 与 \pkg{fontspec} 宏包的字体设置命令在 \hologo{LuaLaTeX} 下失效的问题。}
% \end{function}
%
% \begin{function}[rEXP,added = 2021-01-05,updated = 2021-01-13]{paper}
@@ -184,7 +184,7 @@
% \tn{listoflstlistings*+}\oarg{键值列表}
% \end{syntax}
% \tn{listoffigures} 命令输出图片目录,\tn{listoftables} 输出表格目录,\tn{listoflstlistings} 输出代码目录。带有星号的目录命令不将标题添加进主文档目录,带有+号的目录命令可以使当前标题编号。\tn{tableofcontents+} 与其它命令不同是用于输出双语目录,需要与双语目录标题命令 \tn{bichapter} 等或设置图片、表格和代码等英文目录的标题配合使用,附加代码是中文与英文目录之间的代码,可以插入目录样式和换页等命令。目录的键值列表选项如下
-% \changes{v1.25x}{2021/05/05}{命令 \tn{tableofcontents} 可以输出双语目录。}
+% \changes{v1.25z}{2021/05/05}{命令 \tn{tableofcontents} 可以输出双语目录。}
% \end{function}
%
% \begin{function}{multoc,columns,title,format,aftertitle,pagestyle,chapter,section}
@@ -201,7 +201,7 @@
% 在书籍模式且 \opt{chapter} 选项开启或者文章模式的情况下,\opt{format} 用于设置目录标题的格式,\opt{aftertitle} 选项的代码将被插入到目录标题内容之后,\opt{pagestyle} 是目录标题所在页的页面格式,除此之外还支持 \opt{ctexset/chapter} 或 \opt{ctexset/section} 所有的章节标题样式选项。\opt{chapter} 选项使目录标题按照 chapter 级别输出,\opt{section} 选项使目录标题按照 section 级别输出,默认为 chapter 级别。
% \changes{v1.23}{2021/03/15}{为几个目录增加键值列表的选项,可设置标题输出级别以及是否加入主目录。}
% \changes{v1.24}{2021/04/04}{目录命令的可选参数增加标题键值。}
-% \changes{v1.25x}{2021/06/02}{目录可设置多栏,并在 article 模式仍然生效。}
+% \changes{v1.25z}{2021/06/02}{目录可设置多栏,并在 article 模式仍然生效。}
% \end{function}
%
% \subsubsection{标题命令}
@@ -214,7 +214,7 @@
% 双语目录的标题命令目前设置了常用的三个级别,它们将中文标题正常输出,并使中英文标题加入双语目录,这个功能是为国内一些大学的学位论文模板的要求设计,在一般情况和英文模式下不需要使用。
%
% 它们的星号变体命令使文中标题不编号,但是仍然加入双语目录,若英文标题参数空置那么仅加入中文目录而不加入英文目录,这一特点与 \tn{chapter*} 等命令的行为不太一样,在一些情况下会用到。可选参数是目录中的中文标题,默认与中文标题一致,正文标题过长时可用它设置在目录中显示的标题。双语目录的格式是一致的,共享使用 \tn{tocset} 的设置,英文目录的章级别标题名及编号的修改方式如下
-% \changes{v1.25x}{2021/05/05}{增加与双语目录配合的标题命令。}
+% \changes{v1.25z}{2021/05/05}{增加与双语目录配合的标题命令。}
% \end{function}
%
% \begin{function}{chapter/biname,chapter/binmuber}
@@ -314,7 +314,7 @@
% \changes{v1.10}{2021/01/08}{修复了 \opt{linktopage} 选项关闭时目录中标题编号无超链接的问题。}
% \changes{v1.23}{2021/03/19}{修复在 \pkg{ctex} v2.5.6 更新后 \cls{easybook} 与 \pkg{hyperref} 冲突问题。}
% \changes{v1.24}{2021/04/05}{增加 \pkg{hyperref} 超链接选项完整的支持。}
-% \changes{v1.25x}{2021/05/06}{模块名 \opt{link} 改为 \opt{refset},\opt{link} 作为兼容性保留。}
+% \changes{v1.25z}{2021/05/06}{模块名 \opt{link} 改为 \opt{refset},\opt{link} 作为兼容性保留。}
% \end{function}
%
% \begin{optdesc}
@@ -371,7 +371,7 @@
% \ding{229} 以上选项路径为 \opt{subfont/...}
% \changes{v1.10}{2021/01/08}{加入自定义非正文字体选项。}
% \changes{v1.23}{2021/02/08}{修复使用 \tn{zihao} 命令设置字体失效的问题。}
-% \changes{v1.25x}{2021/05/31}{其它字体模块名由 \opt{elsefont} 改为 \opt{subfont},并增加数学字体的选项 \opt{subfont/math}。}
+% \changes{v1.25z}{2021/05/31}{其它字体模块名由 \opt{elsefont} 改为 \opt{subfont},并增加数学字体的选项 \opt{subfont/math}。}
% \end{function}
%
% \begin{optdesc}
@@ -396,7 +396,7 @@
% \changes{v1.21}{2021/01/11}{增加 \opt{bibset} 选项,可以使用 \hologo{BibTeX} 或 \hologo{biber} 编译参考文献。}
% \changes{v1.23}{2021/02/23}{使用 \opt{bibset} 选项时可设置标注风格。}
% \changes{v1.24}{2021/04/09}{可以不载入参考文献包手动配置参考文献格式。}
-% \changes{v1.25x}{2021/05/12}{取消 \opt{bib-loadpkg} 选项,由是否设置参考文献数据库来决定载入宏包。}
+% \changes{v1.25z}{2021/05/12}{取消 \opt{bib-loadpkg} 选项,由是否设置参考文献数据库来决定载入宏包。}
% \end{function}
%
% \begin{optdesc}
@@ -602,7 +602,7 @@
% 上面几个选项用于设置脚注格式,\opt{fnparskip} 和 \opt{fnparindent} 选项仅在 \opt{fnhang = true} 时有效。\opt{fnhang} 用于将脚注设置为悬挂缩进的格式,\opt{fnmark-pos} 选项设置脚注编号的位置,正常文本或是上标形式。\opt{fnmark-num} 选项设置脚注编号的格式,默认为原生样式 \opt{plain},还可以改为 \opt{pifont} 的各个版本,从左往右依次为普通版、阴文衬线版、阳文无衬线版和阴文无衬线版,缺点是它们的编号仅包括1-10。
%
% \opt{fnmark-form} 是脚注标记的格式,在此设置字体命令会覆盖 \opt{subfont/footnote} 的设置,最后一个格式命令可以带有一个参数,这个参数接受脚注编号,一般配合 \opt{fnmark-num = plain} 使用。\opt{afterfnmark} 是脚注标记后的代码,一般用于设置标记与文本间的距离。
-% \changes{v1.25x}{2021/05/12}{增加脚注样式设置选项。}
+% \changes{v1.25z}{2021/05/12}{增加脚注样式设置选项。}
% \end{function}
%
% \subsection{目录样式}
@@ -621,7 +621,7 @@
% \opt{format} 是目录中标题的格式,可以设置字体和加入垂直间距等,垂直间距最好使用无间距重合的 \tn{addvspace} 命令,带有加号的 \opt{format+} 选项用于在已有的格式命令后附加内容。\opt{indent} 是目录中标题在页面左侧的缩进距离,应该有长度单位。\opt{rule} 选项中一般应当使用 \tn{tocrule} 命令,将会在接下来介绍。\opt{numsep} 是有编号的标题在目录中编号与标题的间距。
% \changes{v1.21}{2021/01/13}{增加配置目录样式的选项。}
% \changes{v1.24}{2021/04/20}{增加目录中编号与标题的间距选项 \opt{numsep}。}
-% \changes{v1.25x}{2021/05/14}{可以分别设置图片、表格和代码目录的格式。}
+% \changes{v1.25z}{2021/05/14}{可以分别设置图片、表格和代码目录的格式。}
% \end{function}
%
% \begin{function}[added = 2021-01-13,updated = 2021-04-20]{\tocrule,\EBNumberLine}
@@ -706,7 +706,7 @@
% \tn{end}\marg{环境名}
% \end{syntax}
% \pkg{tabularray} 是一个较新的宏包,不仅提供了 \pkg{tabularx}、\pkg{multirow}、和 \pkg{booktabs} 宏包的功能,并且不依赖其它宏包与它们同时使用不会产生冲突,还实现了用简便的键值列表方式设置表格样式。目前除了表头斜线以及跨页功能存在不足,其它方面已满足对表格绝大多数格式的需求,具体用法可见宏包的说明文档。
-% \changes{v1.25x}{2021/05/17}{使用功能更便捷齐全的 \pkg{tabularray} 宏包设置表格样式。}
+% \changes{v1.25z}{2021/05/17}{使用功能更便捷齐全的 \pkg{tabularray} 宏包设置表格样式。}
% \end{function}
%
% \subsection{列表}
@@ -879,7 +879,7 @@
% \tn{qtyrange}\oarg{键值列表}\marg{数字1}\marg{数字2}\marg{单位}
% \end{syntax}
% \pkg{siunitx} 宏包的 \tn{num} 命令可以输出以科学计数法表示的数值,单位格式化命令 \tn{unit} 包含文字项目(例如字母或数字)时,使用 . 和 \~{} 放置在单元乘积中间,并使用 \_ 和 \^{} 正确放置指定的下标和上标。格式化方法可在数学和文本模式下使用。而 \tn{qty} 命令可用来输出带有单位的量,\tn{qtyrange} 可以输出带有范围和单位的量。
-% \changes{v1.25x}{2021/05/18}{\pkg{siunitx} 宏包 v3.0.0 更新后用法改变,修改相关配置选项。}
+% \changes{v1.25z}{2021/05/18}{\pkg{siunitx} 宏包 v3.0.0 更新后用法改变,修改相关配置选项。}
% \end{function}
%
% \begin{ctexexam}
@@ -1062,7 +1062,7 @@
%<*class>
\NeedsTeXFormat{LaTeX2e}[2020/10/01]
\RequirePackage{l3keys2e}
-\ProvidesExplClass{easybook}{2021/06/09}{1.25x}{beta}
+\ProvidesExplClass{easybook}{2021/06/10}{1.25z}{beta}
\bool_set_false:N \l__eb_compile_draft_bool
\bool_set_false:N \l__eb_title_newline_bool
@@ -1306,7 +1306,7 @@
%<*package>
\NeedsTeXFormat{LaTeX2e}[2020/10/01]
\RequirePackage{etoolbox}
-\ProvidesExplPackage{easybase}{2021/06/09}{1.25x}{beta}
+\ProvidesExplPackage{easybase}{2021/06/10}{1.25z}{beta}
\cs_generate_variant:Nn \eb_ctex_define:nn { nx }
\cs_generate_variant:Nn \int_to_arabic:n { v }
@@ -2647,13 +2647,11 @@
{
mode = match,
table-parse-only,
- propagate-math-font,
text-family-to-math,
text-series-to-math,
reset-text-family = false,
reset-text-series = false,
reset-text-shape = false,
- reset-math-version = false,
range-phrase = \ensuremath{\sim},
range-units = single,
group-digits = none
@@ -2855,7 +2853,7 @@
{
standard~jigsaw,
nobeforeafter,tcbox~raise~base,
- top = 1.25xt,bottom = 1.25xt,left = 1.25xt,right = 1.25xt,
+ top = 1.25zt,bottom = 1.25zt,left = 1.25zt,right = 1.25zt,
boxrule = 0.75pt,arc = 1pt,
colback = #1,opacityback = 0.12,colframe = #1,#3
}{#2}
@@ -3055,7 +3053,7 @@
\eb_put_hyperref:n
{
linkcolor = ctex@link,linkbordercolor = ctex@link,
- urlcolor = ctex@url,urlbordercolor = ctex@url,
+ urlcolor = ctex@url,urlbordercolor = ctex@url,
citecolor = ctex@cite,citebordercolor = ctex@cite
}
},
@@ -3176,9 +3174,9 @@
{
contentsname = 目\hspace{\ccwd}录,
indexname = 索\hspace{\ccwd}引,
+ abstractname = 摘\hspace{\ccwd}要,
listfigurename = 图片索引,
listtablename = 表格索引,
- abstractname = 摘\hspace{\ccwd}要,
lstlistlistingname = 代码索引,
lstlistingname = 代码
}
diff --git a/macros/latex/contrib/easybook/easybook.pdf b/macros/latex/contrib/easybook/easybook.pdf
index ff5485e64d..ca382390fd 100644
--- a/macros/latex/contrib/easybook/easybook.pdf
+++ b/macros/latex/contrib/easybook/easybook.pdf
Binary files differ
diff --git a/macros/latex/contrib/ffcode/DEPENDS.txt b/macros/latex/contrib/ffcode/DEPENDS.txt
new file mode 100644
index 0000000000..e1cb6ed564
--- /dev/null
+++ b/macros/latex/contrib/ffcode/DEPENDS.txt
@@ -0,0 +1,5 @@
+hard microtype
+hard xkeyval
+hard minted
+hard minted
+hard tcolorbox
diff --git a/macros/latex/contrib/ffcode/README.md b/macros/latex/contrib/ffcode/README.md
new file mode 100644
index 0000000000..1c95d6ece3
--- /dev/null
+++ b/macros/latex/contrib/ffcode/README.md
@@ -0,0 +1,31 @@
+[![make](https://github.com/yegor256/ffcode/actions/workflows/make.yml/badge.svg)](https://github.com/yegor256/ffcode/actions/workflows/make.yml)
+[![License](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/yegor256/ffcode/blob/master/LICENSE.txt)
+
+This LaTeX package helps you write source code in your academic papers
+and make sure it looks neat.
+
+First, [install it](https://en.wikibooks.org/wiki/LaTeX/Installing_Extra_Packages)
+from [CTAN](https://ctan.org/pkg/ffcode)
+and then use in the preamble:
+
+```tex
+\documentclass{article}
+\usepackage{ffcode}
+\begin{document}
+The function \ff{r()} reads the file:
+\begin{ffcode}
+void r() {
+ // read the file
+}
+\end{ffcode}
+\end{document}
+```
+
+The full example and all commands are available in the
+[`ffcode.tex`](https://github.com/yegor256/ffcode/blob/master/ffcode.tex) file.
+
+If you want to contribute yourself, make a fork, then create a branch,
+then run `make` in the root directory.
+It should compile everything without errors. If not, submit an issue and wait.
+Otherwise, make your changes and then run `make` again. If the build is
+still clean, submit a pull request.
diff --git a/macros/latex/contrib/ffcode/ffcode.pdf b/macros/latex/contrib/ffcode/ffcode.pdf
new file mode 100644
index 0000000000..ee829bd037
--- /dev/null
+++ b/macros/latex/contrib/ffcode/ffcode.pdf
Binary files differ
diff --git a/macros/latex/contrib/ffcode/ffcode.sty b/macros/latex/contrib/ffcode/ffcode.sty
new file mode 100644
index 0000000000..280bc58bd8
--- /dev/null
+++ b/macros/latex/contrib/ffcode/ffcode.sty
@@ -0,0 +1,50 @@
+% (The MIT License)
+%
+% Copyright (c) 2021 Yegor Bugayenko
+%
+% Permission is hereby granted, free of charge, to any person obtaining a copy
+% of this software and associated documentation files (the 'Software'), to deal
+% in the Software without restriction, including without limitation the rights
+% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+% copies of the Software, and to permit persons to whom the Software is
+% furnished to do so, subject to the following conditions:
+%
+% The above copyright notice and this permission notice shall be included in all
+% copies or substantial portions of the Software.
+%
+% THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+% SOFTWARE.
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{ffcode}[2021/06/10 0.1.0 Fixed Font Code]
+
+\RequirePackage{microtype}
+\RequirePackage{xkeyval}
+\newif\ifnopygments
+\DeclareOptionX{nopygments}{\nopygmentstrue}
+\ProcessOptionsX\relax
+
+\ifnopygments
+ \RequirePackage[draft=true]{minted}
+\else
+ \RequirePackage{minted}
+\fi
+\setminted{breaklines}
+\usemintedstyle{bw}
+\renewcommand{\theFancyVerbLine}{\textcolor{gray}{\tiny\oldstylenums{\ttfamily\arabic{FancyVerbLine}}}}
+\newminted[ffcode]{text}{firstnumber=last,linenos,numbersep=2pt,framesep=6pt,framerule=1pt,
+ rulecolor=gray,frame=leftline,escapeinside=||,mathescape}
+
+\RequirePackage{tcolorbox}
+ \newtcbox{\codebox}{nobeforeafter,colframe=gray!80!white,
+ colback=gray!5!white,boxrule=0.1pt,arc=1pt,
+ boxsep=1.2pt,left=0.5pt,right=0.5pt,top=0.2pt,bottom=0.2pt,
+ tcbox raise base}
+\newcommand{\ff}[1]{\codebox{\vrule height 6pt depth 1pt width 0pt\texttt{#1}}}
+
+\endinput
diff --git a/macros/latex/contrib/ffcode/ffcode.tex b/macros/latex/contrib/ffcode/ffcode.tex
new file mode 100644
index 0000000000..dcefc53268
--- /dev/null
+++ b/macros/latex/contrib/ffcode/ffcode.tex
@@ -0,0 +1,89 @@
+% (The MIT License)
+%
+% Copyright (c) 2021 Yegor Bugayenko
+%
+% Permission is hereby granted, free of charge, to any person obtaining a copy
+% of this software and associated documentation files (the 'Software'), to deal
+% in the Software without restriction, including without limitation the rights
+% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+% copies of the Software, and to permit persons to whom the Software is
+% furnished to do so, subject to the following conditions:
+%
+% The above copyright notice and this permission notice shall be included in all
+% copies or substantial portions of the Software.
+%
+% THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+% SOFTWARE.
+
+\documentclass[12pt]{article}
+\usepackage[tt=false,type1=true]{libertine}
+\usepackage{amsmath}
+\usepackage{multicol}
+\usepackage{ffcode}
+\title{\ff{ffcode}: \LaTeX{} Package \\ for Fixed-Font Code Blocks}
+\author{Yegor Bugayenko}
+\date{0.1.0 2021/06/10}
+\begin{document}
+\pagenumbering{gobble}
+\raggedbottom
+\setlength{\topskip}{0mm}
+\setlength{\parindent}{0pt}
+\setlength{\columnsep}{32pt}
+\setlength{\parskip}{6pt}
+\maketitle
+
+This package helps you write source code in your articles
+and make sure it looks nice. Install it from CTAN and then
+use like this (pay attention to the \ff{\char`\\ff} command
+and the \ff{ffcode} environment):
+
+\begin{multicols}{2}
+\setlength{\parskip}{0pt}
+\scriptsize
+\raggedcolumns
+\begin{verbatim}\documentclass{article}
+\usepackage{ffcode}
+\begin{document}
+The function \ff{fibo()} is recursive:
+\begin{ffcode}
+void fibo(int n) {
+ if (n < 2) {
+ return n; |$\label{ln:ret}$|
+ }
+ return fibo(n - 1) + fibo(n - 2);
+}
+\end{ffcode}
+The line~\ref{ln:ret} terminates it.
+\end{document}
+\end{verbatim}
+
+\columnbreak
+
+The function \ff{fibo()} is recursive:
+
+\begin{ffcode}
+void fibo(int n) {
+ if (n < 2) { |$\label{ln:ret}$|
+ return n;
+ }
+ return fibo(n - 1) + fibo(n - 2);
+}
+\end{ffcode}
+
+The line~\ref{ln:ret} terminates it.
+\end{multicols}
+
+You have to run \ff{pdflatex} with the \ff{--shell-escape} flag
+in order to let \ff{minted} (the package we use) to run Pygments
+and format the code. If you don't want this to happen,
+just use the \ff{nopygments} option.
+
+More details about this package you can find
+in the \ff{yegor256/ffcode} GitHub repository.
+
+\end{document} \ No newline at end of file
diff --git a/macros/latex/contrib/semantex/README.md b/macros/latex/contrib/semantex/README.md
index 8e177e4f7b..85732053e6 100644
--- a/macros/latex/contrib/semantex/README.md
+++ b/macros/latex/contrib/semantex/README.md
@@ -25,7 +25,7 @@ Released under the LaTeX Project Public License v1.3c or later
See http://www.latex-project.org/lppl.txt
----------------------------------------------------------------
-Copyright (C) 2020 by Sebastian Ørsted <sorsted@gmail.com>
+Copyright (C) 2021 by Sebastian Ørsted <sorsted@gmail.com>
The package is loaded via \usepackage{semantex}
diff --git a/macros/latex/contrib/semantex/semantex.pdf b/macros/latex/contrib/semantex/semantex.pdf
index 9fa36eaa21..7cf9755983 100644
--- a/macros/latex/contrib/semantex/semantex.pdf
+++ b/macros/latex/contrib/semantex/semantex.pdf
Binary files differ
diff --git a/macros/latex/contrib/semantex/semantex.sty b/macros/latex/contrib/semantex/semantex.sty
index 7346d026b0..3e7e1422b2 100644
--- a/macros/latex/contrib/semantex/semantex.sty
+++ b/macros/latex/contrib/semantex/semantex.sty
@@ -1,11 +1,11 @@
\RequirePackage{xparse,l3keys2e,leftindex,semtex}
-\ProvidesExplPackage{semantex}{2020/11/05}{0.463}{}
+\ProvidesExplPackage{semantex}{2021/06/10}{0.500}{}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% SemanTeX -- semantic, keyval-based mathematics %
% https://ctan.org/pkg/semantex %
-% (C) 2020 Sebastian Ørsted %
+% (C) 2021 Sebastian Ørsted %
% sorsted@gmail.com %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -15,13 +15,13 @@
\keys_define:nn { semantex }
{
- keyvalparser .code:n = \cs_set_eq:NN \semantex_keyval_parse:NNn #1,
- keyvalparser .value_required:n = true,
- semtexfile .choice:,
- semtexfile / true .code:n = \semantex_turn_semtex_file_on:,
- semtexfile / false .code:n = \semantex_turn_semtex_file_off:,
- semtexfile / .code:n = \semantex_turn_semtex_file_on:,
- semtexfile / unknown .code:n = \msg_error:nnnn { semantex } { semantex_setup_key_value_not_found } { semtexfile } { #1 },
+ keyval~parser .code:n = \cs_set_eq:NN \semantex_keyval_parse:NNn #1,
+ keyval~parser .value_required:n = true,
+ semtex~file .choice:,
+ semtex~file / true .code:n = \semantex_turn_semtex_file_on:,
+ semtex~file / false .code:n = \semantex_turn_semtex_file_off:,
+ semtex~file / .code:n = \semantex_turn_semtex_file_on:,
+ semtex~file / unknown .code:n = \msg_error:nnnn { semantex } { semantex_setup_key_value_not_found } { semtexfile } { #1 },
unknown .code:n = \msg_error:nnx { semantex } { semantex_setup_key_not_found } { \l_keys_key_str }
}
@@ -512,7 +512,7 @@
\semantex_class_do_output:N #1
\semantex_class_set_symbol:Nn #1 { ##1 }
\semantex_class_set_keys:Nn #1 { ##2 }
- \semantex_class_set_degreedefault:Nn #1 { ##3 }
+ \semantex_class_set_degree_default:Nn #1 { ##3 }
\semantex_class_set_arg:Nn #1 { ##4 }
}
}
@@ -523,7 +523,7 @@
\semantex_class_do_output:N #1
\semantex_class_set_symbol:Nn #1 { ##1 }
\semantex_class_set_keys:Nn #1 { ##2 }
- \semantex_class_set_degreedefault:Nn #1 { ##3 }
+ \semantex_class_set_degree_default:Nn #1 { ##3 }
}
}
}
@@ -610,7 +610,7 @@
\semantex_render_class:Nn #1 {
\semantex_class_do_output:N #1
\semantex_class_set_symbol:Nn #1 { ##1 }
- \semantex_class_set_degreedefault:Nn #1 { ##3 }
+ \semantex_class_set_degree_default:Nn #1 { ##3 }
\semantex_class_set_arg:Nn #1 { ##4 }
}
}
@@ -620,7 +620,7 @@
\semantex_render_class:Nn #1 {
\semantex_class_do_output:N #1
\semantex_class_set_symbol:Nn #1 { ##1 }
- \semantex_class_set_degreedefault:Nn #1 { ##3 }
+ \semantex_class_set_degree_default:Nn #1 { ##3 }
}
}
}
@@ -718,7 +718,7 @@
\semantex_class_set_symbol:Nn #1 { ##2 }
##1
\semantex_class_set_keys:Nn #1 { ##3 }
- \semantex_class_set_degreedefault:Nn #1 { ##4 }
+ \semantex_class_set_degree_default:Nn #1 { ##4 }
\semantex_class_set_arg:Nn #1 { ##5 }
}
}
@@ -730,7 +730,7 @@
\semantex_class_set_symbol:Nn #1 { ##2 }
##1
\semantex_class_set_keys:Nn #1 { ##3 }
- \semantex_class_set_degreedefault:Nn #1 { ##4 }
+ \semantex_class_set_degree_default:Nn #1 { ##4 }
}
}
}
@@ -824,7 +824,7 @@
\semantex_class_do_output:N #1
\semantex_class_set_symbol:Nn #1 { ##2 }
##1
- \semantex_class_set_degreedefault:Nn #1 { ##4 }
+ \semantex_class_set_degree_default:Nn #1 { ##4 }
\semantex_class_set_arg:Nn #1 { ##5 }
}
}
@@ -835,7 +835,7 @@
\semantex_class_do_output:N #1
\semantex_class_set_symbol:Nn #1 { ##2 }
##1
- \semantex_class_set_degreedefault:Nn #1 { ##4 }
+ \semantex_class_set_degree_default:Nn #1 { ##4 }
}
}
}
@@ -944,7 +944,7 @@
\semantex_render_object:Nn ##1 {
\semantex_object_do_output:N ##1
\semantex_object_set_keys:Nn ##1 { ####1 }
- \semantex_object_set_degreedefault:Nn ##1 { ####2 }
+ \semantex_object_set_degree_default:Nn ##1 { ####2 }
\semantex_object_set_arg:Nn ##1 { ####3 }
}
}
@@ -954,7 +954,7 @@
\semantex_render_object:Nn ##1 {
\semantex_object_do_output:N ##1
\semantex_object_set_keys:Nn ##1 { ####1 }
- \semantex_object_set_degreedefault:Nn ##1 { ####2 }
+ \semantex_object_set_degree_default:Nn ##1 { ####2 }
}
}
}
@@ -1034,7 +1034,7 @@
{ ##1 { ####2 } { ####3 } }
\semantex_render_object:Nn ##1 {
\semantex_object_do_output:N ##1
- \semantex_object_set_degreedefault:Nn ##1 { ####2 }
+ \semantex_object_set_degree_default:Nn ##1 { ####2 }
\semantex_object_set_arg:Nn ##1 { ####3 }
}
}
@@ -1043,7 +1043,7 @@
{ ##1 { ####2 } }
\semantex_render_object:Nn ##1 {
\semantex_object_do_output:N ##1
- \semantex_object_set_degreedefault:Nn ##1 { ####2 }
+ \semantex_object_set_degree_default:Nn ##1 { ####2 }
}
}
}
@@ -1178,8 +1178,8 @@
% ##2 = symbol
% ##3 = options
\semantex_new_object:NNn #1 { ##1 }{
- \semantex_object_set_leftpar:Nn ##1 { ##2 }
- \semantex_object_set_rightpar:Nn ##1 { ##3 }
+ \semantex_object_set_left_par:Nn ##1 { ##2 }
+ \semantex_object_set_right_par:Nn ##1 { ##3 }
\semantex_object_set_keys:Nn ##1 { ##4 }
}
% creates the object with name ##1
@@ -1408,14 +1408,14 @@
\semantex_valuekey:nnn { \semantex_object_to_register:N #1 } { arg } { #2 }
}
-\cs_new_protected:Npn\semantex_class_set_degreedefault:Nn#1#2
+\cs_new_protected:Npn\semantex_class_set_degree_default:Nn#1#2
{
- \semantex_valuekey:nnn { \semantex_class_to_register:N #1 } { degreedefault } { #2 }
+ \semantex_valuekey:nnn { \semantex_class_to_register:N #1 } { degree~default } { #2 }
}
-\cs_new_protected:Npn\semantex_object_set_degreedefault:Nn#1#2
+\cs_new_protected:Npn\semantex_object_set_degree_default:Nn#1#2
{
- \semantex_valuekey:nnn { \semantex_object_to_register:N #1 } { degreedefault } { #2 }
+ \semantex_valuekey:nnn { \semantex_object_to_register:N #1 } { degree~default } { #2 }
}
\cs_new_protected:Npn\semantex_class_use_bullet:N#1
@@ -1438,24 +1438,24 @@
\semantex_singlekey:nn { \semantex_object_to_register:N #1 } { * }
}
-\cs_new_protected:Npn\semantex_class_set_leftpar:Nn#1#2
+\cs_new_protected:Npn\semantex_class_set_left_par:Nn#1#2
{
- \semantex_data_tl_set:nnn { \semantex_class_to_register:N #1 } { leftpar } { #2 }
+ \semantex_data_tl_set:nnn { \semantex_class_to_register:N #1 } { left~par } { #2 }
}
-\cs_new_protected:Npn\semantex_object_set_leftpar:Nn#1#2
+\cs_new_protected:Npn\semantex_object_set_left_par:Nn#1#2
{
- \semantex_data_tl_set:nnn { \semantex_object_to_register:N #1 } { leftpar } { #2 }
+ \semantex_data_tl_set:nnn { \semantex_object_to_register:N #1 } { left~par } { #2 }
}
-\cs_new_protected:Npn\semantex_class_set_rightpar:Nn#1#2
+\cs_new_protected:Npn\semantex_class_set_right_par:Nn#1#2
{
- \semantex_data_tl_set:nnn { \semantex_class_to_register:N #1 } { rightpar } { #2 }
+ \semantex_data_tl_set:nnn { \semantex_class_to_register:N #1 } { right~par } { #2 }
}
-\cs_new_protected:Npn\semantex_object_set_rightpar:Nn#1#2
+\cs_new_protected:Npn\semantex_object_set_right_par:Nn#1#2
{
- \semantex_data_tl_set:nnn { \semantex_object_to_register:N #1 } { rightpar } { #2 }
+ \semantex_data_tl_set:nnn { \semantex_object_to_register:N #1 } { right~par } { #2 }
}
\cs_new_protected:Npn\semantex_object_set_class:Nn#1#2
@@ -1505,29 +1505,29 @@
\group_begin:
\cs_set:Nn\semantex_this: { #1 }
#2 % This is where keys can be set up
- \semantex_parse:n { #1 } % Run the "parse" routine, i.e. run the collection of code that the user has added via the key "parseoptions"
+ \semantex_singlekey:nn { #1 } { parse } % Run the "parse" routine, i.e. run the collection of code that the user has added via the key "parse options"
\semantex_data_bool_get:nnTF { #1 } { output } % Checks if the register is supposed to output
{
\semantex_inner_return:n { #1 }
\tl_set:Nx \l__semantex_render_output_class_temp_tl { \semantex_data_tl_get:nn { #1 } { output } } % The output class
- \exp_args:NNx\cs_set:Nn\l__semantex_render_outputoptions_temp_cs:n
- { \semantex_data_tl_get_exp_not:nn { #1 } { outputoptions } }
+ \exp_args:NNx\cs_set:Nn\l__semantex_render_output_options_temp_cs:n
+ { \semantex_data_tl_get_exp_not:nn { #1 } { output~options } }
% \cs_set:Nx did not work here, as it changes ##1 to #1, which we don't want.
- \tl_set:Nn\l__semantex_render_outputoptions_temp_tl
+ \tl_set:Nn\l__semantex_render_output_options_temp_tl
{
- \l__semantex_render_outputoptions_temp_cs:n
+ \l__semantex_render_output_options_temp_cs:n
}
- \tl_put_right:Nx \l__semantex_render_outputoptions_temp_tl
+ \tl_put_right:Nx \l__semantex_render_output_options_temp_tl
{
{ \l__semantex_render_output_class_temp_tl }
}
- \exp_args:NNo\tl_set:No \l__semantex_render_outputoptions_temp_tl
+ \exp_args:NNo\tl_set:No \l__semantex_render_output_options_temp_tl
{
- \l__semantex_render_outputoptions_temp_tl
+ \l__semantex_render_output_options_temp_tl
} % This was necessary, trust me.
- \semantex_data_int_if_positive:nnTF { #1 } { numberofarguments } % Checks if more than one argument has been received, i.e. whether we want to render any argument
+ \semantex_data_int_if_positive:nnTF { #1 } { number~of~arguments } % Checks if more than one argument has been received, i.e. whether we want to render any argument
{
- \semantex_data_bool_get:nnTF { #1 } { leftargument } % Checks if left or right argument
+ \semantex_data_bool_get:nnTF { #1 } { left~argument } % Checks if left or right argument
{
\semantex_left_indices_pre_return:n { #1 }
\semantex_left_arg_pre_return:n { #1 }
@@ -1543,20 +1543,20 @@
% immediately pass options to it
{
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { upperputleft } { \semantex_data_tl_get_exp_not:nn { #1 } { upper } }
+ { upper~put~left } { \semantex_data_tl_get_exp_not:nn { #1 } { upper } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { lowerputleft } { \semantex_data_tl_get_exp_not:nn { #1 } { lower } }
+ { lower~put~left } { \semantex_data_tl_get_exp_not:nn { #1 } { lower } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { preupper } { \semantex_data_tl_get_exp_not:nn { #1 } { preupper } }
+ { pre~upper } { \semantex_data_tl_get_exp_not:nn { #1 } { pre~upper } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { postupper } { \semantex_data_tl_get_exp_not:nn { #1 } { postupper } }
+ { post~upper } { \semantex_data_tl_get_exp_not:nn { #1 } { post~upper } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { prelower } { \semantex_data_tl_get_exp_not:nn { #1 } { prelower } }
+ { pre~lower } { \semantex_data_tl_get_exp_not:nn { #1 } { pre~lower } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { postlower } { \semantex_data_tl_get_exp_not:nn { #1 } { postlower } }
+ { post~lower } { \semantex_data_tl_get_exp_not:nn { #1 } { post~lower } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { mathclass } { \semantex_data_tl_get_exp_not:nn { #1 } { mathclass } }
- \exp_not:V \l__semantex_render_outputoptions_temp_tl
+ { math~class } { \semantex_data_tl_get_exp_not:nn { #1 } { math~class } }
+ \exp_not:V \l__semantex_render_output_options_temp_tl
% These are the options we pass to the output class so that it
% can eventually render it
}
@@ -1578,24 +1578,24 @@
% immediately pass options to it
{
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { upperleftputright } { \semantex_data_tl_get_exp_not:nn { #1 } { upperleft } }
+ { upper~left~put~right } { \semantex_data_tl_get_exp_not:nn { #1 } { upper~left } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { lowerleftputright } { \semantex_data_tl_get_exp_not:nn { #1 } { lowerleft } }
+ { lower~left~put~right } { \semantex_data_tl_get_exp_not:nn { #1 } { lower~left } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { preupperleft } { \semantex_data_tl_get_exp_not:nn { #1 } { preupperleft } }
+ { pre~upper~left } { \semantex_data_tl_get_exp_not:nn { #1 } { pre~upper~left } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { postupperleft } { \semantex_data_tl_get_exp_not:nn { #1 } { postupperleft } }
+ { post~upper~left } { \semantex_data_tl_get_exp_not:nn { #1 } { post~upper~left } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { prelowerleft } { \semantex_data_tl_get_exp_not:nn { #1 } { prelowerleft } }
+ { pre~lower~left } { \semantex_data_tl_get_exp_not:nn { #1 } { pre~lower~left } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { postlowerleft } { \semantex_data_tl_get_exp_not:nn { #1 } { postlowerleft } }
+ { post~lower~left } { \semantex_data_tl_get_exp_not:nn { #1 } { post~lower~left } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { heightphantom } { \semantex_data_tl_get_exp_not:nn { #1 } { heightphantom } }
+ { height~phantom } { \semantex_data_tl_get_exp_not:nn { #1 } { height~phantom } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { slantingphantom } { \semantex_data_tl_get_exp_not:nn { #1 } { slantingphantom } }
+ { slanting~phantom } { \semantex_data_tl_get_exp_not:nn { #1 } { slanting~phantom } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { mathclass } { \semantex_data_tl_get_exp_not:nn { #1 } { mathclass } }
- \exp_not:V \l__semantex_render_outputoptions_temp_tl
+ { math~class } { \semantex_data_tl_get_exp_not:nn { #1 } { math~class } }
+ \exp_not:V \l__semantex_render_output_options_temp_tl
% These are the options we pass to the output class so that it
% can eventually render it
}
@@ -1616,36 +1616,36 @@
% immediately pass options to it
{
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { upperputleft } { \semantex_data_tl_get_exp_not:nn { #1 } { upper } }
+ { upper~put~left } { \semantex_data_tl_get_exp_not:nn { #1 } { upper } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { lowerputleft } { \semantex_data_tl_get_exp_not:nn { #1 } { lower } }
+ { lower~put~left } { \semantex_data_tl_get_exp_not:nn { #1 } { lower } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { upperleftputright } { \semantex_data_tl_get_exp_not:nn { #1 } { upperleft } }
+ { upper~left~put~right } { \semantex_data_tl_get_exp_not:nn { #1 } { upper~left } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { lowerleftputright } { \semantex_data_tl_get_exp_not:nn { #1 } { lowerleft } }
+ { lower~left~put~right } { \semantex_data_tl_get_exp_not:nn { #1 } { lower~left } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { preupper } { \semantex_data_tl_get_exp_not:nn { #1 } { preupper } }
+ { pre~upper } { \semantex_data_tl_get_exp_not:nn { #1 } { pre~upper } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { postupper } { \semantex_data_tl_get_exp_not:nn { #1 } { postupper } }
+ { post~upper } { \semantex_data_tl_get_exp_not:nn { #1 } { post~upper } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { prelower } { \semantex_data_tl_get_exp_not:nn { #1 } { prelower } }
+ { pre~lower } { \semantex_data_tl_get_exp_not:nn { #1 } { pre~lower } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { postlower } { \semantex_data_tl_get_exp_not:nn { #1 } { postlower } }
+ { post~lower } { \semantex_data_tl_get_exp_not:nn { #1 } { post~lower } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { preupperleft } { \semantex_data_tl_get_exp_not:nn { #1 } { preupperleft } }
+ { pre~upper~left } { \semantex_data_tl_get_exp_not:nn { #1 } { pre~upper~left } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { postupperleft } { \semantex_data_tl_get_exp_not:nn { #1 } { postupperleft } }
+ { post~upper~left } { \semantex_data_tl_get_exp_not:nn { #1 } { post~upper~left } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { prelowerleft } { \semantex_data_tl_get_exp_not:nn { #1 } { prelowerleft } }
+ { pre~lower~left } { \semantex_data_tl_get_exp_not:nn { #1 } { pre~lower~left } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { postlowerleft } { \semantex_data_tl_get_exp_not:nn { #1 } { postlowerleft } }
+ { post~lower~left } { \semantex_data_tl_get_exp_not:nn { #1 } { post~lower~left } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { heightphantom } { \semantex_data_tl_get_exp_not:nn { #1 } { heightphantom } }
+ { height~phantom } { \semantex_data_tl_get_exp_not:nn { #1 } { height~phantom } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { slantingphantom } { \semantex_data_tl_get_exp_not:nn { #1 } { slantingphantom } }
+ { slanting~phantom } { \semantex_data_tl_get_exp_not:nn { #1 } { slanting~phantom } }
\exp_not:N\semantex_base_object_valuekey:nnn { \l__semantex_render_output_class_temp_tl }
- { mathclass } { \semantex_data_tl_get_exp_not:nn { #1 } { mathclass } }
- \exp_not:V \l__semantex_render_outputoptions_temp_tl
+ { math~class } { \semantex_data_tl_get_exp_not:nn { #1 } { math~class } }
+ \exp_not:V \l__semantex_render_output_options_temp_tl
% These are the options we pass to the output class so that it
% can eventually render it
}
@@ -1655,8 +1655,8 @@
}
{
\semantex_pre_return:n { #1 } % Performs the pre_return routine, i.e. adds all remaining indices and arguments to the symbol
- \tl_if_blank:xTF { \semantex_data_tl_get_exp_not:nn { #1 } { mathclass } }
- % Checks whether the mathclass register has been declared -- this is
+ \tl_if_blank:xTF { \semantex_data_tl_get_exp_not:nn { #1 } { math~class } }
+ % Checks whether the math~class register has been declared -- this is
% where you store \mathord, \mathbin, \mathrel, etc., if you want
% the object to be eventually wrapped in this.
{
@@ -1668,7 +1668,7 @@
{
\tl_set:Nx\l__semantex_render_temp_tl
{
- \semantex_data_tl_get_exp_not:nn { #1 } { mathclass }
+ \semantex_data_tl_get_exp_not:nn { #1 } { math~class }
{ \semantex_data_tl_get_exp_not:nn { #1 } { symbol } }
}
}
@@ -1760,43 +1760,43 @@
\cs_new_protected:Npn \semantex_parentheses_store:nN#1#2
{
- \semantex_data_tl_get_store:nnN { #1 } { parsize } \l__semantex_parentheses_store_temp_tl
+ \semantex_data_tl_get_store:nnN { #1 } { par~size } \l__semantex_parentheses_store_temp_tl
\str_case:VnF { \l__semantex_parentheses_store_temp_tl } % This is where \big,\Big, etc. go.
{
{ normal } {
\tl_set:Nx #2
{
\exp_not:N \SemantexMathOpen { }
- \semantex_data_tl_get_exp_not:nn { #1 } { leftpar }
- \semantex_data_tl_get_exp_not:nn { #1 } { prearg }
+ \semantex_data_tl_get_exp_not:nn { #1 } { left~par }
+ \semantex_data_tl_get_exp_not:nn { #1 } { pre~arg }
\semantex_data_tl_get_exp_not:nn { #1 } { arg }
- \semantex_data_tl_get_exp_not:nn { #1 } { postarg }
+ \semantex_data_tl_get_exp_not:nn { #1 } { post~arg }
\exp_not:N \SemantexMathClose { }
- \semantex_data_tl_get_exp_not:nn { #1 } { rightpar }
+ \semantex_data_tl_get_exp_not:nn { #1 } { right~par }
}
}
{ auto } {
\tl_set:Nx #2
{
\exp_not:N \SemantexMathOpenAuto
- \semantex_data_tl_get_exp_not:nn { #1 } { leftpar }
- \semantex_data_tl_get_exp_not:nn { #1 } { prearg }
+ \semantex_data_tl_get_exp_not:nn { #1 } { left~par }
+ \semantex_data_tl_get_exp_not:nn { #1 } { pre~arg }
\semantex_data_tl_get_exp_not:nn { #1 } { arg }
- \semantex_data_tl_get_exp_not:nn { #1 } { postarg }
+ \semantex_data_tl_get_exp_not:nn { #1 } { post~arg }
\exp_not:N \SemantexMathCloseAuto
- \semantex_data_tl_get_exp_not:nn { #1 } { rightpar }
+ \semantex_data_tl_get_exp_not:nn { #1 } { right~par }
}
}
{ * } {
\tl_set:Nx #2
{
\exp_not:N \SemantexMathOpenAuto
- \semantex_data_tl_get_exp_not:nn { #1 } { leftpar }
- \semantex_data_tl_get_exp_not:nn { #1 } { prearg }
+ \semantex_data_tl_get_exp_not:nn { #1 } { left~par }
+ \semantex_data_tl_get_exp_not:nn { #1 } { pre~arg }
\semantex_data_tl_get_exp_not:nn { #1 } { arg }
- \semantex_data_tl_get_exp_not:nn { #1 } { postarg }
+ \semantex_data_tl_get_exp_not:nn { #1 } { post~arg }
\exp_not:N \SemantexMathCloseAuto
- \semantex_data_tl_get_exp_not:nn { #1 } { rightpar }
+ \semantex_data_tl_get_exp_not:nn { #1 } { right~par }
}
}
}
@@ -1805,13 +1805,13 @@
{
\exp_not:N \SemantexMathOpen
\exp_not:V \l__semantex_parentheses_store_temp_tl
- \semantex_data_tl_get_exp_not:nn { #1 } { leftpar }
- \semantex_data_tl_get_exp_not:nn { #1 } { prearg }
+ \semantex_data_tl_get_exp_not:nn { #1 } { left~par }
+ \semantex_data_tl_get_exp_not:nn { #1 } { pre~arg }
\semantex_data_tl_get_exp_not:nn { #1 } { arg }
- \semantex_data_tl_get_exp_not:nn { #1 } { postarg }
+ \semantex_data_tl_get_exp_not:nn { #1 } { post~arg }
\exp_not:N \SemantexMathClose
\exp_not:V \l__semantex_parentheses_store_temp_tl
- \semantex_data_tl_get_exp_not:nn { #1 } { rightpar }
+ \semantex_data_tl_get_exp_not:nn { #1 } { right~par }
}
}
}
@@ -1826,9 +1826,9 @@
\tl_set:Nx#2
{
\exp_not:N\SemantexMathOpenNoPar
- \semantex_data_tl_get_exp_not:nn { #1 } { prearg }
+ \semantex_data_tl_get_exp_not:nn { #1 } { pre~arg }
\semantex_data_tl_get_exp_not:nn { #1 } { arg }
- \semantex_data_tl_get_exp_not:nn { #1 } { postarg }
+ \semantex_data_tl_get_exp_not:nn { #1 } { post~arg }
\exp_not:N\SemantexMathCloseNoPar
}
}
@@ -1921,14 +1921,14 @@
\cs_new_protected:Npn\semantex_inner_return:n#1
{
\semantex_inner_pre_return:n { #1 }
- \semantex_data_seq_clear:nn { #1 } { commands_sequence }
+ \semantex_data_seq_clear:nn { #1 } { commands~sequence }
}
\cs_new_protected:Npn\semantex_inner_pre_return:n#1
{
% This adds all of the commands added via the command key
% to the symbol
- \semantex_data_seq_get_store:nnN { #1 } { commands_sequence }
+ \semantex_data_seq_get_store:nnN { #1 } { commands~sequence }
\l__semantex_data_seq_commands_sequence_temp
\seq_map_inline:Nn \l__semantex_data_seq_commands_sequence_temp
{
@@ -1940,7 +1940,7 @@
}
}
}
- \semantex_data_seq_clear:nn { #1 } { commands_sequence }
+ \semantex_data_seq_clear:nn { #1 } { commands~sequence }
}
\cs_new_protected:Npn\semantex_right_return:n#1
@@ -1954,15 +1954,15 @@
{
\semantex_right_indices_pre_return:n { #1 }
\semantex_data_tl_clear:nn { #1 } { upper }
- \semantex_data_tl_clear:nn { #1 } { preupper }
- \semantex_data_tl_clear:nn { #1 } { postupper }
- \semantex_data_bool_set_false:nn { #1 } { nextupperwithsep }
- \semantex_data_int_clear:nn { #1 } { numberofupperindices }
+ \semantex_data_tl_clear:nn { #1 } { pre~upper }
+ \semantex_data_tl_clear:nn { #1 } { post~upper }
+ \semantex_data_bool_set_false:nn { #1 } { next~upper~with~sep }
+ \semantex_data_int_clear:nn { #1 } { number~of~upper~indices }
\semantex_data_tl_clear:nn { #1 } { lower }
- \semantex_data_tl_clear:nn { #1 } { prelower }
- \semantex_data_tl_clear:nn { #1 } { postlower }
- \semantex_data_bool_set_false:nn { #1 } { nextlowerwithsep }
- \semantex_data_int_clear:nn { #1 } { numberoflowerindices }
+ \semantex_data_tl_clear:nn { #1 } { pre~lower }
+ \semantex_data_tl_clear:nn { #1 } { post~lower }
+ \semantex_data_bool_set_false:nn { #1 } { next~lower~with~sep }
+ \semantex_data_int_clear:nn { #1 } { number~of~lower~indices }
}
\cs_new_protected:Npn\semantex_right_indices_pre_return:n#1
@@ -1978,28 +1978,28 @@
\cs_new_protected:Npn \_semantex_right_index_return_store:nN#1#2
{
\tl_set:Nn#2{}
- \semantex_data_int_if_positive:nnTF { #1 } { numberoflowerindices }
+ \semantex_data_int_if_positive:nnTF { #1 } { number~of~lower~indices }
{
\tl_put_right:Nx#2
{
\sb{
- \semantex_data_tl_get_exp_not:nn { #1 } { prelower }
+ \semantex_data_tl_get_exp_not:nn { #1 } { pre~lower }
\semantex_data_tl_get_exp_not:nn { #1 } { lower }
- \semantex_data_tl_get_exp_not:nn { #1 } { postlower }
+ \semantex_data_tl_get_exp_not:nn { #1 } { post~lower }
}
}
}
{
% do nothing
}
- \semantex_data_int_if_positive:nnTF { #1 } { numberofupperindices }
+ \semantex_data_int_if_positive:nnTF { #1 } { number~of~upper~indices }
{
\tl_put_right:Nx#2
{
\sp{
- \semantex_data_tl_get_exp_not:nn { #1 } { preupper }
+ \semantex_data_tl_get_exp_not:nn { #1 } { pre~upper }
\semantex_data_tl_get_exp_not:nn { #1 } { upper }
- \semantex_data_tl_get_exp_not:nn { #1 } { postupper }
+ \semantex_data_tl_get_exp_not:nn { #1 } { post~upper }
}
}
}
@@ -2018,21 +2018,21 @@
\cs_new_protected:Npn\semantex_left_index_return:n#1
{
\semantex_left_indices_pre_return:n { #1 }
- \semantex_data_tl_clear:nn { #1 } { upperleft }
- \semantex_data_tl_clear:nn { #1 } { preupperleft }
- \semantex_data_tl_clear:nn { #1 } { postupperleft }
- \semantex_data_bool_set_false:nn { #1 } { nextupperleftwithsep }
- \semantex_data_int_clear:nn { #1 } { numberofupperleftindices }
- \semantex_data_tl_clear:nn { #1 } { lowerleft }
- \semantex_data_tl_clear:nn { #1 } { prelowerleft }
- \semantex_data_tl_clear:nn { #1 } { postlowerleft }
- \semantex_data_bool_set_false:nn { #1 } { nextlowerleftwithsep }
- \semantex_data_int_clear:nn { #1 } { numberoflowerleftindices }
- \semantex_data_tl_set:nnx { #1 } { heightphantom }
+ \semantex_data_tl_clear:nn { #1 } { upper~left }
+ \semantex_data_tl_clear:nn { #1 } { pre~upper~left }
+ \semantex_data_tl_clear:nn { #1 } { post~upper~left }
+ \semantex_data_bool_set_false:nn { #1 } { next~upper~left~with~sep }
+ \semantex_data_int_clear:nn { #1 } { number~of~upper~left~indices }
+ \semantex_data_tl_clear:nn { #1 } { lower~left }
+ \semantex_data_tl_clear:nn { #1 } { pre~lower~left }
+ \semantex_data_tl_clear:nn { #1 } { post~lower~left }
+ \semantex_data_bool_set_false:nn { #1 } { next~lower~left~with~sep }
+ \semantex_data_int_clear:nn { #1 } { number~of~lower~left~indices }
+ \semantex_data_tl_set:nnx { #1 } { height~phantom }
{
\semantex_data_tl_get_exp_not:nn { #1 } { symbol }
}
- \semantex_data_tl_clear:nn { #1 } { slantingphantom }
+ \semantex_data_tl_clear:nn { #1 } { slanting~phantom }
}
\cs_new_protected:Npn\semantex_left_indices_pre_return:n#1
@@ -2048,27 +2048,27 @@
\cs_new_protected:Npn \_semantex_left_index_return_store:nN#1#2
{
\tl_set:Nn#2{}
- \semantex_data_int_if_positive:nnTF { #1 } { numberofupperleftindices }
+ \semantex_data_int_if_positive:nnTF { #1 } { number~of~upper~left~indices }
{
\tl_put_right:Nn #2 { \manualleftindex }
\tl_put_right:Nx #2
{
- { \semantex_data_tl_get_exp_not:nn { #1 } { heightphantom } }
- { \semantex_data_tl_get_exp_not:nn { #1 } { slantingphantom} }
+ { \semantex_data_tl_get_exp_not:nn { #1 } { height~phantom } }
+ { \semantex_data_tl_get_exp_not:nn { #1 } { slanting~phantom} }
{
- \semantex_data_tl_get_exp_not:nn { #1 } { preupperleft }
- \semantex_data_tl_get_exp_not:nn { #1 } { upperleft }
- \semantex_data_tl_get_exp_not:nn { #1 } { postupperleft }
+ \semantex_data_tl_get_exp_not:nn { #1 } { pre~upper~left }
+ \semantex_data_tl_get_exp_not:nn { #1 } { upper~left }
+ \semantex_data_tl_get_exp_not:nn { #1 } { post~upper~left }
}
}
- \semantex_data_int_if_positive:nnTF { #1 } { numberoflowerleftindices }
+ \semantex_data_int_if_positive:nnTF { #1 } { number~of~lower~left~indices }
{
\tl_put_right:Nx#2
{
{
- \semantex_data_tl_get_exp_not:nn { #1 } { prelowerleft }
- \semantex_data_tl_get_exp_not:nn { #1 } { lowerleft }
- \semantex_data_tl_get_exp_not:nn { #1 } { postlowerleft }
+ \semantex_data_tl_get_exp_not:nn { #1 } { pre~lower~left }
+ \semantex_data_tl_get_exp_not:nn { #1 } { lower~left }
+ \semantex_data_tl_get_exp_not:nn { #1 } { post~lower~left }
}
}
}
@@ -2080,18 +2080,18 @@
}
}
{
- \semantex_data_int_if_positive:nnTF { #1 } { numberoflowerleftindices }
+ \semantex_data_int_if_positive:nnTF { #1 } { number~of~lower~left~indices }
{
\tl_put_right:Nn #2 { \manualleftindex }
\tl_put_right:Nx #2
{
- { \semantex_data_tl_get_exp_not:nn { #1 } { heightphantom } }
- { \semantex_data_tl_get_exp_not:nn { #1 } { slantingphantom} }
+ { \semantex_data_tl_get_exp_not:nn { #1 } { height~phantom } }
+ { \semantex_data_tl_get_exp_not:nn { #1 } { slanting~phantom} }
{ }
{
- \semantex_data_tl_get_exp_not:nn { #1 } { prelowerleft }
- \semantex_data_tl_get_exp_not:nn { #1 } { lowerleft }
- \semantex_data_tl_get_exp_not:nn { #1 } { postlowerleft }
+ \semantex_data_tl_get_exp_not:nn { #1 } { pre~lower~left }
+ \semantex_data_tl_get_exp_not:nn { #1 } { lower~left }
+ \semantex_data_tl_get_exp_not:nn { #1 } { post~lower~left }
}
}
}
@@ -2103,7 +2103,7 @@
\cs_new_protected:Npn\semantex_right_arg_return:n#1
{
- \semantex_data_bool_get:nnTF { #1 } { leftargument }
+ \semantex_data_bool_get:nnTF { #1 } { left~argument }
{
% do nothing
}
@@ -2115,16 +2115,16 @@
\l__semantex_rightreturn_arg_temp
}
\semantex_data_tl_clear:nn { #1 } { arg }
- \semantex_data_tl_clear:nn { #1 } { prearg }
- \semantex_data_tl_clear:nn { #1 } { postarg }
- \semantex_data_int_clear:nn { #1 } { numberofarguments }
- \semantex_data_bool_set_false:nn { #1 } { nextargwithsep }
+ \semantex_data_tl_clear:nn { #1 } { pre~arg }
+ \semantex_data_tl_clear:nn { #1 } { post~arg }
+ \semantex_data_int_clear:nn { #1 } { number~of~arguments }
+ \semantex_data_bool_set_false:nn { #1 } { next~arg~with~sep }
}
}
\cs_new_protected:Npn\semantex_right_arg_pre_return:n#1
{
- \semantex_data_bool_get:nnTF { #1 } { leftargument }
+ \semantex_data_bool_get:nnTF { #1 } { left~argument }
{
% do nothing
}
@@ -2140,7 +2140,7 @@
\cs_new_protected:Npn\semantex_left_arg_return:n#1
{
- \semantex_data_bool_get:nnTF { #1 } { leftargument }
+ \semantex_data_bool_get:nnTF { #1 } { left~argument }
{
\_semantex_arg_return_store:nN { #1 } \l__semantex_leftreturn_arg_temp
\semantex_data_tl_put_left:nnx { #1 } { symbol }
@@ -2148,10 +2148,10 @@
\exp_not:V \l__semantex_leftreturn_arg_temp
}
\semantex_data_tl_clear:nn { #1 } { arg }
- \semantex_data_tl_clear:nn { #1 } { prearg }
- \semantex_data_tl_clear:nn { #1 } { postarg }
- \semantex_data_int_clear:nn { #1 } { numberofarguments }
- \semantex_data_bool_set_false:nn { #1 } { nextargwithsep }
+ \semantex_data_tl_clear:nn { #1 } { pre~arg }
+ \semantex_data_tl_clear:nn { #1 } { post~arg }
+ \semantex_data_int_clear:nn { #1 } { number~of~arguments }
+ \semantex_data_bool_set_false:nn { #1 } { next~arg~with~sep }
}
{
% do nothing
@@ -2160,7 +2160,7 @@
\cs_new_protected:Npn\semantex_left_arg_pre_return:n#1
{
- \semantex_data_bool_get:nnTF { #1 } { leftargument }
+ \semantex_data_bool_get:nnTF { #1 } { left~argument }
{
\_semantex_arg_return_store:nN { #1 } \l__semantex_leftreturn_arg_temp
\semantex_data_tl_put_left:nnx { #1 } { symbol }
@@ -2177,15 +2177,15 @@
{
\semantex_arg_pre_return:n { #1 }
\semantex_data_tl_clear:nn { #1 } { arg }
- \semantex_data_tl_clear:nn { #1 } { prearg }
- \semantex_data_tl_clear:nn { #1 } { postarg }
- \semantex_data_int_clear:nn { #1 } { numberofarguments }
- \semantex_data_bool_set_false:nn { #1 } { nextargwithsep }
+ \semantex_data_tl_clear:nn { #1 } { pre~arg }
+ \semantex_data_tl_clear:nn { #1 } { post~arg }
+ \semantex_data_int_clear:nn { #1 } { number~of~arguments }
+ \semantex_data_bool_set_false:nn { #1 } { next~arg~with~sep }
}
\cs_new_protected:Npn\semantex_arg_pre_return:n#1
{
- \semantex_data_bool_get:nnTF { #1 } { leftargument }
+ \semantex_data_bool_get:nnTF { #1 } { left~argument }
{
\_semantex_arg_return_store:nN { #1 } \l__semantex_leftreturn_arg_temp
\semantex_data_tl_put_left:nnx { #1 } { symbol }
@@ -2207,7 +2207,7 @@
{
\semantex_data_bool_get:nnTF { #1 } { par }
{
- \semantex_data_int_if_positive:nnTF { #1 } { numberofarguments }
+ \semantex_data_int_if_positive:nnTF { #1 } { number~of~arguments }
{
\semantex_parentheses_store:nN { #1 } #2
}
@@ -2216,14 +2216,14 @@
}
}
{
- \semantex_data_bool_get:nnTF { #1 } { flexpar }
+ \semantex_data_bool_get:nnTF { #1 } { flex~par }
{
- \semantex_data_int_if_greater_than_one:nnTF { #1 } { numberofarguments }
+ \semantex_data_int_if_greater_than_one:nnTF { #1 } { number~of~arguments }
{
\semantex_parentheses_store:nN { #1 } #2
}
{
- \semantex_data_int_if_positive:nnTF { #1 } { numberofarguments }
+ \semantex_data_int_if_positive:nnTF { #1 } { number~of~arguments }
{
\semantex_no_parentheses_store:nN { #1 } #2
}
@@ -2233,7 +2233,7 @@
}
}
{
- \semantex_data_int_if_positive:nnTF { #1 } { numberofarguments }
+ \semantex_data_int_if_positive:nnTF { #1 } { number~of~arguments }
{
\semantex_no_parentheses_store:nN { #1 } #2
}
@@ -2259,16 +2259,16 @@
\semantex_return:n { #1 }
\tl_if_blank:nTF { #2 }
{
- \semantex_data_tl_get_store:nnN { #1 } { sparsize }
- \l__semantex_spar_sparsize_temp_tl
+ \semantex_data_tl_get_store:nnN { #1 } { spar~size }
+ \l__semantex_spar_spar_size_temp_tl
}
{
- \tl_set:Nn \l__semantex_spar_sparsize_temp_tl { #2 }
+ \tl_set:Nn \l__semantex_spar_spar_size_temp_tl { #2 }
}
\__semantex_symbol_parentheses_store:xxxxN
- { \exp_not:V\l__semantex_spar_sparsize_temp_tl }
- { \semantex_data_tl_get_exp_not:nn { #1 } { leftspar } }
- { \semantex_data_tl_get_exp_not:nn { #1 } { rightspar } }
+ { \exp_not:V\l__semantex_spar_spar_size_temp_tl }
+ { \semantex_data_tl_get_exp_not:nn { #1 } { left~spar } }
+ { \semantex_data_tl_get_exp_not:nn { #1 } { right~spar } }
{ \semantex_data_tl_get_exp_not:nn { #1 } { symbol } }
\l__semantex_spar_temp_tl
\semantex_data_tl_set:nnx { #1 } { symbol }
@@ -2276,16 +2276,16 @@
\exp_not:V \l__semantex_spar_temp_tl
}
\semantex_spar_set_height_phantom_to_parentheses_size:nx { #1 }
- { \exp_not:V \l__semantex_spar_sparsize_temp_tl }
+ { \exp_not:V \l__semantex_spar_spar_size_temp_tl }
}
\cs_new_protected:Npn\semantex_other_spar:nnn#1#2#3
{
\semantex_return:n { #1 }
- \semantex_data_tl_get_store:nnN { #1 } { sparsize }
- \l__semantex_other_spar_sparsize_temp_tl
+ \semantex_data_tl_get_store:nnN { #1 } { spar~size }
+ \l__semantex_other_spar_spar_size_temp_tl
\__semantex_symbol_parentheses_store:xxxxN
- { \exp_not:V \l__semantex_other_spar_sparsize_temp_tl }
+ { \exp_not:V \l__semantex_other_spar_spar_size_temp_tl }
{ \exp_not:n { #2 } }
{ \exp_not:n { #3 } }
{ \semantex_data_tl_get_exp_not:nn { #1 } { symbol } }
@@ -2295,7 +2295,7 @@
\exp_not:V \l__semantex_other_spar_temp_tl
}
\semantex_spar_set_height_phantom_to_parentheses_size:nx { #1 }
- { \exp_not:V \l__semantex_other_spar_sparsize_temp_tl }
+ { \exp_not:V \l__semantex_other_spar_spar_size_temp_tl }
}
\cs_new_protected:Npn\semantex_other_spar_with_size:nnnn#1#2#3#4
@@ -2322,23 +2322,23 @@
\str_case:nnF { #2 }
{
{ normal } {
- \semantex_data_tl_set:nnn { #1 } { heightphantom } { \vert }
+ \semantex_data_tl_set:nnn { #1 } { height~phantom } { \vert }
}
{ auto } {
- \semantex_data_tl_set:nnx { #1 } { heightphantom }
+ \semantex_data_tl_set:nnx { #1 } { height~phantom }
{
\semantex_data_tl_get_exp_not:nn { #1 } { symbol }
}
}
{ * } {
- \semantex_data_tl_set:nnx { #1 } { heightphantom }
+ \semantex_data_tl_set:nnx { #1 } { height~phantom }
{
\semantex_data_tl_get_exp_not:nn { #1 } { symbol }
}
}
}
{
- \semantex_data_tl_set:nnx { #1 } { heightphantom }
+ \semantex_data_tl_set:nnx { #1 } { height~phantom }
{
\exp_not:n { #2 \vert }
}
@@ -3053,6 +3053,246 @@
\cs_generate_variant:Nn \__semantex_singlekey_x:nnn { fnn }
+\cs_new_protected:Npn\semantex_valuekey_store:nnN#1#2#3
+{
+ % Stores the content of the valuekey
+ % i.e. keys taking a value
+ % #1 = register
+ % #2 = name of the key
+ % #3 = command to store the content in
+ \cs_if_exist:cTF { __semantex_data_cs_custom_valuekey_#1_\tl_trim_spaces:n{#2}:nn }
+ {
+ \exp_args:NNNo \exp_args:NNo\tl_set:No#3 { \use:c { __semantex_data_cs_custom_valuekey_#1_\tl_trim_spaces:n{#2}:nn } { ##1 } { ##2 } }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
+ {
+ \tl_set:Nn #3 {}
+ }
+ {
+ \semantex_valuekey_store:fnN { \semantex_data_parent_get:n { #1 } } { #2 } #3
+ }
+ }
+}
+
+\cs_generate_variant:Nn \semantex_valuekey_store:nnN { fnN }
+
+\cs_new_protected:Npn\semantex_singlekey_store:nnN#1#2#3
+{
+ % Stores the content of the singlekey
+ % #1 = register
+ % #2 = name of the key
+ % #3 = command to store the content in
+ \cs_if_exist:cTF { __semantex_data_cs_custom_singlekey_#1_\tl_trim_spaces:n{#2}:n }
+ {
+ \exp_args:NNNo \exp_args:NNo\tl_set:No#3 { \use:c { __semantex_data_cs_custom_singlekey_#1_\tl_trim_spaces:n{#2}:n } { ##1 } }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
+ {
+ \tl_set:Nn #3 {}
+ }
+ {
+ \semantex_singlekey_store:fnN { \semantex_data_parent_get:n { #1 } } { #2 } #3
+ }
+ }
+}
+
+\cs_generate_variant:Nn \semantex_singlekey_store:nnN { fnN }
+
+\cs_new_protected:Npn\semantex_two_valuekey_store:nnN#1#2#3
+{
+ % Stores the content of the valuekey
+ % i.e. keys taking a value
+ % #1 = register
+ % #2 = name of the key
+ % #3 = command to store the content in
+ \cs_if_exist:cTF { __semantex_data_cs_custom_two_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnn }
+ {
+ \exp_args:NNNo \exp_args:NNo\tl_set:No#3 { \use:c { __semantex_data_cs_custom_two_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnn } { ##1 } { ##2 } { ##3 } }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
+ {
+ \tl_set:Nn #3 {}
+ }
+ {
+ \semantex_two_valuekey_store:fnN { \semantex_data_parent_get:n { #1 } } { #2 } #3
+ }
+ }
+}
+
+\cs_generate_variant:Nn \semantex_two_valuekey_store:nnN { fnN }
+
+\cs_new_protected:Npn\semantex_three_valuekey_store:nnN#1#2#3
+{
+ % Stores the content of the valuekey
+ % i.e. keys taking a value
+ % #1 = register
+ % #2 = name of the key
+ % #3 = command to store the content in
+ \cs_if_exist:cTF { __semantex_data_cs_custom_three_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnn }
+ {
+ \exp_args:NNNo \exp_args:NNo\tl_set:No#3 { \use:c { __semantex_data_cs_custom_three_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnn } { ##1 } { ##2 } { ##3 } { ##4 } }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
+ {
+ \tl_set:Nn #3 {}
+ }
+ {
+ \semantex_three_valuekey_store:fnN { \semantex_data_parent_get:n { #1 } } { #2 } #3
+ }
+ }
+}
+
+\cs_generate_variant:Nn \semantex_three_valuekey_store:nnN { fnN }
+
+\cs_new_protected:Npn\semantex_four_valuekey_store:nnN#1#2#3
+{
+ % Stores the content of the valuekey
+ % i.e. keys taking a value
+ % #1 = register
+ % #2 = name of the key
+ % #3 = command to store the content in
+ \cs_if_exist:cTF { __semantex_data_cs_custom_four_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnn }
+ {
+ \exp_args:NNNo \exp_args:NNo\tl_set:No#3 { \use:c { __semantex_data_cs_custom_four_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnn } { ##1 } { ##2 } { ##3 } { ##4 } { ##5 } }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
+ {
+ \tl_set:Nn #3 {}
+ }
+ {
+ \semantex_four_valuekey_store:fnN { \semantex_data_parent_get:n { #1 } } { #2 } #3
+ }
+ }
+}
+
+\cs_generate_variant:Nn \semantex_four_valuekey_store:nnN { fnN }
+
+\cs_new_protected:Npn\semantex_five_valuekey_store:nnN#1#2#3
+{
+ % Stores the content of the valuekey
+ % i.e. keys taking a value
+ % #1 = register
+ % #2 = name of the key
+ % #3 = command to store the content in
+ \cs_if_exist:cTF { __semantex_data_cs_custom_five_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnn }
+ {
+ \exp_args:NNNo \exp_args:NNo\tl_set:No#3 { \use:c { __semantex_data_cs_custom_five_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnn } { ##1 } { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
+ {
+ \tl_set:Nn #3 {}
+ }
+ {
+ \semantex_five_valuekey_store:fnN { \semantex_data_parent_get:n { #1 } } { #2 } #3
+ }
+ }
+}
+
+\cs_generate_variant:Nn \semantex_five_valuekey_store:nnN { fnN }
+
+\cs_new_protected:Npn\semantex_six_valuekey_store:nnN#1#2#3
+{
+ % Stores the content of the valuekey
+ % i.e. keys taking a value
+ % #1 = register
+ % #2 = name of the key
+ % #3 = command to store the content in
+ \cs_if_exist:cTF { __semantex_data_cs_custom_six_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnn }
+ {
+ \exp_args:NNNo \exp_args:NNo\tl_set:No#3 { \use:c { __semantex_data_cs_custom_six_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnn } { ##1 } { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
+ {
+ \tl_set:Nn #3 {}
+ }
+ {
+ \semantex_six_valuekey_store:fnN { \semantex_data_parent_get:n { #1 } } { #2 } #3
+ }
+ }
+}
+
+\cs_generate_variant:Nn \semantex_six_valuekey_store:nnN { fnN }
+
+\cs_new_protected:Npn\semantex_seven_valuekey_store:nnN#1#2#3
+{
+ % Stores the content of the valuekey
+ % i.e. keys taking a value
+ % #1 = register
+ % #2 = name of the key
+ % #3 = command to store the content in
+ \cs_if_exist:cTF { __semantex_data_cs_custom_seven_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnn }
+ {
+ \exp_args:NNNo \exp_args:NNo\tl_set:No#3 { \use:c { __semantex_data_cs_custom_seven_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnn } { ##1 } { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } { ##8 } }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
+ {
+ \tl_set:Nn #3 {}
+ }
+ {
+ \semantex_seven_valuekey_store:fnN { \semantex_data_parent_get:n { #1 } } { #2 } #3
+ }
+ }
+}
+
+\cs_generate_variant:Nn \semantex_seven_valuekey_store:nnN { fnN }
+
+\cs_new_protected:Npn\semantex_eight_valuekey_store:nnN#1#2#3
+{
+ % Stores the content of the valuekey
+ % i.e. keys taking a value
+ % #1 = register
+ % #2 = name of the key
+ % #3 = command to store the content in
+ \cs_if_exist:cTF { __semantex_data_cs_custom_eight_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn }
+ {
+ \exp_args:NNNo \exp_args:NNo\tl_set:No#3 { \use:c { __semantex_data_cs_custom_eight_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn } { ##1 } { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } { ##8 } { ##9 } }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
+ {
+ \tl_set:Nn #3 {}
+ }
+ {
+ \semantex_eight_valuekey_store:fnN { \semantex_data_parent_get:n { #1 } } { #2 } #3
+ }
+ }
+}
+
+\cs_generate_variant:Nn \semantex_eight_valuekey_store:nnN { fnN }
+
+\cs_new_protected:Npn\semantex_nine_valuekey_store:nnN#1#2#3
+{
+ % Stores the content of the valuekey
+ % i.e. keys taking a value
+ % #1 = register
+ % #2 = name of the key
+ % #3 = command to store the content in
+ \cs_if_exist:cTF { __semantex_data_cs_custom_nine_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn }
+ {
+ \exp_args:NNNo \exp_args:NNo\tl_set:No#3 { \use:c { __semantex_data_cs_custom_nine_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn } { ##1 } { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } { ##8 } { ##9 } }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
+ {
+ \tl_set:Nn #3 {}
+ }
+ {
+ \semantex_nine_valuekey_store:fnN { \semantex_data_parent_get:n { #1 } } { #2 } #3
+ }
+ }
+}
+
+\cs_generate_variant:Nn \semantex_nine_valuekey_store:nnN { fnN }
+
+
\cs_new_protected:Npn\semantex_arg_valuekey:nnn#1#2#3
{
% Takes care of argument valuekeys,
@@ -3146,12 +3386,251 @@
{
% Sets the argument (no keyval interface allowed)
\semantex_data_tl_put_right:nnn { #1 } { arg } { #2 }
- \semantex_data_int_incr:nn { #1 } { numberofarguments }
- \semantex_data_bool_set_true:nn { #1 } { nextargwithsep }
+ \semantex_data_int_incr:nn { #1 } { number~of~arguments }
+ \semantex_data_bool_set_true:nn { #1 } { next~arg~with~sep }
}
\cs_generate_variant:Nn \semantex_arg_without_keyval:nn { nx }
+\cs_new_protected:Npn\semantex_arg_valuekey_store:nnN#1#2#3
+{
+ % Stores the content of the argument valuekey
+ % i.e. keys taking a value
+ % #1 = register
+ % #2 = name of the key
+ % #3 = command to store the content in
+ \cs_if_exist:cTF { __semantex_data_cs_custom_arg_valuekey_#1_\tl_trim_spaces:n{#2}:nn }
+ {
+ \exp_args:NNNo \exp_args:NNo\tl_set:No#3 { \use:c { __semantex_data_cs_custom_arg_valuekey_#1_\tl_trim_spaces:n{#2}:nn } { ##1 } { ##2 } }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
+ {
+ \tl_set:Nn #3 {}
+ }
+ {
+ \semantex_arg_valuekey_store:fnN { \semantex_data_parent_get:n { #1 } } { #2 } #3
+ }
+ }
+}
+
+\cs_generate_variant:Nn \semantex_arg_valuekey_store:nnN { fnN }
+
+\cs_new_protected:Npn\semantex_arg_singlekey_store:nnN#1#2#3
+{
+ % Stores the content of the argument singlekey
+ % #1 = register
+ % #2 = name of the key
+ % #3 = command to store the content in
+ \cs_if_exist:cTF { __semantex_data_cs_custom_arg_singlekey_#1_\tl_trim_spaces:n{#2}:n }
+ {
+ \exp_args:NNNo \exp_args:NNo\tl_set:No#3 { \use:c { __semantex_data_cs_custom_arg_singlekey_#1_\tl_trim_spaces:n{#2}:n } { ##1 } }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
+ {
+ \tl_set:Nn #3 {}
+ }
+ {
+ \semantex_arg_singlekey_store:fnN { \semantex_data_parent_get:n { #1 } } { #2 } #3
+ }
+ }
+}
+
+\cs_generate_variant:Nn \semantex_arg_singlekey_store:nnN { fnN }
+
+\cs_new_protected:Npn\semantex_arg_two_valuekey_store:nnN#1#2#3
+{
+ % Stores the content of the argument valuekey
+ % i.e. keys taking a value
+ % #1 = register
+ % #2 = name of the key
+ % #3 = command to store the content in
+ \cs_if_exist:cTF { __semantex_data_cs_custom_arg_two_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnn }
+ {
+ \exp_args:NNNo \exp_args:NNo\tl_set:No#3 { \use:c { __semantex_data_cs_custom_arg_two_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnn } { ##1 } { ##2 } { ##3 } }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
+ {
+ \tl_set:Nn #3 {}
+ }
+ {
+ \semantex_arg_two_valuekey_store:fnN { \semantex_data_parent_get:n { #1 } } { #2 } #3
+ }
+ }
+}
+
+\cs_generate_variant:Nn \semantex_arg_two_valuekey_store:nnN { fnN }
+
+\cs_new_protected:Npn\semantex_arg_three_valuekey_store:nnN#1#2#3
+{
+ % Stores the content of the argument valuekey
+ % i.e. keys taking a value
+ % #1 = register
+ % #2 = name of the key
+ % #3 = command to store the content in
+ \cs_if_exist:cTF { __semantex_data_cs_custom_arg_three_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnn }
+ {
+ \exp_args:NNNo \exp_args:NNo\tl_set:No#3 { \use:c { __semantex_data_cs_custom_arg_three_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnn } { ##1 } { ##2 } { ##3 } { ##4 } }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
+ {
+ \tl_set:Nn #3 {}
+ }
+ {
+ \semantex_arg_three_valuekey_store:fnN { \semantex_data_parent_get:n { #1 } } { #2 } #3
+ }
+ }
+}
+
+\cs_generate_variant:Nn \semantex_arg_three_valuekey_store:nnN { fnN }
+
+\cs_new_protected:Npn\semantex_arg_four_valuekey_store:nnN#1#2#3
+{
+ % Stores the content of the argument valuekey
+ % i.e. keys taking a value
+ % #1 = register
+ % #2 = name of the key
+ % #3 = command to store the content in
+ \cs_if_exist:cTF { __semantex_data_cs_custom_arg_four_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnn }
+ {
+ \exp_args:NNNo \exp_args:NNo\tl_set:No#3 { \use:c { __semantex_data_cs_custom_arg_four_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnn } { ##1 } { ##2 } { ##3 } { ##4 } { ##5 } }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
+ {
+ \tl_set:Nn #3 {}
+ }
+ {
+ \semantex_arg_four_valuekey_store:fnN { \semantex_data_parent_get:n { #1 } } { #2 } #3
+ }
+ }
+}
+
+\cs_generate_variant:Nn \semantex_arg_four_valuekey_store:nnN { fnN }
+
+\cs_new_protected:Npn\semantex_arg_five_valuekey_store:nnN#1#2#3
+{
+ % Stores the content of the argument valuekey
+ % i.e. keys taking a value
+ % #1 = register
+ % #2 = name of the key
+ % #3 = command to store the content in
+ \cs_if_exist:cTF { __semantex_data_cs_custom_arg_five_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnn }
+ {
+ \exp_args:NNNo \exp_args:NNo\tl_set:No#3 { \use:c { __semantex_data_cs_custom_arg_five_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnn } { ##1 } { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
+ {
+ \tl_set:Nn #3 {}
+ }
+ {
+ \semantex_arg_five_valuekey_store:fnN { \semantex_data_parent_get:n { #1 } } { #2 } #3
+ }
+ }
+}
+
+\cs_generate_variant:Nn \semantex_arg_five_valuekey_store:nnN { fnN }
+
+\cs_new_protected:Npn\semantex_arg_six_valuekey_store:nnN#1#2#3
+{
+ % Stores the content of the argument valuekey
+ % i.e. keys taking a value
+ % #1 = register
+ % #2 = name of the key
+ % #3 = command to store the content in
+ \cs_if_exist:cTF { __semantex_data_cs_custom_arg_six_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnn }
+ {
+ \exp_args:NNNo \exp_args:NNo\tl_set:No#3 { \use:c { __semantex_data_cs_custom_arg_six_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnn } { ##1 } { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
+ {
+ \tl_set:Nn #3 {}
+ }
+ {
+ \semantex_arg_six_valuekey_store:fnN { \semantex_data_parent_get:n { #1 } } { #2 } #3
+ }
+ }
+}
+
+\cs_generate_variant:Nn \semantex_arg_six_valuekey_store:nnN { fnN }
+
+\cs_new_protected:Npn\semantex_arg_seven_valuekey_store:nnN#1#2#3
+{
+ % Stores the content of the argument valuekey
+ % i.e. keys taking a value
+ % #1 = register
+ % #2 = name of the key
+ % #3 = command to store the content in
+ \cs_if_exist:cTF { __semantex_data_cs_custom_arg_seven_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnn }
+ {
+ \exp_args:NNNo \exp_args:NNo\tl_set:No#3 { \use:c { __semantex_data_cs_custom_arg_seven_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnn } { ##1 } { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } { ##8 } }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
+ {
+ \tl_set:Nn #3 {}
+ }
+ {
+ \semantex_arg_seven_valuekey_store:fnN { \semantex_data_parent_get:n { #1 } } { #2 } #3
+ }
+ }
+}
+
+\cs_generate_variant:Nn \semantex_arg_seven_valuekey_store:nnN { fnN }
+
+\cs_new_protected:Npn\semantex_arg_eight_valuekey_store:nnN#1#2#3
+{
+ % Stores the content of the argument valuekey
+ % i.e. keys taking a value
+ % #1 = register
+ % #2 = name of the key
+ % #3 = command to store the content in
+ \cs_if_exist:cTF { __semantex_data_cs_custom_arg_eight_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn }
+ {
+ \exp_args:NNNo \exp_args:NNo\tl_set:No#3 { \use:c { __semantex_data_cs_custom_arg_eight_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn } { ##1 } { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } { ##8 } { ##9 } }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
+ {
+ \tl_set:Nn #3 {}
+ }
+ {
+ \semantex_arg_eight_valuekey_store:fnN { \semantex_data_parent_get:n { #1 } } { #2 } #3
+ }
+ }
+}
+
+\cs_generate_variant:Nn \semantex_arg_eight_valuekey_store:nnN { fnN }
+
+\cs_new_protected:Npn\semantex_arg_nine_valuekey_store:nnN#1#2#3
+{
+ % Stores the content of the argument valuekey
+ % i.e. keys taking a value
+ % #1 = register
+ % #2 = name of the key
+ % #3 = command to store the content in
+ \cs_if_exist:cTF { __semantex_data_cs_custom_arg_nine_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn }
+ {
+ \exp_args:NNNo \exp_args:NNo\tl_set:No#3 { \use:c { __semantex_data_cs_custom_arg_nine_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn } { ##1 } { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } { ##8 } { ##9 } }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
+ {
+ \tl_set:Nn #3 {}
+ }
+ {
+ \semantex_arg_nine_valuekey_store:fnN { \semantex_data_parent_get:n { #1 } } { #2 } #3
+ }
+ }
+}
+
+\cs_generate_variant:Nn \semantex_arg_nine_valuekey_store:nnN { fnN }
+
% NOW SOME KEYS FOR DEFINING NEW KEYS:
% First, we define the central commands for preprocessing keys
@@ -3183,6 +3662,7 @@
\semantex_singlekey:nn { #1 } { #2 }
}
}
+
\cs_new_protected:Npn\__semantex_preprocess_valuekey:nnnN#1#2#3#4
{
\str_case:nnF { #2 }
@@ -3190,46 +3670,61 @@
{ execute }{
\tl_put_right:Nn #4 { #3 }
}
- { setkeys }{
+ { set~keys }{
\semantex_preprocess_keys:nN { #3 } #4
}
- { keysset }{
+ { keys~set }{
\semantex_preprocess_keys:nN { #3 } #4
}
- { setkeysx }{
+ { set~keys~x }{
\semantex_preprocess_keys_x:nN { #3 } #4
}
- { keyssetx }{
+ { keys~set~x }{
\semantex_preprocess_keys_x:nN { #3 } #4
}
- { setargkeys }{
+ { set~arg~keys }{
\semantex_preprocess_arg_keys:nN { #3 } #4
}
- { argkeysset }{
+ { arg~keys~set }{
\semantex_preprocess_arg_keys:nN { #3 } #4
}
- { setargkeysx }{
+ { set~arg~keys~x }{
\semantex_preprocess_arg_keys_x:nN { #3 } #4
}
- { argkeyssetx }{
+ { arg~keys~set~x }{
\semantex_preprocess_arg_keys_x:nN { #3 } #4
}
- { setargsinglekeys }{
+ { set~arg~single~keys }{
\semantex_preprocess_arg_singlekeys:nN { #3 } #4
}
- { argsinglekeysset }{
+ { arg~single~keys~set }{
\semantex_preprocess_arg_singlekeys:nN { #3 } #4
}
- { setargsinglekeysx }{
+ { set~arg~single~keys~x }{
\semantex_preprocess_arg_singlekeys_x:nN { #3 } #4
}
- { argsinglekeyssetx }{
+ { arg~single~keys~set~x }{
\semantex_preprocess_arg_singlekeys_x:nN { #3 } #4
}
- { parseoptions }{
+ { parse~options }{
+ \tl_put_right:Nn#4
+ {
+ \semantex_append_singlekey_with_raw_code:nnn { #1 } { parse~code }
+ }
+ \group_begin:
+ \tl_set:Nn\l__semantex_preprocess_valuekey_keys_temp_tl {}
+ \semantex_preprocess_keys:nN { #3 } \l__semantex_preprocess_valuekey_keys_temp_tl
+ \exp_args:NNNx
+ \group_end:
+ \tl_put_right:Nn#4
+ {
+ { \exp_not:V\l__semantex_preprocess_valuekey_keys_temp_tl }
+ }
+ }
+ { pre~parse~options }{
\tl_put_right:Nn#4
{
- \semantex_add_raw_commands_to_parse_options:nn { #1 }
+ \semantex_pre_append_singlekey_with_raw_code:nnn { #1 } { parse~code }
}
\group_begin:
\tl_set:Nn\l__semantex_preprocess_valuekey_keys_temp_tl {}
@@ -3241,21 +3736,21 @@
{ \exp_not:V\l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- { outputoptions }{
+ { output~options }{
\tl_put_right:Nn#4
{
- \semantex_add_raw_commands_to_output_options:nn { #1 }
+ \semantex_add_raw_code_to_output_options:nn { #1 }
}
\group_begin:
\tl_set:Nn\l__semantex_preprocess_valuekey_keys_pre_temp_tl {}
\semantex_preprocess_keys:nN { #3 } \l__semantex_preprocess_valuekey_keys_pre_temp_tl
- \cs_set:Npo\l__semantex_preprocess_valuekey_keys_temp_cs:nn##1##2
+ \cs_set:Npo\l__semantex_preprocess_valuekey_keys_temp_cs:nnnnnnnnn##1##2##3##4##5##6##7##8##9
{
\l__semantex_preprocess_valuekey_keys_pre_temp_tl
}
\tl_set:No\l__semantex_preprocess_valuekey_keys_temp_tl
{
- \l__semantex_preprocess_valuekey_keys_temp_cs:nn { ###1 } { ##2 }
+ \l__semantex_preprocess_valuekey_keys_temp_cs:nnnnnnnnn { ###1 } { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } { ##8 } { ##9 }
}
\exp_args:NNNx
\group_end:
@@ -3264,8 +3759,31 @@
{ \exp_not:V\l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- { boolifTF }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_boolifTF_temp_cs:nTF##1##2##3
+ { pre~output~options }{
+ \tl_put_right:Nn#4
+ {
+ \semantex_add_raw_code_to_the_left_of_output_options:nn { #1 }
+ }
+ \group_begin:
+ \tl_set:Nn\l__semantex_preprocess_valuekey_keys_pre_temp_tl {}
+ \semantex_preprocess_keys:nN { #3 } \l__semantex_preprocess_valuekey_keys_pre_temp_tl
+ \cs_set:Npo\l__semantex_preprocess_valuekey_keys_temp_cs:nnnnnnnnn##1##2##3##4##5##6##7##8##9
+ {
+ \l__semantex_preprocess_valuekey_keys_pre_temp_tl
+ }
+ \tl_set:No\l__semantex_preprocess_valuekey_keys_temp_tl
+ {
+ \l__semantex_preprocess_valuekey_keys_temp_cs:nnnnnnnnn { ###1 } { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } { ##8 } { ##9 }
+ }
+ \exp_args:NNNx
+ \group_end:
+ \tl_put_right:Nn#4
+ {
+ { \exp_not:V\l__semantex_preprocess_valuekey_keys_temp_tl }
+ }
+ }
+ { bool~if~TF }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_bool_if_TF_temp_cs:nTF##1##2##3
{
\tl_put_right:Nn#4
{
@@ -3290,10 +3808,10 @@
{ \exp_not:V \l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- \l__semantex_preprocess_valuekey_boolifTF_temp_cs:nTF #3
+ \l__semantex_preprocess_valuekey_bool_if_TF_temp_cs:nTF #3
}
- { boolifT }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_boolifT_temp_cs:nT##1##2
+ { bool~if~T }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_bool_if_T_temp_cs:nT##1##2
{
\tl_put_right:Nn#4
{
@@ -3310,10 +3828,10 @@
{ }
}
}
- \l__semantex_preprocess_valuekey_boolifT_temp_cs:nT #3
+ \l__semantex_preprocess_valuekey_bool_if_T_temp_cs:nT #3
}
- { boolifF }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_boolifF_temp_cs:nF##1##2
+ { bool~if~F }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_bool_if_F_temp_cs:nF##1##2
{
\tl_put_right:Nn#4
{
@@ -3330,10 +3848,10 @@
{ \exp_not:V\l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- \l__semantex_preprocess_valuekey_boolifF_temp_cs:nF #3
+ \l__semantex_preprocess_valuekey_bool_if_F_temp_cs:nF #3
}
- { ifblankTF }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_ifblankTF_temp_cs:nTF##1##2##3
+ { if~blank~TF }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_if_blank_TF_temp_cs:nTF##1##2##3
{
\tl_put_right:Nn#4
{
@@ -3358,10 +3876,10 @@
{ \exp_not:V \l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- \l__semantex_preprocess_valuekey_ifblankTF_temp_cs:nTF #3
+ \l__semantex_preprocess_valuekey_if_blank_TF_temp_cs:nTF #3
}
- { ifblankT }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_ifblankT_temp_cs:nT##1##2
+ { if~blank~T }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_if_blank_T_temp_cs:nT##1##2
{
\tl_put_right:Nn#4
{
@@ -3378,10 +3896,10 @@
{ }
}
}
- \l__semantex_preprocess_valuekey_ifblankT_temp_cs:nT #3
+ \l__semantex_preprocess_valuekey_if_blank_T_temp_cs:nT #3
}
- { ifblankF }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_ifblankF_temp_cs:nF##1##2
+ { if~blank~F }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_if_blank_F_temp_cs:nF##1##2
{
\tl_put_right:Nn#4
{
@@ -3398,10 +3916,10 @@
{ \exp_not:V\l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- \l__semantex_preprocess_valuekey_ifblankF_temp_cs:nF #3
+ \l__semantex_preprocess_valuekey_if_blank_F_temp_cs:nF #3
}
- { strifeqTF }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_strifeqTF_temp_cs:nnTF##1##2##3##4
+ { str~if~eq~TF }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_str_if_eq_TF_temp_cs:nnTF##1##2##3##4
{
\tl_put_right:Nn#4
{
@@ -3426,10 +3944,10 @@
{ \exp_not:V \l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- \l__semantex_preprocess_valuekey_strifeqTF_temp_cs:nnTF #3
+ \l__semantex_preprocess_valuekey_str_if_eq_TF_temp_cs:nnTF #3
}
- { strifeqT }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_strifeqT_temp_cs:nnT##1##2##3
+ { str~if~eq~T }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_str_if_eq_T_temp_cs:nnT##1##2##3
{
\tl_put_right:Nn#4
{
@@ -3446,10 +3964,10 @@
{ }
}
}
- \l__semantex_preprocess_valuekey_strifeqT_temp_cs:nnT #3
+ \l__semantex_preprocess_valuekey_str_if_eq_T_temp_cs:nnT #3
}
- { strifeqF }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_strifeqF_temp_cs:nnF##1##2##3
+ { str~if~eq~F }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_str_if_eq_F_temp_cs:nnF##1##2##3
{
\tl_put_right:Nn#4
{
@@ -3466,10 +3984,10 @@
{ \exp_not:V\l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- \l__semantex_preprocess_valuekey_strifeqF_temp_cs:nnF #3
+ \l__semantex_preprocess_valuekey_str_if_eq_F_temp_cs:nnF #3
}
- { intifgreaterTF }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_intifgreaterTF_temp_cs:nnTF##1##2##3##4
+ { int~if~greater~TF }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_int_if_greater_TF_temp_cs:nnTF##1##2##3##4
{
\tl_put_right:Nn#4
{
@@ -3494,10 +4012,10 @@
{ \exp_not:V \l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- \l__semantex_preprocess_valuekey_intifgreaterTF_temp_cs:nnTF #3
+ \l__semantex_preprocess_valuekey_int_if_greater_TF_temp_cs:nnTF #3
}
- { intifgreaterT }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_intifgreaterT_temp_cs:nnT##1##2##3
+ { int~if~greater~T }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_int_if_greater_T_temp_cs:nnT##1##2##3
{
\tl_put_right:Nn#4
{
@@ -3514,10 +4032,10 @@
{ }
}
}
- \l__semantex_preprocess_valuekey_intifgreaterT_temp_cs:nnT #3
+ \l__semantex_preprocess_valuekey_int_if_greater_T_temp_cs:nnT #3
}
- { intifgreaterF }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_intifgreaterF_temp_cs:nnF##1##2##3
+ { int~if~greater~F }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_int_if_greater_F_temp_cs:nnF##1##2##3
{
\tl_put_right:Nn#4
{
@@ -3534,10 +4052,10 @@
{ \exp_not:V\l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- \l__semantex_preprocess_valuekey_intifgreaterF_temp_cs:nnF #3
+ \l__semantex_preprocess_valuekey_int_if_greater_F_temp_cs:nnF #3
}
- { intifeqTF }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_intifeqTF_temp_cs:nnTF##1##2##3##4
+ { int~if~eq~TF }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_int_if_eq_TF_temp_cs:nnTF##1##2##3##4
{
\tl_put_right:Nn#4
{
@@ -3562,10 +4080,10 @@
{ \exp_not:V \l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- \l__semantex_preprocess_valuekey_intifeqTF_temp_cs:nnTF #3
+ \l__semantex_preprocess_valuekey_int_if_eq_TF_temp_cs:nnTF #3
}
- { intifeqT }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_intifeqT_temp_cs:nnT##1##2##3
+ { int~if~eq~T }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_int_if_eq_T_temp_cs:nnT##1##2##3
{
\tl_put_right:Nn#4
{
@@ -3582,10 +4100,10 @@
{ }
}
}
- \l__semantex_preprocess_valuekey_intifeqT_temp_cs:nnT #3
+ \l__semantex_preprocess_valuekey_int_if_eq_T_temp_cs:nnT #3
}
- { intifeqF }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_intifeqF_temp_cs:nnF##1##2##3
+ { int~if~eq~F }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_int_if_eq_F_temp_cs:nnF##1##2##3
{
\tl_put_right:Nn#4
{
@@ -3602,10 +4120,10 @@
{ \exp_not:V\l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- \l__semantex_preprocess_valuekey_intifeqF_temp_cs:nnF #3
+ \l__semantex_preprocess_valuekey_int_if_eq_F_temp_cs:nnF #3
}
- { intiflessTF }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_intiflessTF_temp_cs:nnTF##1##2##3##4
+ { int~if~less~TF }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_int_if_less_TF_temp_cs:nnTF##1##2##3##4
{
\tl_put_right:Nn#4
{
@@ -3630,10 +4148,10 @@
{ \exp_not:V \l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- \l__semantex_preprocess_valuekey_intiflessTF_temp_cs:nnTF #3
+ \l__semantex_preprocess_valuekey_int_if_less_TF_temp_cs:nnTF #3
}
- { intiflessT }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_intiflessT_temp_cs:nnT##1##2##3
+ { int~if~less~T }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_int_if_less_T_temp_cs:nnT##1##2##3
{
\tl_put_right:Nn#4
{
@@ -3650,10 +4168,10 @@
{ }
}
}
- \l__semantex_preprocess_valuekey_intiflessT_temp_cs:nnT #3
+ \l__semantex_preprocess_valuekey_int_if_less_T_temp_cs:nnT #3
}
- { intiflessF }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_intiflessF_temp_cs:nnF##1##2##3
+ { int~if~less~F }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_int_if_less_F_temp_cs:nnF##1##2##3
{
\tl_put_right:Nn#4
{
@@ -3670,7 +4188,7 @@
{ \exp_not:V\l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- \l__semantex_preprocess_valuekey_intiflessF_temp_cs:nnF #3
+ \l__semantex_preprocess_valuekey_int_if_less_F_temp_cs:nnF #3
}
}
{
@@ -3717,46 +4235,61 @@
#3
}
}
- { setkeys }{
+ { set~keys }{
\semantex_preprocess_keys:nN { #3 } #4
}
- { keysset }{
+ { keys~set }{
\semantex_preprocess_keys:nN { #3 } #4
}
- { setkeysx }{
+ { set~keys~x }{
\semantex_preprocess_keys_x:nN { #3 } #4
}
- { keyssetx }{
+ { keys~set~x }{
\semantex_preprocess_keys_x:nN { #3 } #4
}
- { setargkeys }{
+ { set~arg~keys }{
\semantex_preprocess_arg_keys:nN { #3 } #4
}
- { argkeysset }{
+ { arg~keys~set }{
\semantex_preprocess_arg_keys:nN { #3 } #4
}
- { setargkeysx }{
+ { set~arg~keys~x }{
\semantex_preprocess_arg_keys_x:nN { #3 } #4
}
- { argkeyssetx }{
+ { arg~keys~set~x }{
\semantex_preprocess_arg_keys_x:nN { #3 } #4
}
- { setargsinglekeys }{
+ { set~arg~single~keys }{
\semantex_preprocess_arg_singlekeys:nN { #3 } #4
}
- { argsinglekeysset }{
+ { arg~single~keys~set }{
\semantex_preprocess_arg_singlekeys:nN { #3 } #4
}
- { setargsinglekeysx }{
+ { set~arg~single~keys~x }{
\semantex_preprocess_arg_singlekeys_x:nN { #3 } #4
}
- { argsinglekeyssetx }{
+ { arg~single~keys~set~x }{
\semantex_preprocess_arg_singlekeys_x:nN { #3 } #4
}
- { parseoptions }{
+ { parse~options }{
+ \tl_put_right:Nn#4
+ {
+ \semantex_append_singlekey_with_raw_code:nnn { #1 } { parse~code }
+ }
+ \group_begin:
+ \tl_set:Nn\l__semantex_preprocess_valuekey_keys_temp_tl {}
+ \semantex_preprocess_keys_x:nN { #3 } \l__semantex_preprocess_valuekey_keys_temp_tl
+ \exp_args:NNNx
+ \group_end:
+ \tl_put_right:Nn#4
+ {
+ { \exp_not:V\l__semantex_preprocess_valuekey_keys_temp_tl }
+ }
+ }
+ { pre~parse~options }{
\tl_put_right:Nn#4
{
- \semantex_add_raw_commands_to_parse_options:nn { #1 }
+ \semantex_pre_append_singlekey_with_raw_code:nnn { #1 } { parse~code }
}
\group_begin:
\tl_set:Nn\l__semantex_preprocess_valuekey_keys_temp_tl {}
@@ -3768,21 +4301,44 @@
{ \exp_not:V\l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- { outputoptions }{
+ { output~options }{
+ \tl_put_right:Nn#4
+ {
+ \semantex_add_raw_code_to_output_options:nn { #1 }
+ }
+ \group_begin:
+ \tl_set:Nn\l__semantex_preprocess_valuekey_keys_pre_temp_tl {}
+ \semantex_preprocess_keys_x:nN { #3 } \l__semantex_preprocess_valuekey_keys_pre_temp_tl
+ \cs_set:Npo\l__semantex_preprocess_valuekey_keys_temp_cs:nnnnnnnnn##1##2##3##4##5##6##7##8##9
+ {
+ \l__semantex_preprocess_valuekey_keys_pre_temp_tl
+ }
+ \tl_set:No\l__semantex_preprocess_valuekey_keys_temp_tl
+ {
+ \l__semantex_preprocess_valuekey_keys_temp_cs:nnnnnnnnn { ###1 } { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } { ##8 } { ##9 }
+ }
+ \exp_args:NNNx
+ \group_end:
+ \tl_put_right:Nn#4
+ {
+ { \exp_not:V\l__semantex_preprocess_valuekey_keys_temp_tl }
+ }
+ }
+ { pre~output~options }{
\tl_put_right:Nn#4
{
- \semantex_add_raw_commands_to_output_options:nn { #1 }
+ \semantex_add_raw_code_to_the_left_of_output_options:nn { #1 }
}
\group_begin:
\tl_set:Nn\l__semantex_preprocess_valuekey_keys_pre_temp_tl {}
\semantex_preprocess_keys_x:nN { #3 } \l__semantex_preprocess_valuekey_keys_pre_temp_tl
- \cs_set:Npo\l__semantex_preprocess_valuekey_keys_temp_cs:nn##1##2
+ \cs_set:Npo\l__semantex_preprocess_valuekey_keys_temp_cs:nnnnnnnnn##1##2##3##4##5##6##7##8##9
{
\l__semantex_preprocess_valuekey_keys_pre_temp_tl
}
\tl_set:No\l__semantex_preprocess_valuekey_keys_temp_tl
{
- \l__semantex_preprocess_valuekey_keys_temp_cs:nn { ###1 } { ##2 }
+ \l__semantex_preprocess_valuekey_keys_temp_cs:nnnnnnnnn { ###1 } { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } { ##8 } { ##9 }
}
\exp_args:NNNx
\group_end:
@@ -3791,8 +4347,8 @@
{ \exp_not:V\l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- { boolifTF }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_boolifTF_temp_cs:nTF##1##2##3
+ { bool~if~TF }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_bool_if_TF_temp_cs:nTF##1##2##3
{
\tl_put_right:Nn#4
{
@@ -3817,10 +4373,10 @@
{ \exp_not:V \l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- \l__semantex_preprocess_valuekey_boolifTF_temp_cs:nTF #3
+ \l__semantex_preprocess_valuekey_bool_if_TF_temp_cs:nTF #3
}
- { boolifT }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_boolifT_temp_cs:nT##1##2
+ { bool~if~T }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_bool_if_T_temp_cs:nT##1##2
{
\tl_put_right:Nn#4
{
@@ -3837,10 +4393,10 @@
{ }
}
}
- \l__semantex_preprocess_valuekey_boolifT_temp_cs:nT #3
+ \l__semantex_preprocess_valuekey_bool_if_T_temp_cs:nT #3
}
- { boolifF }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_boolifF_temp_cs:nF##1##2
+ { bool~if~F }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_bool_if_F_temp_cs:nF##1##2
{
\tl_put_right:Nn#4
{
@@ -3857,10 +4413,10 @@
{ \exp_not:V\l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- \l__semantex_preprocess_valuekey_boolifF_temp_cs:nF #3
+ \l__semantex_preprocess_valuekey_bool_if_F_temp_cs:nF #3
}
- { ifblankTF }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_ifblankTF_temp_cs:nTF##1##2##3
+ { if~blank~TF }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_if_blank_TF_temp_cs:nTF##1##2##3
{
\tl_put_right:Nn#4
{
@@ -3885,10 +4441,10 @@
{ \exp_not:V \l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- \l__semantex_preprocess_valuekey_ifblankTF_temp_cs:nTF #3
+ \l__semantex_preprocess_valuekey_if_blank_TF_temp_cs:nTF #3
}
- { ifblankT }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_ifblankT_temp_cs:nT##1##2
+ { if~blank~T }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_if_blank_T_temp_cs:nT##1##2
{
\tl_put_right:Nn#4
{
@@ -3905,10 +4461,10 @@
{ }
}
}
- \l__semantex_preprocess_valuekey_ifblankT_temp_cs:nT #3
+ \l__semantex_preprocess_valuekey_if_blank_T_temp_cs:nT #3
}
- { ifblankF }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_ifblankF_temp_cs:nF##1##2
+ { if~blank~F }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_if_blank_F_temp_cs:nF##1##2
{
\tl_put_right:Nn#4
{
@@ -3925,10 +4481,10 @@
{ \exp_not:V\l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- \l__semantex_preprocess_valuekey_ifblankF_temp_cs:nF #3
+ \l__semantex_preprocess_valuekey_if_blank_F_temp_cs:nF #3
}
- { strifeqTF }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_strifeqTF_temp_cs:nnTF##1##2##3##4
+ { str~if~eq~TF }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_str_if_eq_TF_temp_cs:nnTF##1##2##3##4
{
\tl_put_right:Nn#4
{
@@ -3953,10 +4509,10 @@
{ \exp_not:V \l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- \l__semantex_preprocess_valuekey_strifeqTF_temp_cs:nnTF #3
+ \l__semantex_preprocess_valuekey_str_if_eq_TF_temp_cs:nnTF #3
}
- { strifeqT }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_strifeqT_temp_cs:nnT##1##2##3
+ { str~if~eq~T }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_str_if_eq_T_temp_cs:nnT##1##2##3
{
\tl_put_right:Nn#4
{
@@ -3973,10 +4529,10 @@
{ }
}
}
- \l__semantex_preprocess_valuekey_strifeqT_temp_cs:nnT #3
+ \l__semantex_preprocess_valuekey_str_if_eq_T_temp_cs:nnT #3
}
- { strifeqF }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_strifeqF_temp_cs:nnF##1##2##3
+ { str~if~eq~F }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_str_if_eq_F_temp_cs:nnF##1##2##3
{
\tl_put_right:Nn#4
{
@@ -3993,10 +4549,10 @@
{ \exp_not:V\l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- \l__semantex_preprocess_valuekey_strifeqF_temp_cs:nnF #3
+ \l__semantex_preprocess_valuekey_str_if_eq_F_temp_cs:nnF #3
}
- { intifgreaterTF }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_intifgreaterTF_temp_cs:nnTF##1##2##3##4
+ { int~if~greater~TF }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_int_if_greater_TF_temp_cs:nnTF##1##2##3##4
{
\tl_put_right:Nn#4
{
@@ -4021,10 +4577,10 @@
{ \exp_not:V \l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- \l__semantex_preprocess_valuekey_intifgreaterTF_temp_cs:nnTF #3
+ \l__semantex_preprocess_valuekey_int_if_greater_TF_temp_cs:nnTF #3
}
- { intifgreaterT }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_intifgreaterT_temp_cs:nnT##1##2##3
+ { int~if~greater~T }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_int_if_greater_T_temp_cs:nnT##1##2##3
{
\tl_put_right:Nn#4
{
@@ -4041,10 +4597,10 @@
{ }
}
}
- \l__semantex_preprocess_valuekey_intifgreaterT_temp_cs:nnT #3
+ \l__semantex_preprocess_valuekey_int_if_greater_T_temp_cs:nnT #3
}
- { intifgreaterF }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_intifgreaterF_temp_cs:nnF##1##2##3
+ { int~if~greater~F }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_int_if_greater_F_temp_cs:nnF##1##2##3
{
\tl_put_right:Nn#4
{
@@ -4061,10 +4617,10 @@
{ \exp_not:V\l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- \l__semantex_preprocess_valuekey_intifgreaterF_temp_cs:nnF #3
+ \l__semantex_preprocess_valuekey_int_if_greater_F_temp_cs:nnF #3
}
- { intifeqTF }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_intifeqTF_temp_cs:nnTF##1##2##3##4
+ { int~if~eq~TF }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_int_if_eq_TF_temp_cs:nnTF##1##2##3##4
{
\tl_put_right:Nn#4
{
@@ -4089,10 +4645,10 @@
{ \exp_not:V \l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- \l__semantex_preprocess_valuekey_intifeqTF_temp_cs:nnTF #3
+ \l__semantex_preprocess_valuekey_int_if_eq_TF_temp_cs:nnTF #3
}
- { intifeqT }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_intifeqT_temp_cs:nnT##1##2##3
+ { int~if~eq~T }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_int_if_eq_T_temp_cs:nnT##1##2##3
{
\tl_put_right:Nn#4
{
@@ -4109,10 +4665,10 @@
{ }
}
}
- \l__semantex_preprocess_valuekey_intifeqT_temp_cs:nnT #3
+ \l__semantex_preprocess_valuekey_int_if_eq_T_temp_cs:nnT #3
}
- { intifeqF }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_intifeqF_temp_cs:nnF##1##2##3
+ { int~if~eq~F }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_int_if_eq_F_temp_cs:nnF##1##2##3
{
\tl_put_right:Nn#4
{
@@ -4129,10 +4685,10 @@
{ \exp_not:V\l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- \l__semantex_preprocess_valuekey_intifeqF_temp_cs:nnF #3
+ \l__semantex_preprocess_valuekey_int_if_eq_F_temp_cs:nnF #3
}
- { intiflessTF }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_intiflessTF_temp_cs:nnTF##1##2##3##4
+ { int~if~less~TF }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_int_if_less_TF_temp_cs:nnTF##1##2##3##4
{
\tl_put_right:Nn#4
{
@@ -4157,10 +4713,10 @@
{ \exp_not:V \l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- \l__semantex_preprocess_valuekey_intiflessTF_temp_cs:nnTF #3
+ \l__semantex_preprocess_valuekey_int_if_less_TF_temp_cs:nnTF #3
}
- { intiflessT }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_intiflessT_temp_cs:nnT##1##2##3
+ { int~if~less~T }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_int_if_less_T_temp_cs:nnT##1##2##3
{
\tl_put_right:Nn#4
{
@@ -4177,10 +4733,10 @@
{ }
}
}
- \l__semantex_preprocess_valuekey_intiflessT_temp_cs:nnT #3
+ \l__semantex_preprocess_valuekey_int_if_less_T_temp_cs:nnT #3
}
- { intiflessF }{
- \cs_set:Npn \l__semantex_preprocess_valuekey_intiflessF_temp_cs:nnF##1##2##3
+ { int~if~less~F }{
+ \cs_set:Npn \l__semantex_preprocess_valuekey_int_if_less_F_temp_cs:nnF##1##2##3
{
\tl_put_right:Nn#4
{
@@ -4197,7 +4753,7 @@
{ \exp_not:V\l__semantex_preprocess_valuekey_keys_temp_tl }
}
}
- \l__semantex_preprocess_valuekey_intiflessF_temp_cs:nnF #3
+ \l__semantex_preprocess_valuekey_int_if_less_F_temp_cs:nnF #3
}
}
{
@@ -4261,6 +4817,14 @@
}
}
+\cs_new_protected:Npn \semantex_clear_singlekey:nn#1#2
+{
+ \cs_set_protected:cpo { __semantex_data_cs_custom_singlekey_#1_\tl_trim_spaces:n{#2}:n } ##1
+ {
+ % do nothing
+ }
+}
+
\cs_new_protected:Npn\semantex_remove_singlekey:nn#1#2
{
\cs_undefine:c { __semantex_data_cs_custom_singlekey_#1_#2:n }
@@ -4448,43 +5012,653 @@
}
}
-\cs_new_protected:Npn\semantex_define_nine_valuekeys:nn#1#2
+%\cs_new_protected:Npn\semantex_define_nine_valuekeys:nn#1#2
+%{
+% % Add new valuekeys with 9 values
+% \clist_map_inline:nn { #2 }{
+% \__semantex_nine_valuekey_format_auxiliary:nnn{#1}##1
+% }
+%}
+%
+%\cs_new_protected:Npn\__semantex_nine_valuekey_format_auxiliary:nnn#1#2#3%CHECK2
+%{
+% \cs_set:Npn\l__semantex_nine_valuekey_auxiliary_temp_cs:nnnnnnnnn##1##2##3##4##5##6##7##8##9 { #3 }
+% \tl_set:Nn\l__semantex_nine_valuekey_auxiliary_temp_tl{}
+% \cs_set:Npn\l__semantex_nine_valuekey_auxiliary_singlekey_temp_cs:n##1
+% {
+% \__semantex_preprocess_singlekey:nnN { \__semantex_nine_valuekey_format_auxiliary_name_of_register_temp_tl } { ##1 } \l__semantex_nine_valuekey_auxiliary_temp_tl
+% }
+% \cs_set:Npn\l__semantex_nine_valuekey_auxiliary_valuekey_temp_cs:nn##1##2
+% {
+% \__semantex_preprocess_valuekey:nnnN { \__semantex_nine_valuekey_format_auxiliary_name_of_register_temp_tl } { ##1 } { ##2 } \l__semantex_nine_valuekey_auxiliary_temp_tl
+% }
+% \semantex_keyval_parse:NNo
+% \l__semantex_nine_valuekey_auxiliary_singlekey_temp_cs:n
+% \l__semantex_nine_valuekey_auxiliary_valuekey_temp_cs:nn
+% {
+% \l__semantex_nine_valuekey_auxiliary_temp_cs:nnnnnnnnn { ##1 } { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } { ##8 } { ##9 }
+% }
+% \cs_set_protected:cpo { __semantex_data_cs_custom_nine_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn } ##1##2##3##4##5##6##7##8##9
+% {
+% \l__semantex_nine_valuekey_auxiliary_temp_tl
+% }
+% \cs_set_protected:cpn { __semantex_data_cs_custom_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+% {
+% \tl_set:Nn \__semantex_nine_valuekey_format_auxiliary_name_of_register_temp_tl { ##1 }
+% \use:c { __semantex_data_cs_custom_nine_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn } ##2
+% }
+%}
+
+
+
+\cs_new_protected:Npn\semantex_append_valuekeys:nn#1#2
+{
+ % Appends keys taking one value
+ \clist_map_inline:nn { #2 }{
+ \__semantex_append_valuekeys_format_auxiliary:nnn { #1 } ##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_append_valuekeys_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_append_valuekeys_auxiliary_temp_cs:n##1 { #3 }
+ \tl_set:Nn \l__semantex_append_valuekeys_auxiliary_temp_tl {}
+ \semantex_preprocess_keys:oN
+ {
+ \l__semantex_append_valuekeys_auxiliary_temp_cs:n { ##2 }
+ } \l__semantex_append_valuekeys_auxiliary_temp_tl
+ \semantex_valuekey_store:nnN { #1 } { #2 } \l__semantex_append_valuekeys_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn
+ % \cs_set_protected:cx gave us ##1 where we wanted #1
+ { __semantex_data_cs_custom_valuekey_#1_\tl_trim_spaces:n{#2}:nn }
+ {
+ \exp_not:V\l__semantex_append_valuekeys_auxiliary_original_temp_tl
+ \exp_not:V\l__semantex_append_valuekeys_auxiliary_temp_tl
+ }
+}
+
+\cs_new_protected:Npn\semantex_pre_append_valuekeys:nn#1#2
+{
+ % Pre-appends keys taking one value
+ \clist_map_inline:nn { #2 }{
+ \__semantex_pre_append_valuekeys_format_auxiliary:nnn { #1 } ##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_pre_append_valuekeys_format_auxiliary:nnn#1#2#3
{
- % Add new valuekeys with 9 values
+ \cs_set:Npn\l__semantex_pre_append_valuekeys_auxiliary_temp_cs:n##1 { #3 }
+ \tl_set:Nn \l__semantex_pre_append_valuekeys_auxiliary_temp_tl {}
+ \semantex_preprocess_keys:oN
+ {
+ \l__semantex_pre_append_valuekeys_auxiliary_temp_cs:n { ##2 }
+ } \l__semantex_pre_append_valuekeys_auxiliary_temp_tl
+ \semantex_valuekey_store:nnN { #1 } { #2 } \l__semantex_pre_append_valuekeys_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn
+ % \cs_set_protected:cx gave us ##1 where we wanted #1
+ { __semantex_data_cs_custom_valuekey_#1_\tl_trim_spaces:n{#2}:nn }
+ {
+ \exp_not:V\l__semantex_pre_append_valuekeys_auxiliary_temp_tl
+ \exp_not:V\l__semantex_pre_append_valuekeys_auxiliary_original_temp_tl
+ }
+}
+
+\cs_new_protected:Npn\semantex_append_singlekeys:nn#1#2
+{
+ % Appends keys taking no values
\clist_map_inline:nn { #2 }{
- \__semantex_nine_valuekey_format_auxiliary:nnn{#1}##1
+ \__semantex_append_singlekeys_format_auxiliary:nnn { #1 } ##1
}
}
-\cs_new_protected:Npn\__semantex_nine_valuekey_format_auxiliary:nnn#1#2#3
+\cs_new_protected:Npn \__semantex_append_singlekeys_format_auxiliary:nnn#1#2#3
{
- \cs_set:Npn\l__semantex_nine_valuekey_auxiliary_temp_cs:nnnnnnnnn##1##2##3##4##5##6##7##8##9 { #3 }
- \tl_set:Nn\l__semantex_nine_valuekey_auxiliary_temp_tl{}
- \cs_set:Npn\l__semantex_nine_valuekey_auxiliary_singlekey_temp_cs:n##1
+ \cs_set:Npn\l__semantex_append_singlekeys_auxiliary_temp_cs: { #3 }
+ \tl_set:Nn \l__semantex_append_singlekeys_auxiliary_temp_tl {}
+ \semantex_preprocess_keys:oN
{
- \__semantex_preprocess_singlekey:nnN { \__semantex_nine_valuekey_format_auxiliary_name_of_register_temp_tl } { ##1 } \l__semantex_nine_valuekey_auxiliary_temp_tl
+ \l__semantex_append_singlekeys_auxiliary_temp_cs:
+ } \l__semantex_append_singlekeys_auxiliary_temp_tl
+ \semantex_singlekey_store:nnN { #1 } { #2 } \l__semantex_append_singlekeys_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn
+ % \cs_set_protected:cx gave us ##1 where we wanted #1
+ { __semantex_data_cs_custom_singlekey_#1_\tl_trim_spaces:n{#2}:n }
+ {
+ \exp_not:V\l__semantex_append_singlekeys_auxiliary_original_temp_tl
+ \exp_not:V\l__semantex_append_singlekeys_auxiliary_temp_tl
}
- \cs_set:Npn\l__semantex_nine_valuekey_auxiliary_valuekey_temp_cs:nn##1##2
+}
+
+\cs_new_protected:Npn \semantex_append_singlekey_with_raw_code:nnn#1#2#3
+{
+ % Appends the key #2 with the raw code #3
+ % #1 = register
+ % #2 = key
+ % #3 = raw code
+ \tl_set:Nn \l__semantex_add_raw_code_to_singlekey_auxiliary_temp_tl { #3 }
+ \semantex_singlekey_store:nnN { #1 } { #2 } \l__semantex_append_singlekeys_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn
+ % \cs_set_protected:cx gave us ##1 where we wanted #1
+ { __semantex_data_cs_custom_singlekey_#1_\tl_trim_spaces:n{#2}:n }
{
- \__semantex_preprocess_valuekey:nnnN { \__semantex_nine_valuekey_format_auxiliary_name_of_register_temp_tl } { ##1 } { ##2 } \l__semantex_nine_valuekey_auxiliary_temp_tl
+ \exp_not:V\l__semantex_append_singlekeys_auxiliary_original_temp_tl
+ \exp_not:V\l__semantex_append_singlekeys_auxiliary_temp_tl
}
- \semantex_keyval_parse:NNo
- \l__semantex_nine_valuekey_auxiliary_singlekey_temp_cs:n
- \l__semantex_nine_valuekey_auxiliary_valuekey_temp_cs:nn
- {
- \l__semantex_nine_valuekey_auxiliary_temp_cs:nnnnnnnnn { ##1 } { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } { ##8 } { ##9 }
- }
- \cs_set_protected:cpo { __semantex_data_cs_custom_nine_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn } ##1##2##3##4##5##6##7##8##9
+}
+
+\cs_new_protected:Npn \semantex_pre_append_singlekey_with_raw_code:nnn#1#2#3
+{
+ % Appends the key #2 with the raw code #3
+ % #1 = register
+ % #2 = key
+ % #3 = raw code
+ \tl_set:Nn \l__semantex_add_raw_code_to_singlekey_auxiliary_temp_tl { #3 }
+ \semantex_singlekey_store:nnN { #1 } { #2 } \l__semantex_append_singlekeys_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn
+ % \cs_set_protected:cx gave us ##1 where we wanted #1
+ { __semantex_data_cs_custom_singlekey_#1_\tl_trim_spaces:n{#2}:n }
+ {
+ \exp_not:V\l__semantex_append_singlekeys_auxiliary_temp_tl
+ \exp_not:V\l__semantex_append_singlekeys_auxiliary_original_temp_tl
+ }
+}
+
+\cs_new_protected:Npn\semantex_pre_append_singlekeys:nn#1#2
+{
+ % Pre-appends keys taking no values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_pre_append_singlekeys_format_auxiliary:nnn { #1 } ##1
+ }
+}
+
+\cs_new_protected:Npn \__semantex_pre_append_singlekeys_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_pre_append_singlekeys_auxiliary_temp_cs: { #3 }
+ \tl_set:Nn \l__semantex_pre_append_singlekeys_auxiliary_temp_tl {}
+ \semantex_preprocess_keys:oN
+ {
+ \l__semantex_pre_append_singlekeys_auxiliary_temp_cs:
+ } \l__semantex_pre_append_singlekeys_auxiliary_temp_tl
+ \semantex_singlekey_store:nnN { #1 } { #2 } \l__semantex_pre_append_singlekeys_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn
+ % \cs_set_protected:cx gave us ##1 where we wanted #1
+ { __semantex_data_cs_custom_singlekey_#1_\tl_trim_spaces:n{#2}:n }
+ {
+ \exp_not:V\l__semantex_pre_append_singlekeys_auxiliary_temp_tl
+ \exp_not:V\l__semantex_pre_append_singlekeys_auxiliary_original_temp_tl
+ }
+}
+
+\cs_new_protected:Npn\semantex_append_two_valuekeys:nn#1#2
+{
+ % Appends valuekeys with 2 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_append_two_valuekey_format_auxiliary:nnn { #1 } ##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_append_two_valuekey_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_append_two_valuekey_auxiliary_temp_cs:nn##1##2 { #3 }
+ \tl_set:Nn\l__semantex_append_two_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_keys:oN
+ {
+ \l__semantex_append_two_valuekey_auxiliary_temp_cs:nn { ##2 } { ##3 }
+ } \l__semantex_append_two_valuekey_auxiliary_temp_tl
+ \semantex_two_valuekey_store:nnN { #1 } { #2 } \l__semantex_append_two_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_two_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnn }
+ {
+ \exp_not:V\l__semantex_append_two_valuekey_auxiliary_original_temp_tl
+ \exp_not:V\l__semantex_append_two_valuekey_auxiliary_temp_tl
+ }
+ \cs_set_protected:cpn { __semantex_data_cs_custom_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+ {
+ \use:c { __semantex_data_cs_custom_two_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnn } { ##1 } ##2
+ }
+}
+
+\cs_new_protected:Npn\semantex_pre_append_two_valuekeys:nn#1#2
+{
+ % Pre-appends valuekeys with 2 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_pre_append_two_valuekey_format_auxiliary:nnn { #1 } ##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_pre_append_two_valuekey_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_pre_append_two_valuekey_auxiliary_temp_cs:nn##1##2 { #3 }
+ \tl_set:Nn\l__semantex_pre_append_two_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_keys:oN
+ {
+ \l__semantex_pre_append_two_valuekey_auxiliary_temp_cs:nn { ##2 } { ##3 }
+ } \l__semantex_pre_append_two_valuekey_auxiliary_temp_tl
+ \semantex_two_valuekey_store:nnN { #1 } { #2 } \l__semantex_pre_append_two_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_two_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnn }
+ {
+ \exp_not:V\l__semantex_pre_append_two_valuekey_auxiliary_original_temp_tl
+ \exp_not:V\l__semantex_pre_append_two_valuekey_auxiliary_temp_tl
+ }
+ \cs_set_protected:cpn { __semantex_data_cs_custom_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+ {
+ \use:c { __semantex_data_cs_custom_two_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnn } { ##1 } ##2
+ }
+}
+
+\cs_new_protected:Npn\semantex_append_three_valuekeys:nn#1#2
+{
+ % Appends valuekeys with 3 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_append_three_valuekey_format_auxiliary:nnn {#1} ##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_append_three_valuekey_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_append_three_valuekey_auxiliary_temp_cs:nnn##1##2##3 { #3 }
+ \tl_set:Nn\l__semantex_append_three_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_keys:oN
+ {
+ \l__semantex_append_three_valuekey_auxiliary_temp_cs:nnn { ##2 } { ##3 } { ##4 }
+ } \l__semantex_append_three_valuekey_auxiliary_temp_tl
+ \semantex_three_valuekey_store:nnN { #1 } { #2 } \l__semantex_append_three_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_three_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnn }
{
- \l__semantex_nine_valuekey_auxiliary_temp_tl
+ \exp_not:V\l__semantex_append_three_valuekey_auxiliary_original_temp_tl
+ \exp_not:V\l__semantex_append_three_valuekey_auxiliary_temp_tl
}
\cs_set_protected:cpn { __semantex_data_cs_custom_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
{
- \tl_set:Nn \__semantex_nine_valuekey_format_auxiliary_name_of_register_temp_tl { ##1 }
- \use:c { __semantex_data_cs_custom_nine_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn } ##2
+ \use:c { __semantex_data_cs_custom_three_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnn } { ##1 } ##2
}
}
+\cs_new_protected:Npn\semantex_pre_append_three_valuekeys:nn#1#2
+{
+ % Pre-appends valuekeys with 3 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_pre_append_three_valuekey_format_auxiliary:nnn {#1} ##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_pre_append_three_valuekey_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_pre_append_three_valuekey_auxiliary_temp_cs:nnn##1##2##3 { #3 }
+ \tl_set:Nn\l__semantex_pre_append_three_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_keys:oN
+ {
+ \l__semantex_pre_append_three_valuekey_auxiliary_temp_cs:nnn { ##2 } { ##3 } { ##4 }
+ } \l__semantex_pre_append_three_valuekey_auxiliary_temp_tl
+ \semantex_three_valuekey_store:nnN { #1 } { #2 } \l__semantex_pre_append_three_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_three_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnn }
+ {
+ \exp_not:V\l__semantex_pre_append_three_valuekey_auxiliary_temp_tl
+ \exp_not:V\l__semantex_pre_append_three_valuekey_auxiliary_original_temp_tl
+ }
+ \cs_set_protected:cpn { __semantex_data_cs_custom_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+ {
+ \use:c { __semantex_data_cs_custom_three_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnn } { ##1 } ##2
+ }
+}
+
+\cs_new_protected:Npn\semantex_append_four_valuekeys:nn#1#2
+{
+ % Appends valuekeys with 4 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_append_four_valuekey_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_append_four_valuekey_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_append_four_valuekey_auxiliary_temp_cs:nnnn##1##2##3##4 { #3 }
+ \tl_set:Nn\l__semantex_append_four_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_keys:oN
+ {
+ \l__semantex_append_four_valuekey_auxiliary_temp_cs:nnnn { ##2 } { ##3 } { ##4 } { ##5 }
+ } \l__semantex_append_four_valuekey_auxiliary_temp_tl
+ \semantex_four_valuekey_store:nnN { #1 } { #2 } \l__semantex_append_four_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_four_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnn }
+ {
+ \exp_not:V\l__semantex_append_four_valuekey_auxiliary_original_temp_tl
+ \exp_not:V\l__semantex_append_four_valuekey_auxiliary_temp_tl
+ }
+ \cs_set_protected:cpn { __semantex_data_cs_custom_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+ {
+ \use:c { __semantex_data_cs_custom_four_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnn } { ##1 } ##2
+ }
+}
+
+\cs_new_protected:Npn\semantex_pre_append_four_valuekeys:nn#1#2
+{
+ % Pre-appends valuekeys with 4 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_pre_append_four_valuekey_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_pre_append_four_valuekey_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_pre_append_four_valuekey_auxiliary_temp_cs:nnnn##1##2##3##4 { #3 }
+ \tl_set:Nn\l__semantex_pre_append_four_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_keys:oN
+ {
+ \l__semantex_pre_append_four_valuekey_auxiliary_temp_cs:nnnn { ##2 } { ##3 } { ##4 } { ##5 }
+ } \l__semantex_pre_append_four_valuekey_auxiliary_temp_tl
+ \semantex_four_valuekey_store:nnN { #1 } { #2 } \l__semantex_pre_append_four_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_four_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnn }
+ {
+ \exp_not:V\l__semantex_pre_append_four_valuekey_auxiliary_temp_tl
+ \exp_not:V\l__semantex_pre_append_four_valuekey_auxiliary_original_temp_tl
+ }
+ \cs_set_protected:cpn { __semantex_data_cs_custom_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+ {
+ \use:c { __semantex_data_cs_custom_four_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnn } { ##1 } ##2
+ }
+}
+
+\cs_new_protected:Npn\semantex_append_five_valuekeys:nn#1#2
+{
+ % Appends valuekeys with 5 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_append_five_valuekey_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_append_five_valuekey_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_append_five_valuekey_auxiliary_temp_cs:nnnnn##1##2##3##4##5 { #3 }
+ \tl_set:Nn\l__semantex_append_five_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_keys:oN
+ {
+ \l__semantex_append_five_valuekey_auxiliary_temp_cs:nnnnn { ##2 } { ##3 } { ##4 } { ##5 } { ##6 }
+ } \l__semantex_append_five_valuekey_auxiliary_temp_tl
+ \semantex_five_valuekey_store:nnN { #1 } { #2 } \l__semantex_append_five_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_five_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnn }
+ {
+ \exp_not:V\l__semantex_append_five_valuekey_auxiliary_original_temp_tl
+ \exp_not:V\l__semantex_append_five_valuekey_auxiliary_temp_tl
+ }
+ \cs_set_protected:cpn { __semantex_data_cs_custom_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+ {
+ \use:c { __semantex_data_cs_custom_five_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnn } { ##1 } ##2
+ }
+}
+
+\cs_new_protected:Npn\semantex_pre_append_five_valuekeys:nn#1#2
+{
+ % Pre-appends valuekeys with 5 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_pre_append_five_valuekey_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_pre_append_five_valuekey_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_pre_append_five_valuekey_auxiliary_temp_cs:nnnnn##1##2##3##4##5 { #3 }
+ \tl_set:Nn\l__semantex_pre_append_five_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_keys:oN
+ {
+ \l__semantex_pre_append_five_valuekey_auxiliary_temp_cs:nnnnn { ##2 } { ##3 } { ##4 } { ##5 } { ##6 }
+ } \l__semantex_pre_append_five_valuekey_auxiliary_temp_tl
+ \semantex_five_valuekey_store:nnN { #1 } { #2 } \l__semantex_pre_append_five_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_five_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnn }
+ {
+ \exp_not:V\l__semantex_pre_append_five_valuekey_auxiliary_temp_tl
+ \exp_not:V\l__semantex_pre_append_five_valuekey_auxiliary_original_temp_tl
+ }
+ \cs_set_protected:cpn { __semantex_data_cs_custom_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+ {
+ \use:c { __semantex_data_cs_custom_five_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnn } { ##1 } ##2
+ }
+}
+
+\cs_new_protected:Npn\semantex_append_six_valuekeys:nn#1#2
+{
+ % Appends valuekeys with 6 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_append_six_valuekey_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_append_six_valuekey_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_append_six_valuekey_auxiliary_temp_cs:nnnnnn##1##2##3##4##5##6 { #3 }
+ \tl_set:Nn\l__semantex_append_six_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_keys:oN
+ {
+ \l__semantex_append_six_valuekey_auxiliary_temp_cs:nnnnnn { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 }
+ } \l__semantex_append_six_valuekey_auxiliary_temp_tl
+ \semantex_six_valuekey_store:nnN { #1 } { #2 } \l__semantex_append_six_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_six_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnn }
+ {
+ \exp_not:V\l__semantex_append_six_valuekey_auxiliary_original_temp_tl
+ \exp_not:V\l__semantex_append_six_valuekey_auxiliary_temp_tl
+ }
+ \cs_set_protected:cpn { __semantex_data_cs_custom_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+ {
+ \use:c { __semantex_data_cs_custom_six_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnn } { ##1 } ##2
+ }
+}
+
+\cs_new_protected:Npn\semantex_pre_append_six_valuekeys:nn#1#2
+{
+ % Pre-appends valuekeys with 6 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_pre_append_six_valuekey_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_pre_append_six_valuekey_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_pre_append_six_valuekey_auxiliary_temp_cs:nnnnnn##1##2##3##4##5##6 { #3 }
+ \tl_set:Nn\l__semantex_pre_append_six_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_keys:oN
+ {
+ \l__semantex_pre_append_six_valuekey_auxiliary_temp_cs:nnnnnn { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 }
+ } \l__semantex_pre_append_six_valuekey_auxiliary_temp_tl
+ \semantex_six_valuekey_store:nnN { #1 } { #2 } \l__semantex_pre_append_six_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_six_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnn }
+ {
+ \exp_not:V\l__semantex_pre_append_six_valuekey_auxiliary_original_temp_tl
+ \exp_not:V\l__semantex_pre_append_six_valuekey_auxiliary_temp_tl
+ }
+ \cs_set_protected:cpn { __semantex_data_cs_custom_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+ {
+ \use:c { __semantex_data_cs_custom_six_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnn } { ##1 } ##2
+ }
+}
+
+\cs_new_protected:Npn\semantex_append_seven_valuekeys:nn#1#2
+{
+ % Appends valuekeys with 7 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_append_seven_valuekey_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_append_seven_valuekey_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_append_seven_valuekey_auxiliary_temp_cs:nnnnnnn##1##2##3##4##5##6##7 { #3 }
+ \tl_set:Nn\l__semantex_append_seven_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_keys:oN
+ {
+ \l__semantex_append_seven_valuekey_auxiliary_temp_cs:nnnnnnn { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } { ##8 }
+ } \l__semantex_append_seven_valuekey_auxiliary_temp_tl
+ \semantex_seven_valuekey_store:nnN { #1 } { #2 } \l__semantex_append_seven_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_seven_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnn }
+ {
+ \exp_not:V\l__semantex_append_seven_valuekey_auxiliary_original_temp_tl
+ \exp_not:V\l__semantex_append_seven_valuekey_auxiliary_temp_tl
+ }
+ \cs_set_protected:cpn { __semantex_data_cs_custom_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+ {
+ \use:c { __semantex_data_cs_custom_seven_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnn } { ##1 } ##2
+ }
+}
+
+\cs_new_protected:Npn\semantex_pre_append_seven_valuekeys:nn#1#2
+{
+ % Pre-appends valuekeys with 7 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_pre_append_seven_valuekey_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_pre_append_seven_valuekey_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_pre_append_seven_valuekey_auxiliary_temp_cs:nnnnnnn##1##2##3##4##5##6##7 { #3 }
+ \tl_set:Nn\l__semantex_pre_append_seven_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_keys:oN
+ {
+ \l__semantex_pre_append_seven_valuekey_auxiliary_temp_cs:nnnnnnn { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } { ##8 }
+ } \l__semantex_pre_append_seven_valuekey_auxiliary_temp_tl
+ \semantex_seven_valuekey_store:nnN { #1 } { #2 } \l__semantex_pre_append_seven_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_seven_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnn }
+ {
+ \exp_not:V\l__semantex_pre_append_seven_valuekey_auxiliary_original_temp_tl
+ \exp_not:V\l__semantex_pre_append_seven_valuekey_auxiliary_temp_tl
+ }
+ \cs_set_protected:cpn { __semantex_data_cs_custom_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+ {
+ \use:c { __semantex_data_cs_custom_seven_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnn } { ##1 } ##2
+ }
+}
+
+\cs_new_protected:Npn\semantex_append_eight_valuekeys:nn#1#2
+{
+ % Appends valuekeys with 8 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_append_eight_valuekey_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_append_eight_valuekey_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_append_eight_valuekey_auxiliary_temp_cs:nnnnnnnn##1##2##3##4##5##6##7##8 { #3 }
+ \tl_set:Nn\l__semantex_append_eight_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_keys:oN
+ {
+ \l__semantex_append_eight_valuekey_auxiliary_temp_cs:nnnnnnnn { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } { ##8 } { ##9 }
+ } \l__semantex_append_eight_valuekey_auxiliary_temp_tl
+ \semantex_eight_valuekey_store:nnN { #1 } { #2 } \l__semantex_append_eight_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_eight_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn }
+ {
+ \exp_not:V\l__semantex_append_eight_valuekey_auxiliary_original_temp_tl
+ \exp_not:V\l__semantex_append_eight_valuekey_auxiliary_temp_tl
+ }
+ \cs_set_protected:cpn { __semantex_data_cs_custom_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+ {
+ \use:c { __semantex_data_cs_custom_eight_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn } { ##1 } ##2
+ }
+}
+
+\cs_new_protected:Npn\semantex_pre_append_eight_valuekeys:nn#1#2
+{
+ % Pre-appends valuekeys with 8 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_pre_append_eight_valuekey_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_pre_append_eight_valuekey_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_pre_append_eight_valuekey_auxiliary_temp_cs:nnnnnnnn##1##2##3##4##5##6##7##8 { #3 }
+ \tl_set:Nn\l__semantex_pre_append_eight_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_keys:oN
+ {
+ \l__semantex_pre_append_eight_valuekey_auxiliary_temp_cs:nnnnnnnn { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } { ##8 } { ##9 }
+ } \l__semantex_pre_append_eight_valuekey_auxiliary_temp_tl
+ \semantex_eight_valuekey_store:nnN { #1 } { #2 } \l__semantex_pre_append_eight_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_eight_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn }
+ {
+ \exp_not:V\l__semantex_pre_append_eight_valuekey_auxiliary_temp_tl
+ \exp_not:V\l__semantex_pre_append_eight_valuekey_auxiliary_original_temp_tl
+ }
+ \cs_set_protected:cpn { __semantex_data_cs_custom_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+ {
+ \use:c { __semantex_data_cs_custom_eight_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn } { ##1 } ##2
+ }
+}
+
+%\cs_new_protected:Npn\semantex_append_nine_valuekeys:nn#1#2
+%{
+% % Appends valuekeys with 9 values
+% \clist_map_inline:nn { #2 }{
+% \__semantex_append_nine_valuekey_format_auxiliary:nnn{#1}##1
+% }
+%}
+%
+%\cs_new_protected:Npn\__semantex_append_nine_valuekey_format_auxiliary:nnn#1#2#3
+%{
+% \cs_set:Npn\l__semantex_append_nine_valuekey_auxiliary_temp_cs:nnnnnnnnn##1##2##3##4##5##6##7##8##9 { #3 }
+% \tl_set:Nn\l__semantex_append_nine_valuekey_auxiliary_temp_tl{}
+% \cs_set:Npn\l__semantex_append_nine_valuekey_auxiliary_singlekey_temp_cs:n##1
+% {
+% \__semantex_preprocess_singlekey:nnN { \__semantex_nine_valuekey_format_auxiliary_name_of_register_temp_tl } { ##1 } \l__semantex_append_nine_valuekey_auxiliary_temp_tl
+% }
+% \cs_set:Npn\l__semantex_append_nine_valuekey_auxiliary_valuekey_temp_cs:nn##1##2
+% {
+% \__semantex_preprocess_valuekey:nnnN { \__semantex_nine_valuekey_format_auxiliary_name_of_register_temp_tl } { ##1 } { ##2 } \l__semantex_append_nine_valuekey_auxiliary_temp_tl
+% }
+% \semantex_keyval_parse:NNo
+% \l__semantex_append_nine_valuekey_auxiliary_singlekey_temp_cs:n
+% \l__semantex_append_nine_valuekey_auxiliary_valuekey_temp_cs:nn
+% {
+% \l__semantex_append_nine_valuekey_auxiliary_temp_cs:nnnnnnnnn { ##1 } { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } { ##8 } { ##9 }
+% }
+% \semantex_nine_valuekey_store:nnN { #1 } { #2 } \l__semantex_append_nine_valuekey_auxiliary_original_temp_tl
+% \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_nine_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn }
+% {
+% \exp_not:V\l__semantex_append_nine_valuekey_auxiliary_original_temp_tl
+% \exp_not:V\l__semantex_append_nine_valuekey_auxiliary_temp_tl
+% }
+% \cs_set_protected:cpn { __semantex_data_cs_custom_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+% {
+% \tl_set:Nn \__semantex_nine_valuekey_format_auxiliary_name_of_register_temp_tl { ##1 }
+% \use:c { __semantex_data_cs_custom_nine_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn } ##2
+% }
+%}
+%
+%\cs_new_protected:Npn\semantex_pre_append_nine_valuekeys:nn#1#2
+%{
+% % Pre-appends valuekeys with 9 values
+% \clist_map_inline:nn { #2 }{
+% \__semantex_pre_append_nine_valuekey_format_auxiliary:nnn{#1}##1
+% }
+%}
+%
+%\cs_new_protected:Npn\__semantex_pre_append_nine_valuekey_format_auxiliary:nnn#1#2#3
+%{
+% \cs_set:Npn\l__semantex_pre_append_nine_valuekey_auxiliary_temp_cs:nnnnnnnnn##1##2##3##4##5##6##7##8##9 { #3 }
+% \tl_set:Nn\l__semantex_pre_append_nine_valuekey_auxiliary_temp_tl{}
+% \cs_set:Npn\l__semantex_pre_append_nine_valuekey_auxiliary_singlekey_temp_cs:n##1
+% {
+% \__semantex_preprocess_singlekey:nnN { \__semantex_nine_valuekey_format_auxiliary_name_of_register_temp_tl } { ##1 } \l__semantex_pre_append_nine_valuekey_auxiliary_temp_tl
+% }
+% \cs_set:Npn\l__semantex_pre_append_nine_valuekey_auxiliary_valuekey_temp_cs:nn##1##2
+% {
+% \__semantex_preprocess_valuekey:nnnN { \__semantex_nine_valuekey_format_auxiliary_name_of_register_temp_tl } { ##1 } { ##2 } \l__semantex_pre_append_nine_valuekey_auxiliary_temp_tl
+% }
+% \semantex_keyval_parse:NNo
+% \l__semantex_pre_append_nine_valuekey_auxiliary_singlekey_temp_cs:n
+% \l__semantex_pre_append_nine_valuekey_auxiliary_valuekey_temp_cs:nn
+% {
+% \l__semantex_pre_append_nine_valuekey_auxiliary_temp_cs:nnnnnnnnn { ##1 } { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } { ##8 } { ##9 }
+% }
+% \semantex_nine_valuekey_store:nnN { #1 } { #2 } \l__semantex_pre_append_nine_valuekey_auxiliary_original_temp_tl
+% \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_nine_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn }
+% {
+% \exp_not:V\l__semantex_pre_append_nine_valuekey_auxiliary_temp_tl
+% \exp_not:V\l__semantex_pre_append_nine_valuekey_auxiliary_original_temp_tl
+% }
+% \cs_set_protected:cpn { __semantex_data_cs_custom_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+% {
+% \tl_set:Nn \__semantex_nine_valuekey_format_auxiliary_name_of_register_temp_tl { ##1 }
+% \use:c { __semantex_data_cs_custom_nine_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn } ##2
+% }
+%}
+
% SETTING UP THE ARGUMENT KEYVAL INTERFACE
@@ -4525,7 +5699,7 @@
}
-\cs_new_protected:Npn\__semantex_preprocess_arg_valuekey:nnnN#1#2#3#4
+\cs_new_protected:Npn\__semantex_preprocess_arg_valuekey:nnnN#1#2#3#4%CHECK4
{
\str_case:nnF { #2 }
{
@@ -4535,40 +5709,40 @@
#3
}
}
- { setkeys }{
+ { set~keys }{
\semantex_preprocess_keys:nN { #3 } #4
}
- { keysset }{
+ { keys~set }{
\semantex_preprocess_keys:nN { #3 } #4
}
- { setkeysx }{
+ { set~keys~x }{
\semantex_preprocess_keys_x:nN { #3 } #4
}
- { keyssetx }{
+ { keys~set~x }{
\semantex_preprocess_keys_x:nN { #3 } #4
}
- { setargkeys }{
+ { set~arg~keys }{
\semantex_preprocess_arg_keys:nN { #3 } #4
}
- { argkeysset }{
+ { arg~keys~set }{
\semantex_preprocess_arg_keys:nN { #3 } #4
}
- { setargkeysx }{
+ { set~arg~keys~x }{
\semantex_preprocess_arg_keys_x:nN { #3 } #4
}
- { argkeyssetx }{
+ { arg~keys~set~x }{
\semantex_preprocess_arg_keys_x:nN { #3 } #4
}
- { setargsinglekeys }{
+ { set~arg~single~keys }{
\semantex_preprocess_arg_singlekeys:nN { #3 } #4
}
- { argsinglekeysset }{
+ { arg~single~keys~set }{
\semantex_preprocess_arg_singlekeys:nN { #3 } #4
}
- { setargsinglekeysx }{
+ { set~arg~single~keys~x }{
\semantex_preprocess_arg_singlekeys_x:nN { #3 } #4
}
- { argsinglekeyssetx }{
+ { arg~single~keys~set~x }{
\semantex_preprocess_arg_singlekeys_x:nN { #3 } #4
}
}
@@ -4626,40 +5800,40 @@
#3
}
}
- { setkeys }{
+ { set~keys }{
\semantex_preprocess_keys:nN { #3 } #4
}
- { keysset }{
+ { keys~set }{
\semantex_preprocess_keys:nN { #3 } #4
}
- { setkeysx }{
+ { set~keys~x }{
\semantex_preprocess_keys_x:nN { #3 } #4
}
- { keyssetx }{
+ { keys~set~x }{
\semantex_preprocess_keys_x:nN { #3 } #4
}
- { setargkeys }{
+ { set~arg~keys }{
\semantex_preprocess_arg_keys:nN { #3 } #4
}
- { argkeysset }{
+ { arg~keys~set }{
\semantex_preprocess_arg_keys:nN { #3 } #4
}
- { setargkeysx }{
+ { set~arg~keys~x }{
\semantex_preprocess_arg_keys_x:nN { #3 } #4
}
- { argkeyssetx }{
+ { arg~keys~set~x }{
\semantex_preprocess_arg_keys_x:nN { #3 } #4
}
- { setargsinglekeys }{
+ { set~arg~single~keys }{
\semantex_preprocess_arg_singlekeys:nN { #3 } #4
}
- { argsinglekeysset }{
+ { arg~single~keys~set }{
\semantex_preprocess_arg_singlekeys:nN { #3 } #4
}
- { setargsinglekeysx }{
+ { set~arg~single~keys~x }{
\semantex_preprocess_arg_singlekeys_x:nN { #3 } #4
}
- { argsinglekeyssetx }{
+ { arg~single~keys~set~x }{
\semantex_preprocess_arg_singlekeys_x:nN { #3 } #4
}
}
@@ -4757,11 +5931,11 @@
{
% Add new argument valuekeys with 3 values
\clist_map_inline:nn { #2 }{
- \__semantex_three_arg_valuekey_format_auxiliary:nnn{#1}##1
+ \__semantex_arg_three_valuekey_format_auxiliary:nnn{#1}##1
}
}
-\cs_new_protected:Npn\__semantex_three_arg_valuekey_format_auxiliary:nnn#1#2#3
+\cs_new_protected:Npn\__semantex_arg_three_valuekey_format_auxiliary:nnn#1#2#3
{
\cs_set:Npn\l__semantex_arg_three_valuekey_auxiliary_temp_cs:nnn##1##2##3 { #3 }
\tl_set:Nn\l__semantex_arg_three_valuekey_auxiliary_temp_tl{}
@@ -4783,11 +5957,11 @@
{
% Add new argument valuekeys with 4 values
\clist_map_inline:nn { #2 }{
- \__semantex_four_arg_valuekey_format_auxiliary:nnn{#1}##1
+ \__semantex_arg_four_valuekey_format_auxiliary:nnn{#1}##1
}
}
-\cs_new_protected:Npn\__semantex_four_arg_valuekey_format_auxiliary:nnn#1#2#3
+\cs_new_protected:Npn\__semantex_arg_four_valuekey_format_auxiliary:nnn#1#2#3
{
\cs_set:Npn\l__semantex_arg_four_valuekey_auxiliary_temp_cs:nnnn##1##2##3##4 { #3 }
\tl_set:Nn\l__semantex_arg_four_valuekey_auxiliary_temp_tl{}
@@ -4809,11 +5983,11 @@
{
% Add new argument valuekeys with 5 values
\clist_map_inline:nn { #2 }{
- \__semantex_five_arg_valuekey_format_auxiliary:nnn{#1}##1
+ \__semantex_arg_five_valuekey_format_auxiliary:nnn{#1}##1
}
}
-\cs_new_protected:Npn\__semantex_five_arg_valuekey_format_auxiliary:nnn#1#2#3
+\cs_new_protected:Npn\__semantex_arg_five_valuekey_format_auxiliary:nnn#1#2#3
{
\cs_set:Npn\l__semantex_arg_five_valuekey_auxiliary_temp_cs:nnnnn##1##2##3##4##5 { #3 }
\tl_set:Nn\l__semantex_arg_five_valuekey_auxiliary_temp_tl{}
@@ -4835,11 +6009,11 @@
{
% Add new argument valuekeys with 6 values
\clist_map_inline:nn { #2 }{
- \__semantex_six_arg_valuekey_format_auxiliary:nnn{#1}##1
+ \__semantex_arg_six_valuekey_format_auxiliary:nnn{#1}##1
}
}
-\cs_new_protected:Npn\__semantex_six_arg_valuekey_format_auxiliary:nnn#1#2#3
+\cs_new_protected:Npn\__semantex_arg_six_valuekey_format_auxiliary:nnn#1#2#3
{
\cs_set:Npn\l__semantex_arg_six_valuekey_auxiliary_temp_cs:nnnnnn##1##2##3##4##5##6 { #3 }
\tl_set:Nn\l__semantex_arg_six_valuekey_auxiliary_temp_tl{}
@@ -4861,11 +6035,11 @@
{
% Add new argument valuekeys with 7 values
\clist_map_inline:nn { #2 }{
- \__semantex_seven_arg_valuekey_format_auxiliary:nnn{#1}##1
+ \__semantex_arg_seven_valuekey_format_auxiliary:nnn{#1}##1
}
}
-\cs_new_protected:Npn\__semantex_seven_arg_valuekey_format_auxiliary:nnn#1#2#3
+\cs_new_protected:Npn\__semantex_arg_seven_valuekey_format_auxiliary:nnn#1#2#3
{
\cs_set:Npn\l__semantex_arg_seven_valuekey_auxiliary_temp_cs:nnnnnnn##1##2##3##4##5##6##7 { #3 }
\tl_set:Nn\l__semantex_arg_seven_valuekey_auxiliary_temp_tl{}
@@ -4887,11 +6061,11 @@
{
% Add new argument valuekeys with 8 values
\clist_map_inline:nn { #2 }{
- \__semantex_eight_arg_valuekey_format_auxiliary:nnn{#1}##1
+ \__semantex_arg_eight_valuekey_format_auxiliary:nnn{#1}##1
}
}
-\cs_new_protected:Npn\__semantex_eight_arg_valuekey_format_auxiliary:nnn#1#2#3
+\cs_new_protected:Npn\__semantex_arg_eight_valuekey_format_auxiliary:nnn#1#2#3
{
\cs_set:Npn\l__semantex_arg_eight_valuekey_auxiliary_temp_cs:nnnnnnnn##1##2##3##4##5##6##7##8 { #3 }
\tl_set:Nn\l__semantex_arg_eight_valuekey_auxiliary_temp_tl{}
@@ -4909,75 +6083,617 @@
}
}
-\cs_new_protected:Npn\semantex_define_arg_nine_valuekeys:nn#1#2
+%\cs_new_protected:Npn\semantex_define_arg_nine_valuekeys:nn#1#2
+%{
+% % Add new argument valuekeys with 9 values
+% \clist_map_inline:nn { #2 }{
+% \__semantex_arg_nine_valuekey_format_auxiliary:nnn{#1}##1
+% }
+%}
+%
+%\cs_new_protected:Npn\__semantex_arg_nine_valuekey_format_auxiliary:nnn#1#2#3
+%{
+% \cs_set:Npn\l__semantex_arg_nine_valuekey_auxiliary_temp_cs:nnnnnnnnn##1##2##3##4##5##6##7##8##9 { #3 }
+% \tl_set:Nn\l__semantex_arg_nine_valuekey_auxiliary_temp_tl{}
+% \cs_set:Npn\l__semantex_arg_nine_valuekey_auxiliary_singlekey_temp_cs:n##1
+% {
+% \__semantex_preprocess_arg_singlekey:nnN { \__semantex_arg_nine_valuekey_format_auxiliary_name_of_register_temp_tl } { ##1 } \l__semantex_arg_nine_valuekey_auxiliary_temp_tl
+% }
+% \cs_set:Npn\l__semantex_arg_nine_valuekey_auxiliary_valuekey_temp_cs:nn##1##2
+% {
+% \__semantex_preprocess_arg_valuekey:nnnN { \__semantex_arg_nine_valuekey_format_auxiliary_name_of_register_temp_tl } { ##1 } { ##2 } \l__semantex_arg_nine_valuekey_auxiliary_temp_tl
+% }
+% \semantex_keyval_parse:NNo
+% \l__semantex_arg_nine_valuekey_auxiliary_singlekey_temp_cs:n
+% \l__semantex_arg_nine_valuekey_auxiliary_valuekey_temp_cs:nn
+% {
+% \l__semantex_arg_nine_valuekey_auxiliary_temp_cs:nnnnnnnnn { ##1 } { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } { ##8 } { ##9 }
+% }
+% \cs_set_protected:cpo { __semantex_data_cs_custom_arg_nine_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn } ##1##2##3##4##5##6##7##8##9
+% {
+% \l__semantex_arg_nine_valuekey_auxiliary_temp_tl
+% }
+% \cs_set_protected:cpn { __semantex_data_cs_custom_arg_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+% {
+% \tl_set:Nn \__semantex_arg_nine_valuekey_format_auxiliary_name_of_register_temp_tl { ##1 }
+% \use:c { __semantex_data_cs_custom_arg_nine_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn } ##2
+% }
+%}
+
+
+\cs_new_protected:Npn\semantex_append_arg_valuekeys:nn#1#2
+{
+ % Appends keys taking one value
+ \clist_map_inline:nn { #2 }{
+ \__semantex_append_arg_valuekeys_format_auxiliary:nnn { #1 } ##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_append_arg_valuekeys_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_append_arg_valuekeys_auxiliary_temp_cs:n##1 { #3 }
+ \tl_set:Nn \l__semantex_append_arg_valuekeys_auxiliary_temp_tl {}
+ \semantex_preprocess_arg_keys:oN
+ {
+ \l__semantex_append_arg_valuekeys_auxiliary_temp_cs:n { ##2 }
+ } \l__semantex_append_arg_valuekeys_auxiliary_temp_tl
+ \semantex_arg_valuekey_store:nnN { #1 } { #2 } \l__semantex_append_arg_valuekeys_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn
+ % \cs_set_protected:cx gave us ##1 where we wanted #1
+ { __semantex_data_cs_custom_arg_valuekey_#1_\tl_trim_spaces:n{#2}:nn }
+ {
+ \exp_not:V\l__semantex_append_arg_valuekeys_auxiliary_original_temp_tl
+ \exp_not:V\l__semantex_append_arg_valuekeys_auxiliary_temp_tl
+ }
+}
+
+\cs_new_protected:Npn\semantex_pre_append_arg_valuekeys:nn#1#2
{
- % Add new argument valuekeys with 9 values
+ % Pre-appends keys taking one value
\clist_map_inline:nn { #2 }{
- \__semantex_nine_arg_valuekey_format_auxiliary:nnn{#1}##1
+ \__semantex_pre_append_arg_valuekeys_format_auxiliary:nnn { #1 } ##1
}
}
-\cs_new_protected:Npn\__semantex_nine_arg_valuekey_format_auxiliary:nnn#1#2#3
+\cs_new_protected:Npn\__semantex_pre_append_arg_valuekeys_format_auxiliary:nnn#1#2#3
{
- \cs_set:Npn\l__semantex_arg_nine_valuekey_auxiliary_temp_cs:nnnnnnnnn##1##2##3##4##5##6##7##8##9 { #3 }
- \tl_set:Nn\l__semantex_arg_nine_valuekey_auxiliary_temp_tl{}
- \cs_set:Npn\l__semantex_arg_nine_valuekey_auxiliary_singlekey_temp_cs:n##1
+ \cs_set:Npn\l__semantex_pre_append_arg_valuekeys_auxiliary_temp_cs:n##1 { #3 }
+ \tl_set:Nn \l__semantex_pre_append_arg_valuekeys_auxiliary_temp_tl {}
+ \semantex_preprocess_arg_keys:oN
+ {
+ \l__semantex_pre_append_arg_valuekeys_auxiliary_temp_cs:n { ##2 }
+ } \l__semantex_pre_append_arg_valuekeys_auxiliary_temp_tl
+ \semantex_arg_valuekey_store:nnN { #1 } { #2 } \l__semantex_pre_append_arg_valuekeys_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn
+ % \cs_set_protected:cx gave us ##1 where we wanted #1
+ { __semantex_data_cs_custom_arg_valuekey_#1_\tl_trim_spaces:n{#2}:nn }
{
- \__semantex_preprocess_arg_singlekey:nnN { \__semantex_arg_nine_valuekey_format_auxiliary_name_of_register_temp_tl } { ##1 } \l__semantex_arg_nine_valuekey_auxiliary_temp_tl
+ \exp_not:V\l__semantex_pre_append_arg_valuekeys_auxiliary_temp_tl
+ \exp_not:V\l__semantex_pre_append_arg_valuekeys_auxiliary_original_temp_tl
+ }
+}
+
+\cs_new_protected:Npn\semantex_append_arg_singlekeys:nn#1#2
+{
+ % Appends keys taking no values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_append_arg_singlekeys_format_auxiliary:nnn { #1 } ##1
}
- \cs_set:Npn\l__semantex_arg_nine_valuekey_auxiliary_valuekey_temp_cs:nn##1##2
+}
+
+\cs_new_protected:Npn \__semantex_append_arg_singlekeys_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_append_arg_singlekeys_auxiliary_temp_cs: { #3 }
+ \tl_set:Nn \l__semantex_append_arg_singlekeys_auxiliary_temp_tl {}
+ \semantex_preprocess_arg_keys:oN
{
- \__semantex_preprocess_arg_valuekey:nnnN { \__semantex_arg_nine_valuekey_format_auxiliary_name_of_register_temp_tl } { ##1 } { ##2 } \l__semantex_arg_nine_valuekey_auxiliary_temp_tl
+ \l__semantex_append_arg_singlekeys_auxiliary_temp_cs:
+ } \l__semantex_append_arg_singlekeys_auxiliary_temp_tl
+ \semantex_arg_singlekey_store:nnN { #1 } { #2 } \l__semantex_append_arg_singlekeys_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn
+ % \cs_set_protected:cx gave us ##1 where we wanted #1
+ { __semantex_data_cs_custom_arg_singlekey_#1_\tl_trim_spaces:n{#2}:n }
+ {
+ \exp_not:V\l__semantex_append_arg_singlekeys_auxiliary_original_temp_tl
+ \exp_not:V\l__semantex_append_arg_singlekeys_auxiliary_temp_tl
}
- \semantex_keyval_parse:NNo
- \l__semantex_arg_nine_valuekey_auxiliary_singlekey_temp_cs:n
- \l__semantex_arg_nine_valuekey_auxiliary_valuekey_temp_cs:nn
- {
- \l__semantex_arg_nine_valuekey_auxiliary_temp_cs:nnnnnnnnn { ##1 } { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } { ##8 } { ##9 }
- }
- \cs_set_protected:cpo { __semantex_data_cs_custom_arg_nine_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn } ##1##2##3##4##5##6##7##8##9
+}
+
+\cs_new_protected:Npn\semantex_pre_append_arg_singlekeys:nn#1#2
+{
+ % Pre-append_args keys taking no values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_pre_append_arg_singlekeys_format_auxiliary:nnn { #1 } ##1
+ }
+}
+
+\cs_new_protected:Npn \__semantex_pre_append_arg_singlekeys_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_pre_append_arg_singlekeys_auxiliary_temp_cs: { #3 }
+ \tl_set:Nn \l__semantex_pre_append_arg_singlekeys_auxiliary_temp_tl {}
+ \semantex_preprocess_arg_keys:oN
+ {
+ \l__semantex_pre_append_arg_singlekeys_auxiliary_temp_cs:
+ } \l__semantex_pre_append_arg_singlekeys_auxiliary_temp_tl
+ \semantex_arg_singlekey_store:nnN { #1 } { #2 } \l__semantex_pre_append_arg_singlekeys_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn
+ % \cs_set_protected:cx gave us ##1 where we wanted #1
+ { __semantex_data_cs_custom_arg_singlekey_#1_\tl_trim_spaces:n{#2}:n }
+ {
+ \exp_not:V\l__semantex_pre_append_arg_singlekeys_auxiliary_temp_tl
+ \exp_not:V\l__semantex_pre_append_arg_singlekeys_auxiliary_original_temp_tl
+ }
+}
+
+\cs_new_protected:Npn\semantex_append_arg_two_valuekeys:nn#1#2
+{
+ % Appends valuekeys with 2 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_append_arg_two_valuekey_format_auxiliary:nnn { #1 } ##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_append_arg_two_valuekey_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_append_arg_two_valuekey_auxiliary_temp_cs:nn##1##2 { #3 }
+ \tl_set:Nn\l__semantex_append_arg_two_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_arg_keys:oN
+ {
+ \l__semantex_append_arg_two_valuekey_auxiliary_temp_cs:nn { ##2 } { ##3 }
+ } \l__semantex_append_arg_two_valuekey_auxiliary_temp_tl
+ \semantex_arg_two_valuekey_store:nnN { #1 } { #2 } \l__semantex_append_arg_two_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_arg_two_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnn }
{
- \l__semantex_arg_nine_valuekey_auxiliary_temp_tl
+ \exp_not:V\l__semantex_append_arg_two_valuekey_auxiliary_original_temp_tl
+ \exp_not:V\l__semantex_append_arg_two_valuekey_auxiliary_temp_tl
}
\cs_set_protected:cpn { __semantex_data_cs_custom_arg_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
{
- \tl_set:Nn \__semantex_arg_nine_valuekey_format_auxiliary_name_of_register_temp_tl { ##1 }
- \use:c { __semantex_data_cs_custom_arg_nine_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn } ##2
+ \use:c { __semantex_data_cs_custom_arg_two_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnn } { ##1 } ##2
}
}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% COMMANDS HANDLING THE PARSE ROUTINE
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\cs_new_protected:Npn\semantex_pre_append_arg_two_valuekeys:nn#1#2
+{
+ % Pre-appends valuekeys with 2 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_pre_append_arg_two_valuekey_format_auxiliary:nnn { #1 } ##1
+ }
+}
-\cs_new_protected:Npn\semantex_parse:n#1
+\cs_new_protected:Npn\__semantex_pre_append_arg_two_valuekey_format_auxiliary:nnn#1#2#3
{
- % This command runs all the keys that the user may have
- % stored via the parseoptions key
- \exp_args:NNx\cs_set_protected:Nn\l__semantex_parse_temp_cs:n
- % \cs_set:Nx gave us ##1 where we wanted #1
+ \cs_set:Npn\l__semantex_pre_append_arg_two_valuekey_auxiliary_temp_cs:nn##1##2 { #3 }
+ \tl_set:Nn\l__semantex_pre_append_arg_two_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_arg_keys:oN
{
- \semantex_data_tl_get_exp_not:nn { #1 } { parseoptions }
+ \l__semantex_pre_append_arg_two_valuekey_auxiliary_temp_cs:nn { ##2 } { ##3 }
+ } \l__semantex_pre_append_arg_two_valuekey_auxiliary_temp_tl
+ \semantex_arg_two_valuekey_store:nnN { #1 } { #2 } \l__semantex_pre_append_arg_two_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_arg_two_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnn }
+ {
+ \exp_not:V\l__semantex_pre_append_arg_two_valuekey_auxiliary_original_temp_tl
+ \exp_not:V\l__semantex_pre_append_arg_two_valuekey_auxiliary_temp_tl
+ }
+ \cs_set_protected:cpn { __semantex_data_cs_custom_arg_arg_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+ {
+ \use:c { __semantex_data_cs_custom_arg_two_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnn } { ##1 } ##2
}
- \l__semantex_parse_temp_cs:n { #1 }
- \semantex_data_tl_clear:nn { #1 } { parseoptions }
}
-\cs_new_protected:Npn\semantex_add_to_parse_options:nn#1#2
+\cs_new_protected:Npn\semantex_append_arg_three_valuekeys:nn#1#2
{
- \tl_set:Nn\l__semantex_parseoptions_auxiliary_temp_tl{}
- \semantex_preprocess_keys:nN { #2 } \l__semantex_parseoptions_auxiliary_temp_tl
- \semantex_add_raw_commands_to_parse_options:no { #1 } { \l__semantex_parseoptions_auxiliary_temp_tl }
+ % Appends valuekeys with 3 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_append_arg_three_valuekey_format_auxiliary:nnn {#1} ##1
+ }
}
-\cs_new_protected:Npn\semantex_add_raw_commands_to_parse_options:nn#1#2
+\cs_new_protected:Npn\__semantex_append_arg_three_valuekey_format_auxiliary:nnn#1#2#3
{
- \semantex_data_tl_put_right:nnn { #1 } { parseoptions } { #2 }
+ \cs_set:Npn\l__semantex_append_arg_three_valuekey_auxiliary_temp_cs:nnn##1##2##3 { #3 }
+ \tl_set:Nn\l__semantex_append_arg_three_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_arg_keys:oN
+ {
+ \l__semantex_append_arg_three_valuekey_auxiliary_temp_cs:nnn { ##2 } { ##3 } { ##4 }
+ } \l__semantex_append_arg_three_valuekey_auxiliary_temp_tl
+ \semantex_arg_three_valuekey_store:nnN { #1 } { #2 } \l__semantex_append_arg_three_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_arg_three_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnn }
+ {
+ \exp_not:V\l__semantex_append_arg_three_valuekey_auxiliary_original_temp_tl
+ \exp_not:V\l__semantex_append_arg_three_valuekey_auxiliary_temp_tl
+ }
+ \cs_set_protected:cpn { __semantex_data_cs_custom_arg_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+ {
+ \use:c { __semantex_data_cs_custom_arg_three_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnn } { ##1 } ##2
+ }
}
-\cs_generate_variant:Nn \semantex_add_raw_commands_to_parse_options:nn { no }
+\cs_new_protected:Npn\semantex_pre_append_arg_three_valuekeys:nn#1#2
+{
+ % Pre-appends valuekeys with 3 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_pre_append_arg_three_valuekey_format_auxiliary:nnn {#1} ##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_pre_append_arg_three_valuekey_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_pre_append_arg_three_valuekey_auxiliary_temp_cs:nnn##1##2##3 { #3 }
+ \tl_set:Nn\l__semantex_pre_append_arg_three_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_arg_keys:oN
+ {
+ \l__semantex_pre_append_arg_three_valuekey_auxiliary_temp_cs:nnn { ##2 } { ##3 } { ##4 }
+ } \l__semantex_pre_append_arg_three_valuekey_auxiliary_temp_tl
+ \semantex_arg_three_valuekey_store:nnN { #1 } { #2 } \l__semantex_pre_append_arg_three_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_arg_three_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnn }
+ {
+ \exp_not:V\l__semantex_pre_append_arg_three_valuekey_auxiliary_temp_tl
+ \exp_not:V\l__semantex_pre_append_arg_three_valuekey_auxiliary_original_temp_tl
+ }
+ \cs_set_protected:cpn { __semantex_data_cs_custom_arg_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+ {
+ \use:c { __semantex_data_cs_custom_arg_three_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnn } { ##1 } ##2
+ }
+}
+
+\cs_new_protected:Npn\semantex_append_arg_four_valuekeys:nn#1#2
+{
+ % Appends valuekeys with 4 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_append_arg_four_valuekey_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_append_arg_four_valuekey_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_append_arg_four_valuekey_auxiliary_temp_cs:nnnn##1##2##3##4 { #3 }
+ \tl_set:Nn\l__semantex_append_arg_four_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_arg_keys:oN
+ {
+ \l__semantex_append_arg_four_valuekey_auxiliary_temp_cs:nnnn { ##2 } { ##3 } { ##4 } { ##5 }
+ } \l__semantex_append_arg_four_valuekey_auxiliary_temp_tl
+ \semantex_arg_four_valuekey_store:nnN { #1 } { #2 } \l__semantex_append_arg_four_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_arg_four_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnn }
+ {
+ \exp_not:V\l__semantex_append_arg_four_valuekey_auxiliary_original_temp_tl
+ \exp_not:V\l__semantex_append_arg_four_valuekey_auxiliary_temp_tl
+ }
+ \cs_set_protected:cpn { __semantex_data_cs_custom_arg_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+ {
+ \use:c { __semantex_data_cs_custom_arg_four_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnn } { ##1 } ##2
+ }
+}
+
+\cs_new_protected:Npn\semantex_pre_append_arg_four_valuekeys:nn#1#2
+{
+ % Pre-appends valuekeys with 4 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_pre_append_arg_four_valuekey_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_pre_append_arg_four_valuekey_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_pre_append_arg_four_valuekey_auxiliary_temp_cs:nnnn##1##2##3##4 { #3 }
+ \tl_set:Nn\l__semantex_pre_append_arg_four_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_arg_keys:oN
+ {
+ \l__semantex_pre_append_arg_four_valuekey_auxiliary_temp_cs:nnnn { ##2 } { ##3 } { ##4 } { ##5 }
+ } \l__semantex_pre_append_arg_four_valuekey_auxiliary_temp_tl
+ \semantex_arg_four_valuekey_store:nnN { #1 } { #2 } \l__semantex_pre_append_arg_four_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_arg_four_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnn }
+ {
+ \exp_not:V\l__semantex_pre_append_arg_four_valuekey_auxiliary_temp_tl
+ \exp_not:V\l__semantex_pre_append_arg_four_valuekey_auxiliary_original_temp_tl
+ }
+ \cs_set_protected:cpn { __semantex_data_cs_custom_arg_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+ {
+ \use:c { __semantex_data_cs_custom_arg_four_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnn } { ##1 } ##2
+ }
+}
+
+\cs_new_protected:Npn\semantex_append_arg_five_valuekeys:nn#1#2
+{
+ % Appends valuekeys with 5 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_append_arg_five_valuekey_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_append_arg_five_valuekey_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_append_arg_five_valuekey_auxiliary_temp_cs:nnnnn##1##2##3##4##5 { #3 }
+ \tl_set:Nn\l__semantex_append_arg_five_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_arg_keys:oN
+ {
+ \l__semantex_append_arg_five_valuekey_auxiliary_temp_cs:nnnnn { ##2 } { ##3 } { ##4 } { ##5 } { ##6 }
+ } \l__semantex_append_arg_five_valuekey_auxiliary_temp_tl
+ \semantex_arg_five_valuekey_store:nnN { #1 } { #2 } \l__semantex_append_arg_five_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_arg_five_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnn }
+ {
+ \exp_not:V\l__semantex_append_arg_five_valuekey_auxiliary_original_temp_tl
+ \exp_not:V\l__semantex_append_arg_five_valuekey_auxiliary_temp_tl
+ }
+ \cs_set_protected:cpn { __semantex_data_cs_custom_arg_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+ {
+ \use:c { __semantex_data_cs_custom_arg_five_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnn } { ##1 } ##2
+ }
+}
+
+\cs_new_protected:Npn\semantex_pre_append_arg_five_valuekeys:nn#1#2
+{
+ % Pre-appends valuekeys with 5 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_pre_append_arg_five_valuekey_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_pre_append_arg_five_valuekey_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_pre_append_arg_five_valuekey_auxiliary_temp_cs:nnnnn##1##2##3##4##5 { #3 }
+ \tl_set:Nn\l__semantex_pre_append_arg_five_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_arg_keys:oN
+ {
+ \l__semantex_pre_append_arg_five_valuekey_auxiliary_temp_cs:nnnnn { ##2 } { ##3 } { ##4 } { ##5 } { ##6 }
+ } \l__semantex_pre_append_arg_five_valuekey_auxiliary_temp_tl
+ \semantex_arg_five_valuekey_store:nnN { #1 } { #2 } \l__semantex_pre_append_arg_five_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_arg_five_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnn }
+ {
+ \exp_not:V\l__semantex_pre_append_arg_five_valuekey_auxiliary_temp_tl
+ \exp_not:V\l__semantex_pre_append_arg_five_valuekey_auxiliary_original_temp_tl
+ }
+ \cs_set_protected:cpn { __semantex_data_cs_custom_arg_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+ {
+ \use:c { __semantex_data_cs_custom_arg_five_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnn } { ##1 } ##2
+ }
+}
+
+\cs_new_protected:Npn\semantex_append_arg_six_valuekeys:nn#1#2
+{
+ % Appends valuekeys with 6 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_append_arg_six_valuekey_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_append_arg_six_valuekey_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_append_arg_six_valuekey_auxiliary_temp_cs:nnnnnn##1##2##3##4##5##6 { #3 }
+ \tl_set:Nn\l__semantex_append_arg_six_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_arg_keys:oN
+ {
+ \l__semantex_append_arg_six_valuekey_auxiliary_temp_cs:nnnnnn { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 }
+ } \l__semantex_append_arg_six_valuekey_auxiliary_temp_tl
+ \semantex_arg_six_valuekey_store:nnN { #1 } { #2 } \l__semantex_append_arg_six_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_arg_six_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnn }
+ {
+ \exp_not:V\l__semantex_append_arg_six_valuekey_auxiliary_original_temp_tl
+ \exp_not:V\l__semantex_append_arg_six_valuekey_auxiliary_temp_tl
+ }
+ \cs_set_protected:cpn { __semantex_data_cs_custom_arg_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+ {
+ \use:c { __semantex_data_cs_custom_arg_six_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnn } { ##1 } ##2
+ }
+}
+
+\cs_new_protected:Npn\semantex_pre_append_arg_six_valuekeys:nn#1#2
+{
+ % Pre-appends valuekeys with 6 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_pre_append_arg_six_valuekey_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_pre_append_arg_six_valuekey_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_pre_append_arg_six_valuekey_auxiliary_temp_cs:nnnnnn##1##2##3##4##5##6 { #3 }
+ \tl_set:Nn\l__semantex_pre_append_arg_six_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_arg_keys:oN
+ {
+ \l__semantex_pre_append_arg_six_valuekey_auxiliary_temp_cs:nnnnnn { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 }
+ } \l__semantex_pre_append_arg_six_valuekey_auxiliary_temp_tl
+ \semantex_arg_six_valuekey_store:nnN { #1 } { #2 } \l__semantex_pre_append_arg_six_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_arg_six_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnn }
+ {
+ \exp_not:V\l__semantex_pre_append_arg_six_valuekey_auxiliary_original_temp_tl
+ \exp_not:V\l__semantex_pre_append_arg_six_valuekey_auxiliary_temp_tl
+ }
+ \cs_set_protected:cpn { __semantex_data_cs_custom_arg_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+ {
+ \use:c { __semantex_data_cs_custom_arg_six_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnn } { ##1 } ##2
+ }
+}
+
+\cs_new_protected:Npn\semantex_append_arg_seven_valuekeys:nn#1#2
+{
+ % Appends valuekeys with 7 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_append_arg_seven_valuekey_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_append_arg_seven_valuekey_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_append_arg_seven_valuekey_auxiliary_temp_cs:nnnnnnn##1##2##3##4##5##6##7 { #3 }
+ \tl_set:Nn\l__semantex_append_arg_seven_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_arg_keys:oN
+ {
+ \l__semantex_append_arg_seven_valuekey_auxiliary_temp_cs:nnnnnnn { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } { ##8 }
+ } \l__semantex_append_arg_seven_valuekey_auxiliary_temp_tl
+ \semantex_arg_seven_valuekey_store:nnN { #1 } { #2 } \l__semantex_append_arg_seven_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_arg_seven_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnn }
+ {
+ \exp_not:V\l__semantex_append_arg_seven_valuekey_auxiliary_original_temp_tl
+ \exp_not:V\l__semantex_append_arg_seven_valuekey_auxiliary_temp_tl
+ }
+ \cs_set_protected:cpn { __semantex_data_cs_custom_arg_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+ {
+ \use:c { __semantex_data_cs_custom_arg_seven_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnn } { ##1 } ##2
+ }
+}
+
+\cs_new_protected:Npn\semantex_pre_append_arg_seven_valuekeys:nn#1#2
+{
+ % Pre-appends valuekeys with 7 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_pre_append_arg_seven_valuekey_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_pre_append_arg_seven_valuekey_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_pre_append_arg_seven_valuekey_auxiliary_temp_cs:nnnnnnn##1##2##3##4##5##6##7 { #3 }
+ \tl_set:Nn\l__semantex_pre_append_arg_seven_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_arg_keys:oN
+ {
+ \l__semantex_pre_append_arg_seven_valuekey_auxiliary_temp_cs:nnnnnnn { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } { ##8 }
+ } \l__semantex_pre_append_arg_seven_valuekey_auxiliary_temp_tl
+ \semantex_arg_seven_valuekey_store:nnN { #1 } { #2 } \l__semantex_pre_append_arg_seven_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_arg_seven_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnn }
+ {
+ \exp_not:V\l__semantex_pre_append_arg_seven_valuekey_auxiliary_original_temp_tl
+ \exp_not:V\l__semantex_pre_append_arg_seven_valuekey_auxiliary_temp_tl
+ }
+ \cs_set_protected:cpn { __semantex_data_cs_custom_arg_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+ {
+ \use:c { __semantex_data_cs_custom_arg_seven_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnn } { ##1 } ##2
+ }
+}
+
+\cs_new_protected:Npn\semantex_append_arg_eight_valuekeys:nn#1#2
+{
+ % Appends valuekeys with 8 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_append_arg_eight_valuekey_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_append_arg_eight_valuekey_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_append_arg_eight_valuekey_auxiliary_temp_cs:nnnnnnnn##1##2##3##4##5##6##7##8 { #3 }
+ \tl_set:Nn\l__semantex_append_arg_eight_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_arg_keys:oN
+ {
+ \l__semantex_append_arg_eight_valuekey_auxiliary_temp_cs:nnnnnnnn { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } { ##8 } { ##9 }
+ } \l__semantex_append_arg_eight_valuekey_auxiliary_temp_tl
+ \semantex_arg_eight_valuekey_store:nnN { #1 } { #2 } \l__semantex_append_arg_eight_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_arg_eight_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn }
+ {
+ \exp_not:V\l__semantex_append_arg_eight_valuekey_auxiliary_original_temp_tl
+ \exp_not:V\l__semantex_append_arg_eight_valuekey_auxiliary_temp_tl
+ }
+ \cs_set_protected:cpn { __semantex_data_cs_custom_arg_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+ {
+ \use:c { __semantex_data_cs_custom_arg_eight_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn } { ##1 } ##2
+ }
+}
+
+\cs_new_protected:Npn\semantex_pre_append_arg_eight_valuekeys:nn#1#2
+{
+ % Pre-appends valuekeys with 8 values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_pre_append_arg_eight_valuekey_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new_protected:Npn\__semantex_pre_append_arg_eight_valuekey_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_pre_append_arg_eight_valuekey_auxiliary_temp_cs:nnnnnnnn##1##2##3##4##5##6##7##8 { #3 }
+ \tl_set:Nn\l__semantex_pre_append_arg_eight_valuekey_auxiliary_temp_tl{}
+ \semantex_preprocess_arg_keys:oN
+ {
+ \l__semantex_pre_append_arg_eight_valuekey_auxiliary_temp_cs:nnnnnnnn { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } { ##8 } { ##9 }
+ } \l__semantex_pre_append_arg_eight_valuekey_auxiliary_temp_tl
+ \semantex_arg_eight_valuekey_store:nnN { #1 } { #2 } \l__semantex_pre_append_arg_eight_valuekey_auxiliary_original_temp_tl
+ \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_arg_eight_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn }
+ {
+ \exp_not:V\l__semantex_pre_append_arg_eight_valuekey_auxiliary_temp_tl
+ \exp_not:V\l__semantex_pre_append_arg_eight_valuekey_auxiliary_original_temp_tl
+ }
+ \cs_set_protected:cpn { __semantex_data_cs_custom_arg_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+ {
+ \use:c { __semantex_data_cs_custom_arg_eight_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn } { ##1 } ##2
+ }
+}
+
+%\cs_new_protected:Npn\semantex_append_arg_nine_valuekeys:nn#1#2
+%{
+% % Appends valuekeys with 9 values
+% \clist_map_inline:nn { #2 }{
+% \__semantex_append_arg_nine_valuekey_format_auxiliary:nnn{#1}##1
+% }
+%}
+%
+%\cs_new_protected:Npn\__semantex_append_arg_nine_valuekey_format_auxiliary:nnn#1#2#3
+%{
+% \cs_set:Npn\l__semantex_append_arg_nine_valuekey_auxiliary_temp_cs:nnnnnnnnn##1##2##3##4##5##6##7##8##9 { #3 }
+% \tl_set:Nn\l__semantex_append_arg_nine_valuekey_auxiliary_temp_tl{}
+% \cs_set:Npn\l__semantex_append_arg_nine_valuekey_auxiliary_singlekey_temp_cs:n##1
+% {
+% \__semantex_preprocess_arg_singlekey:nnN { \__semantex_arg_nine_valuekey_format_auxiliary_name_of_register_temp_tl } { ##1 } \l__semantex_append_arg_nine_valuekey_auxiliary_temp_tl
+% }
+% \cs_set:Npn\l__semantex_append_arg_nine_valuekey_auxiliary_valuekey_temp_cs:nn##1##2
+% {
+% \__semantex_preprocess_arg_valuekey:nnnN { \__semantex_arg_nine_valuekey_format_auxiliary_name_of_register_temp_tl } { ##1 } { ##2 } \l__semantex_append_arg_nine_valuekey_auxiliary_temp_tl
+% }
+% \semantex_keyval_parse:NNo
+% \l__semantex_append_arg_nine_valuekey_auxiliary_singlekey_temp_cs:n
+% \l__semantex_append_arg_nine_valuekey_auxiliary_valuekey_temp_cs:nn
+% {
+% \l__semantex_append_arg_nine_valuekey_auxiliary_temp_cs:nnnnnnnnn { ##1 } { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } { ##8 } { ##9 }
+% }
+% \semantex_arg_nine_valuekey_store:nnN { #1 } { #2 } \l__semantex_append_arg_nine_valuekey_auxiliary_original_temp_tl
+% \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_arg_nine_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn }
+% {
+% \exp_not:V\l__semantex_append_arg_nine_valuekey_auxiliary_original_temp_tl
+% \exp_not:V\l__semantex_append_arg_nine_valuekey_auxiliary_temp_tl
+% }
+% \cs_set_protected:cpn { __semantex_data_cs_custom_arg_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+% {
+% \tl_set:Nn \__semantex_arg_nine_valuekey_format_auxiliary_name_of_register_temp_tl { ##1 }
+% \use:c { __semantex_data_cs_custom_arg_nine_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn } ##2
+% }
+%}
+%
+%\cs_new_protected:Npn\semantex_pre_append_arg_nine_valuekeys:nn#1#2
+%{
+% % Pre-appends valuekeys with 9 values
+% \clist_map_inline:nn { #2 }{
+% \__semantex_pre_append_arg_nine_valuekey_format_auxiliary:nnn{#1}##1
+% }
+%}
+%
+%\cs_new_protected:Npn\__semantex_pre_append_arg_nine_valuekey_format_auxiliary:nnn#1#2#3
+%{
+% \cs_set:Npn\l__semantex_pre_append_arg_nine_valuekey_auxiliary_temp_cs:nnnnnnnnn##1##2##3##4##5##6##7##8##9 { #3 }
+% \tl_set:Nn\l__semantex_pre_append_arg_nine_valuekey_auxiliary_temp_tl{}
+% \cs_set:Npn\l__semantex_pre_append_arg_nine_valuekey_auxiliary_singlekey_temp_cs:n##1
+% {
+% \__semantex_preprocess_arg_singlekey:nnN { \__semantex_arg_nine_valuekey_format_auxiliary_name_of_register_temp_tl } { ##1 } \l__semantex_pre_append_arg_nine_valuekey_auxiliary_temp_tl
+% }
+% \cs_set:Npn\l__semantex_pre_append_arg_nine_valuekey_auxiliary_valuekey_temp_cs:nn##1##2
+% {
+% \__semantex_preprocess_arg_valuekey:nnnN { \__semantex_arg_nine_valuekey_format_auxiliary_name_of_register_temp_tl } { ##1 } { ##2 } \l__semantex_pre_append_arg_nine_valuekey_auxiliary_temp_tl
+% }
+% \semantex_keyval_parse:NNo
+% \l__semantex_pre_append_arg_nine_valuekey_auxiliary_singlekey_temp_cs:n
+% \l__semantex_pre_append_arg_nine_valuekey_auxiliary_valuekey_temp_cs:nn
+% {
+% \l__semantex_pre_append_arg_nine_valuekey_auxiliary_temp_cs:nnnnnnnnn { ##1 } { ##2 } { ##3 } { ##4 } { ##5 } { ##6 } { ##7 } { ##8 } { ##9 }
+% }
+% \semantex_arg_nine_valuekey_store:nnN { #1 } { #2 } \l__semantex_pre_append_arg_nine_valuekey_auxiliary_original_temp_tl
+% \exp_args:Nnx\cs_set_protected:cn { __semantex_data_cs_custom_arg_nine_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn }
+% {
+% \exp_not:V\l__semantex_pre_append_arg_nine_valuekey_auxiliary_temp_tl
+% \exp_not:V\l__semantex_pre_append_arg_nine_valuekey_auxiliary_original_temp_tl
+% }
+% \cs_set_protected:cpn { __semantex_data_cs_custom_arg_valuekey_#1_\tl_trim_spaces:n{#2}:nn } ##1##2
+% {
+% \tl_set:Nn \__semantex_arg_nine_valuekey_format_auxiliary_name_of_register_temp_tl { ##1 }
+% \use:c { __semantex_data_cs_custom_arg_nine_valuekey_#1_\tl_trim_spaces:n{#2}_auxiliary:nnnnnnnnn } ##2
+% }
+%}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
@@ -5001,16 +6717,29 @@
{
\tl_set:Nn\l__semantex_output_options_auxiliary_temp_tl{}
\semantex_preprocess_keys:nN { #2 } \l__semantex_output_options_auxiliary_temp_tl
- \semantex_add_raw_commands_to_output_options:no { #1 } { \l__semantex_output_options_auxiliary_temp_tl }
+ \semantex_add_raw_code_to_output_options:no { #1 } { \l__semantex_output_options_auxiliary_temp_tl }
}
-\cs_new_protected:Npn\semantex_add_raw_commands_to_output_options:nn#1#2
+\cs_new_protected:Npn\semantex_add_raw_code_to_output_options:nn#1#2
{
- \semantex_data_tl_put_right:nnn { #1 } { outputoptions } { #2 }
+ \semantex_data_tl_put_right:nnn { #1 } { output~options } { #2 }
}
-\cs_generate_variant:Nn \semantex_add_raw_commands_to_output_options:nn { no }
+\cs_generate_variant:Nn \semantex_add_raw_code_to_output_options:nn { no }
+\cs_new_protected:Npn\semantex_add_to_the_left_of_output_options:nn#1#2
+{
+ \tl_set:Nn\l__semantex_left_of_output_options_auxiliary_temp_tl{}
+ \semantex_preprocess_keys:nN { #2 } \l__semantex_left_of_output_options_auxiliary_temp_tl
+ \semantex_add_raw_code_to_the_left_of_output_options:no { #1 } { \l__semantex_left_of_output_options_auxiliary_temp_tl }
+}
+
+\cs_new_protected:Npn\semantex_add_raw_code_to_the_left_of_output_options:nn#1#2
+{
+ \semantex_data_tl_put_left:nnn { #1 } { output~options } { #2 }
+}
+
+\cs_generate_variant:Nn \semantex_add_raw_code_to_the_left_of_output_options:nn { no }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
@@ -5229,7 +6958,7 @@
\msg_new:nnnn { semantex } { created_a_SemantexBaseObject } { Never~create~objects~of~class~\token_to_str:N\SemantexBaseObject;~create~a~new~class~yourself~instead.~You~created~the~object~#1 on~line~\msg_line_number: } {}
-\msg_new:nnnn { semantex } { SemantexThis_in_input_stream } { The~command~\token_to_str:N\SemantexThis~was~found~outside~a~class~or~object~on~line~\msg_line_number:;~did~you~forget~to~use~setkeysx={...}? } {}
+\msg_new:nnnn { semantex } { SemantexThis_in_input_stream } { The~command~\token_to_str:N\SemantexThis~was~found~outside~a~class~or~object~on~line~\msg_line_number:;~did~you~forget~to~use~set~keys~x={...}? } {}
\msg_new:nnnn { semantex } { generic_error } { #2~#1 on~line~\msg_line_number: } {}
@@ -5307,11 +7036,11 @@
\semantex_define_valuekeys:nn { \semantex_class_to_register:N \SemantexBaseObject }
{
- {definekeys[1]}{execute={ \semantex_define_valuekeys:nn { ##1 } { #1 } }},
+ {define~keys[1]}{execute={ \semantex_define_valuekeys:nn { ##1 } { #1 } }},
}
\semantex_new_simple_class:Nw \SemantexBaseObject [
- definekeys[1]={
+ define~keys[1]={
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% THE MOST BASIC KEYS, INCLUDING PROGRAMMING KEYS
@@ -5321,121 +7050,205 @@
% Yes, this really does make sense
% -- check how \semantex_define_valuekeys:nn was defined
% Keys for setting up the keyval interface
- {definekeys}{ execute={ \semantex_define_singlekeys:nn { ##1 } { #1 } } },
- {definekeys[0]}{ execute={ \semantex_define_singlekeys:nn { ##1 } { #1 } } },
- {definekeys[{0}]}{ execute={ \semantex_define_singlekeys:nn { ##1 } { #1 } } },
- {definekeys[{1}]}{ execute={ \semantex_define_valuekeys:nn { ##1 } { #1 } } },
- {definekeys[2]}{ execute={ \semantex_define_two_valuekeys:nn { ##1 } { #1 } } },
- {definekeys[{2}]}{ execute={ \semantex_define_two_valuekeys:nn { ##1 } { #1 } } },
- {definekeys[3]}{ execute={ \semantex_define_three_valuekeys:nn { ##1 } { #1 } } },
- {definekeys[{3}]}{ execute={ \semantex_define_three_valuekeys:nn { ##1 } { #1 } } },
- {definekeys[4]}{ execute={ \semantex_define_four_valuekeys:nn { ##1 } { #1 } } },
- {definekeys[{4}]}{ execute={ \semantex_define_four_valuekeys:nn { ##1 } { #1 } } },
- {definekeys[5]}{ execute={ \semantex_define_five_valuekeys:nn { ##1 } { #1 } } },
- {definekeys[{5}]}{ execute={ \semantex_define_five_valuekeys:nn { ##1 } { #1 } } },
- {definekeys[6]}{ execute={ \semantex_define_six_valuekeys:nn { ##1 } { #1 } } },
- {definekeys[{6}]}{ execute={ \semantex_define_six_valuekeys:nn { ##1 } { #1 } } },
- {definekeys[7]}{ execute={ \semantex_define_seven_valuekeys:nn { ##1 } { #1 } } },
- {definekeys[{7}]}{ execute={ \semantex_define_seven_valuekeys:nn { ##1 } { #1 } } },
- {definekeys[8]}{ execute={ \semantex_define_eight_valuekeys:nn { ##1 } { #1 } } },
- {definekeys[{8}]}{ execute={ \semantex_define_eight_valuekeys:nn { ##1 } { #1 } } },
- {definekeys[9]}{ execute={ \semantex_define_nine_valuekeys:nn { ##1 } { #1 } } },
- {definekeys[{9}]}{ execute={ \semantex_define_nine_valuekeys:nn { ##1 } { #1 } } },
- {removekey}{ execute={ \semantex_remove_singlekey:nn { ##1 } { #1 } } },
- {removekey[0]}{ execute={ \semantex_remove_singlekey:nn { ##1 } { #1 } } },
- {removekey[{0}]}{ execute={ \semantex_remove_singlekey:nn { ##1 } { #1 } } },
- {removekey[1]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
- {removekey[{1}]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
- {removekey[2]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
- {removekey[{2}]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
- {removekey[3]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
- {removekey[{3}]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
- {removekey[4]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
- {removekey[{5}]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
- {removekey[6]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
- {removekey[{6}]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
- {removekey[7]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
- {removekey[{7}]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
- {removekey[8]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
- {removekey[{8}]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
- {removekey[9]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
- {removekey[{9}]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
+ {define~keys}{ execute={ \semantex_define_singlekeys:nn { ##1 } { #1 } } },
+ {define~keys[0]}{ execute={ \semantex_define_singlekeys:nn { ##1 } { #1 } } },
+ {define~keys[{0}]}{ execute={ \semantex_define_singlekeys:nn { ##1 } { #1 } } },
+ {define~keys[{1}]}{ execute={ \semantex_define_valuekeys:nn { ##1 } { #1 } } },
+ {define~keys[2]}{ execute={ \semantex_define_two_valuekeys:nn { ##1 } { #1 } } },
+ {define~keys[{2}]}{ execute={ \semantex_define_two_valuekeys:nn { ##1 } { #1 } } },
+ {define~keys[3]}{ execute={ \semantex_define_three_valuekeys:nn { ##1 } { #1 } } },
+ {define~keys[{3}]}{ execute={ \semantex_define_three_valuekeys:nn { ##1 } { #1 } } },
+ {define~keys[4]}{ execute={ \semantex_define_four_valuekeys:nn { ##1 } { #1 } } },
+ {define~keys[{4}]}{ execute={ \semantex_define_four_valuekeys:nn { ##1 } { #1 } } },
+ {define~keys[5]}{ execute={ \semantex_define_five_valuekeys:nn { ##1 } { #1 } } },
+ {define~keys[{5}]}{ execute={ \semantex_define_five_valuekeys:nn { ##1 } { #1 } } },
+ {define~keys[6]}{ execute={ \semantex_define_six_valuekeys:nn { ##1 } { #1 } } },
+ {define~keys[{6}]}{ execute={ \semantex_define_six_valuekeys:nn { ##1 } { #1 } } },
+ {define~keys[7]}{ execute={ \semantex_define_seven_valuekeys:nn { ##1 } { #1 } } },
+ {define~keys[{7}]}{ execute={ \semantex_define_seven_valuekeys:nn { ##1 } { #1 } } },
+ {define~keys[8]}{ execute={ \semantex_define_eight_valuekeys:nn { ##1 } { #1 } } },
+ {define~keys[{8}]}{ execute={ \semantex_define_eight_valuekeys:nn { ##1 } { #1 } } },
+% {define~keys[9]}{ execute={ \semantex_define_nine_valuekeys:nn { ##1 } { #1 } } },
+% {define~keys[{9}]}{ execute={ \semantex_define_nine_valuekeys:nn { ##1 } { #1 } } },
+ {append~keys}{ execute={ \semantex_append_singlekeys:nn { ##1 } { #1 } } },
+ {append~keys[0]}{ execute={ \semantex_append_singlekeys:nn { ##1 } { #1 } } },
+ {append~keys[{0}]}{ execute={ \semantex_append_singlekeys:nn { ##1 } { #1 } } },
+ {append~keys[1]}{ execute={ \semantex_append_valuekeys:nn { ##1 } { #1 } } },
+ {append~keys[{1}]}{ execute={ \semantex_append_valuekeys:nn { ##1 } { #1 } } },
+ {append~keys[2]}{ execute={ \semantex_append_two_valuekeys:nn { ##1 } { #1 } } },
+ {append~keys[{2}]}{ execute={ \semantex_append_two_valuekeys:nn { ##1 } { #1 } } },
+ {append~keys[3]}{ execute={ \semantex_append_three_valuekeys:nn { ##1 } { #1 } } },
+ {append~keys[{3}]}{ execute={ \semantex_append_three_valuekeys:nn { ##1 } { #1 } } },
+ {append~keys[4]}{ execute={ \semantex_append_four_valuekeys:nn { ##1 } { #1 } } },
+ {append~keys[{4}]}{ execute={ \semantex_append_four_valuekeys:nn { ##1 } { #1 } } },
+ {append~keys[5]}{ execute={ \semantex_append_five_valuekeys:nn { ##1 } { #1 } } },
+ {append~keys[{5}]}{ execute={ \semantex_append_five_valuekeys:nn { ##1 } { #1 } } },
+ {append~keys[6]}{ execute={ \semantex_append_six_valuekeys:nn { ##1 } { #1 } } },
+ {append~keys[{6}]}{ execute={ \semantex_append_six_valuekeys:nn { ##1 } { #1 } } },
+ {append~keys[7]}{ execute={ \semantex_append_seven_valuekeys:nn { ##1 } { #1 } } },
+ {append~keys[{7}]}{ execute={ \semantex_append_seven_valuekeys:nn { ##1 } { #1 } } },
+ {append~keys[8]}{ execute={ \semantex_append_eight_valuekeys:nn { ##1 } { #1 } } },
+ {append~keys[{8}]}{ execute={ \semantex_append_eight_valuekeys:nn { ##1 } { #1 } } },
+% {append~keys[9]}{ execute={ \semantex_append_nine_valuekeys:nn { ##1 } { #1 } } },
+% {append~keys[{9}]}{ execute={ \semantex_append_nine_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~keys}{ execute={ \semantex_pre_append_singlekeys:nn { ##1 } { #1 } } },
+ {pre~append~keys[0]}{ execute={ \semantex_pre_append_singlekeys:nn { ##1 } { #1 } } },
+ {pre~append~keys[{0}]}{ execute={ \semantex_pre_append_singlekeys:nn { ##1 } { #1 } } },
+ {pre~append~keys[1]}{ execute={ \semantex_pre_append_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~keys[{1}]}{ execute={ \semantex_pre_append_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~keys[2]}{ execute={ \semantex_pre_append_two_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~keys[{2}]}{ execute={ \semantex_pre_append_two_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~keys[3]}{ execute={ \semantex_pre_append_three_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~keys[{3}]}{ execute={ \semantex_pre_append_three_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~keys[4]}{ execute={ \semantex_pre_append_four_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~keys[{4}]}{ execute={ \semantex_pre_append_four_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~keys[5]}{ execute={ \semantex_pre_append_five_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~keys[{5}]}{ execute={ \semantex_pre_append_five_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~keys[6]}{ execute={ \semantex_pre_append_six_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~keys[{6}]}{ execute={ \semantex_pre_append_six_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~keys[7]}{ execute={ \semantex_pre_append_seven_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~keys[{7}]}{ execute={ \semantex_pre_append_seven_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~keys[8]}{ execute={ \semantex_pre_append_eight_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~keys[{8}]}{ execute={ \semantex_pre_append_eight_valuekeys:nn { ##1 } { #1 } } },
+% {pre~append~keys[9]}{ execute={ \semantex_pre_append_nine_valuekeys:nn { ##1 } { #1 } } },
+% {pre~append~keys[{9}]}{ execute={ \semantex_pre_append_nine_valuekeys:nn { ##1 } { #1 } } },
+ {remove~key}{ execute={ \semantex_remove_singlekey:nn { ##1 } { #1 } } },
+ {remove~key[0]}{ execute={ \semantex_remove_singlekey:nn { ##1 } { #1 } } },
+ {remove~key[{0}]}{ execute={ \semantex_remove_singlekey:nn { ##1 } { #1 } } },
+ {remove~key[1]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
+ {remove~key[{1}]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
+ {remove~key[2]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
+ {remove~key[{2}]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
+ {remove~key[3]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
+ {remove~key[{3}]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
+ {remove~key[4]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
+ {remove~key[{5}]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
+ {remove~key[6]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
+ {remove~key[{6}]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
+ {remove~key[7]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
+ {remove~key[{7}]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
+ {remove~key[8]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
+ {remove~key[{8}]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
+% {remove~key[9]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
+% {remove~key[{9}]}{ execute={ \semantex_remove_valuekey:nn { ##1 } { #1 } } },
% Keys for setting up the argument keyval interface:
- {defineargkeys}{ execute={ \semantex_define_arg_singlekeys:nn { ##1 } { #1 } } },
- {defineargkeys[0]}{ execute={ \semantex_define_arg_singlekeys:nn { ##1 } { #1 } } },
- {defineargkeys[{0}]}{ execute={ \semantex_define_arg_singlekeys:nn { ##1 } { #1 } } },
- {defineargkeys[1]}{ execute={ \semantex_define_arg_valuekeys:nn { ##1 } { #1 } } },
- {defineargkeys[{1}]}{ execute={ \semantex_define_arg_valuekeys:nn { ##1 } { #1 } } },
- {defineargkeys[2]}{ execute={ \semantex_define_arg_two_valuekeys:nn { ##1 } { #1 } } },
- {defineargkeys[{2}]}{ execute={ \semantex_define_arg_two_valuekeys:nn { ##1 } { #1 } } },
- {defineargkeys[3]}{ execute={ \semantex_define_arg_three_valuekeys:nn { ##1 } { #1 } } },
- {defineargkeys[{3}]}{ execute={ \semantex_define_arg_three_valuekeys:nn { ##1 } { #1 } } },
- {defineargkeys[4]}{ execute={ \semantex_define_arg_four_valuekeys:nn { ##1 } { #1 } } },
- {defineargkeys[{4}]}{ execute={ \semantex_define_arg_four_valuekeys:nn { ##1 } { #1 } } },
- {defineargkeys[5]}{ execute={ \semantex_define_arg_five_valuekeys:nn { ##1 } { #1 } } },
- {defineargkeys[{5}]}{ execute={ \semantex_define_arg_five_valuekeys:nn { ##1 } { #1 } } },
- {defineargkeys[6]}{ execute={ \semantex_define_arg_six_valuekeys:nn { ##1 } { #1 } } },
- {defineargkeys[{6}]}{ execute={ \semantex_define_arg_six_valuekeys:nn { ##1 } { #1 } } },
- {defineargkeys[7]}{ execute={ \semantex_define_arg_seven_valuekeys:nn { ##1 } { #1 } } },
- {defineargkeys[{7}]}{ execute={ \semantex_define_arg_seven_valuekeys:nn { ##1 } { #1 } } },
- {defineargkeys[8]}{ execute={ \semantex_define_arg_eight_valuekeys:nn { ##1 } { #1 } } },
- {defineargkeys[{8}]}{ execute={ \semantex_define_arg_eight_valuekeys:nn { ##1 } { #1 } } },
- {defineargkeys[9]}{ execute={ \semantex_define_arg_nine_valuekeys:nn { ##1 } { #1 } } },
- {defineargkeys[{9}]}{ execute={ \semantex_define_arg_nine_valuekeys:nn { ##1 } { #1 } } },
- {removeargkey}{ execute={ \semantex_remove_arg_singlekey:nn { ##1 } { #1 } } },
- {removeargkey[0]}{ execute={ \semantex_remove_arg_singlekey:nn { ##1 } { #1 } } },
- {removeargkey[{0}]}{ execute={ \semantex_remove_arg_singlekey:nn { ##1 } { #1 } } },
- {removeargkey[1]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
- {removeargkey[{1}]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
- {removeargkey[2]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
- {removeargkey[{2}]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
- {removeargkey[3]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
- {removeargkey[{3}]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
- {removeargkey[4]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
- {removeargkey[{5}]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
- {removeargkey[6]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
- {removeargkey[{6}]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
- {removeargkey[7]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
- {removeargkey[{7}]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
- {removeargkey[8]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
- {removeargkey[{8}]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
- {removeargkey[9]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
- {removeargkey[{9}]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
+ {define~arg~keys}{ execute={ \semantex_define_arg_singlekeys:nn { ##1 } { #1 } } },
+ {define~arg~keys[0]}{ execute={ \semantex_define_arg_singlekeys:nn { ##1 } { #1 } } },
+ {define~arg~keys[{0}]}{ execute={ \semantex_define_arg_singlekeys:nn { ##1 } { #1 } } },
+ {define~arg~keys[1]}{ execute={ \semantex_define_arg_valuekeys:nn { ##1 } { #1 } } },
+ {define~arg~keys[{1}]}{ execute={ \semantex_define_arg_valuekeys:nn { ##1 } { #1 } } },
+ {define~arg~keys[2]}{ execute={ \semantex_define_arg_two_valuekeys:nn { ##1 } { #1 } } },
+ {define~arg~keys[{2}]}{ execute={ \semantex_define_arg_two_valuekeys:nn { ##1 } { #1 } } },
+ {define~arg~keys[3]}{ execute={ \semantex_define_arg_three_valuekeys:nn { ##1 } { #1 } } },
+ {define~arg~keys[{3}]}{ execute={ \semantex_define_arg_three_valuekeys:nn { ##1 } { #1 } } },
+ {define~arg~keys[4]}{ execute={ \semantex_define_arg_four_valuekeys:nn { ##1 } { #1 } } },
+ {define~arg~keys[{4}]}{ execute={ \semantex_define_arg_four_valuekeys:nn { ##1 } { #1 } } },
+ {define~arg~keys[5]}{ execute={ \semantex_define_arg_five_valuekeys:nn { ##1 } { #1 } } },
+ {define~arg~keys[{5}]}{ execute={ \semantex_define_arg_five_valuekeys:nn { ##1 } { #1 } } },
+ {define~arg~keys[6]}{ execute={ \semantex_define_arg_six_valuekeys:nn { ##1 } { #1 } } },
+ {define~arg~keys[{6}]}{ execute={ \semantex_define_arg_six_valuekeys:nn { ##1 } { #1 } } },
+ {define~arg~keys[7]}{ execute={ \semantex_define_arg_seven_valuekeys:nn { ##1 } { #1 } } },
+ {define~arg~keys[{7}]}{ execute={ \semantex_define_arg_seven_valuekeys:nn { ##1 } { #1 } } },
+ {define~arg~keys[8]}{ execute={ \semantex_define_arg_eight_valuekeys:nn { ##1 } { #1 } } },
+ {define~arg~keys[{8}]}{ execute={ \semantex_define_arg_eight_valuekeys:nn { ##1 } { #1 } } },
+% {define~arg~keys[9]}{ execute={ \semantex_define_arg_nine_valuekeys:nn { ##1 } { #1 } } },
+% {define~arg~keys[{9}]}{ execute={ \semantex_define_arg_nine_valuekeys:nn { ##1 } { #1 } } },
+ {append~arg~keys}{ execute={ \semantex_append_arg_singlekeys:nn { ##1 } { #1 } } },
+ {append~arg~keys[0]}{ execute={ \semantex_append_arg_singlekeys:nn { ##1 } { #1 } } },
+ {append~arg~keys[{0}]}{ execute={ \semantex_append_arg_singlekeys:nn { ##1 } { #1 } } },
+ {append~arg~keys[1]}{ execute={ \semantex_append_arg_valuekeys:nn { ##1 } { #1 } } },
+ {append~arg~keys[{1}]}{ execute={ \semantex_append_arg_valuekeys:nn { ##1 } { #1 } } },
+ {append~arg~keys[2]}{ execute={ \semantex_append_arg_two_valuekeys:nn { ##1 } { #1 } } },
+ {append~arg~keys[{2}]}{ execute={ \semantex_append_arg_two_valuekeys:nn { ##1 } { #1 } } },
+ {append~arg~keys[3]}{ execute={ \semantex_append_arg_three_valuekeys:nn { ##1 } { #1 } } },
+ {append~arg~keys[{3}]}{ execute={ \semantex_append_arg_three_valuekeys:nn { ##1 } { #1 } } },
+ {append~arg~keys[4]}{ execute={ \semantex_append_arg_four_valuekeys:nn { ##1 } { #1 } } },
+ {append~arg~keys[{4}]}{ execute={ \semantex_append_arg_four_valuekeys:nn { ##1 } { #1 } } },
+ {append~arg~keys[5]}{ execute={ \semantex_append_arg_five_valuekeys:nn { ##1 } { #1 } } },
+ {append~arg~keys[{5}]}{ execute={ \semantex_append_arg_five_valuekeys:nn { ##1 } { #1 } } },
+ {append~arg~keys[6]}{ execute={ \semantex_append_arg_six_valuekeys:nn { ##1 } { #1 } } },
+ {append~arg~keys[{6}]}{ execute={ \semantex_append_arg_six_valuekeys:nn { ##1 } { #1 } } },
+ {append~arg~keys[7]}{ execute={ \semantex_append_arg_seven_valuekeys:nn { ##1 } { #1 } } },
+ {append~arg~keys[{7}]}{ execute={ \semantex_append_arg_seven_valuekeys:nn { ##1 } { #1 } } },
+ {append~arg~keys[8]}{ execute={ \semantex_append_arg_eight_valuekeys:nn { ##1 } { #1 } } },
+ {append~arg~keys[{8}]}{ execute={ \semantex_append_arg_eight_valuekeys:nn { ##1 } { #1 } } },
+% {append~arg~keys[9]}{ execute={ \semantex_append_arg_nine_valuekeys:nn { ##1 } { #1 } } },
+% {append~arg~keys[{9}]}{ execute={ \semantex_append_arg_nine_valuekeys:nn { ##1 } { #1 } } },%
+ {pre~append~arg~keys}{ execute={ \semantex_pre_append_arg_singlekeys:nn { ##1 } { #1 } } },
+ {pre~append~arg~keys[0]}{ execute={ \semantex_pre_append_arg_singlekeys:nn { ##1 } { #1 } } },
+ {pre~append~arg~keys[{0}]}{ execute={ \semantex_pre_append_arg_singlekeys:nn { ##1 } { #1 } } },
+ {pre~append~arg~keys[1]}{ execute={ \semantex_pre_append_arg_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~arg~keys[{1}]}{ execute={ \semantex_pre_append_arg_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~arg~keys[2]}{ execute={ \semantex_pre_append_arg_two_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~arg~keys[{2}]}{ execute={ \semantex_pre_append_arg_two_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~arg~keys[3]}{ execute={ \semantex_pre_append_arg_three_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~arg~keys[{3}]}{ execute={ \semantex_pre_append_arg_three_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~arg~keys[4]}{ execute={ \semantex_pre_append_arg_four_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~arg~keys[{4}]}{ execute={ \semantex_pre_append_arg_four_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~arg~keys[5]}{ execute={ \semantex_pre_append_arg_five_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~arg~keys[{5}]}{ execute={ \semantex_pre_append_arg_five_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~arg~keys[6]}{ execute={ \semantex_pre_append_arg_six_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~arg~keys[{6}]}{ execute={ \semantex_pre_append_arg_six_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~arg~keys[7]}{ execute={ \semantex_pre_append_arg_seven_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~arg~keys[{7}]}{ execute={ \semantex_pre_append_arg_seven_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~arg~keys[8]}{ execute={ \semantex_pre_append_arg_eight_valuekeys:nn { ##1 } { #1 } } },
+ {pre~append~arg~keys[{8}]}{ execute={ \semantex_pre_append_arg_eight_valuekeys:nn { ##1 } { #1 } } },
+% {pre~append~arg~keys[9]}{ execute={ \semantex_pre_append_arg_nine_valuekeys:nn { ##1 } { #1 } } },
+% {pre~append~arg~keys[{9}]}{ execute={ \semantex_pre_append_arg_nine_valuekeys:nn { ##1 } { #1 } } },
+ {remove~arg~key}{ execute={ \semantex_remove_arg_singlekey:nn { ##1 } { #1 } } },
+ {remove~arg~key[0]}{ execute={ \semantex_remove_arg_singlekey:nn { ##1 } { #1 } } },
+ {remove~arg~key[{0}]}{ execute={ \semantex_remove_arg_singlekey:nn { ##1 } { #1 } } },
+ {remove~arg~key[1]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
+ {remove~arg~key[{1}]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
+ {remove~arg~key[2]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
+ {remove~arg~key[{2}]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
+ {remove~arg~key[3]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
+ {remove~arg~key[{3}]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
+ {remove~arg~key[4]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
+ {remove~arg~key[{5}]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
+ {remove~arg~key[6]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
+ {remove~arg~key[{6}]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
+ {remove~arg~key[7]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
+ {remove~arg~key[{7}]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
+ {remove~arg~key[8]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
+ {remove~arg~key[{8}]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
+% {remove~arg~key[9]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
+% {remove~arg~key[{9}]}{ execute={ \semantex_remove_arg_valuekey:nn { ##1 } { #1 } } },
% Keys for programming:
- {dataprovide}{ execute={ \semantex_data_tl_provide:nn { ##1 } { \tl_trim_spaces:n { #1 } } } },
- {dataclear}{
+ {data~provide}{ execute={ \semantex_data_tl_provide:nn { ##1 } { \tl_trim_spaces:n { #1 } } } },
+ {data~clear}{
execute={ \semantex_data_tl_clear:nn { ##1 } { \tl_trim_spaces:n { #1 } } },
},
- {keysset}{ execute={ \semantex_keys_set:nn { ##1 } { #1 } } },
- {setkeys}{ execute={ \semantex_keys_set:nn { ##1 } { #1 } } },
- {keyssetx}{ execute={ \semantex_keys_set_x:nn { ##1 } { #1 } } },
- {setkeysx}{ execute={ \semantex_keys_set_x:nn { ##1 } { #1 } } },
- {boolprovide}{
+ {keys~set}{ execute={ \semantex_keys_set:nn { ##1 } { #1 } } },
+ {set~keys}{ execute={ \semantex_keys_set:nn { ##1 } { #1 } } },
+ {keys~set~x}{ execute={ \semantex_keys_set_x:nn { ##1 } { #1 } } },
+ {set~keys~x}{ execute={ \semantex_keys_set_x:nn { ##1 } { #1 } } },
+ {bool~provide}{
execute={
\semantex_data_bool_provide:nn { ##1 } { \tl_trim_spaces:n { #1 } }
},
},
- {boolsettrue}{
+ {bool~set~true}{
execute={
\semantex_data_bool_set_true:nn { ##1 } { \tl_trim_spaces:n { #1 } }
},
},
- {boolsetfalse}{
+ {bool~set~false}{
execute={
\semantex_data_bool_set_false:nn { ##1 } { \tl_trim_spaces:n { #1 } }
},
},
- {intprovide}{
+ {int~provide}{
execute={
\semantex_data_int_provide:nn { ##1 } { \tl_trim_spaces:n { #1 } }
},
},
- {intclear}{
+ {int~clear}{
execute={
\semantex_data_int_clear:nn { ##1 } { \tl_trim_spaces:n { #1 } }
},
},
- {intincr}{
+ {int~incr}{
execute={
\semantex_data_int_incr:nn { ##1 } { \tl_trim_spaces:n { #1 } }
},
@@ -5446,52 +7259,52 @@
},
},
},
- definekeys[2]={
- {dataset}{
+ define~keys[2]={
+ {data~set}{
execute={
\semantex_data_tl_set:nnn { ##1 } { \tl_trim_spaces:n { #1 } } { #2 }
},
},
- {datasetx}{
+ {data~set~x}{
execute={
\semantex_data_tl_set:nnx { ##1 } { \tl_trim_spaces:n { #1 } } { #2 }
},
},
- {dataputright}{
+ {data~put~right}{
execute={
\semantex_data_tl_put_right:nnn { ##1 } { \tl_trim_spaces:n { #1 } } { #2 }
},
},
- {dataputrightx}{
+ {data~put~right~x}{
execute={
\semantex_data_tl_put_right:nnx { ##1 } { \tl_trim_spaces:n { #1 } } { #2 }
},
},
- {dataputleft}{
+ {data~put~left}{
execute={
\semantex_data_tl_put_left:nnn { ##1 } { \tl_trim_spaces:n { #1 } } { #2 }
},
},
- {dataputleftx}{
+ {data~put~left~x}{
execute={
\semantex_data_tl_put_left:nnx { ##1 } { \tl_trim_spaces:n { #1 } } { #2 }
},
},
- {ifblankT}{
+ {if~blank~T}{
execute={
\tl_if_blank:xTF { #1 }
{ \semantex_keys_set:nn { ##1 } { #2 } }
{ }
},
},
- {ifblankF}{
+ {if~blank~F}{
execute={
\tl_if_blank:xTF { #1 }
{ }
{ \semantex_keys_set:nn { ##1 } { #2 } }
},
},
- {boolifT}{
+ {bool~if~T}{
execute={
\semantex_data_bool_get:nnTF { ##1 }
{ \tl_trim_spaces:n { #1 } }
@@ -5499,7 +7312,7 @@
{ }
},
},
- {boolifF}{
+ {bool~if~F}{
execute={
\semantex_data_bool_get:nnTF { ##1 }
{ \tl_trim_spaces:n { #1 } }
@@ -5507,45 +7320,45 @@
{ \semantex_keys_set:nn { ##1 } { #2 } }
},
},
- {intset}{
+ {int~set}{
execute={
\semantex_data_int_set:nnn { ##1 } { \tl_trim_spaces:n { #1 } } { #2 }
},
},
- {ERRORkeyvaluenotfound}{
+ {ERROR~key~value~not~found}{
execute={
\semantex_error_key_value_not_found:nnn { ##1 } { #1 } { #2 }
},
},
- {ERRORargkeyvaluenotfound}{
+ {ERROR~arg~key~value~not~found}{
execute={
\semantex_error_arg_key_value_not_found:nnn { ##1 } { #1 } { #2 }
},
},
},
- definekeys[3]={
- {strifeqT}{
+ define~keys[3]={
+ {str~if~eq~T}{
execute={
\str_if_eq:xxTF { #1 } { #2 }
{ \semantex_keys_set:nn { ##1 } { #3 } }
{ }
},
},
- {strifeqF}{
+ {str~if~eq~F}{
execute={
\str_if_eq:xxTF { #1 } { #2 }
{ }
{ \semantex_keys_set:nn { ##1 } { #3 } }
},
},
- {ifblankTF}{
+ {if~blank~TF}{
execute={
\tl_if_blank:xTF { #1 }
{ \semantex_keys_set:nn { ##1 } { #2 } }
{ \semantex_keys_set:nn { ##1 } { #3 } }
},
},
- {boolifTF}{
+ {bool~if~TF}{
execute={
\semantex_data_bool_get:nnTF { ##1 }
{ \tl_trim_spaces:n { #1 } }
@@ -5553,42 +7366,42 @@
{ \semantex_keys_set:nn { ##1 } { #3 } }
},
},
- {intifgreaterT}{
+ {int~if~greater~T}{
execute={
\int_compare:nNnTF { #1 } > { #2 }
{ \semantex_keys_set:nn { ##1 } { #3 } }
{ }
},
},
- {intifgreaterF}{
+ {int~if~greater~F}{
execute={
\int_compare:nNnTF { #1 } > { #2 }
{ }
{ \semantex_keys_set:nn { ##1 } { #3 } }
},
},
- {intifeqT}{
+ {int~if~eq~T}{
execute={
\int_compare:nNnTF { #1 } = { #2 }
{ \semantex_keys_set:nn { ##1 } { #3 } }
{ }
},
},
- {intifeqF}{
+ {int~if~eq~F}{
execute={
\int_compare:nNnTF { #1 } = { #2 }
{ }
{ \semantex_keys_set:nn { ##1 } { #3 } }
},
},
- {intiflessT}{
+ {int~if~less~T}{
execute={
\int_compare:nNnTF { #1 } < { #2 }
{ \semantex_keys_set:nn { ##1 } { #3 } }
{ }
},
},
- {intiflessF}{
+ {int~if~less~F}{
execute={
\int_compare:nNnTF { #1 } < { #2 }
{ }
@@ -5596,29 +7409,29 @@
},
},
},
- definekeys[4]={
- {strifeqTF}{
+ define~keys[4]={
+ {str~if~eq~TF}{
execute={
\str_if_eq:xxTF { #1 } { #2 }
{ \semantex_keys_set:nn { ##1 } { #3 } }
{ \semantex_keys_set:nn { ##1 } { #4 } }
},
},
- {intifgreaterTF}{
+ {int~if~greater~TF}{
execute={
\int_compare:nNnTF { #1 } > { #2 }
{ \semantex_keys_set:nn { ##1 } { #3 } }
{ \semantex_keys_set:nn { ##1 } { #4 } }
},
},
- {intifeqTF}{
+ {int~if~eq~TF}{
execute={
\int_compare:nNnTF { #1 } = { #2 }
{ \semantex_keys_set:nn { ##1 } { #3 } }
{ \semantex_keys_set:nn { ##1 } { #4 } }
},
},
- {intiflessTF}{
+ {int~if~less~TF}{
execute={
\int_compare:nNnTF { #1 } < { #2 }
{ \semantex_keys_set:nn { ##1 } { #3 } }
@@ -5631,1644 +7444,1661 @@
% THE COLLECTION OF SLIGHTLY LESS FUNDAMENTAL KEYS
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- dataprovide=symbol,
- boolprovide=uppergrading,
- boolsettrue=uppergrading,
- boolprovide=output,
- dataprovide=outputoptions,
- boolprovide=par,
- boolsettrue=par,
- boolprovide=flexpar,
- dataprovide=parseoptions,
- dataprovide=mathclass,
- boolprovide=leftargument,
- dataprovide=heightphantom,
- dataprovide=slantingphantom,
- execute={ \semantex_data_seq_provide:nn { \semantex_this: } { commands_sequence } },
- definekeys[1]={
+ data~provide=symbol,
+ bool~provide=upper~grading,
+ bool~set~true=upper~grading,
+ bool~provide=output,
+ data~provide=output~options,
+ bool~provide=par,
+ bool~set~true=par,
+ bool~provide=flex~par,
+ data~provide=math~class,
+ bool~provide=left~argument,
+ data~provide=height~phantom,
+ data~provide=slanting~phantom,
+ execute={ \semantex_data_seq_provide:nn { \semantex_this: } { commands~sequence } },
+ define~keys[1]={
{parent}{ execute={ \semantex_data_parent_set:nn { ##1 } { #1 } } },
{class}{ execute={ \semantex_data_class_set:nn { ##1 } { #1 } } },
{copy}{ execute={ \semantex_data_copy_object:nn { ##1 } { #1 } } },
- {mathclass}{ execute={ \semantex_data_tl_set:nnn { ##1 } { mathclass } { #1 } } },
+ {math~class}{ execute={ \semantex_data_tl_set:nnn { ##1 } { math~class } { #1 } } },
{symbol}{
execute={
\semantex_data_tl_set:nnn { ##1 } { symbol } { #1 }
- \semantex_data_tl_set:nnn { ##1 } { heightphantom } { #1 }
- \semantex_data_tl_set:nnn { ##1 } { slantingphantom } { #1 }
+ \semantex_data_tl_set:nnn { ##1 } { height~phantom } { #1 }
+ \semantex_data_tl_set:nnn { ##1 } { slanting~phantom } { #1 }
}
},
- {symbolputright}{ execute={ \semantex_data_tl_put_right:nnn { ##1 } { symbol } { #1 } } },
- {symbolputleft}{ execute={ \semantex_data_tl_put_left:nnn { ##1 } { symbol } { #1 } } },
- {heightphantom}{ execute={ \semantex_data_tl_set:nnn { ##1 } { heightphantom } { #1 } } },
- {slantingphantom}{ execute={ \semantex_data_tl_set:nnn { ##1 } { slantingphantom } { #1 } } },
- {parseoptions}{ execute={ \semantex_add_to_parse_options:nn { ##1 } { #1 } } },
- {command}{ execute={ \semantex_data_seq_put_right:nnn { ##1 } { commands_sequence } { #1 } } },
+ {symbol~put~right}{ execute={ \semantex_data_tl_put_right:nnn { ##1 } { symbol } { #1 } } },
+ {symbol~put~left}{ execute={ \semantex_data_tl_put_left:nnn { ##1 } { symbol } { #1 } } },
+ {height~phantom}{ execute={ \semantex_data_tl_set:nnn { ##1 } { height~phantom } { #1 } } },
+ {slanting~phantom}{ execute={ \semantex_data_tl_set:nnn { ##1 } { slanting~phantom } { #1 } } },
+ {parse~options}{ append~keys={ {parse~code}{#1} } },
+ {pre~parse~options}{ pre~append~keys={ {parse~code}{#1} } },
+ {command}{ execute={ \semantex_data_seq_put_right:nnn { ##1 } { commands~sequence } { #1 } } },
{output}{ execute={ \semantex_set_output:nn { ##1 } { #1 } } },
- {outputoptions}{ execute={ \semantex_add_to_output_options:nn { ##1 } { #1 } } },
- {dooutput}{
- strifeqTF={#1}{true}
+ {output~options}{ execute={ \semantex_add_to_output_options:nn { ##1 } { #1 } } },
+ {pre~output~options}{ execute={ \semantex_add_to_the_left_of_output_options:nn { ##1 } { #1 } } },
+ {do~output}{
+ str~if~eq~TF={#1}{true}
{
- boolsettrue={output},
+ bool~set~true={output},
}
{
- strifeqTF={#1}{false}
+ str~if~eq~TF={#1}{false}
{
- boolsetfalse={output},
+ bool~set~false={output},
}
{
- ERRORkeyvaluenotfound={dooutput}{#1},
+ ERROR~key~value~not~found={do~output}{#1},
}
},
},
- {gradingposition}{
- strifeqTF={#1}{upper}
+ {grading~position}{
+ str~if~eq~TF={#1}{upper}
{
- boolsettrue={uppergrading},
+ bool~set~true={upper~grading},
}
{
- strifeqTF={#1}{lower}
+ str~if~eq~TF={#1}{lower}
{
- boolsetfalse={uppergrading},
+ bool~set~false={upper~grading},
}
{
- ERRORkeyvaluenotfound={gradingposition}{#1},
+ ERROR~key~value~not~found={grading~position}{#1},
},
},
},
- {gradingpos}{
- strifeqTF={#1}{upper}
+ {grading~pos}{
+ str~if~eq~TF={#1}{upper}
{
- boolsettrue={uppergrading},
+ bool~set~true={upper~grading},
}
{
- strifeqTF={#1}{lower}
+ str~if~eq~TF={#1}{lower}
{
- boolsetfalse={uppergrading},
+ bool~set~false={upper~grading},
}
{
- ERRORkeyvaluenotfound={gradingpos}{#1},
+ ERROR~key~value~not~found={grading~pos}{#1},
},
},
},
- {default}{sepi={#1}},
- {degreedefault}{sepd={#1}},
+ {default}{sep~i={#1}},
+ {degree~default}{sep~d={#1}},
{arg}{ execute={ \semantex_arg_singlekeys_set:nn { ##1 } { #1 } } },
- {*withothersep}{
- d*withothersep={#1},
+ {*~with~other~sep}{
+ d~*~with~other~sep={#1},
},
- {**withothersep}{
- d**withothersep={#1},
+ {**~with~other~sep}{
+ d~**~with~other~sep={#1},
},
},
output=\SemantexBaseObject,
- definekeys={
+ define~keys={
{return}{ execute={ \semantex_return:n { ##1 } } },
- {innerreturn}{ execute={ \semantex_inner_return:n { ##1 } } },
- {rightreturn}{ execute={ \semantex_right_return:n { ##1 } } },
- {leftreturn}{ execute={ \semantex_left_return:n { ##1 } } },
- {rightindexreturn}{ execute={ \semantex_right_index_return:n { ##1 } } },
- {leftindexreturn}{ execute={ \semantex_left_index_return:n { ##1 } } },
- {indexreturn}{ leftindexreturn, rightindexreturn },
- {rightargreturn}{ execute={ \semantex_right_arg_return:n { ##1 } } },
- {leftargreturn}{ execute={ \semantex_left_arg_return:n { ##1 } } },
- {argreturn}{ execute={ \semantex_arg_return:n { ##1 } } },
- {parse}{ execute={ \semantex_parse:n { ##1 } } },
- {clearcommand}{ execute={ \semantex_data_seq_clear:nn { ##1 } { commands_sequence } } },
- {dots}{sepidots},
+ {inner~return}{ execute={ \semantex_inner_return:n { ##1 } } },
+ {right~return}{ execute={ \semantex_right_return:n { ##1 } } },
+ {left~return}{ execute={ \semantex_left_return:n { ##1 } } },
+ {right~index~return}{ execute={ \semantex_right_index_return:n { ##1 } } },
+ {left~index~return}{ execute={ \semantex_left_index_return:n { ##1 } } },
+ {index~return}{ left~index~return, right~index~return },
+ {right~arg~return}{ execute={ \semantex_right_arg_return:n { ##1 } } },
+ {left~arg~return}{ execute={ \semantex_left_arg_return:n { ##1 } } },
+ {arg~return}{ execute={ \semantex_arg_return:n { ##1 } } },
+ {parse}{ parse~code, execute={ \semantex_clear_singlekey:nn { ##1 } { parse~code } } },
+ {parse~code}{ },
+ {clear~command}{ execute={ \semantex_data_seq_clear:nn { ##1 } { commands~sequence } } },
+ {dots}{sep~i~dots},
{...}{dots},
- {slot}{sepislot},
+ {slot}{sep~i~slot},
{-}{slot},
- {*}{sepd*},
- {**}{sepd**},
+ {*}{sep~d~*},
+ {**}{sep~d~**},
},
% The "spar" routine:
- definekeys={
+ define~keys={
{spar}{spar=},
},
- definekeys[1]={
+ define~keys[1]={
{spar}{ execute={ \semantex_spar:nn { ##1 } { #1 } } },
- {sparsize}{ execute={ \semantex_data_tl_set:nnn { ##1 } { sparsize } { #1 } } },
- {leftspar}{ execute={ \semantex_data_tl_set:nnn { ##1 } { leftspar } { #1 } } },
- {rightspar}{ execute={ \semantex_data_tl_set:nnn { ##1 } { rightspar } { #1 } } },
+ {spar~size}{ execute={ \semantex_data_tl_set:nnn { ##1 } { spar~size } { #1 } } },
+ {left~spar}{ execute={ \semantex_data_tl_set:nnn { ##1 } { left~spar } { #1 } } },
+ {right~spar}{ execute={ \semantex_data_tl_set:nnn { ##1 } { right~spar } { #1 } } },
},
- definekeys[2]={
- {otherspar}{ execute={ \semantex_other_spar:nnn { ##1 } { #1 } { #2 } } },
+ define~keys[2]={
+ {other~spar}{ execute={ \semantex_other_spar:nnn { ##1 } { #1 } { #2 } } },
},
- definekeys[3]={
- {Otherspar}{ execute={ \semantex_other_spar_with_size:nnnn { ##1 } { #1 } { #2 } { #3 } } },
+ define~keys[3]={
+ {Other~spar}{ execute={ \semantex_other_spar_with_size:nnnn { ##1 } { #1 } { #2 } { #3 } } },
},
- leftspar=(,
- rightspar=),
- sparsize=normal,
+ left~spar=(,
+ right~spar=),
+ spar~size=normal,
% The argument:
- dataprovide=arg,
- boolprovide=nextargwithsep,
- intprovide=numberofarguments,
- dataprovide=prearg,
- dataprovide=postarg,
- definekeys={
- {argdots}{setargkeys={...}},
- {arg...}{setargkeys={dots}},
- {commaargdots}{setargkeys={commadots}},
- {commaarg...}{setargkeys={comma...}},
- {argslot}{setargkeys={slot}},
- {arg-}{setargkeys={-}},
- {commaargslot}{setargkeys={commaslot}},
- {commaarg-}{setargkeys={comma-}},
- {cleararg}{ execute={
+ data~provide=arg,
+ bool~provide=next~arg~with~sep,
+ int~provide=number~of~arguments,
+ data~provide=pre~arg,
+ data~provide=post~arg,
+ define~keys={
+ {arg~dots}{set~arg~keys={...}},
+ {arg~...}{set~arg~keys={dots}},
+ {comma~arg~dots}{set~arg~keys={comma~dots}},
+ {comma~arg~...}{set~arg~keys={comma~...}},
+ {arg~slot}{set~arg~keys={slot}},
+ {arg-}{set~arg~keys={-}},
+ {comma~arg~slot}{set~arg~keys={comma~slot}},
+ {comma~arg~-}{set~arg~keys={comma~-}},
+ {clear~arg}{ execute={
\semantex_data_tl_clear:nn { ##1 } { arg }
- \semantex_data_int_clear:nn { ##1 } { numberofarguments }
- \semantex_data_bool_set_false:nn { ##1 } { nextargwithsep }
+ \semantex_data_int_clear:nn { ##1 } { number~of~arguments }
+ \semantex_data_bool_set_false:nn { ##1 } { next~arg~with~sep }
}
},
- {clearprearg}{ execute={ \semantex_data_tl_clear:nn { ##1 } { prearg } } },
- {clearpostarg}{ execute={ \semantex_data_tl_clear:nn { ##1 } { postarg } } },
+ {clear~pre~arg}{ execute={ \semantex_data_tl_clear:nn { ##1 } { pre~arg } } },
+ {clear~post~arg}{ execute={ \semantex_data_tl_clear:nn { ##1 } { post~arg } } },
},
- definekeys[1]={
- {setargkeys}{ execute={ \semantex_arg_keys_set:nn { ##1 } { #1 } } },
- {argkeysset}{ execute={ \semantex_arg_keys_set:nn { ##1 } { #1 } } },
- {setargkeysx}{ execute={ \semantex_arg_keys_set_x:nn { ##1 } { #1 } } },
- {argkeyssetx}{ execute={ \semantex_arg_keys_set_x:nn { ##1 } { #1 } } },
- {setargsinglekeys}{ execute={ \semantex_arg_singlekeys_set:nn { ##1 } { #1 } } },
- {argsinglekeysset}{ execute={ \semantex_arg_singlekeys_set:nn { ##1 } { #1 } } },
- {setargsinglekeysx}{ execute={ \semantex_arg_singlekeys_set_x:nn { ##1 } { #1 } } },
- {argsinglekeyssetx}{ execute={ \semantex_arg_singlekeys_set_x:nn { ##1 } { #1 } } },
- {setoneargsinglekey}{ execute={ \semantex_arg_singlekey:nn { ##1 } { #1 } } },
- {oneargsinglekeyset}{ execute={ \semantex_arg_singlekey:nn { ##1 } { #1 } } },
- {setoneargsinglekeyx}{ execute={ \semantex_arg_singlekey_x:nn { ##1 } { #1 } } },
- {oneargsinglekeysetx}{ execute={ \semantex_arg_singlekey_x:nn { ##1 } { #1 } } },
- {setargwithoutkeyval}{ execute={ \semantex_arg_without_keyval:nn { ##1 } { #1 } } },
- {argwithoutkeyvalset}{ execute={ \semantex_arg_without_keyval:nn { ##1 } { #1 } } },
- {setargwithoutkeyvalx}{ execute={ \semantex_arg_without_keyval:nx { ##1 } { #1 } } },
- {argwithoutkeyvalsetx}{ execute={ \semantex_arg_without_keyval:nx { ##1 } { #1 } } },
- {prearg}{ execute={ \semantex_data_tl_put_right:nnn { ##1 } { prearg } { #1 } } },
- {postarg}{ execute={ \semantex_data_tl_put_left:nnn { ##1 } { postarg } { #1 } } },
- {setargsep}{ execute={ \semantex_data_tl_set:nnn { ##1 } { argsep } { #1 } } },
- {setargslot}{ execute={ \semantex_data_tl_set:nnn { ##1 } { argslot } { #1 } } },
- {setargdots}{ execute={ \semantex_data_tl_set:nnn { ##1 } { argdots } { #1 } } },
- {argkeyval}{
- strifeqTF={#1}{true}
- {
- definekeys[1]={
+ define~keys[1]={
+ {set~arg~keys}{ execute={ \semantex_arg_keys_set:nn { ##1 } { #1 } } },
+ {arg~keys~set}{ execute={ \semantex_arg_keys_set:nn { ##1 } { #1 } } },
+ {set~arg~keys~x}{ execute={ \semantex_arg_keys_set_x:nn { ##1 } { #1 } } },
+ {arg~keys~set~x}{ execute={ \semantex_arg_keys_set_x:nn { ##1 } { #1 } } },
+ {set~arg~single~keys}{ execute={ \semantex_arg_singlekeys_set:nn { ##1 } { #1 } } },
+ {arg~single~keys~set}{ execute={ \semantex_arg_singlekeys_set:nn { ##1 } { #1 } } },
+ {set~arg~single~keys~x}{ execute={ \semantex_arg_singlekeys_set_x:nn { ##1 } { #1 } } },
+ {arg~single~keys~set~x}{ execute={ \semantex_arg_singlekeys_set_x:nn { ##1 } { #1 } } },
+ {set~one~arg~single~key}{ execute={ \semantex_arg_singlekey:nn { ##1 } { #1 } } },
+ {one~arg~single~key~set}{ execute={ \semantex_arg_singlekey:nn { ##1 } { #1 } } },
+ {set~one~arg~single~key~x}{ execute={ \semantex_arg_singlekey_x:nn { ##1 } { #1 } } },
+ {one~arg~single~key~set~x}{ execute={ \semantex_arg_singlekey_x:nn { ##1 } { #1 } } },
+ {set~arg~without~keyval}{ execute={ \semantex_arg_without_keyval:nn { ##1 } { #1 } } },
+ {arg~without~keyval~set}{ execute={ \semantex_arg_without_keyval:nn { ##1 } { #1 } } },
+ {set~arg~without~keyval~x}{ execute={ \semantex_arg_without_keyval:nx { ##1 } { #1 } } },
+ {arg~without~keyval~set~x}{ execute={ \semantex_arg_without_keyval:nx { ##1 } { #1 } } },
+ {pre~arg}{ execute={ \semantex_data_tl_put_right:nnn { ##1 } { pre~arg } { #1 } } },
+ {post~arg}{ execute={ \semantex_data_tl_put_left:nnn { ##1 } { post~arg } { #1 } } },
+ {set~arg~sep}{ execute={ \semantex_data_tl_set:nnn { ##1 } { arg~sep } { #1 } } },
+ {set~arg~slot}{ execute={ \semantex_data_tl_set:nnn { ##1 } { arg~slot } { #1 } } },
+ {set~arg~dots}{ execute={ \semantex_data_tl_set:nnn { ##1 } { arg~dots } { #1 } } },
+ {arg~keyval}{
+ str~if~eq~TF={#1}{true}
+ {
+ define~keys[1]={
{arg}{execute={ \semantex_arg_keys_set:nn { ########1 } { ####1 } }},
},
}
{
- strifeqTF={#1}{false}
+ str~if~eq~TF={#1}{false}
{
- definekeys[1]={
+ define~keys[1]={
{arg}{ execute={ \semantex_arg_without_keyval:nn { ########1 } { ####1 } } },
},
}
{
- strifeqTF={#1}{singlekeys}
+ str~if~eq~TF={#1}{single~keys}
{
- definekeys[1]={
+ define~keys[1]={
{arg}{ execute={ \semantex_arg_singlekeys_set:nn { ########1 } { ####1 } } },
},
}
{
- strifeqTF={#1}{onesinglekey}
+ str~if~eq~TF={#1}{one~single~key}
{
- definekeys[1]={
+ define~keys[1]={
{arg}{ execute={ \semantex_arg_singlekey:nn { ########1 } { ####1 } } },
},
}
{
- ERRORkeyvaluenotfound={argkeyval}{#1},
+ ERROR~key~value~not~found={arg~keyval}{#1},
},
},
},
},
},
- {argposition}{
- strifeqTF={#1}{left}
+ {arg~position}{
+ str~if~eq~TF={#1}{left}
+ {
+ bool~set~true=left~argument,
+ }
+ {
+ str~if~eq~TF={#1}{right}
+ {
+ bool~set~false=left~argument,
+ }
+ {
+ ERROR~key~value~not~found={arg~position}{#1},
+ },
+ },
+ },
+ {arg~pos}{
+ str~if~eq~TF={#1}{left}
{
- boolsettrue={leftargument},
+ bool~set~true=left~argument,
}
{
- strifeqTF={#1}{right}
+ str~if~eq~TF={#1}{right}
{
- boolsetfalse={leftargument},
+ bool~set~false=left~argument,
}
{
- ERRORkeyvaluenotfound={argposition}{#1},
+ ERROR~key~value~not~found={arg~pos}{#1},
},
},
},
- {nextargwithsep}{
- strifeqTF={#1}{true}
+ {next~arg~with~sep}{
+ str~if~eq~TF={#1}{true}
{
- boolsettrue={nextargwithsep},
+ bool~set~true=next~arg~with~sep,
}
{
- strifeqTF={#1}{false}
+ str~if~eq~TF={#1}{false}
{
- boolsetfalse={nextargwithsep},
+ bool~set~false=next~arg~with~sep,
}
{
- ERRORkeyvaluenotfound={nextargwithsep}{#1},
+ ERROR~key~value~not~found={next~arg~with~sep}{#1},
},
},
},
- {separg}{setargkeys={sep={#1}}},
- {commaarg}{setargkeys={comma={#1}}},
- {argdotswithothersep}{setargkeys={dotswithothersep={#1}}},
- {arg...withothersep}{setargkeys={dotswithothersep={#1}}},
- {argslotwithothersep}{setargkeys={slotwithothersep={#1}}},
- {arg-withothersep}{setargkeys={slotwithothersep={#1}}},
+ {sep~arg}{set~arg~keys={sep={#1}}},
+ {comma~arg}{set~arg~keys={comma={#1}}},
+ {arg~dots~with~other~sep}{set~arg~keys={dots~with~other~sep={#1}}},
+ {arg~...~with~other~sep}{set~arg~keys={dots~with~other~sep={#1}}},
+ {arg~slot~with~other~sep}{set~arg~keys={slot~with~other~sep={#1}}},
+ {arg~-~with~other~sep}{set~arg~keys={slot~with~other~sep={#1}}},
},
- definekeys[2]={
- {argwithothersep}{setargkeys={othersep={#1}{#2}}},
+ define~keys[2]={
+ {arg~with~other~sep}{set~arg~keys={other~sep={#1}{#2}}},
},
- setargsep={,},
- setargslot={ {-} },
- setargdots={ \dots },
+ set~arg~sep={,},
+ set~arg~slot={ {-} },
+ set~arg~dots={ \dots },
% Parentheses:
- definekeys={
- {par}{usepar=true},
- {neverpar}{usepar=never},
- {nopar}{usepar=false},
+ define~keys={
+ {par}{use~par=true},
+ {never~par}{use~par=never},
+ {no~par}{use~par=false},
},
- definekeys[1]={
+ define~keys[1]={
{par}{
execute={
- \semantex_data_tl_set:nnn { ##1 } { parsize } { #1 }
+ \semantex_data_tl_set:nnn { ##1 } { par~size } { #1 }
\semantex_data_bool_set_true:nn { ##1 } { par }
},
},
- {parsize}{
+ {par~size}{
execute={
- \semantex_data_tl_set:nnn { ##1 } { parsize } { #1 }
+ \semantex_data_tl_set:nnn { ##1 } { par~size } { #1 }
},
},
- {leftpar}{
- execute={ \semantex_data_tl_set:nnn { ##1 } { leftpar } { #1 } },
+ {left~par}{
+ execute={ \semantex_data_tl_set:nnn { ##1 } { left~par } { #1 } },
},
- {rightpar}{
- execute={ \semantex_data_tl_set:nnn { ##1 } { rightpar } { #1 } },
+ {right~par}{
+ execute={ \semantex_data_tl_set:nnn { ##1 } { right~par } { #1 } },
},
- {usepar}{
- strifeqTF={#1}{true}
+ {use~par}{
+ str~if~eq~TF={#1}{true}
{
- boolsettrue={par},
- boolsetfalse={flexpar},
+ bool~set~true=par,
+ bool~set~false=flex~par,
}
{
- strifeqTF={#1}{false}
+ str~if~eq~TF={#1}{false}
{
- boolsetfalse={par},
- boolsettrue={flexpar},
+ bool~set~false=par,
+ bool~set~true=flex~par,
}
{
- strifeqTF={#1}{never}
+ str~if~eq~TF={#1}{never}
{
- boolsetfalse={par},
- boolsetfalse={flexpar},
+ bool~set~false=par,
+ bool~set~false=flex~par,
}
{
- ERRORkeyvaluenotfound={usepar}{#1},
+ ERROR~key~value~not~found={use~par}{#1},
},
},
},
},
},
- leftpar=(,
- rightpar=),
+ left~par=(,
+ right~par=),
par=normal,
% Accents, primes, bullets, etc.:
- definekeys={
- {smash}{command=\smash},
- {prime}{upper={\prime},nextupperwithsep=false},
+ define~keys={
+ {smash}{return,command=\smash},
+ {prime}{upper={\prime},next~upper~with~sep=false},
{'}{prime},
{''}{prime,prime},
{'''}{prime,prime,prime},
},
% Upper indices:
- dataprovide=upper,
- boolprovide=nextupperwithsep,
- intprovide=numberofupperindices,
- dataprovide=preupper,
- dataprovide=postupper,
- definekeys={
- {upperslot}{ setkeysx={ upper=\semantex_data_tl_get_exp_not:nn { ##1 } { upperslot } } },
- {upper-}{upperslot},
- {sepupperslot}{ setkeysx={ sepupper=\semantex_data_tl_get_exp_not:nn { ##1 } { upperslot } } },
- {sepupper-}{sepupperslot},
- {commaupperslot}{ setkeysx={ commaupper=\semantex_data_tl_get_exp_not:nn { ##1 } { upperslot } } },
- {commaupper-}{commaupperslot},
- {upperdots}{ setkeysx={ upper=\semantex_data_tl_get_exp_not:nn { ##1 } { upperdots } } },
- {upper...}{upperdots},
- {sepupperdots}{ setkeysx={ sepupper=\semantex_data_tl_get_exp_not:nn { ##1 } { upperdots } } },
- {sepupper...}{sepupperdots},
- {commaupperdots}{ setkeysx={ commaupper=\semantex_data_tl_get_exp_not:nn { ##1 } { upperdots } } },
- {commaupper...}{commaupperdots},
- {clearupper}{
+ data~provide=upper,
+ bool~provide=next~upper~with~sep,
+ int~provide=number~of~upper~indices,
+ data~provide=pre~upper,
+ data~provide=post~upper,
+ define~keys={
+ {upper~slot}{ set~keys~x={ upper=\semantex_data_tl_get_exp_not:nn { ##1 } { upper~slot } } },
+ {upper~-}{upper~slot},
+ {sep~upper~slot}{ set~keys~x={ sep~upper=\semantex_data_tl_get_exp_not:nn { ##1 } { upper~slot } } },
+ {sep~upper~-}{sep~upper~slot},
+ {comma~upper~slot}{ set~keys~x={ comma~upper=\semantex_data_tl_get_exp_not:nn { ##1 } { upper~slot } } },
+ {comma~upper~-}{comma~upper~slot},
+ {upper~dots}{ set~keys~x={ upper=\semantex_data_tl_get_exp_not:nn { ##1 } { upper~dots } } },
+ {upper~...}{upper~dots},
+ {sep~upper~dots}{ set~keys~x={ sep~upper=\semantex_data_tl_get_exp_not:nn { ##1 } { upper~dots } } },
+ {sep~upper~...}{sep~upper~dots},
+ {comma~upper~dots}{ set~keys~x={ comma~upper=\semantex_data_tl_get_exp_not:nn { ##1 } { upper~dots } } },
+ {comma~upper~...}{comma~upper~dots},
+ {clear~upper}{
execute={
\semantex_data_tl_clear:nn { ##1 } { upper }
- \semantex_data_bool_set_false:nn { ##1 } { nextupperwithsep }
- \semantex_data_int_clear:nn { ##1 } { numberofupperindices }
+ \semantex_data_bool_set_false:nn { ##1 } { next~upper~with~sep }
+ \semantex_data_int_clear:nn { ##1 } { number~of~upper~indices }
},
},
- {clearpreupper}{
- execute={ \semantex_data_tl_clear:nn { ##1 } { preupper } },
+ {clear~pre~upper}{
+ execute={ \semantex_data_tl_clear:nn { ##1 } { pre~upper } },
},
- {clearpostupper}{
- execute={ \semantex_data_tl_clear:nn { ##1 } { postupper } },
+ {clear~post~upper}{
+ execute={ \semantex_data_tl_clear:nn { ##1 } { post~upper } },
},
- {upper*}{upper=\SemantexBullet},
- {upper**}{upper=\SemantexDoubleBullet},
- {sepupper*}{sepupper=\SemantexBullet},
- {sepupper**}{sepupper=\SemantexDoubleBullet},
- {commaupper*}{commaupper=\SemantexBullet},
- {commaupper**}{commaupper=\SemantexDoubleBullet},
+ {upper~*}{upper=\SemantexBullet},
+ {upper~**}{upper=\SemantexDoubleBullet},
+ {sep~upper~*}{sep~upper=\SemantexBullet},
+ {sep~upper~**}{sep~upper=\SemantexDoubleBullet},
+ {comma~upper~*}{comma~upper=\SemantexBullet},
+ {comma~upper~**}{comma~upper=\SemantexDoubleBullet},
},
- definekeys[1]={
+ define~keys[1]={
{upper}{
execute={
\tl_if_blank:nF { #1 }
{
\semantex_data_tl_put_right:nnn { ##1 } { upper } { #1 }
- \semantex_data_bool_set_true:nn { ##1 } { nextupperwithsep }
- \semantex_data_int_incr:nn { ##1 } { numberofupperindices }
+ \semantex_data_bool_set_true:nn { ##1 } { next~upper~with~sep }
+ \semantex_data_int_incr:nn { ##1 } { number~of~upper~indices }
}
},
},
- {sepupper}{
+ {sep~upper}{
execute={
\tl_if_blank:nF { #1 }
{
- \semantex_data_bool_get:nnTF { ##1 } { nextupperwithsep }
+ \semantex_data_bool_get:nnTF { ##1 } { next~upper~with~sep }
{
\semantex_data_tl_put_right:nnx { ##1 } { upper }
- { \semantex_data_tl_get_exp_not:nn { ##1 } { uppersep } }
+ { \semantex_data_tl_get_exp_not:nn { ##1 } { upper~sep } }
\semantex_data_tl_put_right:nnn { ##1 } { upper } { #1 }
}
{
\semantex_data_tl_put_right:nnn { ##1 } { upper } { #1 }
}
- \semantex_data_bool_set_true:nn { ##1 } { nextupperwithsep }
- \semantex_data_int_incr:nn { ##1 } { numberofupperindices }
+ \semantex_data_bool_set_true:nn { ##1 } { next~upper~with~sep }
+ \semantex_data_int_incr:nn { ##1 } { number~of~upper~indices }
}
},
},
- {commaupper}{
+ {comma~upper}{
execute={
\tl_if_blank:nF{#1}
{
- \semantex_data_bool_get:nnTF { ##1 } { nextupperwithsep }
+ \semantex_data_bool_get:nnTF { ##1 } { next~upper~with~sep }
{
\semantex_data_tl_put_right:nnn { ##1 } { upper } { , #1 }
}
{
\semantex_data_tl_put_right:nnn { ##1 } { upper } { #1 }
}
- \semantex_data_bool_set_true:nn { ##1 } { nextupperwithsep }
- \semantex_data_int_incr:nn { ##1 } { numberofupperindices }
+ \semantex_data_bool_set_true:nn { ##1 } { next~upper~with~sep }
+ \semantex_data_int_incr:nn { ##1 } { number~of~upper~indices }
}
}
},
- {preupper}{
+ {pre~upper}{
execute={
\tl_if_blank:nF{#1}{
- \semantex_data_tl_put_right:nnn { ##1 } { preupper } { #1 }
+ \semantex_data_tl_put_right:nnn { ##1 } { pre~upper } { #1 }
}
},
},
- {postupper}{
+ {post~upper}{
execute={
\tl_if_blank:nF{#1}{
- \semantex_data_tl_put_left:nnn { ##1 } { postupper } { #1 }
+ \semantex_data_tl_put_left:nnn { ##1 } { post~upper } { #1 }
}
},
},
- {upperputleft}{
+ {upper~put~left}{
execute={
\tl_if_blank:nF { #1 }
{
\semantex_data_tl_put_left:nnn { ##1 } { upper } { #1 }
- \semantex_data_bool_set_true:nn { ##1 } { nextupperwithsep }
- \semantex_data_int_incr:nn { ##1 } { numberofupperindices }
+ \semantex_data_bool_set_true:nn { ##1 } { next~upper~with~sep }
+ \semantex_data_int_incr:nn { ##1 } { number~of~upper~indices }
}
},
},
- {setupperslot}{
- execute={ \semantex_data_tl_set:nnn { ##1 } { upperslot } { #1 } },
+ {set~upper~slot}{
+ execute={ \semantex_data_tl_set:nnn { ##1 } { upper~slot } { #1 } },
},
- {upperslotwithothersep}{
+ {upper~slot~with~other~sep}{
execute={
- \semantex_valuekey:nnx { ##1 } { upperwithothersep }
+ \semantex_valuekey:nnx { ##1 } { upper~with~other~sep }
{
{ \exp_not:n { #1 } }
- { \semantex_data_tl_get_exp_not:nn { ##1 } { upperslot } }
+ { \semantex_data_tl_get_exp_not:nn { ##1 } { upper~slot } }
}
},
},
- {upper-withothersep}{
+ {upper~-~with~other~sep}{
execute={
- \semantex_valuekey:nnx { ##1 } { upperwithothersep }
+ \semantex_valuekey:nnx { ##1 } { upper~with~other~sep }
{
{ \exp_not:n { #1 } }
- { \semantex_data_tl_get_exp_not:nn { ##1 } { upperslot } }
+ { \semantex_data_tl_get_exp_not:nn { ##1 } { upper~slot } }
}
},
},
- {setupperdots}{
- execute={ \semantex_data_tl_set:nnn { ##1 } { upperdots } { #1 } },
+ {set~upper~dots}{
+ execute={ \semantex_data_tl_set:nnn { ##1 } { upper~dots } { #1 } },
},
- {upperdotswithothersep}{
+ {upper~dots~with~other~sep}{
execute={
- \semantex_valuekey:nnx { ##1 } { upperwithothersep }
+ \semantex_valuekey:nnx { ##1 } { upper~with~other~sep }
{
{ \exp_not:n { #1 } }
- { \semantex_data_tl_get_exp_not:nn { ##1 } { upperdots } }
+ { \semantex_data_tl_get_exp_not:nn { ##1 } { upper~dots } }
}
},
},
- {upper...withothersep}{
+ {upper~...~with~other~sep}{
execute={
- \semantex_valuekey:nnx { ##1 } { upperwithothersep }
+ \semantex_valuekey:nnx { ##1 } { upper~with~other~sep }
{
{ \exp_not:n { #1 } }
- { \semantex_data_tl_get_exp_not:nn { ##1 } { upperdots } }
+ { \semantex_data_tl_get_exp_not:nn { ##1 } { upper~dots } }
}
},
},
- {upper*withothersep}{upperwithothersep={#1}{\SemantexBullet}},
- {upper**withothersep}{upperwithothersep={#1}{\SemantexDoubleBullet}},
- {setuppersep}{
- execute={ \semantex_data_tl_set:nnn { ##1 } { uppersep } { #1 } },
+ {upper~*~with~other~sep}{upper~with~other~sep={#1}{\SemantexBullet}},
+ {upper~**~with~other~sep}{upper~with~other~sep={#1}{\SemantexDoubleBullet}},
+ {set~upper~sep}{
+ execute={ \semantex_data_tl_set:nnn { ##1 } { upper~sep } { #1 } },
},
- {nextupperwithsep}{
- strifeqTF={#1}{false}
+ {next~upper~with~sep}{
+ str~if~eq~TF={#1}{false}
{
- boolsetfalse={nextupperwithsep},
+ bool~set~false={next~upper~with~sep},
}
{
- strifeqTF={#1}{true}
+ str~if~eq~TF={#1}{true}
{
- boolsettrue={nextupperwithsep},
+ bool~set~true={next~upper~with~sep},
}
{
- ERRORkeyvaluenotfound={nextupperwithsep}{#1},
+ ERROR~key~value~not~found={next~upper~with~sep}{#1},
},
},
},
},
- definekeys[2]={
- {upperwithothersep}{
+ define~keys[2]={
+ {upper~with~other~sep}{
execute={
- \semantex_data_bool_get:nnTF { ##1 } { nextupperwithsep }
+ \semantex_data_bool_get:nnTF { ##1 } { next~upper~with~sep }
{ \semantex_data_tl_put_right:nnn { ##1 } { upper } { #1 #2 } }
{ \semantex_data_tl_put_right:nnn { ##1 } { upper } { #2 } }
- \semantex_data_bool_set_true:nn { ##1 } { nextupperwithsep }
- \semantex_data_int_incr:nn { ##1 } { numberofupperindices }
+ \semantex_data_bool_set_true:nn { ##1 } { next~upper~with~sep }
+ \semantex_data_int_incr:nn { ##1 } { number~of~upper~indices }
},
},
},
- setuppersep={ , },
- setupperdots={ \dots },
- setupperslot={ {-} },
+ set~upper~sep={ , },
+ set~upper~dots={ \dots },
+ set~upper~slot={ {-} },
% Lower indices:
- dataprovide=lower,
- boolprovide=nextlowerwithsep,
- intprovide=numberoflowerindices,
- dataprovide=prelower,
- dataprovide=postlower,
- definekeys={
- {lowerslot}{ setkeysx={ lower=\semantex_data_tl_get_exp_not:nn { ##1 } { lowerslot } } },
- {lower-}{lowerslot},
- {seplowerslot}{ setkeysx={ seplower=\semantex_data_tl_get_exp_not:nn { ##1 } { lowerslot } } },
- {seplower-}{seplowerslot},
- {commalowerslot}{ setkeysx={ commalower=\semantex_data_tl_get_exp_not:nn { ##1 } { lowerslot } } },
- {commalower-}{commalowerslot},
- {lowerdots}{ setkeysx={ lower=\semantex_data_tl_get_exp_not:nn { ##1 } { lowerdots } } },
- {lower...}{lowerdots},
- {seplowerdots}{ setkeysx={ seplower=\semantex_data_tl_get_exp_not:nn { ##1 } { lowerdots } } },
- {seplower...}{seplowerdots},
- {commalowerdots}{ setkeysx={ commalower=\semantex_data_tl_get_exp_not:nn { ##1 } { lowerdots } } },
- {commalower...}{commalowerdots},
- {clearlower}{
+ data~provide=lower,
+ bool~provide=next~lower~with~sep,
+ int~provide=number~of~lower~indices,
+ data~provide=pre~lower,
+ data~provide=post~lower,
+ define~keys={
+ {lower~slot}{ set~keys~x={ lower=\semantex_data_tl_get_exp_not:nn { ##1 } { lower~slot } } },
+ {lower~-}{lower~slot},
+ {sep~lower~slot}{ set~keys~x={ sep~lower=\semantex_data_tl_get_exp_not:nn { ##1 } { lower~slot } } },
+ {sep~lower~-}{sep~lower~slot},
+ {comma~lower~slot}{ set~keys~x={ comma~lower=\semantex_data_tl_get_exp_not:nn { ##1 } { lower~slot } } },
+ {comma~lower~-}{comma~lower~slot},
+ {lower~dots}{ set~keys~x={ lower=\semantex_data_tl_get_exp_not:nn { ##1 } { lower~dots } } },
+ {lower~...}{lower~dots},
+ {sep~lower~dots}{ set~keys~x={ sep~lower=\semantex_data_tl_get_exp_not:nn { ##1 } { lower~dots } } },
+ {sep~lower~...}{sep~lower~dots},
+ {comma~lower~dots}{ set~keys~x={ comma~lower=\semantex_data_tl_get_exp_not:nn { ##1 } { lower~dots } } },
+ {comma~lower~...}{comma~lower~dots},
+ {clear~lower}{
execute={
\semantex_data_tl_clear:nn { ##1 } { lower }
- \semantex_data_bool_set_false:nn { ##1 } { nextlowerwithsep }
- \semantex_data_int_clear:nn { ##1 } { numberoflowerindices }
+ \semantex_data_bool_set_false:nn { ##1 } { next~lower~with~sep }
+ \semantex_data_int_clear:nn { ##1 } { number~of~lower~indices }
},
},
- {clearprelower}{
- execute={ \semantex_data_tl_clear:nn { ##1 } { prelower } },
+ {clear~pre~lower}{
+ execute={ \semantex_data_tl_clear:nn { ##1 } { pre~lower } },
},
- {clearpostlower}{
- execute={ \semantex_data_tl_clear:nn { ##1 } { postlower } },
+ {clear~post~lower}{
+ execute={ \semantex_data_tl_clear:nn { ##1 } { post~lower } },
},
- {lower*}{lower=\SemantexBullet},
- {lower**}{lower=\SemantexDoubleBullet},
- {seplower*}{seplower=\SemantexBullet},
- {seplower**}{seplower=\SemantexDoubleBullet},
- {commalower*}{commalower=\SemantexBullet},
- {commalower**}{commalower=\SemantexDoubleBullet},
+ {lower~**}{lower=\SemantexBullet},
+ {lower~***}{lower=\SemantexDoubleBullet},
+ {sep~lower~**}{sep~lower=\SemantexBullet},
+ {sep~lower~***}{sep~lower=\SemantexDoubleBullet},
+ {comma~lower~**}{comma~lower=\SemantexBullet},
+ {comma~lower~***}{comma~lower=\SemantexDoubleBullet},
},
- definekeys[1]={
+ define~keys[1]={
{lower}{
execute={
\tl_if_blank:nF{#1}{
\semantex_data_tl_put_right:nnn { ##1 } { lower } { #1 }
- \semantex_data_bool_set_true:nn { ##1 } { nextlowerwithsep }
- \semantex_data_int_incr:nn { ##1 } { numberoflowerindices }
+ \semantex_data_bool_set_true:nn { ##1 } { next~lower~with~sep }
+ \semantex_data_int_incr:nn { ##1 } { number~of~lower~indices }
}
},
},
- {seplower}{
+ {sep~lower}{
execute={
\tl_if_blank:nF { #1 }
{
- \semantex_data_bool_get:nnTF { ##1 } { nextlowerwithsep }
+ \semantex_data_bool_get:nnTF { ##1 } { next~lower~with~sep }
{
\semantex_data_tl_put_right:nnx { ##1 } { lower }
- { \semantex_data_tl_get_exp_not:nn { ##1 } { lowersep } }
+ { \semantex_data_tl_get_exp_not:nn { ##1 } { lower~sep } }
\semantex_data_tl_put_right:nnn { ##1 } { lower } { #1 }
}
{
\semantex_data_tl_put_right:nnn { ##1 } { lower } { #1 }
}
- \semantex_data_bool_set_true:nn { ##1 } { nextlowerwithsep }
- \semantex_data_int_incr:nn { ##1 } { numberoflowerindices }
+ \semantex_data_bool_set_true:nn { ##1 } { next~lower~with~sep }
+ \semantex_data_int_incr:nn { ##1 } { number~of~lower~indices }
}
},
},
- {commalower}{
+ {comma~lower}{
execute={
\tl_if_blank:nF{#1}
{
- \semantex_data_bool_get:nnTF { ##1 } { nextlowerwithsep }
+ \semantex_data_bool_get:nnTF { ##1 } { next~lower~with~sep }
{
\semantex_data_tl_put_right:nnn { ##1 } { lower } { , #1 }
}
{
\semantex_data_tl_put_right:nnn { ##1 } { lower } { #1 }
}
- \semantex_data_bool_set_true:nn { ##1 } { nextlowerwithsep }
- \semantex_data_int_incr:nn { ##1 } { numberoflowerindices }
+ \semantex_data_bool_set_true:nn { ##1 } { next~lower~with~sep }
+ \semantex_data_int_incr:nn { ##1 } { number~of~lower~indices }
}
}
},
- {prelower}{
+ {pre~lower}{
execute={
\tl_if_blank:nF{#1}{
- \semantex_data_tl_put_right:nnn { ##1 } { prelower } { #1 }
+ \semantex_data_tl_put_right:nnn { ##1 } { pre~lower } { #1 }
}
},
},
- {postlower}{
+ {post~lower}{
execute={
\tl_if_blank:nF{#1}{
- \semantex_data_tl_put_left:nnn { ##1 } { postlower } { #1 }
+ \semantex_data_tl_put_left:nnn { ##1 } { post~lower } { #1 }
}
},
},
- {lowerputleft}{
+ {lower~put~left}{
execute={
\tl_if_blank:nF { #1 }
{
\semantex_data_tl_put_left:nnn { ##1 } { lower } { #1 }
- \semantex_data_bool_set_true:nn { ##1 } { nextlowerwithsep }
- \semantex_data_int_incr:nn { ##1 } { numberoflowerindices }
+ \semantex_data_bool_set_true:nn { ##1 } { next~lower~with~sep }
+ \semantex_data_int_incr:nn { ##1 } { number~of~lower~indices }
}
},
},
- {setlowerslot}{
- execute={ \semantex_data_tl_set:nnn { ##1 } { lowerslot } { #1 } },
+ {set~lower~slot}{
+ execute={ \semantex_data_tl_set:nnn { ##1 } { lower~slot } { #1 } },
},
- {lowerslotwithothersep}{
+ {lower~slot~with~other~sep}{
execute={
- \semantex_valuekey:nnx { ##1 } { lowerwithothersep }
+ \semantex_valuekey:nnx { ##1 } { lower~with~other~sep }
{
{ \exp_not:n { #1 } }
- { \semantex_data_tl_get_exp_not:nn { ##1 } { lowerslot } }
+ { \semantex_data_tl_get_exp_not:nn { ##1 } { lower~slot } }
}
},
},
- {lower-withothersep}{
+ {lower~-~with~other~sep}{
execute={
- \semantex_valuekey:nnx { ##1 } { lowerwithothersep }
+ \semantex_valuekey:nnx { ##1 } { lower~with~other~sep }
{
{ \exp_not:n { #1 } }
- { \semantex_data_tl_get_exp_not:nn { ##1 } { lowerslot } }
+ { \semantex_data_tl_get_exp_not:nn { ##1 } { lower~slot } }
}
},
},
- {setlowerdots}{
- execute={ \semantex_data_tl_set:nnn { ##1 } { lowerdots } { #1 } },
+ {set~lower~dots}{
+ execute={ \semantex_data_tl_set:nnn { ##1 } { lower~dots } { #1 } },
},
- {lowerdotswithothersep}{
+ {lower~dots~with~other~sep}{
execute={
- \semantex_valuekey:nnx { ##1 } { lowerwithothersep }
+ \semantex_valuekey:nnx { ##1 } { lower~with~other~sep }
{
{ \exp_not:n { #1 } }
- { \semantex_data_tl_get_exp_not:nn { ##1 } { lowerdots } }
+ { \semantex_data_tl_get_exp_not:nn { ##1 } { lower~dots } }
}
},
},
- {lower...withothersep}{
+ {lower~...~with~other~sep}{
execute={
- \semantex_valuekey:nnx { ##1 } { lowerwithothersep }
+ \semantex_valuekey:nnx { ##1 } { lower~with~other~sep }
{
{ \exp_not:n { #1 } }
- { \semantex_data_tl_get_exp_not:nn { ##1 } { lowerdots } }
+ { \semantex_data_tl_get_exp_not:nn { ##1 } { lower~dots } }
}
},
},
- {lower*withothersep}{lowerwithothersep={#1}{\SemantexBullet}},
- {lower**withothersep}{lowerwithothersep={#1}{\SemantexDoubleBullet}},
- {setlowersep}{
- execute={ \semantex_data_tl_set:nnn { ##1 } { lowersep } { #1 } },
+ {lower~**~with~other~sep}{lower~with~other~sep={#1}{\SemantexBullet}},
+ {lower~***~with~other~sep}{lower~with~other~sep={#1}{\SemantexDoubleBullet}},
+ {set~lower~sep}{
+ execute={ \semantex_data_tl_set:nnn { ##1 } { lower~sep } { #1 } },
},
- {nextlowerwithsep}{
- strifeqTF={#1}{false}
+ {next~lower~with~sep}{
+ str~if~eq~TF={#1}{false}
{
- boolsetfalse={nextlowerwithsep},
+ bool~set~false={next~lower~with~sep},
}
{
- strifeqTF={#1}{true}
+ str~if~eq~TF={#1}{true}
{
- boolsettrue={nextlowerwithsep},
+ bool~set~true={next~lower~with~sep},
}
{
- ERRORkeyvaluenotfound={nextlowerwithsep}{#1},
+ ERROR~key~value~not~found={next~lower~with~sep}{#1},
},
},
},
},
- definekeys[2]={
- {lowerwithothersep}{
+ define~keys[2]={
+ {lower~with~other~sep}{
execute={
- \semantex_data_bool_get:nnTF { ##1 } { nextlowerwithsep }
+ \semantex_data_bool_get:nnTF { ##1 } { next~lower~with~sep }
{ \semantex_data_tl_put_right:nnn { ##1 } { lower } { #1 #2 } }
{ \semantex_data_tl_put_right:nnn { ##1 } { lower } { #2 } }
- \semantex_data_bool_set_true:nn { ##1 } { nextlowerwithsep }
- \semantex_data_int_incr:nn { ##1 } { numberoflowerindices }
+ \semantex_data_bool_set_true:nn { ##1 } { next~lower~with~sep }
+ \semantex_data_int_incr:nn { ##1 } { number~of~lower~indices }
},
},
},
- setlowersep={ , },
- setlowerdots={ \dots },
- setlowerslot={ {-} },
+ set~lower~sep={ , },
+ set~lower~dots={ \dots },
+ set~lower~slot={ {-} },
% Upper left indices:
- dataprovide=upperleft,
- intprovide=nextupperleftwithsep,
- intprovide=numberofupperleftindices,
- dataprovide=preupperleft,
- dataprovide=postupperleft,
- definekeys={
- {upperleftslot}{ setkeysx={ upperleft=\semantex_data_tl_get_exp_not:nn { ##1 } { upperleftslot } } },
- {upperleft-}{upperleftslot},
- {sepupperleftslot}{ setkeysx={ sepupperleft=\semantex_data_tl_get_exp_not:nn { ##1 } { upperleftslot } } },
- {sepupperleft-}{sepupperleftslot},
- {commaupperleftslot}{ setkeysx={ commaupperleft=\semantex_data_tl_get_exp_not:nn { ##1 } { upperleftslot } } },
- {commaupperleft-}{commaupperleftslot},
- {upperleftdots}{ setkeysx={ upperleft=\semantex_data_tl_get_exp_not:nn { ##1 } { upperleftdots } } },
- {upperleft...}{upperleftdots},
- {sepupperleftdots}{ setkeysx={ sepupperleft=\semantex_data_tl_get_exp_not:nn { ##1 } { upperleftdots } } },
- {sepupperleft...}{sepupperleftdots},
- {commaupperleftdots}{ setkeysx={ commaupperleft=\semantex_data_tl_get_exp_not:nn { ##1 } { upperleftdots } } },
- {commaupperleft...}{commaupperleftdots},
- {clearupperleft}{
+ data~provide=upper~left,
+ int~provide=next~upper~left~with~sep,
+ int~provide=number~of~upper~left~indices,
+ data~provide=pre~upper~left,
+ data~provide=post~upper~left,
+ define~keys={
+ {upper~left~slot}{ set~keys~x={ upper~left=\semantex_data_tl_get_exp_not:nn { ##1 } { upper~left~slot } } },
+ {upper~left~-}{upper~left~slot},
+ {sep~upper~left~slot}{ set~keys~x={ sep~upper~left=\semantex_data_tl_get_exp_not:nn { ##1 } { upper~left~slot } } },
+ {sep~upper~left~-}{sep~upper~left~slot},
+ {comma~upper~left~slot}{ set~keys~x={ comma~upper~left=\semantex_data_tl_get_exp_not:nn { ##1 } { upper~left~slot } } },
+ {comma~upper~left~-}{comma~upper~left~slot},
+ {lower~left~dots}{ set~keys~x={ upper~left=\semantex_data_tl_get_exp_not:nn { ##1 } { lower~left~dots } } },
+ {upper~left~...}{lower~left~dots},
+ {sep~lower~left~dots}{ set~keys~x={ sep~upper~left=\semantex_data_tl_get_exp_not:nn { ##1 } { lower~left~dots } } },
+ {sep~upper~left~...}{sep~lower~left~dots},
+ {comma~lower~left~dots}{ set~keys~x={ comma~upper~left=\semantex_data_tl_get_exp_not:nn { ##1 } { lower~left~dots } } },
+ {comma~upper~left~...}{comma~lower~left~dots},
+ {clear~upper~left}{
execute={
- \semantex_data_tl_clear:nn { ##1 } { upperleft }
- \semantex_data_bool_set_false:nn { ##1 } { nextupperleftwithsep }
- \semantex_data_int_clear:nn { ##1 } { numberofupperleftindices }
+ \semantex_data_tl_clear:nn { ##1 } { upper~left }
+ \semantex_data_bool_set_false:nn { ##1 } { next~upper~left~with~sep }
+ \semantex_data_int_clear:nn { ##1 } { number~of~upper~left~indices }
},
},
- {clearpreupperleft}{
- execute={ \semantex_data_tl_clear:nn { ##1 } { preupperleft } },
+ {clear~pre~upper~left}{
+ execute={ \semantex_data_tl_clear:nn { ##1 } { pre~upper~left } },
},
- {clearpostupperleft}{
- execute={ \semantex_data_tl_clear:nn { ##1 } { postupperleft } },
+ {clear~post~upper~left}{
+ execute={ \semantex_data_tl_clear:nn { ##1 } { post~upper~left } },
},
- {upperleft*}{upperleft=\SemantexBullet},
- {upperleft**}{upperleft=\SemantexDoubleBullet},
- {sepupperleft*}{sepupperleft=\SemantexBullet},
- {sepupperleft**}{sepupperleft=\SemantexDoubleBullet},
- {commaupperleft*}{commaupperleft=\SemantexBullet},
- {commaupperleft**}{commaupperleft=\SemantexDoubleBullet},
+ {upper~left~*}{upper~left=\SemantexBullet},
+ {upper~left~**}{upper~left=\SemantexDoubleBullet},
+ {sep~upper~left~*}{sep~upper~left=\SemantexBullet},
+ {sep~upper~left~**}{sep~upper~left=\SemantexDoubleBullet},
+ {comma~upper~left~*}{comma~upper~left=\SemantexBullet},
+ {comma~upper~left~**}{comma~upper~left=\SemantexDoubleBullet},
},
- definekeys[1]={
- {upperleft}{
+ define~keys[1]={
+ {upper~left}{
execute={
\tl_if_blank:nF{#1}{
- \semantex_data_tl_put_left:nnn { ##1 } { upperleft } { #1 }
- \semantex_data_bool_set_true:nn { ##1 } { nextupperleftwithsep }
- \semantex_data_int_incr:nn { ##1 } { numberofupperleftindices }
+ \semantex_data_tl_put_left:nnn { ##1 } { upper~left } { #1 }
+ \semantex_data_bool_set_true:nn { ##1 } { next~upper~left~with~sep }
+ \semantex_data_int_incr:nn { ##1 } { number~of~upper~left~indices }
}
},
},
- {sepupperleft}{
+ {sep~upper~left}{
execute={
\tl_if_blank:nF { #1 }
{
- \semantex_data_bool_get:nnTF { ##1 } { nextupperleftwithsep }
+ \semantex_data_bool_get:nnTF { ##1 } { next~upper~left~with~sep }
{
- \semantex_data_tl_put_left:nnx { ##1 } { upperleft }
- { \semantex_data_tl_get_exp_not:nn { ##1 } { upperleftsep } }
- \semantex_data_tl_put_left:nnn { ##1 } { upperleft } { #1 }
+ \semantex_data_tl_put_left:nnx { ##1 } { upper~left }
+ { \semantex_data_tl_get_exp_not:nn { ##1 } { upper~left~sep } }
+ \semantex_data_tl_put_left:nnn { ##1 } { upper~left } { #1 }
}
{
- \semantex_data_tl_put_left:nnn { ##1 } { upperleft } { #1 }
+ \semantex_data_tl_put_left:nnn { ##1 } { upper~left } { #1 }
}
- \semantex_data_bool_set_true:nn { ##1 } { nextupperleftwithsep }
- \semantex_data_int_incr:nn { ##1 } { numberofupperleftindices }
+ \semantex_data_bool_set_true:nn { ##1 } { next~upper~left~with~sep }
+ \semantex_data_int_incr:nn { ##1 } { number~of~upper~left~indices }
}
},
},
- {commaupperleft}{
+ {comma~upper~left}{
execute={
\tl_if_blank:nF{#1}
{
- \semantex_data_bool_get:nnTF { ##1 } { nextupperleftwithsep }
+ \semantex_data_bool_get:nnTF { ##1 } { next~upper~left~with~sep }
{
- \semantex_data_tl_put_left:nnn { ##1 } { upperleft } { , #1 }
+ \semantex_data_tl_put_left:nnn { ##1 } { upper~left } { , #1 }
}
{
- \semantex_data_tl_put_left:nnn { ##1 } { upperleft } { #1 }
+ \semantex_data_tl_put_left:nnn { ##1 } { upper~left } { #1 }
}
- \semantex_data_bool_set_true:nn { ##1 } { nextupperleftwithsep }
- \semantex_data_int_incr:nn { ##1 } { numberofupperleftindices }
+ \semantex_data_bool_set_true:nn { ##1 } { next~upper~left~with~sep }
+ \semantex_data_int_incr:nn { ##1 } { number~of~upper~left~indices }
}
}
},
- {preupperleft}{
+ {pre~upper~left}{
execute={
\tl_if_blank:nF{#1}{
- \semantex_data_tl_put_right:nnn { ##1 } { preupperleft } { #1 }
+ \semantex_data_tl_put_right:nnn { ##1 } { pre~upper~left } { #1 }
}
},
},
- {postupperleft}{
+ {post~upper~left}{
execute={
\tl_if_blank:nF{#1}{
- \semantex_data_tl_put_left:nnn { ##1 } { postupperleft } { #1 }
+ \semantex_data_tl_put_left:nnn { ##1 } { post~upper~left } { #1 }
}
},
},
- {upperleftputright}{
+ {upper~left~put~right}{
execute={
\tl_if_blank:nF { #1 }
{
- \semantex_data_tl_put_right:nnn { ##1 } { upperleft } { #1 }
- \semantex_data_bool_set_true:nn { ##1 } { nextupperleftwithsep }
- \semantex_data_int_incr:nn { ##1 } { numberofupperleftindices }
+ \semantex_data_tl_put_right:nnn { ##1 } { upper~left } { #1 }
+ \semantex_data_bool_set_true:nn { ##1 } { next~upper~left~with~sep }
+ \semantex_data_int_incr:nn { ##1 } { number~of~upper~left~indices }
}
},
},
- {setupperleftslot}{
- execute={ \semantex_data_tl_set:nnn { ##1 } { upperleftslot } { #1 } },
+ {set~upper~left~slot}{
+ execute={ \semantex_data_tl_set:nnn { ##1 } { upper~left~slot } { #1 } },
},
- {upperleftslotwithothersep}{
+ {upper~left~slot~with~other~sep}{
execute={
- \semantex_valuekey:nnx { ##1 } { upperleftwithothersep }
+ \semantex_valuekey:nnx { ##1 } { upper~left~with~other~sep }
{
{ \exp_not:n { #1 } }
- { \semantex_data_tl_get_exp_not:nn { ##1 } { upperleftslot } }
+ { \semantex_data_tl_get_exp_not:nn { ##1 } { upper~left~slot } }
}
},
},
- {upperleft-withothersep}{
+ {upper~left~-~with~other~sep}{
execute={
- \semantex_valuekey:nnx { ##1 } { upperleftwithothersep }
+ \semantex_valuekey:nnx { ##1 } { upper~left~with~other~sep }
{
{ \exp_not:n { #1 } }
- { \semantex_data_tl_get_exp_not:nn { ##1 } { upperleftslot } }
+ { \semantex_data_tl_get_exp_not:nn { ##1 } { upper~left~slot } }
}
},
},
- {setupperleftdots}{
- execute={ \semantex_data_tl_set:nnn { ##1 } { upperleftdots } { #1 } },
+ {set~lower~left~dots}{
+ execute={ \semantex_data_tl_set:nnn { ##1 } { lower~left~dots } { #1 } },
},
- {upperleftdotswithothersep}{
+ {lower~left~dots~with~other~sep}{
execute={
- \semantex_valuekey:nnx { upperleftwithothersep }
+ \semantex_valuekey:nnx { upper~left~with~other~sep }
{
{ \exp_not:n { #1 } }
- { \semantex_data_tl_get_exp_not:nn { ##1 } { upperleftdots } }
+ { \semantex_data_tl_get_exp_not:nn { ##1 } { lower~left~dots } }
}
},
},
- {upperleft...withothersep}{
+ {upper~left~...~with~other~sep}{
execute={
- \semantex_valuekey:nnx { upperleftwithothersep }
+ \semantex_valuekey:nnx { upper~left~with~other~sep }
{
{ \exp_not:n { #1 } }
- { \semantex_data_tl_get_exp_not:nn { ##1 } { upperleftdots } }
+ { \semantex_data_tl_get_exp_not:nn { ##1 } { lower~left~dots } }
}
},
},
- {upperleft*withothersep}{upperleftwithothersep={#1}{\SemantexBullet}},
- {upperleft**withothersep}{upperleftwithothersep={#1}{\SemantexDoubleBullet}},
- {setupperleftsep}{
- execute={ \semantex_data_tl_set:nnn { ##1 } { upperleftsep } { #1 } },
+ {upper~left~*~with~other~sep}{upper~left~with~other~sep={#1}{\SemantexBullet}},
+ {upper~left~**~with~other~sep}{upper~left~with~other~sep={#1}{\SemantexDoubleBullet}},
+ {set~upper~left~sep}{
+ execute={ \semantex_data_tl_set:nnn { ##1 } { upper~left~sep } { #1 } },
},
- {nextupperleftwithsep}{
- strifeqTF={#1}{false}
+ {next~upper~left~with~sep}{
+ str~if~eq~TF={#1}{false}
{
- boolsetfalse={nextupperleftwithsep},
+ bool~set~false=next~upper~left~with~sep,
}
{
- strifeqTF={#1}{true}
+ str~if~eq~TF={#1}{true}
{
- boolsettrue={nextupperleftwithsep},
+ bool~set~true=next~upper~left~with~sep,
}
{
- ERRORkeyvaluenotfound={nextupperleftwithsep}{#1},
+ ERROR~key~value~not~found={next~upper~left~with~sep}{#1},
},
},
},
},
- definekeys[2]={
- {upperleftwithothersep}{
+ define~keys[2]={
+ {upper~left~with~other~sep}{
execute={
- \semantex_data_bool_get:nnTF { ##1 } { nextupperleftwithsep }
- { \semantex_data_tl_put_left:nnn { ##1 } { upperleft } { #2 #1 } }
- { \semantex_data_tl_put_left:nnn { ##1 } { upperleft } { #2 } }
- \semantex_data_bool_set_true:nn { ##1 } { nextupperleftwithsep }
- \semantex_data_int_incr:nn { ##1 } { numberofupperleftindices }
+ \semantex_data_bool_get:nnTF { ##1 } { next~upper~left~with~sep }
+ { \semantex_data_tl_put_left:nnn { ##1 } { upper~left } { #2 #1 } }
+ { \semantex_data_tl_put_left:nnn { ##1 } { upper~left } { #2 } }
+ \semantex_data_bool_set_true:nn { ##1 } { next~upper~left~with~sep }
+ \semantex_data_int_incr:nn { ##1 } { number~of~upper~left~indices }
},
},
},
- setupperleftsep={ , },
- setupperleftdots={ \dots },
- setupperleftslot={ {-} },
+ set~upper~left~sep={ , },
+ set~lower~left~dots={ \dots },
+ set~upper~left~slot={ {-} },
% Lower left indices:
- dataprovide=lowerleft,
- boolprovide=nextlowerleftwithsep,
- intprovide=numberoflowerleftindices,
- dataprovide=prelowerleft,
- dataprovide=postlowerleft,
- definekeys={
- {lowerleftslot}{ setkeysx={ lowerleft=\semantex_data_tl_get_exp_not:nn { ##1 } { lowerleftslot } } },
- {lowerleft-}{lowerleftslot},
- {seplowerleftslot}{ setkeysx={ seplowerleft=\semantex_data_tl_get_exp_not:nn { ##1 } { lowerleftslot } } },
- {seplowerleft-}{seplowerleftslot},
- {commalowerleftslot}{ setkeysx={ commalowerleft=\semantex_data_tl_get_exp_not:nn { ##1 } { lowerleftslot } } },
- {commalowerleft-}{commalowerleftslot},
- {lowerleftdots}{ setkeysx={ lowerleft=\semantex_data_tl_get_exp_not:nn { ##1 } { lowerleftdots } } },
- {lowerleft...}{lowerleftdots},
- {seplowerleftdots}{ setkeysx={ seplowerleft=\semantex_data_tl_get_exp_not:nn { ##1 } { lowerleftdots } } },
- {seplowerleft...}{seplowerleftdots},
- {commalowerleftdots}{ setkeysx={ commalowerleft=\semantex_data_tl_get_exp_not:nn { ##1 } { lowerleftdots } } },
- {commalowerleft...}{commalowerleftdots},
- {clearlowerleft}{
+ data~provide=lower~left,
+ bool~provide=next~lower~left~with~sep,
+ int~provide=number~of~lower~left~indices,
+ data~provide=pre~lower~left,
+ data~provide=post~lower~left,
+ define~keys={
+ {lower~left~slot}{ set~keys~x={ lower~left=\semantex_data_tl_get_exp_not:nn { ##1 } { lower~left~slot } } },
+ {lower~left~-}{lower~left~slot},
+ {sep~lower~left~slot}{ set~keys~x={ sep~lower~left=\semantex_data_tl_get_exp_not:nn { ##1 } { lower~left~slot } } },
+ {sep~lower~left~-}{sep~lower~left~slot},
+ {comma~lower~left~slot}{ set~keys~x={ comma~lower~left=\semantex_data_tl_get_exp_not:nn { ##1 } { lower~left~slot } } },
+ {comma~lower~left~-}{comma~lower~left~slot},
+ {lower~left~dots}{ set~keys~x={ lower~left=\semantex_data_tl_get_exp_not:nn { ##1 } { lower~left~dots } } },
+ {lower~left~...}{lower~left~dots},
+ {sep~lower~left~dots}{ set~keys~x={ sep~lower~left=\semantex_data_tl_get_exp_not:nn { ##1 } { lower~left~dots } } },
+ {sep~lower~left~...}{sep~lower~left~dots},
+ {comma~lower~left~dots}{ set~keys~x={ comma~lower~left=\semantex_data_tl_get_exp_not:nn { ##1 } { lower~left~dots } } },
+ {comma~lower~left~...}{comma~lower~left~dots},
+ {clear~lower~left}{
execute={
- \semantex_data_tl_clear:nn { ##1 } { lowerleft }
- \semantex_data_bool_set_false:nn { ##1 } { nextlowerleftwithsep }
- \semantex_data_int_clear:nn { ##1 } { numberoflowerleftindices }
+ \semantex_data_tl_clear:nn { ##1 } { lower~left }
+ \semantex_data_bool_set_false:nn { ##1 } { next~lower~left~with~sep }
+ \semantex_data_int_clear:nn { ##1 } { number~of~lower~left~indices }
},
},
- {clearprelowerleft}{
- execute={ \semantex_data_tl_clear:nn { ##1 } { prelowerleft } },
+ {clear~pre~lower~left}{
+ execute={ \semantex_data_tl_clear:nn { ##1 } { pre~lower~left } },
},
- {clearpostlowerleft}{
- execute={ \semantex_data_tl_clear:nn { ##1 } { postlowerleft } },
+ {clear~post~lower~left}{
+ execute={ \semantex_data_tl_clear:nn { ##1 } { post~lower~left } },
},
- {lowerleft*}{lowerleft=\SemantexBullet},
- {lowerleft**}{lowerleft=\SemantexDoubleBullet},
- {seplowerleft*}{seplowerleft=\SemantexBullet},
- {seplowerleft**}{seplowerleft=\SemantexDoubleBullet},
- {commalowerleft*}{commalowerleft=\SemantexBullet},
- {commalowerleft**}{commalowerleft=\SemantexDoubleBullet},
+ {lower~left~*}{lower~left=\SemantexBullet},
+ {lower~left~**}{lower~left=\SemantexDoubleBullet},
+ {sep~lower~left~*}{sep~lower~left=\SemantexBullet},
+ {sep~lower~left~**}{sep~lower~left=\SemantexDoubleBullet},
+ {comma~lower~left~*}{comma~lower~left=\SemantexBullet},
+ {comma~lower~left~**}{comma~lower~left=\SemantexDoubleBullet},
},
- definekeys[1]={
- {lowerleft}{
+ define~keys[1]={
+ {lower~left}{
execute={
\tl_if_blank:nF{#1}{
- \semantex_data_tl_put_left:nnn { ##1 } { lowerleft } { #1 }
- \semantex_data_bool_set_true:nn { ##1 } { nextlowerleftwithsep }
- \semantex_data_int_incr:nn { ##1 } { numberoflowerleftindices }
+ \semantex_data_tl_put_left:nnn { ##1 } { lower~left } { #1 }
+ \semantex_data_bool_set_true:nn { ##1 } { next~lower~left~with~sep }
+ \semantex_data_int_incr:nn { ##1 } { number~of~lower~left~indices }
}
},
},
- {seplowerleft}{
+ {sep~lower~left}{
execute={
\tl_if_blank:nF { #1 }
{
- \semantex_data_bool_get:nnTF { ##1 } { nextlowerleftwithsep }
+ \semantex_data_bool_get:nnTF { ##1 } { next~lower~left~with~sep }
{
- \semantex_data_tl_put_left:nnx { ##1 } { lowerleft }
- { \semantex_data_tl_get_exp_not:nn { ##1 } { lowerleftsep } }
- \semantex_data_tl_put_left:nnn { ##1 } { lowerleft } { #1 }
+ \semantex_data_tl_put_left:nnx { ##1 } { lower~left }
+ { \semantex_data_tl_get_exp_not:nn { ##1 } { lower~left~sep } }
+ \semantex_data_tl_put_left:nnn { ##1 } { lower~left } { #1 }
}
{
- \semantex_data_tl_put_left:nnn { ##1 } { lowerleft } { #1 }
+ \semantex_data_tl_put_left:nnn { ##1 } { lower~left } { #1 }
}
- \semantex_data_bool_set_true:nn { ##1 } { nextlowerleftwithsep }
- \semantex_data_int_incr:nn { ##1 } { numberoflowerleftindices }
+ \semantex_data_bool_set_true:nn { ##1 } { next~lower~left~with~sep }
+ \semantex_data_int_incr:nn { ##1 } { number~of~lower~left~indices }
}
},
},
- {commalowerleft}{
+ {comma~lower~left}{
execute={
\tl_if_blank:nF{#1}
{
- \semantex_data_bool_get:nnTF { ##1 } { nextlowerleftwithsep }
+ \semantex_data_bool_get:nnTF { ##1 } { next~lower~left~with~sep }
{
- \semantex_data_tl_put_left:nnn { ##1 } { lowerleft } { , #1 }
+ \semantex_data_tl_put_left:nnn { ##1 } { lower~left } { , #1 }
}
{
- \semantex_data_tl_put_left:nnn { ##1 } { lowerleft } { #1 }
+ \semantex_data_tl_put_left:nnn { ##1 } { lower~left } { #1 }
}
- \semantex_data_bool_set_true:nn { ##1 } { nextlowerleftwithsep }
- \semantex_data_int_incr:nn { ##1 } { numberoflowerleftindices }
+ \semantex_data_bool_set_true:nn { ##1 } { next~lower~left~with~sep }
+ \semantex_data_int_incr:nn { ##1 } { number~of~lower~left~indices }
}
}
},
- {prelowerleft}{
+ {pre~lower~left}{
execute={
\tl_if_blank:nF{#1}{
- \semantex_data_tl_put_right:nnn { ##1 } { prelowerleft } { #1 }
+ \semantex_data_tl_put_right:nnn { ##1 } { pre~lower~left } { #1 }
}
},
},
- {postlowerleft}{
+ {post~lower~left}{
execute={
\tl_if_blank:nF{#1}{
- \semantex_data_tl_put_left:nnn { ##1 } { postlowerleft } { #1 }
+ \semantex_data_tl_put_left:nnn { ##1 } { post~lower~left } { #1 }
}
},
},
- {lowerleftputright}{
+ {lower~left~put~right}{
execute={
\tl_if_blank:nF { #1 }
{
- \semantex_data_tl_put_right:nnn { ##1 } { lowerleft } { #1 }
- \semantex_data_bool_set_true:nn { ##1 } { nextlowerleftwithsep }
- \semantex_data_int_incr:nn { ##1 } { numberoflowerleftindices }
+ \semantex_data_tl_put_right:nnn { ##1 } { lower~left } { #1 }
+ \semantex_data_bool_set_true:nn { ##1 } { next~lower~left~with~sep }
+ \semantex_data_int_incr:nn { ##1 } { number~of~lower~left~indices }
}
},
},
- {setlowerleftslot}{
- execute={ \semantex_data_tl_set:nnn { ##1 } { lowerleftslot } { #1 } },
+ {set~lower~left~slot}{
+ execute={ \semantex_data_tl_set:nnn { ##1 } { lower~left~slot } { #1 } },
},
- {lowerleftslotwithothersep}{
+ {lower~left~slot~with~other~sep}{
execute={
- \semantex_valuekey:nnx { ##1 } { lowerleftwithothersep }
+ \semantex_valuekey:nnx { ##1 } { lower~left~with~other~sep }
{
{ \exp_not:n { #1 } }
- { \semantex_data_tl_get_exp_not:nn { ##1 } { lowerleftslot } },
+ { \semantex_data_tl_get_exp_not:nn { ##1 } { lower~left~slot } },
}
},
},
- {lowerleft-withothersep}{
+ {lower~left~-~with~other~sep}{
execute={
- \semantex_valuekey:nnx { ##1 } { lowerleftwithothersep }
+ \semantex_valuekey:nnx { ##1 } { lower~left~with~other~sep }
{
{ \exp_not:n { #1 } }
- { \semantex_data_tl_get_exp_not:nn { ##1 } { lowerleftslot } },
+ { \semantex_data_tl_get_exp_not:nn { ##1 } { lower~left~slot } },
}
},
},
- {setlowerleftdots}{
- execute={ \semantex_data_tl_set:nnn { ##1 } { lowerleftdots } { #1 } },
+ {set~lower~left~dots}{
+ execute={ \semantex_data_tl_set:nnn { ##1 } { lower~left~dots } { #1 } },
},
- {lowerleftdotswithothersep}{
+ {lower~left~dots~with~other~sep}{
execute={
- \semantex_valuekey:nnx { ##1 } { lowerleftwithothersep }
+ \semantex_valuekey:nnx { ##1 } { lower~left~with~other~sep }
{
{ \exp_not:n { #1 } }
- { \semantex_data_tl_get_exp_not:nn { ##1 } { lowerleftdots } }
+ { \semantex_data_tl_get_exp_not:nn { ##1 } { lower~left~dots } }
}
},
},
- {lowerleft...withothersep}{
+ {lower~left~...~with~other~sep}{
execute={
- \semantex_valuekey:nnx { ##1 } { lowerleftwithothersep }
+ \semantex_valuekey:nnx { ##1 } { lower~left~with~other~sep }
{
{ \exp_not:n { #1 } }
- { \semantex_data_tl_get_exp_not:nn { ##1 } { lowerleftdots } }
+ { \semantex_data_tl_get_exp_not:nn { ##1 } { lower~left~dots } }
}
},
},
- {lowerleft*withothersep}{lowerleftwithothersep={#1}{\SemantexBullet}},
- {lowerleft**withothersep}{lowerleftwithothersep={#1}{\SemantexDoubleBullet}},
- {setlowerleftsep}{
- execute={ \semantex_data_tl_set:nnn { ##1 } { lowerleftsep } { #1 } },
+ {lower~left~*~with~other~sep}{lower~left~with~other~sep={#1}{\SemantexBullet}},
+ {lower~left~**~with~other~sep}{lower~left~with~other~sep={#1}{\SemantexDoubleBullet}},
+ {set~lower~left~sep}{
+ execute={ \semantex_data_tl_set:nnn { ##1 } { lower~left~sep } { #1 } },
},
- {nextlowerleftwithsep}{
- strifeqTF={#1}{false}
+ {next~lower~left~with~sep}{
+ str~if~eq~TF={#1}{false}
{
- boolsetfalse={nextlowerleftwithsep},
+ bool~set~false=next~lower~left~with~sep,
}
{
- strifeqTF={#1}{true}
+ str~if~eq~TF={#1}{true}
{
- boolsettrue={nextlowerleftwithsep},
+ bool~set~true=next~lower~left~with~sep,
}
{
- ERRORkeyvaluenotfound={nextlowerleftwithsep}{#1},
+ ERROR~key~value~not~found={next~lower~left~with~sep}{#1},
},
},
},
},
- definekeys[2]={
- {lowerleftwithothersep}{
+ define~keys[2]={
+ {lower~left~with~other~sep}{
execute={
- \semantex_data_bool_get:nnTF { ##1 } { nextlowerleftwithsep }
- { \semantex_data_tl_put_left:nnn { ##1 } { lowerleft } { #2 #1 } }
- { \semantex_data_tl_put_left:nnn { ##1 } { lowerleft } { #2 } }
- \semantex_data_bool_set_true:nn { ##1 } { nextlowerleftwithsep }
- \semantex_data_int_incr:nn { ##1 } { numberoflowerleftindices }
+ \semantex_data_bool_get:nnTF { ##1 } { next~lower~left~with~sep }
+ { \semantex_data_tl_put_left:nnn { ##1 } { lower~left } { #2 #1 } }
+ { \semantex_data_tl_put_left:nnn { ##1 } { lower~left } { #2 } }
+ \semantex_data_bool_set_true:nn { ##1 } { next~lower~left~with~sep }
+ \semantex_data_int_incr:nn { ##1 } { number~of~lower~left~indices }
},
},
},
- setlowerleftsep={ , },
- setlowerleftdots={ \dots },
- setlowerleftslot={ {-} },
+ set~lower~left~sep={ , },
+ set~lower~left~dots={ \dots },
+ set~lower~left~slot={ {-} },
% The "d" index:
- definekeys={
- {dslot}{
- boolifTF={uppergrading}
- { upperslot }
- { lowerslot },
- },
- {d-}{dslot},
- {sepdslot}{
- boolifTF={uppergrading}
- { sepupperslot }
- { seplowerslot },
- },
- {sepd-}{sepdslot},
- {commadslot}{
- boolifTF={uppergrading}
- { commaupperslot }
- { commalowerslot },
- },
- {commad-}{commadslot},
- {ddots}{
- boolifTF={uppergrading}
- { upperdots }
- { lowerdots },
- },
- {d...}{ddots},
- {sepddots}{
- boolifTF={uppergrading}
- { sepupperdots }
- { seplowerdots },
- },
- {sepd...}{sepddots},
- {commaddots}{
- boolifTF={uppergrading}
- { commaupperdots }
- { commalowerdots },
- },
- {commad...}{commaddots},
- {cleard}{
- boolifTF={uppergrading}
- { clearupper }
- { clearlower },
- },
- {clearpred}{
- boolifTF={uppergrading}
- { clearpreupper }
- { clearprelower },
- },
- {clearpostd}{
- boolifTF={uppergrading}
- { clearpostupper }
- { clearpostlower },
- },
- {d*}{
- boolifTF={uppergrading}
- { upper* }
- { lower* },
- },
- {d**}{
- boolifTF={uppergrading}
- { upper** }
- { lower** },
- },
- {sepd*}{
- boolifTF={uppergrading}
- { sepupper* }
- { seplower* },
- },
- {sepd**}{
- boolifTF={uppergrading}
- { sepupper** }
- { seplower** },
- },
- {commad*}{
- boolifTF={uppergrading}
- { commaupper* }
- { commalower* },
- },
- {commad**}{
- boolifTF={uppergrading}
- { commaupper** }
- { commalower** },
+ define~keys={
+ {d~slot}{
+ bool~if~TF={upper~grading}
+ { upper~slot }
+ { lower~slot },
+ },
+ {d~-}{d~slot},
+ {sep~d~slot}{
+ bool~if~TF={upper~grading}
+ { sep~upper~slot }
+ { sep~lower~slot },
+ },
+ {sep~d~-}{sep~d~slot},
+ {comma~d~slot}{
+ bool~if~TF={upper~grading}
+ { comma~upper~slot }
+ { comma~lower~slot },
+ },
+ {comma~d~-}{comma~d~slot},
+ {d~dots}{
+ bool~if~TF={upper~grading}
+ { upper~dots }
+ { lower~dots },
+ },
+ {d~...}{d~dots},
+ {sep~d~dots}{
+ bool~if~TF={upper~grading}
+ { sep~upper~dots }
+ { sep~lower~dots },
+ },
+ {sep~d~...}{sep~d~dots},
+ {comma~d~dots}{
+ bool~if~TF={upper~grading}
+ { comma~upper~dots }
+ { comma~lower~dots },
+ },
+ {comma~d~...}{comma~d~dots},
+ {clear~d}{
+ bool~if~TF={upper~grading}
+ { clear~upper }
+ { clear~lower },
+ },
+ {clear~pre~d}{
+ bool~if~TF={upper~grading}
+ { clear~pre~upper }
+ { clear~pre~lower },
+ },
+ {clear~post~d}{
+ bool~if~TF={upper~grading}
+ { clear~post~upper }
+ { clear~post~lower },
+ },
+ {d~*}{
+ bool~if~TF={upper~grading}
+ { upper~* }
+ { lower~** },
+ },
+ {d~**}{
+ bool~if~TF={upper~grading}
+ { upper~** }
+ { lower~*** },
+ },
+ {sep~d~*}{
+ bool~if~TF={upper~grading}
+ { sep~upper~* }
+ { sep~lower~** },
+ },
+ {sep~d~**}{
+ bool~if~TF={upper~grading}
+ { sep~upper~** }
+ { sep~lower~*** },
+ },
+ {comma~d~*}{
+ bool~if~TF={upper~grading}
+ { comma~upper~* }
+ { comma~lower~** },
+ },
+ {comma~d~**}{
+ bool~if~TF={upper~grading}
+ { comma~upper~** }
+ { comma~lower~*** },
},
},
- definekeys[1]={
+ define~keys[1]={
{d}{
execute={
- \semantex_data_bool_get:nnTF { ##1 } { uppergrading }
+ \semantex_data_bool_get:nnTF { ##1 } { upper~grading }
{ \semantex_valuekey:nnn { ##1 } { upper } { #1 } }
{ \semantex_valuekey:nnn { ##1 } { lower } { #1 } }
},
},
- {sepd}{
+ {sep~d}{
execute={
- \semantex_data_bool_get:nnTF { ##1 } { uppergrading }
- { \semantex_valuekey:nnn { ##1 } { sepupper } { #1 } }
- { \semantex_valuekey:nnn { ##1 } { seplower } { #1 } }
+ \semantex_data_bool_get:nnTF { ##1 } { upper~grading }
+ { \semantex_valuekey:nnn { ##1 } { sep~upper } { #1 } }
+ { \semantex_valuekey:nnn { ##1 } { sep~lower } { #1 } }
},
},
- {commad}{
+ {comma~d}{
execute={
- \semantex_data_bool_get:nnTF { ##1 } { uppergrading }
- { \semantex_valuekey:nnn { ##1 } { commaupper } { #1 } }
- { \semantex_valuekey:nnn { ##1 } { commalower } { #1 } }
+ \semantex_data_bool_get:nnTF { ##1 } { upper~grading }
+ { \semantex_valuekey:nnn { ##1 } { comma~upper } { #1 } }
+ { \semantex_valuekey:nnn { ##1 } { comma~lower } { #1 } }
},
},
- {pred}{
- boolifTF={uppergrading}
+ {pre~d}{
+ bool~if~TF={upper~grading}
{
- preupper={#1},
+ pre~upper={#1},
}
{
- prelower={#1},
+ pre~lower={#1},
},
},
- {postd}{
- boolifTF={uppergrading}
+ {post~d}{
+ bool~if~TF={upper~grading}
{
- postupper={#1},
+ post~upper={#1},
}
{
- postlower={#1},
+ post~lower={#1},
},
},
- {dputleft}{
- boolifTF={uppergrading}
+ {d~put~left}{
+ bool~if~TF={upper~grading}
{
- upperputleft={#1},
+ upper~put~left={#1},
}
{
- lowerputleft={#1},
+ lower~put~left={#1},
},
},
- {setdslot}{
- boolifTF={uppergrading}
+ {set~d~slot}{
+ bool~if~TF={upper~grading}
{
- setupperslot={#1},
+ set~upper~slot={#1},
}
{
- setlowerslot={#1},
+ set~lower~slot={#1},
}
},
- {dslotwithothersep}{
- boolifTF={uppergrading}
+ {d~slot~with~other~sep}{
+ bool~if~TF={upper~grading}
{
- upperslotwithothersep={#1},
+ upper~slot~with~other~sep={#1},
}
{
- lowerslotwithothersep={#1},
+ lower~slot~with~other~sep={#1},
},
},
- {d-withothersep}{
- dslotwithothersep={#1},
+ {d~-~with~other~sep}{
+ d~slot~with~other~sep={#1},
},
- {setddots}{
- boolifTF={uppergrading}
+ {set~d~dots}{
+ bool~if~TF={upper~grading}
{
- setupperdots={#1},
+ set~upper~dots={#1},
}
{
- setlowerdots={#1},
+ set~lower~dots={#1},
}
},
- {ddotswithothersep}{
- boolifTF={uppergrading}
+ {d~dots~with~other~sep}{
+ bool~if~TF={upper~grading}
{
- upperdotswithothersep={#1},
+ upper~dots~with~other~sep={#1},
}
{
- lowerdotswithothersep={#1},
+ lower~dots~with~other~sep={#1},
},
},
- {d...withothersep}{
- ddotswithothersep={#1},
+ {d~...~with~other~sep}{
+ d~dots~with~other~sep={#1},
},
- {d*withothersep}{
- boolifTF={uppergrading}
- { upper*withothersep={#1} }
- { lower*withothersep={#1} },
+ {d~*~with~other~sep}{
+ bool~if~TF={upper~grading}
+ { upper~*~with~other~sep={#1} }
+ { lower~**~with~other~sep={#1} },
},
- {d**withothersep}{
- boolifTF={uppergrading}
- { upper**withothersep={#1} }
- { lower**withothersep={#1} },
+ {d~**~with~other~sep}{
+ bool~if~TF={upper~grading}
+ { upper~**~with~other~sep={#1} }
+ { lower~***~with~other~sep={#1} },
},
- {setdsep}{
- boolifTF={uppergrading}
+ {set~d~sep}{
+ bool~if~TF={upper~grading}
{
- setuppersep={#1},
+ set~upper~sep={#1},
}
{
- setlowersep={#1},
+ set~lower~sep={#1},
},
},
- {nextdwithsep}{
- strifeqTF={#1}{true}
+ {next~d~with~sep}{
+ str~if~eq~TF={#1}{true}
{
- boolifTF={uppergrading}
+ bool~if~TF={upper~grading}
{
- nextupperwithsep=true,
+ next~upper~with~sep=true,
}
{
- nextlowerwithsep=true,
+ next~lower~with~sep=true,
},
}
{
- strifeqTF={#1}{false}
+ str~if~eq~TF={#1}{false}
{
- boolifTF={uppergrading}
+ bool~if~TF={upper~grading}
{
- nextupperwithsep=false,
+ next~upper~with~sep=false,
}
{
- nextlowerwithsep=false,
+ next~lower~with~sep=false,
},
}
{
- ERRORkeyvaluenotfound={nextdwithothersep}{#1},
+ ERROR~key~value~not~found={next~d~with~other~sep}{#1},
},
},
},
},
- definekeys[2]={
- {dwithothersep}{
- boolifTF={uppergrading}
+ define~keys[2]={
+ {d~with~other~sep}{
+ bool~if~TF={upper~grading}
{
- upperwithothersep={#1}{#2},
+ upper~with~other~sep={#1}{#2},
}
{
- lowerwithothersep={#1}{#2},
+ lower~with~other~sep={#1}{#2},
},
},
},
% The "i" index:
- definekeys={
- {islot}{
- boolifTF={uppergrading}
- { lowerslot }
- { upperslot },
- },
- {i-}{islot},
- {sepislot}{
- boolifTF={uppergrading}
- { seplowerslot }
- { sepupperslot },
- },
- {sepi-}{sepislot},
- {commaislot}{
- boolifTF={uppergrading}
- { commalowerslot }
- { commaupperslot },
- },
- {commai-}{commaislot},
- {idots}{
- boolifTF={uppergrading}
- { lowerdots }
- { upperdots },
- },
- {i...}{idots},
- {sepidots}{
- boolifTF={uppergrading}
- { seplowerdots }
- { sepupperdots },
- },
- {sepi...}{sepidots},
- {commaidots}{
- boolifTF={uppergrading}
- { commalowerdots }
- { commaupperdots },
- },
- {commai...}{commaidots},
- {cleari}{
- boolifTF={uppergrading}
- { clearlower }
- { clearupper },
- },
- {clearprei}{
- boolifTF={uppergrading}
- { clearprelower }
- { clearpreupper },
- },
- {clearposti}{
- boolifTF={uppergrading}
- { clearpostlower }
- { clearpostupper },
- },
- {i*}{
- boolifTF={uppergrading}
- { lower* }
- { upper* },
- },
- {i**}{
- boolifTF={uppergrading}
- { lower** }
- { upper** },
- },
- {sepi*}{
- boolifTF={uppergrading}
- { seplower* }
- { sepupper* },
- },
- {sepi**}{
- boolifTF={uppergrading}
- { seplower** }
- { sepupper** },
- },
- {commai*}{
- boolifTF={uppergrading}
- { commalower* }
- { commaupper* },
- },
- {commai**}{
- boolifTF={uppergrading}
- { commalower** }
- { commaupper** },
+ define~keys={
+ {i~slot}{
+ bool~if~TF={upper~grading}
+ { lower~slot }
+ { upper~slot },
+ },
+ {i~-}{i~slot},
+ {sep~i~slot}{
+ bool~if~TF={upper~grading}
+ { sep~lower~slot }
+ { sep~upper~slot },
+ },
+ {sep~i~-}{sep~i~slot},
+ {comma~i~slot}{
+ bool~if~TF={upper~grading}
+ { comma~lower~slot }
+ { comma~upper~slot },
+ },
+ {comma~i~-}{comma~i~slot},
+ {i~dots}{
+ bool~if~TF={upper~grading}
+ { lower~dots }
+ { upper~dots },
+ },
+ {i~...}{i~dots},
+ {sep~i~dots}{
+ bool~if~TF={upper~grading}
+ { sep~lower~dots }
+ { sep~upper~dots },
+ },
+ {sep~i~...}{sep~i~dots},
+ {comma~i~dots}{
+ bool~if~TF={upper~grading}
+ { comma~lower~dots }
+ { comma~upper~dots },
+ },
+ {comma~i~...}{comma~i~dots},
+ {clear~i}{
+ bool~if~TF={upper~grading}
+ { clear~lower }
+ { clear~upper },
+ },
+ {clear~pre~i}{
+ bool~if~TF={upper~grading}
+ { clear~pre~lower }
+ { clear~pre~upper },
+ },
+ {clear~post~i}{
+ bool~if~TF={upper~grading}
+ { clear~post~lower }
+ { clear~post~upper },
+ },
+ {i~*}{
+ bool~if~TF={upper~grading}
+ { lower~** }
+ { upper~* },
+ },
+ {i~**}{
+ bool~if~TF={upper~grading}
+ { lower~*** }
+ { upper~** },
+ },
+ {sep~i~*}{
+ bool~if~TF={upper~grading}
+ { sep~lower~** }
+ { sep~upper~* },
+ },
+ {sep~i~**}{
+ bool~if~TF={upper~grading}
+ { sep~lower~*** }
+ { sep~upper~** },
+ },
+ {comma~i~*}{
+ bool~if~TF={upper~grading}
+ { comma~lower~** }
+ { comma~upper~* },
+ },
+ {comma~i~**}{
+ bool~if~TF={upper~grading}
+ { comma~lower~*** }
+ { comma~upper~** },
},
},
- definekeys[1]={
+ define~keys[1]={
{i}{
execute={
- \semantex_data_bool_get:nnTF { ##1 } { uppergrading }
+ \semantex_data_bool_get:nnTF { ##1 } { upper~grading }
{ \semantex_valuekey:nnn { ##1 } { lower } { #1 } }
{ \semantex_valuekey:nnn { ##1 } { upper } { #1 } }
},
},
- {sepi}{
+ {sep~i}{
execute={
- \semantex_data_bool_get:nnTF { ##1 } { uppergrading }
- { \semantex_valuekey:nnn { ##1 } { seplower } { #1 } }
- { \semantex_valuekey:nnn { ##1 } { sepupper } { #1 } }
+ \semantex_data_bool_get:nnTF { ##1 } { upper~grading }
+ { \semantex_valuekey:nnn { ##1 } { sep~lower } { #1 } }
+ { \semantex_valuekey:nnn { ##1 } { sep~upper } { #1 } }
},
},
- {commai}{
+ {comma~i}{
execute={
- \semantex_data_bool_get:nnTF { ##1 } { uppergrading }
- { \semantex_valuekey:nnn { ##1 } { commalower } { #1 } }
- { \semantex_valuekey:nnn { ##1 } { commaupper } { #1 } }
+ \semantex_data_bool_get:nnTF { ##1 } { upper~grading }
+ { \semantex_valuekey:nnn { ##1 } { comma~lower } { #1 } }
+ { \semantex_valuekey:nnn { ##1 } { comma~upper } { #1 } }
},
},
- {prei}{
- boolifTF={uppergrading}
+ {pre~i}{
+ bool~if~TF={upper~grading}
{
- prelower={#1},
+ pre~lower={#1},
}
{
- preupper={#1},
+ pre~upper={#1},
},
},
- {posti}{
- boolifTF={uppergrading}
+ {post~i}{
+ bool~if~TF={upper~grading}
{
- postlower={#1},
+ post~lower={#1},
}
{
- postupper={#1},
+ post~upper={#1},
},
},
- {iputleft}{
- boolifTF={uppergrading}
+ {i~put~left}{
+ bool~if~TF={upper~grading}
{
- lowerputleft={#1},
+ lower~put~left={#1},
}{
- upperputleft={#1},
+ upper~put~left={#1},
},
},
- {setislot}{
- boolifTF={uppergrading}
+ {set~i~slot}{
+ bool~if~TF={upper~grading}
{
- setlowerslot={#1},
+ set~lower~slot={#1},
}
{
- setupperslot={#1},
+ set~upper~slot={#1},
}
},
- {islotwithothersep}{
- boolifTF={uppergrading}
+ {i~slot~with~other~sep}{
+ bool~if~TF={upper~grading}
{
- lowerslotwithothersep={#1},
+ lower~slot~with~other~sep={#1},
}
{
- upperslotwithothersep={#1},
+ upper~slot~with~other~sep={#1},
},
},
- {i-withothersep}{
- islotwithothersep={#1},
+ {i~-~with~other~sep}{
+ i~slot~with~other~sep={#1},
},
- {setidots}{
- boolifTF={uppergrading}
+ {set~i~dots}{
+ bool~if~TF={upper~grading}
{
- setlowerdots={#1},
+ set~lower~dots={#1},
}
{
- setupperdots={#1},
+ set~upper~dots={#1},
}
},
- {idotswithothersep}{
- boolifTF={uppergrading}
+ {i~dots~with~other~sep}{
+ bool~if~TF={upper~grading}
{
- lowerdotswithothersep={#1},
+ lower~dots~with~other~sep={#1},
}
{
- upperdotswithothersep={#1},
+ upper~dots~with~other~sep={#1},
},
},
- {i...withothersep}{
- idotswithothersep={#1},
+ {i~...~with~other~sep}{
+ i~dots~with~other~sep={#1},
},
- {i*withothersep}{
- boolifTF={uppergrading}
- { lower*withothersep={#1} }
- { upper*withothersep={#1} },
+ {i~*~with~other~sep}{
+ bool~if~TF={upper~grading}
+ { lower~**~with~other~sep={#1} }
+ { upper~*~with~other~sep={#1} },
},
- {i**withothersep}{
- boolifTF={uppergrading}
- { lower**withothersep={#1} }
- { upper**withothersep={#1} },
+ {i~**~with~other~sep}{
+ bool~if~TF={upper~grading}
+ { lower~***~with~other~sep={#1} }
+ { upper~**~with~other~sep={#1} },
},
- {setisep}{
- boolifTF={uppergrading}
+ {set~i~sep}{
+ bool~if~TF={upper~grading}
{
- setlowersep={#1},
+ set~lower~sep={#1},
}
{
- setuppersep={#1},
+ set~upper~sep={#1},
},
},
- {nextiwithsep}{
- strifeqTF={#1}{true}
+ {next~i~with~sep}{
+ str~if~eq~TF={#1}{true}
{
- boolifTF={uppergrading}
+ bool~if~TF={upper~grading}
{
- nextlowerwithsep={#1},
+ next~lower~with~sep={#1},
}
{
- nextupperwithsep={#1},
+ next~upper~with~sep={#1},
},
}
{
- strifeqTF={#1}{false}
+ str~if~eq~TF={#1}{false}
{
- boolifTF={uppergrading}
+ bool~if~TF={upper~grading}
{
- nextupperwithsep={#1},
+ next~upper~with~sep={#1},
}
{
- nextlowerwithsep={#1},
+ next~lower~with~sep={#1},
},
}
{
- ERRORkeyvaluenotfound={nextiwithothersep}{#1},
+ ERROR~key~value~not~found={next~i~with~other~sep}{#1},
},
},
},
},
- definekeys[2]={
- {iwithothersep}{
+ define~keys[2]={
+ {i~with~other~sep}{
execute={
- \semantex_data_bool_get:nnTF { ##1 } { uppergrading }
- { \semantex_valuekey:nnn { ##1 } { lowerwithothersep } { { #1 } { #2 } } }
- { \semantex_valuekey:nnn { ##1 } { upperwithothersep } { { #1 } { #2 } } }
+ \semantex_data_bool_get:nnTF { ##1 } { upper~grading }
+ { \semantex_valuekey:nnn { ##1 } { lower~with~other~sep } { { #1 } { #2 } } }
+ { \semantex_valuekey:nnn { ##1 } { upper~with~other~sep } { { #1 } { #2 } } }
},
},
},
% Argument keyval interface
- defineargkeys[1]={
+ define~arg~keys[1]={
{execute}{execute={#1}},
- {setkeys}{ execute={ \semantex_keys_set:nn { ##1 } { #1 } } },
- {keysset}{ execute={ \semantex_keys_set:nn { ##1 } { #1 } } },
- {setkeysx}{ execute={ \semantex_keys_set_x:nn { ##1 } { #1 } } },
- {keyssetx}{ execute={ \semantex_keys_set_x:nn { ##1 } { #1 } } },
- {setargkeys}{ execute={ \semantex_arg_keys_set:nn { ##1 } { #1 } } },
- {argkeysset}{ execute={ \semantex_arg_keys_set:nn { ##1 } { #1 } } },
- {setargkeysx}{ execute={ \semantex_arg_keys_set_x:nn { ##1 } { #1 } } },
- {argkeyssetx}{ execute={ \semantex_arg_keys_set_x:nn { ##1 } { #1 } } },
- {setargsinglekeys}{ execute={ \semantex_arg_singlekeys_set:nn { ##1 } { #1 } } },
- {argsinglekeysset}{ execute={ \semantex_arg_singlekeys_set:nn { ##1 } { #1 } } },
- {setargsinglekeysx}{ execute={ \semantex_arg_singlekeys_set_x:nn { ##1 } { #1 } } },
- {argsinglekeyssetx}{ execute={ \semantex_arg_singlekeys_set_x:nn { ##1 } { #1 } } },
- {setoneargsinglekey}{ execute={ \semantex_arg_singlekey:nn { ##1 } { #1 } } },
- {oneargsinglekeyset}{ execute={ \semantex_arg_singlekey:nn { ##1 } { #1 } } },
- {setoneargsinglekeyx}{ execute={ \semantex_arg_singlekey_x:nn { ##1 } { #1 } } },
- {oneargsinglekeysetx}{ execute={ \semantex_arg_singlekey_x:nn { ##1 } { #1 } } },
- {setargwithoutkeyval}{ execute={ \semantex_arg_without_keyval:nn { ##1 } { #1 } } },
- {argwithoutkeyvalset}{ execute={ \semantex_arg_without_keyval:nn { ##1 } { #1 } } },
- {setargwithoutkeyvalx}{ execute={ \semantex_arg_without_keyval:nx { ##1 } { #1 } } },
- {argwithoutkeyvalsetx}{ execute={ \semantex_arg_without_keyval:nx { ##1 } { #1 } } },
+ {set~keys}{ execute={ \semantex_keys_set:nn { ##1 } { #1 } } },
+ {keys~set}{ execute={ \semantex_keys_set:nn { ##1 } { #1 } } },
+ {set~keys~x}{ execute={ \semantex_keys_set_x:nn { ##1 } { #1 } } },
+ {keys~set~x}{ execute={ \semantex_keys_set_x:nn { ##1 } { #1 } } },
+ {set~arg~keys}{ execute={ \semantex_arg_keys_set:nn { ##1 } { #1 } } },
+ {arg~keys~set}{ execute={ \semantex_arg_keys_set:nn { ##1 } { #1 } } },
+ {set~arg~keys~x}{ execute={ \semantex_arg_keys_set_x:nn { ##1 } { #1 } } },
+ {arg~keys~set~x}{ execute={ \semantex_arg_keys_set_x:nn { ##1 } { #1 } } },
+ {set~arg~single~keys}{ execute={ \semantex_arg_singlekeys_set:nn { ##1 } { #1 } } },
+ {arg~single~keys~set}{ execute={ \semantex_arg_singlekeys_set:nn { ##1 } { #1 } } },
+ {set~arg~single~keys~x}{ execute={ \semantex_arg_singlekeys_set_x:nn { ##1 } { #1 } } },
+ {arg~single~keys~set~x}{ execute={ \semantex_arg_singlekeys_set_x:nn { ##1 } { #1 } } },
+ {set~one~arg~single~key}{ execute={ \semantex_arg_singlekey:nn { ##1 } { #1 } } },
+ {one~arg~single~key~set}{ execute={ \semantex_arg_singlekey:nn { ##1 } { #1 } } },
+ {set~one~arg~single~key~x}{ execute={ \semantex_arg_singlekey_x:nn { ##1 } { #1 } } },
+ {one~arg~single~key~set~x}{ execute={ \semantex_arg_singlekey_x:nn { ##1 } { #1 } } },
+ {set~arg~without~keyval}{ execute={ \semantex_arg_without_keyval:nn { ##1 } { #1 } } },
+ {arg~without~keyval~set}{ execute={ \semantex_arg_without_keyval:nn { ##1 } { #1 } } },
+ {set~arg~without~keyval~x}{ execute={ \semantex_arg_without_keyval:nx { ##1 } { #1 } } },
+ {arg~without~keyval~set~x}{ execute={ \semantex_arg_without_keyval:nx { ##1 } { #1 } } },
{default}{sep={#1}},
- {-withothersep}{slotwithothersep={#1}},
- {...withothersep}{dotswithothersep={#1}},
+ {-~with~other~sep}{slot~with~other~sep={#1}},
+ {...~with~other~sep}{dots~with~other~sep={#1}},
{sep}{
execute={
- \semantex_data_bool_get:nnTF { ##1 } { nextargwithsep }
+ \semantex_data_bool_get:nnTF { ##1 } { next~arg~with~sep }
{
\semantex_data_tl_put_right:nnx { ##1 } { arg }
{
- \semantex_data_tl_get_exp_not:nn { ##1 } { argsep }
+ \semantex_data_tl_get_exp_not:nn { ##1 } { arg~sep }
}
}
{
% do nothing
}
\semantex_data_tl_put_right:nnn { ##1 } { arg } { #1 }
- \semantex_data_int_incr:nn { ##1 } { numberofarguments }
- \semantex_data_bool_set_true:nn { ##1 } { nextargwithsep }
+ \semantex_data_int_incr:nn { ##1 } { number~of~arguments }
+ \semantex_data_bool_set_true:nn { ##1 } { next~arg~with~sep }
}
},
{comma}{
execute={
- \semantex_data_bool_get:nnTF { ##1 } { nextargwithsep }
+ \semantex_data_bool_get:nnTF { ##1 } { next~arg~with~sep }
{
\semantex_data_tl_put_right:nnn { ##1 } { arg } { , #1 }
}
{
\semantex_data_tl_put_right:nnn { ##1 } { arg } { #1 }
}
- \semantex_data_int_incr:nn { ##1 } { numberofarguments }
- \semantex_data_bool_set_true:nn { ##1 } { nextargwithsep }
+ \semantex_data_int_incr:nn { ##1 } { number~of~arguments }
+ \semantex_data_bool_set_true:nn { ##1 } { next~arg~with~sep }
}
},
- {dotswithothersep}{
+ {dots~with~other~sep}{
execute={
- \semantex_arg_valuekey:nnx { ##1 } { othersep }
+ \semantex_arg_valuekey:nnx { ##1 } { other~sep }
{
{ \exp_not:n { #1 } }
- { \semantex_data_tl_get_exp_not:nn { ##1 } { argdots } }
+ { \semantex_data_tl_get_exp_not:nn { ##1 } { arg~dots } }
}
},
},
- {slotwithothersep}{
+ {slot~with~other~sep}{
execute={
- \semantex_arg_valuekey:nnx { ##1 } { othersep }
+ \semantex_arg_valuekey:nnx { ##1 } { other~sep }
{
{ \exp_not:n { #1 } }
- { \semantex_data_tl_get_exp_not:nn { ##1 } { argslot } }
+ { \semantex_data_tl_get_exp_not:nn { ##1 } { arg~slot } }
}
},
},
},
- defineargkeys={
+ define~arg~keys={
{dots}{
execute={
\semantex_arg_valuekey:nnx { ##1 } { sep }
{
- \semantex_data_tl_get_exp_not:nn { ##1 } { argdots }
+ \semantex_data_tl_get_exp_not:nn { ##1 } { arg~dots }
}
},
},
{...}{dots},
- {commadots}{
+ {comma~dots}{
execute={
\semantex_arg_valuekey:nnx { ##1 } { comma }
{
- \semantex_data_tl_get_exp_not:nn { ##1 } { argdots }
+ \semantex_data_tl_get_exp_not:nn { ##1 } { arg~dots }
}
},
},
- {comma...}{commadots},
+ {comma~...}{comma~dots},
{slot}{
execute={
\semantex_arg_valuekey:nnx { ##1 } { sep }
{
- \semantex_data_tl_get_exp_not:nn { ##1 } { argslot }
+ \semantex_data_tl_get_exp_not:nn { ##1 } { arg~slot }
}
},
},
{-}{slot},
- {commaslot}{
+ {comma~slot}{
execute={
\semantex_arg_valuekey:nnx { ##1 } { comma }
{
- \semantex_data_tl_get_exp_not:nn { ##1 } { argslot }
+ \semantex_data_tl_get_exp_not:nn { ##1 } { arg~slot }
}
},
},
- {comma-}{commaslot},
+ {comma~-}{comma~slot},
},
- defineargkeys[2]={
- {othersep}{
+ define~arg~keys[2]={
+ {other~sep}{
execute={
- \semantex_data_bool_get:nnTF { ##1 } { nextargwithsep }
+ \semantex_data_bool_get:nnTF { ##1 } { next~arg~with~sep }
{
\semantex_data_tl_put_right:nnn { ##1 } { arg } { #1 #2 }
}
{
\semantex_data_tl_put_right:nnn { ##1 } { arg } { #2 }
}
- \semantex_data_int_incr:nn { ##1 } { numberofarguments }
- \semantex_data_bool_set_true:nn { ##1 } { nextargwithsep }
+ \semantex_data_int_incr:nn { ##1 } { number~of~arguments }
+ \semantex_data_bool_set_true:nn { ##1 } { next~arg~with~sep }
},
},
},
diff --git a/macros/latex/contrib/semantex/semantex.tex b/macros/latex/contrib/semantex/semantex.tex
index ab0d352a62..2bf168eb0f 100644
--- a/macros/latex/contrib/semantex/semantex.tex
+++ b/macros/latex/contrib/semantex/semantex.tex
@@ -1,4 +1,4 @@
-\documentclass[a4paper,article,oneside,english,10pt]{memoir}
+\documentclass[a4paper,oneside,english,10pt]{memoir}
\makeatletter
@@ -42,7 +42,7 @@
\usepackage[nameinlink]{cleveref}
-\title{Seman\!\TeX: semantic, keyval-based mathematics (v0.463)}
+\title{Seman\!\TeX: semantic, keyval-based mathematics (v0.500)}
\date{\today}
\author{Sebastian Ørsted (\href{mailto:sorsted@gmail.com}{sorsted@gmail.com})}
@@ -210,19 +210,9 @@
\NewObject\MyVar\Hom{\operatorname{Hom}}
-\NewCohomologyClass\MyCohomology[
- parent=\MyVar,
- gradingposition=upper,
-]
-
-\NewCohomologyClass\MyHomology[
- parent=\MyCohomology,
- gradingposition=lower,
-]
+\NewObject\MyVar\co{H}[grading position=upper]
-\NewObject\MyCohomology\co{H}
-
-\NewObject\MyHomology\ho{H}
+\NewObject\MyVar\ho{H}[grading position=lower]
\makeatother
@@ -243,6 +233,9 @@ and more or less stable, so using it at this point should be safe.
Still, suggestions, ideas, and bug reports are more than welcome!
\setlength\cftsectionnumwidth{3em}
+
+\pagebreak
+
\tableofcontents*
\pagebreak
@@ -251,16 +244,16 @@ Still, suggestions, ideas, and bug reports are more than welcome!
\begingroup
\SetupClass\MyVar{
- definekeys={
+ define keys={
{conj}{command=\overline},
{inv}{upper={-1}},
- {inverseimage}{upper={-1},nopar},
+ {inverse image}{upper={-1},no par},
},
- definekeys[1]={
+ define keys[1]={
{der}{upper={ (#1) } },
- {res}{ rightreturn, symbolputright={|}, lower={#1} },
- {stalk}{seplower={#1}},
- % "seplower" means "separator + lower", i.e. lower index
+ {res}{ right return, symbol put right={|}, lower={#1} },
+ {stalk}{sep lower={#1}},
+ % "sep lower" means "separator + lower", i.e. lower index
% separated from any previous lower index by a separator,
% which by default is a comma
},
@@ -297,23 +290,26 @@ $ \vg[inv,res=\vU]{\vx} $
Suppose \( \sheafF \)~is a sheaf and \( \vh \)~a~map,
and that we want to typeset the
equation~\( \smash{
- \vh[inverseimage]{\sheafF}[
- spar,stalk=\vp]
+ \vh[inverse image]{\sheafF}[spar,
+ stalk=\vp]
=
\sheafF[stalk=\vh{\vp}]
} \),
- saying that the stalk of the inverse image~\( \vh[inverseimage]{\sheafF} \)
+ saying that the stalk of the inverse image~\( \vh[inverse image]{\sheafF} \)
at the point~\( \vp \) is~\( \smash{ \sheafF[stalk=\vh{\vp}] } \).
This can be accomplished by typing
\begin{LTXexample}
-$ \vh[inverseimage]{\sheafF}[spar,stalk=\vp]
+$ \vh[inverse image]{\sheafF}[spar,stalk=\vp]
=
\sheafF[stalk=\vh{\vp}] $
\end{LTXexample}
- Here, \lstinline!spar! (an abbreviation for~\enquote{symbol parentheses})
- is the key that adds the parentheses around~\( \vh[inverseimage]{\sheafF} \).
-
- Let us see how you could set up all the above notation:
+Here, \lstinline!spar! (an abbreviation for~\enquote{symbol parentheses})
+is the key that adds the parentheses around~\( \vh[inverse image]{\sheafF} \).
+
+Let us see how you could set up all the above notation:
+
+\newpage
+
\begin{lstlisting}
\documentclass{article}
@@ -337,18 +333,18 @@ $ \vh[inverseimage]{\sheafF}[spar,stalk=\vp]
output=\MyVar, % This means that the output of an object
% of class \MyVar is also of class \MyVar
% We add a few keys for use with the class \MyVar:
- definekeys={ % we define a few keys
+ define keys={ % we define a few keys
{inv}{upper={-1}},
{conj}{command=\overline}, % Applies \overline to the symbol
- {inverseimage}{upper={-1},nopar},
+ {inverse image}{upper={-1},no par},
},
- definekeys[1]={ % we define keys taking 1 value
+ define keys[1]={ % we define keys taking 1 value
{der}{upper={(#1)}},
- {stalk}{seplower={#1}},
- % "seplower" means "separator + lower", i.e. lower index
+ {stalk}{sep lower={#1}},
+ % "sep lower" means "separator + lower", i.e. lower index
% separated from any previous lower index by a separator,
% which by default is a comma
- {res}{ rightreturn, symbolputright={|}, lower={#1} },
+ {res}{ right return, symbol put right={|}, lower={#1} },
},
}
@@ -358,7 +354,7 @@ $ \vf[conj,der=\vn] $
$ \vg[inv,res=\vU]{\vx} $
-$ \vh[inverseimage]{\sheafF}[spar,stalk=\vp]
+$ \vh[inverse image]{\sheafF}[spar,stalk=\vp]
= \sheafF[stalk=\vh{\vp}] $
\end{document}
@@ -443,17 +439,19 @@ $\vf[lower=3]$
In fact, there are quite a few keys for manipulating upper and lower indices.
Right now, apart from \lstinline!upper! and~\lstinline!lower!,
we shall only need a couple more:
-\lstinline!sepupper! and~\lstinline!seplower! mean
+\lstinline!sep upper! and~\lstinline!sep lower! mean
\enquote{separator~+~upper} and \enquote{separator~+~lower}.
These are like \lstinline!upper! and~\lstinline!lower!,
but if there already was an upper or lower index,
the new index will be separated from the old one by a separator.
By default, this separator is a comma.
There are also two more commands,
-\lstinline!commaupper! and~\lstinline!commalower!.
+\lstinline!comma upper! and~\lstinline!comma lower!.
These will use a comma as separator, even if you have changed the
default separator.
+\newpage
+
\section{Next step: Defining more variables}
We are soon going to need more variables
@@ -568,12 +566,12 @@ $\vf[par=\bigg]{\vx}$,
$\vf[par=\Bigg]{\vx}$,
$\vf[par=auto]{\frac{1}{2}}$
\end{LTXexample}
-Using \lstinline!par=auto! corresponds to using \lstinline!\left...\right!. Just as for ordinary math, I advice you to use manual scaling rather than automatic scaling, as \TeX\ has a tendency to scale things wrong. If you do not want parentheses at all, you can pass the key~\lstinline!nopar! (it will still print parentheses if there is more than one argument, though; to exclude this behaviour, run~\lstinline!neverpar! instead):
+Using \lstinline!par=auto! corresponds to using \lstinline!\left ...\right!. Just as for ordinary math, I advice you to use manual scaling rather than automatic scaling, as \TeX\ has a tendency to scale things wrong. If you do not want parentheses at all, you can pass the key~\mbox{\lstinline!no par!} (it will still print parentheses if there is more than one argument, though; to exclude this behaviour, run~\lstinline!never par! instead):
\begin{LTXexample}
-$\vf[nopar]{\vx}$,
-$\vf[nopar]{\vx,\vy}$,
-$\vf[neverpar]{\vx}$,
-$\vf[neverpar]{\vx,\vy}$
+$\vf[no par]{\vx}$,
+$\vf[no par]{\vx,\vy}$,
+$\vf[never par]{\vx}$,
+$\vf[never par]{\vx,\vy}$
\end{LTXexample}
Primes are added via the key~\lstinline!prime!
or the keys~\lstinline!'!,~\lstinline!''! and~\lstinline!'''!:
@@ -592,11 +590,11 @@ For the rest of the manual, we assume that you have already defined a class~\lst
So far, so good, but our variables cannot really do anything yet. For this, we need to assign \emph{keys} to them. The more pieces of math notation you need, the more keys you will have to define.
To define keys, we use the command~\lstinline!\SetupClass!
(or~\lstinline!\SetupObject! if you want to define it for an individual object)
-and the key~\lstinline!definekeys!.
+and the key~\lstinline!define keys!.
The syntax is as follows:
\begin{lstlisting}
\SetupClass\MyVar{
- definekeys={
+ define keys={
{@\<key name\num{1}\>@}{ @\<keys to run\>@ },
{@\<key name\num{2}\>@}{ @\<keys to run\>@ },
{@\<key name\num{3}\>@}{ @\<keys to run\>@ },
@@ -607,7 +605,7 @@ The syntax is as follows:
For instance, you can do
\begin{lstlisting}
\SetupClass\MyVar{
- definekeys={
+ define keys={
{key1}{ upper=3, lower=7 },
{key2}{ lower=6, upper=4 },
},
@@ -616,22 +614,22 @@ For instance, you can do
Quite often, we shall also need to define
keys that can \emph{take a value}.
-A key can take up to~\( 9 \)~values.
+A key can take up to~\( 8 \)~values (for technical reasons, \( 9 \)~values are not allowed).
To define a key taking \( n \)~values,
-use~\mylst!definekeys[$n$]!
-for~\( n = 0 , 1 , 2 , \ldots , 9 \).
-The syntax is similar to~\lstinline!definekeys!,
+use~\mylst!define keys[$n$]!
+for~\( n = 0 , 1 , 2 , \ldots , 8 \).
+The syntax is similar to~\lstinline!define keys!,
except the values can be accessed
-by writing~\lstinline!#1!, \lstinline!#2!, \ldots, \lstinline!#9!.
+by writing~\lstinline!#1!, \lstinline!#2!, \ldots, \lstinline!#8!.
Except for a few special cases, you will probably only
-ever need~\lstinline!definekeys[1]!. So you can do
+ever need~\lstinline!define keys[1]!. So you can do
\begin{lstlisting}
\SetupClass\MyVar{
- definekeys[1]={
+ define keys[1]={
{key3}{ upper=\{#1\} },
{key4}{ lower=(#1) },
},
- definekeys[2]={
+ define keys[2]={
{key5}{ upper=3+#1, lower=7-#2 },
{key6}{ lower=6\cdot#1, upper=4/#2 },
},
@@ -639,17 +637,17 @@ ever need~\lstinline!definekeys[1]!. So you can do
\end{lstlisting}
\begingroup
\SetupClass\MyVar{
- definekeys={
- {key1}{ upper=3, seplower=7 },
- {key2}{ lower=6, sepupper=4 },
+ define keys={
+ {key1}{ upper=3, sep lower=7 },
+ {key2}{ lower=6, sep upper=4 },
},
- definekeys[1]={
- {key3}{ sepupper=\{#1\} },
- {key4}{ seplower=(#1) },
+ define keys[1]={
+ {key3}{ sep upper=\{#1\} },
+ {key4}{ sep lower=(#1) },
},
- definekeys[2]={
- {key5}{ sepupper=3+#1, seplower=7-#2 },
- {key6}{ seplower=6\cdot#1, sepupper=4/#2 },
+ define keys[2]={
+ {key5}{ sep upper=3+#1, sep lower=7-#2 },
+ {key6}{ sep lower=6\cdot#1, sep upper=4/#2 },
},
}
Let us see these rather ridiculous keys in action:
@@ -667,17 +665,17 @@ $ \vP[key1,key3=0,key5={3}{4}] $
One thing we might want to do to a variable
is \emph{invert} it. We therefore add a key~\lstinline!inv!
that adds an upper index~\lstinline!-1! to the symbol.
-We add this key using the key \lstinline!definekeys!
+We add this key using the key \lstinline!define keys!
since there is no reason for this key to take a value:
\begin{lstlisting}
\SetupClass\MyVar{
- definekeys={
+ define keys={
{inv}{ upper={-1} },
},
}
\end{lstlisting}
\SetupClass\MyVar{
-definekeys={
+define keys={
{inv}{ upper={-1} },
},
}
@@ -691,21 +689,21 @@ $\vh[\va,\vb,inv]$
\end{LTXexample}
Other keys might need to take one value.
-For defining these, we use a different key, \lstinline!definekeys[1]!.
+For defining these, we use a different key, \lstinline!define keys[1]!.
For instance, suppose we want a command for deriving a function \( n \)~times.
For this, we add the key~\lstinline!der!:
\begin{lstlisting}
\SetupClass\MyVar{
- definekeys={
+ define keys={
{inv}{ upper={-1} },
},
- definekeys[1]={
+ define keys[1]={
{der}{ upper={(#1)} },
},
}
\end{lstlisting}
\SetupClass\MyVar{
-definekeys[1]={
+define keys[1]={
{der}{ upper={(#1)} },
},
}
@@ -718,17 +716,17 @@ $\vf[der=\vn]{\vx}$
Maybe we also want a more elementary key~\lstinline!power! for raising a variable to a power:
\begin{lstlisting}
\SetupClass\MyVar{
- definekeys={
+ define keys={
{inv}{ upper={-1} },
},
- definekeys[1]={
+ define keys[1]={
{der}{ upper={(#1)} },
{power}{ upper={#1} },
},
}
\end{lstlisting}
\SetupClass\MyVar{
- definekeys[1]={
+ define keys[1]={
{power}{ upper={#1} },
},
}
@@ -742,26 +740,26 @@ Let us try doing something a bit more complicated: adding a key for restricting
For this, we do the following:
\begin{lstlisting}
\SetupClass\MyVar{
- definekeys={
+ define keys={
{inv}{ upper={-1} },
},
- definekeys[1]={
+ define keys[1]={
{der}{ upper={(#1)} },
{power}{ upper={#1} },
- {res}{ rightreturn,symbolputright={|}, lower={#1} },
+ {res}{ right return,symbol put right={|}, lower={#1} },
},
}
\end{lstlisting}
\SetupClass\MyVar{
- definekeys[1]={
- {res}{ rightreturn,symbolputright={|}, lower={#1} },
+ define keys[1]={
+ {res}{ right return,symbol put right={|}, lower={#1} },
},
}
This adds a horizonal line~\enquote{$|$}
to the right of the symbol followed by
a lower index containing whatever you passed to the key
(contained in the \mbox{command~\lstinline!#1!)}.
-(There is also an extra key, \lstinline!rightreturn!, which is a bit more advanced and should be taken for granted for now. Roughly speaking, it is there to make sure that the restriction symbol is printed \emph{after} all indices that you might have added before. More details in \cref{ch:return}.)
+(There is also an extra key, \lstinline!right return!, which is a bit more advanced and should be taken for granted for now. Roughly speaking, it is there to make sure that the restriction symbol is printed \emph{after} all indices that you might have added before. More details in \cref{ch:return}.)
Now we may write the following:
\begin{LTXexample}
$\vf[res=\vU]{\vx}$,
@@ -779,18 +777,20 @@ $\vf[der=\vn]{\vx}{\vy}{\vz}
Some people prefer to be able to scale the vertical line in the restriction notation. I rarely do that, but for this purpose, we could do the following:
\begin{lstlisting}
\SetupClass\MyVar{
- definekeys[1]={
- {bigres}{ rightreturn, symbolputright=\big|, lower={#1} },
- {Bigres}{ rightreturn, symbolputright=\Big|, lower={#1} },
- {biggres}{ rightreturn, symbolputright=\bigg|, lower={#1} },
- {Biggres}{ rightreturn, symbolputright=\Bigg|, lower={#1} },
- {autores}{ leftreturn, symbolputleft=\kern-\nulldelimiterspace,
- Otherspar={.}{|}{auto}, symbolputleft=\bgroup,
- symbolputright=\egroup, lower={#1},
+ define keys[1]={
+ {big res}{ right return, symbol put right=\big|, lower={#1} },
+ {Big res}{ right return, symbol put right=\Big|, lower={#1} },
+ {bigg res}{ right return, symbol put right=\bigg|, lower={#1} },
+ {Bigg res}{ right return, symbol put right=\Bigg|, lower={#1} },
+ {auto res}{
+ left return,
+ symbol put left=\kern-\nulldelimiterspace,
+ Other spar={.}{|}{auto}, symbol put left=\bgroup,
+ symbol put right=\egroup, lower={#1},
},
% The last key auto-scales the vertical bar. See @\textit{\cref{sec:spar}}@
- % for information about Otherspar.
- % Note that Otherspar automatically invokes rightreturn,
+ % for information about Other spar.
+ % Note that Other spar automatically invokes right return,
% so no need to run that key twice.
},
}
@@ -802,13 +802,13 @@ via \lstinline!\NewVariableClass! and then used \lstinline!\SetupClass! to add k
\NewVariableClass\MyVar[
output=\MyVar, % This means that the output of an object
% of class \MyVar is also of class \MyVar
- definekeys={
+ define keys={
{inv}{ upper={-1} },
},
- definekeys[1]={
+ define keys[1]={
{der}{ upper={(#1)} },
{power}{ upper={#1} },
- {res}{ rightreturn, symbolputright={|}, lower={#1} },
+ {res}{ right return, symbol put right={|}, lower={#1} },
},
]
\end{lstlisting}
@@ -820,12 +820,12 @@ Let me add that it is possible to create subclasses of existing classes. You jus
\section{Example: Elementary algebra}\label{sec:algebra}
\SetupClass\MyVar{
- definekeys={
+ define keys={
{poly}{
par, % This tells semantex to use parentheses around
% the argument in the first place, in case this
% had been turned off
- leftpar=[,rightpar=],
+ left par=[,right par=],
},
},
}
@@ -835,12 +835,12 @@ for doing algebra.
As an algebraist, one of the first things you might want to do is to create polynomial rings~\( \vk[poly]{\vx,\vy,\vz} \). Since all variables can already be used as functions (this is a design choice we discussed earlier), all we need to do is find a way to change from using parentheses to square brackets. This can be done the following way:
\begin{lstlisting}
\SetupClass\MyVar{
- definekeys={
+ define keys={
{poly}{
par, % This tells semantex to use parentheses around
% the argument in the first place, in case this
% had been turned off
- leftpar=[,rightpar=],
+ left par=[,right par=],
},
},
}
@@ -852,25 +852,25 @@ $\vk[poly]{\vx,\vy,\vz}$
It is straightforward how to do adjust this to instead write the \emph{field} generated by the variables~\( x, y, z \):
\begin{lstlisting}
\SetupClass\MyVar{
- definekeys={
+ define keys={
{poly}{
par, % This tells semantex to use parentheses around
% the argument in the first place, in case this
% had been turned off
- leftpar=[,rightpar=],
+ left par=[,right par=],
},
{field}{
par,
- leftpar=(,rightpar=),
+ left par=(,right par=),
},
},
}
\end{lstlisting}
\SetupClass\MyVar{
- definekeys={
+ define keys={
{field}{
par,
- leftpar=(,rightpar=),
+ left par=(,right par=),
},
},
}
@@ -880,33 +880,33 @@ key would produce the same result with the current configuration of the class~\l
Adding support for free algebras, power series, and Laurent series is almost as easy, but there is a catch:
\begin{lstlisting}
\SetupClass\MyVar{
- definekeys={
+ define keys={
{poly}{
par, % This tells semantex to use parentheses around
% the argument in the first place, in case this
% had been turned off
- leftpar=[,rightpar=],
+ left par=[,right par=],
},
{field}{
par,
- leftpar=(,rightpar=),
+ left par=(,right par=),
},
- {freealg}{
+ {free alg}{
par,
- leftpar=\langle,
- rightpar=\rangle,
+ left par=\langle,
+ right par=\rangle,
},
- {powerseries}{
+ {power series}{
par,
- leftpar=\llbracket,
- rightpar=\rrbracket,
+ left par=\llbracket,
+ right par=\rrbracket,
},
{laurent}{
par,
- leftpar=(, rightpar=),
- prearg={\!\mathopen{}\SemantexDelimiterSize(},
- postarg={\SemantexDelimiterSize)\mathclose{}\!},
- % The "prearg" and "postarg" are printed before after
+ left par=(, right par=),
+ pre arg={\!\mathopen{}\SemantexDelimiterSize(},
+ post arg={\SemantexDelimiterSize)\mathclose{}\!},
+ % The "pre arg" and "post arg" are printed before after
% the argument, if the argument is non-empty.
% The command "\SemantexDelimiterSize" is substituted
% by \big, \Big, ..., or whatever size the
@@ -916,22 +916,22 @@ Adding support for free algebras, power series, and Laurent series is almost as
}
\end{lstlisting}
\SetupClass\MyVar{
- definekeys={
- {freealg}{
+ define keys={
+ {free alg}{
par,
- leftpar=\langle,
- rightpar=\rangle,
+ left par=\langle,
+ right par=\rangle,
},
- {powerseries}{
+ {power series}{
par,
- leftpar=\llbracket,
- rightpar=\rrbracket,
+ left par=\llbracket,
+ right par=\rrbracket,
},
{laurent}{
par,
- leftpar=(, rightpar=),
- prearg={\!\mathopen{}\SemantexDelimiterSize(},
- postarg={\SemantexDelimiterSize)\mathclose{}\!},
+ left par=(, right par=),
+ pre arg={\!\mathopen{}\SemantexDelimiterSize(},
+ post arg={\SemantexDelimiterSize)\mathclose{}\!},
% These are printed before and after the argument.
% The command "\SemantexDelimiterSize" is substituted
% by \big, \Big, ..., or whatever size the
@@ -941,8 +941,8 @@ Adding support for free algebras, power series, and Laurent series is almost as
}
See for yourself:
\begin{LTXexample}
-$\vk[freealg]{\vx}$,
-$\vk[powerseries]{\vy}$,
+$\vk[free alg]{\vx}$,
+$\vk[power series]{\vy}$,
$\vk[laurent]{\vz}$
\end{LTXexample}
@@ -950,10 +950,10 @@ $\vk[laurent]{\vz}$
Let us look at some other algebraic operations that we can control via \semantex:
\begin{lstlisting}
\SetupClass\MyVar{
- definekeys={
+ define keys={
{op}{upper={\mathrm{op}}},
% opposite groups, rings, categories, etc.
- {algclosure}{command=\overline},
+ {alg closure}{command=\overline},
% algebraic closure
{conj}{command=\overline},
% complex conjugation
@@ -962,31 +962,31 @@ Let us look at some other algebraic operations that we can control via \semantex
{perp}{upper=\perp},
% orthogonal complement
},
- definekeys[1]={
- {mod}{rightreturn,symbolputright={/#1}},
+ define keys[1]={
+ {mod}{right return,symbol put right={/#1}},
% for modulo notation like R/I
- {dom}{leftreturn,symbolputleft={#1\backslash}},
+ {dom}{left return,symbol put left={#1\backslash}},
% for left modulo notation like I\R
% "dom" is "mod" spelled backwards
{oplus}{upper={\oplus#1}},
% for notation like R^{\oplus n}
{tens}{upper={\otimes#1}},
% for notation like R^{\otimes n}
- {localize}{symbolputright={ \lbrack #1^{-1} \rbrack }},
+ {localize}{symbol put right={ \lbrack #1^{-1} \rbrack }},
% localization at a multiplicative subset;
% we use \lbrack and \rbrack rather than [ and ] since in some
% cases (using constructions like in @{\itshape\cref{ch:the_class_command}}@),
% the [...] might be interpreted as an optional argument.
- {localizeprime}{seplower={#1}},
+ {localize prime}{sep lower={#1}},
% for localization at a prime ideal
},
}
\end{lstlisting}
\SetupClass\MyVar{
- definekeys={
+ define keys={
{op}{upper={\mathrm{op}}},
% opposite groups, rings, categories, etc.
- {algclosure}{command=\overline},
+ {alg closure}{command=\overline},
% algebraic closure
{conj}{command=\overline},
% complex conjugation
@@ -995,40 +995,40 @@ Let us look at some other algebraic operations that we can control via \semantex
{perp}{upper=\perp},
% orthogonal complement
},
- definekeys[1]={
- {mod}{symbolputright={/#1}},
+ define keys[1]={
+ {mod}{symbol put right={/#1}},
% for modulo notation like R/I
- {dom}{symbolputleft={#1\backslash}},
+ {dom}{symbol put left={#1\backslash}},
% for left modulo notation like I\R
% "dom" is "mod" spelled backwards
{oplus}{upper={\oplus#1}},
% for notatoin like R^{\oplus n}
{tens}{upper={\otimes#1}},
% for notation like R^{\otimes n}
- {localize}{symbolputright={ \lbrack #1^{-1} \rbrack }},
+ {localize}{symbol put right={ \lbrack #1^{-1} \rbrack }},
% localization at a multiplicative subset
- {localizeprime}{seplower={#1}},
+ {localize prime}{sep lower={#1}},
% for localization at a prime ideal
},
}
Let us see it in practice:
\begin{LTXexample}
-$\vR[op]$, $\vk[algclosure]$,
+$\vR[op]$, $\vk[alg closure]$,
$\vz[conj]$, $\vV[dual]$,
$\vR[mod=\vI]$,$\vR[dom=\vJ]$,
$\vR[oplus=\vn]$,
$\vV[tens=\vm]$,
$\vR[localize=\vS]$,
-$\vR[localizeprime=\vI]$,
-$\vk[freealg]{\vS}[op]$,
+$\vR[localize prime=\vI]$,
+$\vk[free alg]{\vS}[op]$,
$\vV[perp]$
\end{LTXexample}
\section{GIT quotients}
\SetupClass\MyVar{
- definekeys[2]={
- {projquotient}{ symbolputright={ /\!\!/ _ { #1 } #2 } },
+ define keys[2]={
+ {proj quotient}{ symbol put right={ /\!\!/ _ { #1 } #2 } },
}
}
@@ -1036,17 +1036,17 @@ We include a slightly more advanced example
to show the use of keys with more than one value.
Sometimes, a key with one value is simply not enough. For instance, if you
work in geometric invariant theory~(GIT), you will eventually have to take the proj
-quotient~\( \vX[projquotient={\vchi}{\vG}] \) of~\( \vX \) with respect to the action of the group~\( \vG \) and the character~\( \vchi \). In other words, the proj quotient depends on two parameters, \( \vchi \) and~\( \vG \). For this purpose, we the the key~\lstinline!definekeys[2]!:
+quotient~\( \vX[proj quotient={\vchi}{\vG}] \) of~\( \vX \) with respect to the action of the group~\( \vG \) and the character~\( \vchi \). In other words, the proj quotient depends on two parameters, \( \vchi \) and~\( \vG \). For this purpose, we the the key~\lstinline!define keys[2]!:
\begin{lstlisting}
\SetupClass\MyVar{
- definekeys[2]={
- {projquotient}{ symbolputright={ /\!\!/_{#1} #2 } },
+ define keys[2]={
+ {proj quotient}{ symbol put right={ /\!\!/_{#1} #2 } },
}
}
\end{lstlisting}
\begin{LTXexample}
-$ \vX[projquotient={\vchi}{\vG}] $
+$ \vX[proj quotient={\vchi}{\vG}] $
\end{LTXexample}
@@ -1068,7 +1068,7 @@ $ \vf[1,res=\vV,spar,conj,op,spar,0,inv,spar,mod=\vI,spar,dual]{\vx} $
\end{LTXexample}
If it becomes too messy, you can scale the parentheses, too. Simply use the syntax
\lstinline!spar=\big!, \lstinline!spar=\Big!, etc.
-You can also get auto-scaled parentheses base on \lstinline!\left...\right!,
+You can also get auto-scaled parentheses base on \lstinline!\left ...\right!,
using the key \lstinline!spar=auto!:
\begin{LTXexample}
$\vf[spar]$,
@@ -1082,24 +1082,24 @@ So returning to the above example, we can write
\begin{LTXexample}
$\vf[1,res=\vV,spar,conj,op,spar=\big,0,inv,spar=\Big,mod=\vI,spar=\bigg,dual]{\vx}$
\end{LTXexample}
-To adjust the type of brackets, use the \lstinline!leftspar! and \lstinline!rightspar! keys:
+To adjust the type of brackets, use the \lstinline!left spar! and \lstinline!right spar! keys:
\begin{LTXexample}
-$\vf[leftspar={[},rightspar={\}},spar,spar=\Bigg]$
+$\vf[left spar={[},right spar={\}},spar,spar=\Bigg]$
\end{LTXexample}
Occassionally, it is useful to be able to input a particular kind of brackets just once,
without adjusting any settings. For this purpose, we have the
-\lstinline!otherspar! and~\lstinline!Otherspar! keys. They use the syntax
+\lstinline!other spar! and~\lstinline!Other spar! keys. They use the syntax
\begin{lstlisting}
-otherspar={@\<opening bracket\>@}{@\<closing bracket\>@}
-Otherspar={@\<opening bracket\>@}{@\<closing bracket\>@}{@\values\<normal|auto|*|{\textit{other}}\>@}
+other spar={@\<opening bracket\>@}{@\<closing bracket\>@}
+Other spar={@\<opening bracket\>@}{@\<closing bracket\>@}{@\values\<normal|auto|*|{\textit{other}}\>@}
\end{lstlisting}
-The last argument in \lstinline!Otherspar! sets the size of the
+The last argument in \lstinline!Other spar! sets the size of the
parentheses.
Let us see them in action:
\begin{LTXexample}
-$\vf[otherspar={[}{)},
- otherspar={\{}{\rangle},
- Otherspar={\langle}{\rangle}{\Bigg},spar]$
+$\vf[other spar={[}{)},
+ other spar={\{}{\rangle},
+ Other spar={\langle}{\rangle}{\Bigg},spar]$
\end{LTXexample}
\section{The \texorpdfstring{\texttt{$\backslash$\<Class\>}}{Class} command}\label{ch:the_class_command}
@@ -1140,7 +1140,7 @@ Sometimes, it is useful to put these commands into
keys instead. So you can do stuff like
\begin{lstlisting}
\SetupClass\MyVar{
- definekeys={
+ define keys={
{tilde}{command=\tilde},
{widetilde}{command=\widetilde},
{bar}{command=\bar},
@@ -1150,7 +1150,7 @@ keys instead. So you can do stuff like
}
\end{lstlisting}
\SetupClass\MyVar{
- definekeys={
+ define keys={
{tilde}{command=\tilde},
{widetilde}{command=\widetilde},
{bar}{command=\bar},
@@ -1166,7 +1166,7 @@ $\va[roman]$,
$\va[bar]$
\end{LTXexample}
Note that there is a predefined key,~\lstinline!smash!,
-which is equivalent to~\lstinline!command=\smash!.
+which is equivalent to~\lstinline!return, command=\smash!.
\endgroup
@@ -1201,7 +1201,7 @@ But after the \lstinline!return! routine, the symbol is~\lstinline!f^{-1}!, and
There are some cases when you do not want to add all commands, indices, and arguments to the symbol at the same time.
Therefore, there exist a few extra, partial \lstinline!return! keys that only add some of them to the symbol and save the rest of later.
We list the most important ones here and refer to~\cref{sec:fundamental_keys} for the remaining ones.
-Most users will probably only ever need the keys \lstinline!return! and~\lstinline!rightreturn!.
+Most users will probably only ever need the keys \lstinline!return! and~\lstinline!right return!.
\begin{itemize}
\item
\mylst!return!
@@ -1209,17 +1209,17 @@ Most users will probably only ever need the keys \lstinline!return! and~\lstinli
Invokes the return routine, i.e.\ adds all commands, indices, and arguments to the symbol, if any such exist.
\item
- \mylst!innerreturn!
+ \mylst!inner return!
Invokes the inner return routine, i.e.\ adds all commands to the symbol, if any such exist.
\item
- \mylst!rightreturn!
+ \mylst!right return!
Invokes the right return routine, i.e.\ adds all commands, right indices, and right arguments to the symbol, if any such exist.
\item
- \mylst!leftreturn!
+ \mylst!left return!
Invokes the left return routine, i.e.\ adds all commands, left indices, and left arguments to the symbol, if any such exist.
\end{itemize}
@@ -1276,7 +1276,7 @@ also turn keyval syntax in arguments completely off,
avoiding such issues. This can be done by setting
\begin{lstlisting}
\SetupClass\MyVar{
- argkeyval=false,
+ arg keyval=false,
}
\end{lstlisting}
@@ -1300,11 +1300,11 @@ To switch to the keyval parser of this package, we do
\begin{lstlisting}
\usepackage{expkv}
\SemantexSetup{
- keyvalparser=\ekvparse,
+ keyval parser=\ekvparse,
}
\end{lstlisting}
\SemantexSetup{
- keyvalparser=\ekvparse,
+ keyval parser=\ekvparse,
}
Now you can do
\begin{LTXexample}
@@ -1313,7 +1313,7 @@ $ \va[lower=\vx[lower=3]] $
In general,
using the key
-\mylst!keyvalparser={$\<command\>$}!
+\mylst!keyval parser={$\<command\>$}!
sets the keyval parser function to be the command~\<command\>.
The \<command\> must take three arguments:
\mylst!$\<command\>\<function\num{1}\>\<function\num{2}\>${$\<key-value list\>$}!.
@@ -1365,83 +1365,83 @@ Next, for morphisms of schemes~\( \vf \colon \vX \to \vY \),
we need to be able to typeset comorphisms as well as the one hundred thousand different pullback and pushforward operations. For this, we add some keys to the \lstinline!\MyVar! key:
\begin{lstlisting}
\SetupClass\MyVar{
- definekeys={
+ define keys={
{comorphism}{upper=\#},
% comorphisms, i.e. f^{\#}
- {inverseimage}{upper={-1},nopar},
+ {inverse image}{upper={-1},no par},
% inverse image of sheaves
- {sheafpull}{upper=*,nopar},
+ {sheaf pull}{upper=*,no par},
% sheaf *-pullback
- {sheafpush}{lower=*,nopar},
+ {sheaf push}{lower=*,no par},
% sheaf *-pushforward
- {sheaf!pull}{upper=!,nopar},
+ {sheaf !pull}{upper=!,no par},
% sheaf !-pullback
- {sheaf!push}{lower=!,nopar},
+ {sheaf !push}{lower=!,no par},
% sheaf !-pushforward
},
}
\end{lstlisting}
\SetupClass\MyVar{
- definekeys={
+ define keys={
{comorphism}{upper=\#},
% comorphisms, i.e. f^{\#}
- {inverseimage}{upper={-1},nopar},
+ {inverse image}{upper={-1},no par},
% inverse image of sheaves
- {sheafpull}{upper=*,nopar},
+ {sheaf pull}{upper=*,no par},
% sheaf *-pullback
- {sheafpush}{lower=*,nopar},
+ {sheaf push}{lower=*,no par},
% sheaf *-pushforward
- {sheaf!pull}{upper=!,nopar},
+ {sheaf !pull}{upper=!,no par},
% sheaf !-pullback
- {sheaf!push}{lower=!,nopar},
+ {sheaf !push}{lower=!,no par},
% sheaf !-pushforward
},
}
-We have added the command \lstinline!nopar! to all pullback and pushforward commands since it is custom to write, say,~\( \vf[sheafpull]{\sheafF} \) rather than~\( \vf[sheafpull,par]{\sheafF} \). Of course, you can decide that for yourself, and in any case, you can write~\lstinline!\vf[sheafpull,par]{\sheafF}! if you want to force it to use parentheses in a particular case. Of course, since all \semantex variables can be used as functions, so can whatever these pullback and pushforward operations output. So we may write:
+We have added the command \lstinline!no par! to all pullback and pushforward commands since it is custom to write, say,~\( \vf[sheaf pull]{\sheafF} \) rather than~\( \vf[sheaf pull,par]{\sheafF} \). Of course, you can decide that for yourself, and in any case, you can write~\lstinline!\vf[sheaf pull,par]{\sheafF}! if you want to force it to use parentheses in a particular case. Of course, since all \semantex variables can be used as functions, so can whatever these pullback and pushforward operations output. So we may write:
\begin{LTXexample}
For a morphism~$ \vf \colon
\vX \to \vY $ with
comorphism~$ \vf[comorphism]
\colon \sheafreg[\vY] \to
-\vf[sheafpush]{\sheafreg[\vX]} $,
+\vf[sheaf push]{\sheafreg[\vX]} $,
and for a sheaf~$ \sheafF $ on~$ \vY $, we can define the
-pullback~$ \vf[sheafpull]{
+pullback~$ \vf[sheaf pull]{
\sheafF} $ by letting~$
-\vf[sheafpull]{\sheafF}{\vU} = \cdots $ and the $ ! $-pullback by letting~$
-\vf[sheaf!pull]{\sheafF}{\vU} = \cdots $.
+\vf[sheaf pull]{\sheafF}{\vU} = \cdots $ and the $ ! $-pullback by letting~$
+\vf[sheaf !pull]{\sheafF}{\vU} = \cdots $.
\end{LTXexample}
Maybe some people would write \lstinline!pull!, \lstinline!push!, etc.~instead, but there are many different kinds of pullbacks in mathematics, so I prefer to use the \lstinline!sheaf!~prefix to show that this is for sheaves.
Probably, in the long run, an algebraic geometer might also want
-to abbreviate~\lstinline!inverseimage! to~\lstinline!invim!.
+to abbreviate~\lstinline!inverse image! to~\lstinline!invim!.
There are a number of other operations we might want to do for sheaves. We already defined the key~\lstinline!res! for restriction, so there is no need to define this again.
However, we might need to stalk, sheafify, take dual sheaves, and twist sheaves. Let us define keys for this:
\begin{lstlisting}
\SetupClass\MyVar{
- definekeys[1]={
- {stalk}{seplower={#1}},
- % "seplower" means "separator + lower", i.e. lower index
+ define keys[1]={
+ {stalk}{sep lower={#1}},
+ % "sep lower" means "separator + lower", i.e. lower index
% separated from any previous lower index by a separator,
% which by default is a comma
- {sheaftwist}{return,symbolputright={(#1)}},
+ {sheaf twist}{return,symbol put right={(#1)}},
},
- definekeys={
+ define keys={
{sheafify}{upper=+},
- {sheafdual}{upper=\vee},
+ {sheaf dual}{upper=\vee},
},
}
\end{lstlisting}
\SetupClass\MyVar{
- definekeys[1]={
- {stalk}{seplower={#1}},
- % "seplower" means "separator + lower", i.e. lower index
+ define keys[1]={
+ {stalk}{sep lower={#1}},
+ % "sep lower" means "separator + lower", i.e. lower index
% separated from any previous lower index by a separator,
% which by default is a comma
- {sheaftwist}{return,symbolputright={(#1)}},
+ {sheaf twist}{return,symbol put right={(#1)}},
},
- definekeys={
+ define keys={
{sheafify}{upper=+},
- {sheafdual}{upper=\vee},
+ {sheaf dual}{upper=\vee},
},
}
\begin{LTXexample}
@@ -1450,11 +1450,11 @@ $\sheafF[res=\vU,spar,stalk=
\vp]$,
$\sheafreg[\vX,stalk=\vp]$,
$\sheafG[sheafify]$,
-$\vf[inverseimage]{\sheafreg[
+$\vf[inverse image]{\sheafreg[
\vY]}[spar,stalk=\vx]$,
-$\sheafG[sheafdual]$,
-$\sheafreg[\vX][sheaftwist=-1]$,
-$\sheafreg[sheaftwist=1,sheafdual]$
+$\sheafG[sheaf dual]$,
+$\sheafreg[\vX][sheaf twist=-1]$,
+$\sheafreg[sheaf twist=1,sheaf dual]$
\end{LTXexample}
\chapter{Example: Homological algebra}
@@ -1475,8 +1475,8 @@ $\Hom[\vA]{\vM,\vN}$,
$\Ext[\vA]{\vM,\vN}$
\end{LTXexample}
\SetupClass\MyVar{
-definekeys[1]={
- {shift}{ rightreturn,symbolputright={ \relax [ {#1} ] } },
+define keys[1]={
+ {shift}{ right return,symbol put right={ \relax [ {#1} ] } },
% we use \lbrack and \rbrack rather than [ and ] since in some
% cases (using constructions like in @{\itshape\cref{ch:the_class_command}}@),
% the [...] might be interpreted as an optional argument.
@@ -1485,8 +1485,8 @@ definekeys[1]={
You will probably need several keyval interfaces, some of which will be covered below. But right now, we shall implement a shift operation~\( \vX\mapsto\vX[shift=\vn] \):
\begin{lstlisting}
\SetupClass\MyVar{
- definekeys[1]={
- {shift}{ rightreturn,symbolputright={ \lbrack #1 \rbrack } },
+ define keys[1]={
+ {shift}{ right return,symbol put right={ \lbrack #1 \rbrack } },
% we use \lbrack and \rbrack rather than [ and ] since in some
% cases (using constructions like in @{\itshape\cref{ch:the_class_command}}@),
% the [...] might be interpreted as an optional argument.
@@ -1499,9 +1499,9 @@ $\vX \mapsto \vX[shift=\vn]$
\end{LTXexample}
Finally, let us define a command for the differential (in the homolgoical algebra sense):
\begin{lstlisting}
-\NewObject\MyVar\dif{d}[nopar]
+\NewObject\MyVar\dif{d}[no par]
\end{lstlisting}%
-\NewObject\MyVar\dif{d}[nopar]%
+\NewObject\MyVar\dif{d}[no par]%
\begin{LTXexample}
$\dif{\vx} = 0$
\end{LTXexample}
@@ -1513,20 +1513,20 @@ people have very different opinions about the positions of the gradings.
As an algebraist, I am used to \emph{upper} gradings (\enquote{cohomological} grading), whereas many topologists prefer \emph{lower} gradings (\enquote{homological} grading). The \semantex system
supports both, but the default is upper gradings.
You can adjust this by writing
-\lstinline!gradingposition=upper! or~\lstinline!gradingposition=lower!.
+\lstinline!grading position=upper! or~\lstinline!grading position=lower!.
We already learned about the keys \lstinline!upper! and~\lstinline!lower!,
-as well as their friends \lstinline!sepupper!, \lstinline!seplower!, \lstinline!commaupper!, \lstinline!commalower!, etc.
+as well as their friends \lstinline!sep upper!, \lstinline!sep lower!, \lstinline!comma upper!, \lstinline!comma lower!, etc.
There also exist \enquote{relative} versions of these keys that print the index either as an upper index or as a lower index, depending on your preference for cohomological or homological grading. They are called
\begin{center}
\lstinline!d!,
- \lstinline!sepd!,
- \lstinline!commad!
+ \lstinline!sep d!,
+ \lstinline!comma d!
\qquad\qquad and\qquad\qquad
\lstinline!i!,
- \lstinline!sepi!,
- \lstinline!commai!,
+ \lstinline!sep i!,
+ \lstinline!comma i!,
\end{center}
and consequently, we shall refer to the indices
they correspond to as the \enquote{\lstinline!d!-index} and the \enquote{\lstinline!i!-index}.
@@ -1535,8 +1535,13 @@ the grading. The~\lstinline!i! stands for \enquote{index}
and corresponds to the \enquote{other} index where you may store
additional information.\footnote{These names are not perfect; you might object that the degree is also an index, but feel free to come up with a more satisfactory naming principle, and I shall be happy to consider it.}
-To understand the difference, keep the following two examples
-in mind: the hom complex~\( \Hom[*,i=\vA] \) and the simplicial homology~\( \ho[*,i=\vDelta] \) (we will define the command~\lstinline!\ho! for homology in the next section):
+To understand the difference,
+keep the following two examples
+in mind: the hom complex~\( \Hom[*,i=\vA] \) and the simplicial homology~\( \ho[*,i=\vDelta] \):
+\begin{lstlisting}
+\NewObject\MyVar\Hom{\operatorname{Hom}}
+\NewObject\MyVar\ho{H}[grading position=lower] % homology
+\end{lstlisting}
\begin{LTXexample}
$\Hom[i=\vA,d=0]$,
$\ho[i=\vDelta,d=1]$
@@ -1546,7 +1551,7 @@ Let us see them in action:
$ \vX[d=3,i=\vk] $
\SetupObject\vX{
- gradingposition=lower
+ grading position=lower
}
$ \vX[d=3,i=\vk] $
@@ -1557,7 +1562,7 @@ If you want to print a bullet as the degree, there is the predefined key~\lstinl
$ \vX[*] $
\SetupObject\vX{
- gradingposition=lower
+ grading position=lower
}
$ \vX[*] $
@@ -1568,7 +1573,7 @@ I guess it is also time to reveal that the previously mentioned shorthand notati
$ \vX[1] $
\SetupObject\vX{
- gradingposition=lower
+ grading position=lower
}
$ \vX[1] $
@@ -1591,51 +1596,27 @@ that the actions of these keys are invoked.
In fact, \semantex carefully separates keys taking
a value from keys taking no values.
-\section{The \texorpdfstring{\texttt{Cohomology}}{Cohomology} class type}
-
-Now homological algebra is hard unless we can do \emph{cohomology} and \emph{homology}. In principle, this is not hard
-to do, as we can write e.g.~\lstinline!\vH[d=0]{\vX}! to get~\( \vH[d=0]{\vX} \).
-However, some people might find it cumbersome to have to write~\lstinline!d=! every time you want to print an index.
-This is probably the right time to reveal that \semantex supports multiple class \emph{types}.
-So far, we have been exclusively using the \lstinline!Variable!
-class type, which is what you create when you apply the command~\lstinline!\NewVariableClass!.
-The first other class type we shall need is the \lstinline!Cohomology! class type, which has a different input syntax that fits cohomology.
-Let us try to use it:
-\begin{lstlisting}
-\NewCohomologyClass\MyCohomology[
- parent=\MyVar,gradingposition=upper
-]
-
-\NewObject\MyCohomology\co{H}
-
-\NewCohomologyClass\MyHomology[
- parent=\MyCohomology,gradingposition=lower
-]
-
-\NewObject\MyHomology\ho{H}
-\end{lstlisting}
-The cohomology command~\lstinline!\co! we just created works very much
-like a command of \lstinline!Variable! type. However, the input syntax is a bit different:
+We can similarly define a command for cohomology:
\begin{lstlisting}
-\co[@\<options\>@]{@\<degree\>@}{@\<argument\>@}
+\NewObject\MyVar\co{H}[grading position=upper]
+ % this is actually unnecessary, as
+ % upper grading is the default
\end{lstlisting}
-All three arguments are optional. The~\<degree\> is printed
-in the \lstinline!d!-index.
-Let us see it in practice:
+Let us see \lstinline!\ho! and~\lstinline!\co! in practise:
\begin{LTXexample}
-$\co{0}$, $\co{*}$,
-$\co{\vi}{\vX}$,
-$\co[\vG]{0}$,
-$\co[\vH]{*}$,
-$\co[\vDelta]{\vi}{\vX}$
+$\co[d=0]$, $\co[*]$,
+$\co[d=\vi]{\vX}$,
+$\co[\vG,d=0]$,
+$\co[\vH,*]$,
+$\co[\vDelta,d=\vi]{\vX}$
\end{LTXexample}
\begin{LTXexample}
-$\ho{0}$, $\ho{*}$,
-$\ho{\vi}{\vX}$,
-$\ho[\vG]{0}$,
-$\ho[\vH]{*}$,
-$\ho[\vDelta]{\vi}{\vX}$
+$\ho[d=0]$, $\co[*]$,
+$\ho[d=\vi]{\vX}$,
+$\ho[\vG,d=0]$,
+$\ho[\vH,*]$,
+$\ho[\vDelta,d=\vi]{\vX}$
\end{LTXexample}
Of course, you can define similar commands for cocycles, coboundaries, and all sorts of other entities that show up in homological algebra.
@@ -1643,7 +1624,7 @@ You might also want to implement feature like reduced cohomology, \v{C}ech cohom
and hypercohomology. This is quite easy with the \lstinline!command! key:
\begin{lstlisting}
\SetupClass\MyVar{
- definekeys={
+ define keys={
{reduced}{command=\widetilde},
{cech}{command=\check},
{hyper}{command=\mathbb},
@@ -1651,7 +1632,7 @@ and hypercohomology. This is quite easy with the \lstinline!command! key:
}
\end{lstlisting}
\SetupClass\MyVar{
- definekeys={
+ define keys={
{reduced}{command=\widetilde},
{cech}{command=\check},
{hyper}{command=\mathbb},
@@ -1659,23 +1640,22 @@ and hypercohomology. This is quite easy with the \lstinline!command! key:
}
\begin{LTXexample}
-$\co[reduced]{i}$,
-$\co[cech]{*}$,
-$\co[hyper,cech]{0}{\vX}$
+$\co[reduced,d=\vi]$,
+$\co[cech][*]$,
+$\co[hyper,cech,d=0]{\vX}$
\end{LTXexample}
-The \lstinline!Cohomology! class type also provides a nice way
-to implement derived functors:
+You can use a similar approach to define commands for derived functors:
\begin{lstlisting}
-\NewObject\MyCohomology\Lder{\mathbb{L}}[nopar]
-\NewObject\MyCohomology\Rder{\mathbb{R}}[nopar]
+\NewObject\MyVar\Lder{\mathbb{L}}[no par]
+\NewObject\MyVar\Rder{\mathbb{R}}[no par]
\end{lstlisting}
-\NewObject\MyCohomology\Lder{\mathbb{L}}[nopar]
-\NewObject\MyCohomology\Rder{\mathbb{R}}[nopar]
+\NewObject\MyVar\Lder{\mathbb{L}}[no par]
+\NewObject\MyVar\Rder{\mathbb{R}}[no par]
For instance, we can write
\begin{LTXexample}
-$\Lder{\vi}{\vf}$,
-$\Rder{0}{\vf}$
+$\Lder[d=\vi]{\vf}$,
+$\Rder[d=0]{\vf}$
\end{LTXexample}
Alternatively, the user might prefer to use keyval syntax
@@ -1683,39 +1663,39 @@ on the level of the function itself (\( \vf \)~in this case).
This can be done the following way:
\begin{lstlisting}
\SetupClass\MyVar{
- definekeys[1]={
+ define keys[1]={
{Lder} {
- leftreturn, symbolputleft=\mathbb{L}^{#1},
+ left return, symbol put left=\mathbb{L}^{#1},
},
{Rder} {
- leftreturn, symbolputleft=\mathbb{R}^{#1},
+ left return, symbol put left=\mathbb{R}^{#1},
},
},
- definekeys={
+ define keys={
{Lder} {
- leftreturn, symbolputleft=\mathbb{L},
+ left return, symbol put left=\mathbb{L},
},
{Rder} {
- leftreturn, symbolputleft=\mathbb{R},
+ left return, symbol put left=\mathbb{R},
},
},
}
\end{lstlisting}
\SetupClass\MyVar{
- definekeys[1]={
+ define keys[1]={
{Lder} {
- leftreturn, symbolputleft=\mathbb{L}^{#1},
+ left return, symbol put left=\mathbb{L}^{#1},
},
{Rder} {
- leftreturn, symbolputleft=\mathbb{R}^{#1},
+ left return, symbol put left=\mathbb{R}^{#1},
},
},
- definekeys={
+ define keys={
{Lder} {
- leftreturn, symbolputleft=\mathbb{L},
+ left return, symbol put left=\mathbb{L},
},
{Rder} {
- leftreturn, symbolputleft=\mathbb{R},
+ left return, symbol put left=\mathbb{R},
},
},
}
@@ -1741,13 +1721,13 @@ $\RHom{\vX,\vY}$
\chapter{Keyval syntax in arguments (Example: Cohomology with coefficients)}\label{ch:arg_keyval}
\SetupClass\MyVar{
- defineargkeys[1]={
- {coef}{ othersep={;}{#1} },
+ define arg keys[1]={
+ {coef}{ other sep={;}{#1} },
},
}
\SetupObject\co{
- argkeyval=true,
+ arg keyval=true,
}
Imagine we want to do cohomology with coefficients in some ring~\( \vR \).
@@ -1758,23 +1738,23 @@ $\co{*}{\vX,coef=\vR}$
\end{LTXexample}
This shows that arguments of functions also support keyval syntax.
To define argument keys,
-we use the key~\lstinline!defineargkeys!,
-or~\mylst!defineargkeys[$n$]! if you want it to be
+we use the key~\lstinline!define arg keys!,
+or~\mylst!define arg keys[$n$]! if you want it to be
able to take $n$~values for~$n=0,1,2,\ldots,9$. The syntax for these is
-just like the syntax for the keys~\lstinline!definekeys!
-and~\mbox{\mylst!definekeys[$n$]!}.
+just like the syntax for the keys~\lstinline!define keys!
+and~\mbox{\mylst!define keys[$n$]!}.
However, for reasons we shall see in a moment, argument
keys (at least those taking values) are actually turned off
by default, so we shall have to turn them on first:
\begin{lstlisting}
\SetupClass\MyVar{
- argkeyval=true, % this turns keyval syntax in arguments on
- defineargkeys[1]={
- {coef}{ othersep={;}{#1} },
+ arg keyval=true, % this turns keyval syntax in arguments on
+ define arg keys[1]={
+ {coef}{ other sep={;}{#1} },
},
}
\end{lstlisting}
-The key \lstinline!othersep! is a key that controls the separator
+The key \lstinline!other sep! is a key that controls the separator
between the current argument and the previous argument (it will only be printed if there was a previous argument). By default, this separator is a comma. So in the syntax~\lstinline!\co{*}{\vX,coef=\vR}!,
there are two arguments, \lstinline!\vX! and~\lstinline!\vR!, and the separator is a semicolon.
We shall later (see~\cref{ch:parse_coho_coef})
@@ -1792,8 +1772,8 @@ $\Hom[\sheafreg[\vU]]{
}$
\end{LTXexample}
-The key~\lstinline!argkeyval! can take four arguments: \lstinline!true! (which we used above, keyval syntax is completely on),
-\lstinline!false! (no keys allowed), \lstinline!singlekeys! (the default behaviour where only keys taking no values are allowed), and \lstinline!onesinglekey! (only allows one key, taking no value).
+The key~\lstinline!arg keyval! can take four arguments: \lstinline!true! (which we used above, keyval syntax is completely on),
+\lstinline!false! (no keys allowed), \lstinline!single keys! (the default behaviour where only keys taking no values are allowed), and \lstinline!one single key! (only allows one key, taking no value).
It should be noted that there are several predefined
argument keys on the level
@@ -1836,75 +1816,78 @@ Our solution for left indices in \semantex is based directly on the one
from \pack{leftindex}. However, it works much better if you use \semantex
than if you just used \pack{leftindex} alone, due to the ability to centrally control all your notation. This allows you to choose height and slanting phantoms once and for all in the preamble and never have to worry about it in your document body.
-Just like we have the keys \lstinline!upper!, \lstinline!lower!, \lstinline!sepupper!, \lstinline!seplower!, \lstinline!commaupper!, \mbox{\lstinline!commalower!,} we have a similar collection of keys for left
+Just like we have the keys \lstinline!upper!, \lstinline!lower!, \lstinline!sep upper!, \lstinline!sep lower!, \lstinline!comma upper!, \lstinline!comma lower!, we have a similar collection of keys for left
indices:
-\lstinline!upperleft!, \lstinline!lowerleft!, \mbox{\lstinline!sepupperleft!,} \lstinline!seplowerleft!, \lstinline!commaupperleft!, \lstinline!commalowerleft!:
+\lstinline!upper left!, \lstinline!lower left!, \lstinline!sep upper left!, \lstinline!sep lower left!, \lstinline!comma upper left!, \lstinline!comma lower left!:
\begin{LTXexample}
-$ \vf[upperleft=*] $,
-$ \vGamma[upperleft=*] $,
-$ \vA[upperleft=*] $
+$ \vf[upper left=*] $,
+$ \vGamma[upper left=*] $,
+$ \vA[upper left=*] $
\end{LTXexample}
When you create a new object in \semantex, the height and slanting phantoms
will automatically be set to be equal to the symbol. However, as we see
above, we sometimes need to change them.
-This can be done using the keys \lstinline!heightphantom!
-and~\lstinline!slantingphantom!:
+This can be done using the keys \lstinline!height phantom!
+and~\lstinline!slanting phantom!:
\begin{LTXexample}
\SetupObject\vGamma{
- slantingphantom=I}
-\SetupObject\vA{slantingphantom=P}
-$ \vf[upperleft=*] $,
-$ \vGamma[upperleft=*] $,
-$ \vA[upperleft=*] $
+ slanting phantom=I}
+\SetupObject\vA{slanting phantom=P}
+$ \vf[upper left=*] $,
+$ \vGamma[upper left=*] $,
+$ \vA[upper left=*] $
\end{LTXexample}
Sometimes, changing the slanting phantom is not quite enough.
In the previous example, the star is still not quite close enough
to the~\( \vA \), and there is no slanting phantom that is quite slanted enough to correct this. We solve this using
-the key~\lstinline!postupperleft!. What you add using this key
+the key~\lstinline!post upper left!. What you add using this key
will be printed after the upper left index, provided the upper left index
is non-empty and hence will be printed in the first place.
-There is also a \lstinline!preupperleft!, and there are similarly \lstinline!prelowerleft!, \lstinline!postlowerleft!, \lstinline!preupper!, \lstinline!postupper!, \lstinline!prelower!, and~\lstinline!postlower!.
+There is also a \lstinline!pre upper left!, and there are similarly \lstinline!pre lower left!, \lstinline!post lower left!, \lstinline!pre upper!, \lstinline!post upper!, \lstinline!pre lower!, and~\lstinline!post lower!.
Let us see it in action:
\begin{LTXexample}
\SetupObject\vA{
- slantingphantom=P,
- postupperleft=\!,
+ slanting phantom=P,
+ post upper left=\!,
}
-$ \vA[upperleft=*] $
+$ \vA[upper left=*] $
\end{LTXexample}
Note that \semantex at least does its best to try to guess
new height and slanting phantoms when you use operations on objects:
\begin{LTXexample}
-$ \vA[spar=\Bigg,upperleft=*] $,
+$ \vA[spar=\Bigg,upper left=*] $,
$ \vP[command=\overline,return,
- upperleft=*] $
+ upper left=*] $
\end{LTXexample}
\chapter{The \texorpdfstring{\texttt{Symbol}}{Symbol} class type (Example: Derived tensor products and fibre products)}
\NewSymbolClass\MyBinaryOperator[
- definekeys={
+ define keys={
{Lder}{upper=L},
{Rder}{upper=R},
},
]
\NewObject\MyBinaryOperator\tensor{\otimes}[
- definekeys={
+ define keys={
{der}{Lder},
},
]
\NewObject\MyBinaryOperator\fibre{\times}[
% Americans are free to call it \fiber instead
- definekeys={
+ define keys={
{der}{Rder},
},
]
\semantex has facilities for printing tensor products~\( \tensor \) as well as derived tensor products~\( \tensor[der] \).
-For this, we need the \lstinline!Symbol! class type.
+This is probably the right time to reveal that \semantex supports multiple class \emph{types}.
+So far, we have been exclusively using the \lstinline!Variable!
+class type, which is what you create when you apply the command~\lstinline!\NewVariableClass!.
+The first other class type we shall need is the \lstinline!Symbol! class type.
This has exactly the same syntax as the \lstinline!Variable!
class type, except that it cannot take an argument.
In other words, its syntax is
@@ -1915,21 +1898,21 @@ You should normally only use it for special constructions like binary operators
Let us try to use it to define tensor products and fibre products:
\begin{lstlisting}
\NewSymbolClass\MyBinaryOperator[
- definekeys={
+ define keys={
{Lder}{upper=L},
{Rder}{upper=R},
},
]
\NewObject\MyBinaryOperator\tensor{\otimes}[
- definekeys={
+ define keys={
{der}{Lder},
},
]
\NewObject\MyBinaryOperator\fibre{\times}[
% Americans are free to call it \fiber instead
- definekeys={
+ define keys={
{der}{Rder},
},
]
@@ -1945,29 +1928,21 @@ $\vk \tensor[\vA,der] \vk$,
$\vX \fibre[\vY,der] \vX$
\end{LTXexample}
-\chapter{The \texorpdfstring{\texttt{Delimiter}}{Delimiter} class type}
+\chapter{Paired delimiters}
-\NewDelimiterClass\MyDelim[parent=\MyVar]
-\NewObject\MyDelim\norm{\lVert}{\rVert}[
- definekeys[1]={
- {default}{ outputoptions={ default={#1} } },
+\NewObject\MyVar\norm[
+ left par=\lVert, right par=\rVert,
+ define keys[1]={
+ {default}{ output options={ default={#1} } },
},
]
-\NewObject\MyDelim\inner{\langle}{\rangle}
+\NewObject\MyVar\inner[left par=\langle, right par=\rangle]
-Delimiters are what they sound like: functions like \( \norm{slot} \) and~\( \inner{slot,slot} \)
-that are defined using brackets only. Let us define a class of type \lstinline!Delimiter!:
-\begin{lstlisting}
-\NewDelimiterClass\MyDelim[parent=\MyVar]
-\end{lstlisting}
-Now we can create instances of the class~\lstinline!\MyDelim! with the following syntax:
+In this chapter, se show how to define delimiter commands like \( \norm{slot} \) and~\( \inner{slot,slot} \).
+This is easy to do via the keys \lstinline!left par! and~\lstinline!right par!:
\begin{lstlisting}
-\NewObject\MyDelim@\usercommand\<object\>@{@\<left bracket\>@}{@\<right bracket\>@}[@\<options\>@]
-\end{lstlisting}
-Now we can do the following:
-\begin{lstlisting}
-\NewObject\MyDelim\norm{\lVert}{\rVert}
-\NewObject\MyDelim\inner{\langle}{\rangle}
+\NewObject\MyVar\norm[left par=\lVert, right par=\rVert]
+\NewObject\MyVar\inner[left par=\langle, right par=\rangle]
\end{lstlisting}
Indeed:
\begin{LTXexample}
@@ -1977,13 +1952,13 @@ $\inner{slot,slot}$
\end{LTXexample}
In the case where you want to use different kinds of
norms, say \( \norm[2]{slot} \) or~\( \norm[\infty]{slot} \),
-you can use the key~\mylst!outputoptions={$\<options\>$}!.
+you can use the key~\mylst!output options={$\<options\>$}!.
This allows you to pass the~\<options\> to the output class
(in this case,~\lstinline!\MyVar!):
\begin{lstlisting}
\SetupObject\norm{
- definekeys[1]={
- {default}{ outputoptions={ default={#1} } },
+ define keys[1]={
+ {default}{ output options={ default={#1} } },
},
}
\end{lstlisting}
@@ -1993,7 +1968,7 @@ $\norm[2]{\vx}$,
$\norm[\infty]{\vx}$
\end{LTXexample}
-We can also use it for more complicated constructions, like sets.
+We can also create for more complicated constructions, like sets.
The following is inspired from the \pack{mathtools} package where a similar construction is created using the commands from that package. My impression is that Lars Madsen is the main mastermind behind the code I use for the \lstinline!\where!~construction:
\begin{lstlisting}
\newcommand\wherecommand[1]{
@@ -2006,10 +1981,11 @@ The following is inspired from the \pack{mathtools} package where a similar cons
\NewObject\MyVar\where{ \wherecommand{\SemantexDelimiterSize} }
-\NewObject\MyDelim\Set{\lbrace}{\rbrace}[
- prearg={\,},postarg={\,},
+\NewObject\MyVar\Set[
+ left par=\lbrace, right par=\rbrace,
+ pre arg={\,},post arg={\,},
% adds \, inside {...}, as recommended by D. Knuth
- argkeyval=false,
+ arg keyval=false,
% this turns off all keyval syntax in the argument
]
\end{lstlisting}
@@ -2023,10 +1999,11 @@ The following is inspired from the \pack{mathtools} package where a similar cons
\NewObject\MyVar\where{ \wherecommand{\SemantexDelimiterSize} }
-\NewObject\MyDelim\Set{\lbrace}{\rbrace}[
- prearg={\,},postarg={\,},
+\NewObject\MyVar\Set[
+ left par=\lbrace, right par=\rbrace,
+ pre arg={\,},post arg={\,},
% adds \, inside {...}, as recommended by D. Knuth
- argkeyval=false,
+ arg keyval=false,
% this turns off all keyval syntax in the argument
]
@@ -2040,7 +2017,7 @@ Now you can use
$\Set{ \vx\in\vY \where \vx\ge0 }$,
$\Set[par=\big]{ \vx\in\vY \where \vx\ge0 }$
\end{LTXexample}
-Don't forget that, since the class~\lstinline!\MyDelim! inherits from~\lstinline!\MyVar!,
+Don't forget that, because we called~\lstinline!output=\MyVar! in the beginning of this manual,
the output of any of these commands also belongs to class~\lstinline!\MyVar!.
So you can do stuff like
\begin{LTXexample}
@@ -2054,18 +2031,22 @@ $\Set{
Tuple-like commands are also possible:
\begin{lstlisting}
-\NewObject\MyDelim\tup{(}{)} % tuples
-\NewObject\MyDelim\pcoor{[}{]}[ % projective coordinates
- setargsep=\mathpunct{:},
+\NewObject\MyVar\tup[left par=(,right par=)] % tuples
+\NewObject\MyVar\pcoor[ % projective coordinates
+ left par={[}, right par={]},
+ set arg sep=\mathpunct{:},
% changes the argument separator to colon
- setargdots=\cdots,
- % changes what is inserted if you write "..."
+ set arg dots=\dotsb,
+ % changes what is inserted if you write "..."
]
\end{lstlisting}
-\NewObject\MyDelim\tup{(}{)} % tuples
-\NewObject\MyDelim\pcoor{[}{]}[ % projective coordinates
- setargsep=\mathpunct{:}, % changes the argument separator to :
- setargdots=\cdots, % changes what is inserted if you write "..."
+\NewObject\MyVar\tup[left par=(,right par=)] % tuples
+\NewObject\MyVar\pcoor[ % projective coordinates
+ left par={[}, right par={]},
+ set arg sep=\mathpunct{:},
+ % changes the argument separator to colon
+ set arg dots=\dotsb,
+ % changes what is inserted if you write "..."
]
Let us see them in action:
\begin{LTXexample}
@@ -2073,11 +2054,11 @@ $\tup{\va,\vb,...,\vz}$,
$\pcoor{\va,\vb,...,\vz}$
\end{LTXexample}
-One can also use delimiters for other, less obvious purposes, like calculus differentials:
+One can use similar techniques for other, less obvious purposes, like calculus differentials:
\begin{lstlisting}
-\NewDelimiterClass\CalculusDifferential[
+\NewVariableClass\CalculusDifferential[
parent=\MyVar,
- defineargkeys[1]={
+ define arg keys[1]={
{default}{sep={d\!#1}},
% default is the key that is automatically applied by the
% system to anything you write in the argument that is
@@ -2085,26 +2066,26 @@ One can also use delimiters for other, less obvious purposes, like calculus diff
% is a key that prints the value of the key with the
% standard argument separator in front.
},
- setargdots=\cdots,
- neverpar,
- % neverpar is like nopar, except nopar will still print
+ set arg dots=\dotsm,
+ never par,
+ % never par is like no par, except no par will still print
% parentheses when there is more than one argument
- % -- neverpar does not even print parentheses in this case
+ % -- never par does not even print parentheses in this case
]
-\NewObject\CalculusDifferential\intD{(}{)}[
- setargsep={\,},
- nextargwithsep=true,
+\NewObject\CalculusDifferential\intD[
+ set arg sep={\,},
+ next arg with sep=true,
% because of this, even the first argument will
% receive a separator, which in this case
% is a small space
]
-\NewObject\CalculusDifferential\wedgeD{(}{)}[setargsep=\wedge]
+\NewObject\CalculusDifferential\wedgeD[set arg sep=\wedge]
\end{lstlisting}
-\NewDelimiterClass\CalculusDifferential[
+\NewVariableClass\CalculusDifferential[
parent=\MyVar,
- defineargkeys[1]={
+ define arg keys[1]={
{default}{sep={d\!#1}},
% default is the key that is automatically applied by the
% system to anything you write in the argument that is
@@ -2112,16 +2093,22 @@ One can also use delimiters for other, less obvious purposes, like calculus diff
% is a key that prints the value of the key with the
% standard argument separator in front.
},
- setargdots=\cdots,
- neverpar,
- % neverpar is like nopar, except nopar will still print
+ set arg dots=\dotsm,
+ never par,
+ % never par is like no par, except no par will still print
% parentheses when there is more than one argument
- % -- neverpar does not even print parentheses in this case
+ % -- never par does not even print parentheses in this case
]
-\NewObject\CalculusDifferential\intD{(}{)}[setargsep={\,},nextargwithsep=true]
+\NewObject\CalculusDifferential\intD[
+ set arg sep={\,},
+ next arg with sep=true,
+ % because of this, even the first argument will
+ % receive a separator, which in this case
+ % is a small space
+]
-\NewObject\CalculusDifferential\wedgeD{(}{)}[setargsep=\wedge]
+\NewObject\CalculusDifferential\wedgeD[set arg sep=\wedge]
\begin{LTXexample}
$\int \vf \intD{\vx[1],
@@ -2131,7 +2118,7 @@ $\int \vf \wedgeD{\vx[1],
\vx[2],...,\vx[n]}$
\end{LTXexample}
-\chapter{Using \texorpdfstring{Seman\!\TeX{}}{SemanTeX} in other commands using \texorpdfstring{\texttt{\textbackslash UseClassInCommand}}{\UseClassInCommand}}\label{sec:UseClassInCommand}
+\chapter{Using \texorpdfstring{Seman\!\TeX{}}{SemanTeX} in other commands using \texorpdfstring{\texttt{\textbackslash UseClassInCommand}}{\string\UseClassInCommand}}\label{sec:UseClassInCommand}
\SemantexRecordObject{\Frac}
\newcommand\Frac[2]{
@@ -2332,28 +2319,28 @@ of other situations, like
\NewObject\MyVar\Mat{\operatorname{Mat}}[
% We provide data sets "rows" and "columns" to
% be set up by the user later
- dataprovide={rows},
- dataprovide={columns},
- dataprovide={field},
- definekeys[1]={
- {rows}{ dataset={rows}{#1} }, % set the rows data set
- {columns}{ dataset={columns}{#1} }, % set the columns data set
- {field}{ dataset={field}{#1} }, % set the underlying field
+ data provide={rows},
+ data provide={columns},
+ data provide={field},
+ define keys[1]={
+ {rows}{ data set={rows}{#1} }, % set the rows data set
+ {columns}{ data set={columns}{#1} }, % set the columns data set
+ {field}{ data set={field}{#1} }, % set the underlying field
{arg}{ field={#1} },
% this way, setting the argument becomes equivalent
% to specifying the underlying field
},
- parseoptions={ % Here we add code to the parse routine
+ parse options={ % Here we add code to the parse routine
% We check whether columns = rows. If so, we only write
% the number once
- strifeqTF={\SemantexDataGetExpNot{columns}}{\SemantexDataGetExpNot{rows}}
+ str if eq TF={\SemantexDataGetExpNot{columns}}{\SemantexDataGetExpNot{rows}}
{
- setkeysx={
+ set keys x={
lower={\SemantexDataGetExpNot{columns}},
},
}
{
- setkeysx={
+ set keys x={
lower={
\SemantexDataGetExpNot{rows}
\times
@@ -2361,9 +2348,9 @@ of other situations, like
},
},
},
- ifblankF={\SemantexDataGetExpNot{field}}
+ if blank F={\SemantexDataGetExpNot{field}}
{
- setargkeysx={
+ set arg keys x={
sep={\SemantexDataGetExpNot{field}},
},
},
@@ -2373,23 +2360,23 @@ of other situations, like
\NewObject\MyVar\GL{\operatorname{GL}}[
% We provide a few data sets:
- dataprovide=order, % The "order" will be the number n in GL_n(k)
- dataprovide=field, % The "field" is of course the k in GL_n(k)
- definekeys[1]={
- {order}{ dataset={order}{#1} }, % Sets the order
- {field}{ dataset={field}{#1} }, % Sets the field
+ data provide=order, % The "order" will be the number n in GL_n(k)
+ data provide=field, % The "field" is of course the k in GL_n(k)
+ define keys[1]={
+ {order}{ data set={order}{#1} }, % Sets the order
+ {field}{ data set={field}{#1} }, % Sets the field
{arg}{ field={#1} },
% This way, setting the argument becomes equivalent
% to setting the field
},
- parseoptions={
- setkeysx={
+ parse options={
+ set keys x={
% This means set the keys, but fully expand their values first
lower={\SemantexDataGetExpNot{order}},
},
- ifblankF={\SemantexDataGetExpNot{field}}
+ if blank F={\SemantexDataGetExpNot{field}}
{
- setargkeysx={
+ set arg keys x={
% Set the argument keys, but fully expand their values first
sep={\SemantexDataGetExpNot{field}},
},
@@ -2398,24 +2385,24 @@ of other situations, like
]
\SetupObject\co{
- dataprovide=coefficient,
- dataprovide=space,
- definekeys[1]={
- {coef}{ dataset={coefficient}{#1} },
- {space}{ dataset={space}{#1} },
+ data provide=coefficient,
+ data provide=space,
+ define keys[1]={
+ {coef}{ data set={coefficient}{#1} },
+ {space}{ data set={space}{#1} },
{arg}{ space={#1} },
},
- parseoptions={
- ifblankF={\SemantexDataGetExpNot{space}}
+ parse options={
+ if blank F={\SemantexDataGetExpNot{space}}
{
- setargkeysx={
+ set arg keys x={
sep=\SemantexDataGetExpNot{space},
},
},
- ifblankF={\SemantexDataGetExpNot{coefficient}}
+ if blank F={\SemantexDataGetExpNot{coefficient}}
{
- setargkeysx={
- othersep={;}{ \SemantexDataGetExpNot{coefficient} },
+ set arg keys x={
+ other sep={;}{ \SemantexDataGetExpNot{coefficient} },
},
},
},
@@ -2438,7 +2425,7 @@ executed right before
an object (or class) is being rendered (but before it outputs).
By default, the parse routine contains no code.
However, you can add code to it using the
-key~\mylst!parseoptions={$\<keys\>$}!.
+key~\mylst!parse options={$\<keys\>$}!.
Even though the \lstinline!parse!~routine is automatically invoked right before rendering, you can also invoke it at any time by force
using the key~\lstinline!parse!. This will also empty the code from the
@@ -2468,9 +2455,9 @@ as~\(
We can in principle do the following:
\begingroup
\SetupObject\GL{
- dataclear=parseoptions,
- definekeys[1]={
- {arg}{ setargkeys={sep=#1} }
+ data clear=parse options,
+ define keys[1]={
+ {arg}{ set arg keys={sep=#1} }
},
}
\begin{lstlisting}
@@ -2499,23 +2486,23 @@ To set up the notation from above, we do the following:
\begin{lstlisting}
\NewObject\MyVar\GL{\operatorname{GL}}[
% We provide a few data sets:
- dataprovide=order, % The "order" will be the number n in GL_n(k)
- dataprovide=field, % The "field" is of course the k in GL_n(k)
- definekeys[1]={
- {order}{ dataset={order}{#1} }, % Sets the order
- {field}{ dataset={field}{#1} }, % Sets the field
+ data provide=order, % The "order" will be the number n in GL_n(k)
+ data provide=field, % The "field" is of course the k in GL_n(k)
+ define keys[1]={
+ {order}{ data set={order}{#1} }, % Sets the order
+ {field}{ data set={field}{#1} }, % Sets the field
{arg}{ field={#1} },
% This way, setting the argument becomes equivalent
% to setting the field
},
- parseoptions={
- setkeysx={
+ parse options={
+ set keys x={
% This means set the keys, but fully expand their values first
lower={\SemantexDataGetExpNot{order}},
},
- ifblankF={\SemantexDataGetExpNot{field}}
+ if blank F={\SemantexDataGetExpNot{field}}
{
- setargkeysx={
+ set arg keys x={
% Set the argument keys, but fully expand their values first
sep={\SemantexDataGetExpNot{field}},
},
@@ -2548,28 +2535,28 @@ We accomplish this by the following:
\NewObject\MyVar\Mat{\operatorname{Mat}}[
% We provide data sets "rows" and "columns" to
% be set up by the user later
- dataprovide={rows},
- dataprovide={columns},
- dataprovide={field},
- definekeys[1]={
- {rows}{ dataset={rows}{#1} }, % set the rows data set
- {columns}{ dataset={columns}{#1} }, % set the columns data set
- {field}{ dataset={field}{#1} }, % set the underlying field
+ data provide={rows},
+ data provide={columns},
+ data provide={field},
+ define keys[1]={
+ {rows}{ data set={rows}{#1} }, % set the rows data set
+ {columns}{ data set={columns}{#1} }, % set the columns data set
+ {field}{ data set={field}{#1} }, % set the underlying field
{arg}{ field={#1} },
% this way, setting the argument becomes equivalent
% to specifying the underlying field
},
- parseoptions={ % Here we add code to the parse routine
+ parse options={ % Here we add code to the parse routine
% We check whether columns = rows. If so, we only write
% the number once
- strifeqTF={\SemantexDataGetExpNot{columns}}{\SemantexDataGetExpNot{rows}}
+ str if eq TF={\SemantexDataGetExpNot{columns}}{\SemantexDataGetExpNot{rows}}
{
- setkeysx={
+ set keys x={
lower={\SemantexDataGetExpNot{columns}},
},
}
{
- setkeysx={
+ set keys x={
lower={
\SemantexDataGetExpNot{rows}
\times
@@ -2577,9 +2564,9 @@ We accomplish this by the following:
},
},
},
- ifblankF={\SemantexDataGetExpNot{field}}
+ if blank F={\SemantexDataGetExpNot{field}}
{
- setargkeysx={
+ set arg keys x={
sep={\SemantexDataGetExpNot{field}},
},
},
@@ -2601,24 +2588,24 @@ and show how to set up a syntax like the below:
\begin{lstlisting}
\SetupObject\co{
- dataprovide=coefficient,
- dataprovide=space,
- definekeys[1]={
- {coef}{ dataset={coefficient}{#1} },
- {space}{ dataset={space}{#1} },
+ data provide=coefficient,
+ data provide=space,
+ define keys[1]={
+ {coef}{ data set={coefficient}{#1} },
+ {space}{ data set={space}{#1} },
{arg}{ space={#1} },
},
- parseoptions={
- ifblankF={\SemantexDataGetExpNot{space}}
+ parse options={
+ if blank F={\SemantexDataGetExpNot{space}}
{
- setargkeysx={
+ set arg keys x={
sep=\SemantexDataGetExpNot{space},
},
},
- ifblankF={\SemantexDataGetExpNot{coefficient}}
+ if blank F={\SemantexDataGetExpNot{coefficient}}
{
- setargkeysx={
- othersep={;}{ \SemantexDataGetExpNot{coefficient} },
+ set arg keys x={
+ other sep={;}{ \SemantexDataGetExpNot{coefficient} },
},
},
},
@@ -2636,42 +2623,42 @@ $\co[d=0,space=\vX,coef=\vR]$
Let us look at a more complicated example: Let us create a command for partial derivatives:
\NewObject\MyVar\partialdif[
- nopar,
- boolprovide={raisefunction},
- boolsettrue={raisefunction},
- setidots=\cdots,
- setisep=\,,
- definekeys[1]={
+ no par,
+ bool provide={raise function},
+ bool set true={raise function},
+ set i dots=\dotsm,
+ set i sep={\,},
+ define keys[1]={
{default}{
- sepi={\partial #1},
+ sep i={\partial #1},
},
{raise}{
- strifeqTF={#1}{true}
+ str if eq TF={#1}{true}
{
- boolsettrue={raisefunction},
+ bool set true={raise function},
}
{
- strifeqTF={#1}{false}
+ str if eq TF={#1}{false}
{
- boolsetfalse={raisefunction},
+ bool set false={raise function},
}
{
- ERRORkeyvaluenotfound={raise}{#1},
+ ERROR key value not found={raise}{#1},
},
},
},
},
- parseoptions={
- ifblankTF={ \SemantexDataGetExpNot{upper} }
+ parse options={
+ if blank TF={ \SemantexDataGetExpNot{upper} }
{
- intifgreaterTF={ \SemantexIntGet{numberoflowerindices} } { 1 }
+ int if greater TF={ \SemantexIntGet{number of lower indices} } { 1 }
{
- setkeysx={
+ set keys x={
symbol={
\SemantexExpNot\frac
{
- \partial ^ { \SemantexIntGet{numberoflowerindices} }
- \SemantexBoolIfT{raisefunction}
+ \partial ^ { \SemantexIntGet{number of lower indices} }
+ \SemantexBoolIfT{raise function}
{
\SemantexDataGetExpNot{arg}
}
@@ -2683,12 +2670,12 @@ Let us look at a more complicated example: Let us create a command for partial d
},
}
{
- setkeysx={
+ set keys x={
symbol={
\SemantexExpNot\frac
{
\partial
- \SemantexBoolIfT{raisefunction}
+ \SemantexBoolIfT{raise function}
{
\SemantexDataGetExpNot{arg}
}
@@ -2701,12 +2688,12 @@ Let us look at a more complicated example: Let us create a command for partial d
},
}
{
- setkeysx={
+ set keys x={
symbol={
\SemantexExpNot\frac
{
\partial ^ { \SemantexDataGetExpNot{upper} }
- \SemantexBoolIfT{raisefunction}
+ \SemantexBoolIfT{raise function}
{
\SemantexDataGetExpNot{arg}
}
@@ -2717,54 +2704,54 @@ Let us look at a more complicated example: Let us create a command for partial d
},
},
},
- dataclear={lower},
- dataclear={upper},
- boolifT={raisefunction}
+ data clear={lower},
+ data clear={upper},
+ bool if T={raise function}
{
- dataclear={arg},
- intclear={numberofarguments},
+ data clear={arg},
+ int clear={number of arguments},
},
},
]
\begin{lstlisting}
\NewObject\MyVar\partialdif[
- nopar,
- boolprovide={raisefunction},
- boolsettrue={raisefunction},
- setidots=\cdots,
- setisep=\,,
- definekeys[1]={
+ no par,
+ bool provide={raise function},
+ bool set true={raise function},
+ set i dots=\dotsm,
+ set i sep={\,},
+ define keys[1]={
{default}{
- sepi={\partial #1},
+ sep i={\partial #1},
},
{raise}{
- strifeqTF={#1}{true}
+ str if eq TF={#1}{true}
{
- boolsettrue={raisefunction},
+ bool set true={raise function},
}
{
- strifeqTF={#1}{false}
+ str if eq TF={#1}{false}
{
- boolsetfalse={raisefunction},
+ bool set false={raise function},
}
{
- ERRORkeyvaluenotfound={raise}{#1},
+ ERROR key value not found={raise}{#1},
},
},
},
},
- parseoptions={
- ifblankTF={ \SemantexDataGetExpNot{upper} }
+ parse options={
+ if blank TF={ \SemantexDataGetExpNot{upper} }
{
- intifgreaterTF={ \SemantexIntGet{numberoflowerindices} } { 1 }
+ int if greater TF={ \SemantexIntGet{number of lower indices} } { 1 }
{
- setkeysx={
+ set keys x={
symbol={
\SemantexExpNot\frac
{
- \partial ^ { \SemantexIntGet{numberoflowerindices} }
- \SemantexBoolIfT{raisefunction}
+ \partial ^ { \SemantexIntGet{number of lower indices} }
+ \SemantexBoolIfT{raise function}
{
\SemantexDataGetExpNot{arg}
}
@@ -2776,12 +2763,12 @@ Let us look at a more complicated example: Let us create a command for partial d
},
}
{
- setkeysx={
+ set keys x={
symbol={
\SemantexExpNot\frac
{
\partial
- \SemantexBoolIfT{raisefunction}
+ \SemantexBoolIfT{raise function}
{
\SemantexDataGetExpNot{arg}
}
@@ -2794,12 +2781,12 @@ Let us look at a more complicated example: Let us create a command for partial d
},
}
{
- setkeysx={
+ set keys x={
symbol={
\SemantexExpNot\frac
{
\partial ^ { \SemantexDataGetExpNot{upper} }
- \SemantexBoolIfT{raisefunction}
+ \SemantexBoolIfT{raise function}
{
\SemantexDataGetExpNot{arg}
}
@@ -2810,12 +2797,12 @@ Let us look at a more complicated example: Let us create a command for partial d
},
},
},
- dataclear={lower},
- dataclear={upper},
- boolifT={raisefunction}
+ data clear={lower},
+ data clear={upper},
+ bool if T={raise function}
{
- dataclear={arg},
- intclear={numberofarguments},
+ data clear={arg},
+ int clear={number of arguments},
},
},
]
@@ -2897,7 +2884,7 @@ The system has the following limitations:
after~\lstinline!\begin{document}!:
\begin{lstlisting}
\SetupObject\va{
- definekeys[1]={
+ define keys[1]={
{weirdkey}{ upper=\vb[ {#1} ] }
},
}
@@ -3008,11 +2995,11 @@ Let us take a look at the commands defined by \pack{semtex}:
\mylst!\SemantexLeft!,
\mylst!\SemantexRight!
- Like \lstinline!\left...\right!, but fixing some spacing issues
+ Like \lstinline!\left ...\right!, but fixing some spacing issues
around these.
They are completely equivalent to~\lstinline!\mleft! and~\lstinline!\mright!
from the package~\pack{mleftright}, so it is safe to just load that package
- and replace the above commands by \lstinline!\mleft...\mright! instead,
+ and replace the above commands by \lstinline!\mleft ...\mright! instead,
or use the redefinitions mentioned above.
\end{itemize}
@@ -3108,10 +3095,10 @@ in the document body have been removed.
\chapter{Known bugs}
-If you write e.g.~\lstinline!Otherspar={[}{]}{\Bigg}!
+If you write e.g.~\lstinline!Other spar={[}{]}{\Bigg}!
in a heading, your command will fail for some reason.
It can be solved by omitting the braces around~\lstinline!\Bigg!,
-i.e.~by replacing it by~\lstinline!Otherspar={[}{]}\Bigg!.
+i.e.~by replacing it by~\lstinline!Other spar={[}{]}\Bigg!.
\chapter{The predefined keys, commands, and data}
@@ -3120,7 +3107,7 @@ Firstly,
the keys that can be used inside the command~\lstinline!\SemantexSetup! are:
\begin{itemize}
- \item \mylst!keyvalparser={$\<command\>$}!
+ \item \mylst!keyval parser={$\<command\>$}!
Sets the keyval parser function to~\<command\>.
The \<command\> must take three arguments:
@@ -3131,7 +3118,7 @@ the keys that can be used inside the command~\lstinline!\SemantexSetup! are:
Another interesting possibility is the command~\lstinline!\ekvparse! from the package~\lstinline!expkv!. This choice will only affect keys for objects and classes,
\emph{not} keys for use inside~\lstinline!\SemantexSetup!.
- \item \mylst!semtexfile={$\values\<true|\default{false}\>$}!
+ \item \mylst!semtex file={$\values\<true|\default{false}\>$}!
When turned on, a \lstinline!.semtex! file will be created while processing the document.
This is mainly relevant when using \lstinline!stripsemantex!.
@@ -3144,63 +3131,112 @@ In the following sections, we include the full list.
\begin{itemize}
\item
- \mylst!definekeys={$\<key definitions\>$}!
+ \mylst!define keys={$\<key definitions\>$}!
Defines keys taking no values.
The syntax is
\begin{lstlisting}
- definekeys={
+ define keys={
{key1}{ upper=3, lower=7 },
{key2}{ lower=6, upper=4 },
},
\end{lstlisting}
\item
- \mylst!definekeys[$n$]={$\<key definitions\>$}!
+ \mylst!define keys[$n$]={$\<key definitions\>$}!
- Defines keys taking $n$~values, where $n=0,1,2,\ldots,9$.
+ Defines keys taking $n$~values, where $n=0,1,2,\dotsc,8$.
The values are accessed by
writing
- \lstinline!#1!,~\lstinline!#2!, \ldots,~\lstinline!#9!.
+ \lstinline!#1!,~\lstinline!#2!, \ldots,~\lstinline!#8!.
+ For technical reasons, nine arguments are not allowed.
The syntax is
\begin{lstlisting}
- definekeys[2]={
+ define keys[2]={
{key1}{ upper=3+#1, lower=7-#2 },
{key2}{ lower=6\cdot#1, upper=4/#2 },
},
\end{lstlisting}
\item
- \mylst!removekey=$\<key name\>$!
+ \mylst!append keys={$\<key definitions\>$}!
+
+ Appends keys taking no values, i.e.~adds code to the right of that key.
+ The syntax is identical to the one for~\lstinline!define keys!.
+
+ \item
+ \mylst!pre append keys={$\<key definitions\>$}!
+
+ Pre-appends keys taking no values, i.e.~adds code to the left of that key.
+ The syntax is identical to the one for~\lstinline!define keys!.
+
+ \item
+ \mylst!append keys[$n$]={$\<key definitions\>$}!
+
+ Appends keys taking $n$~values, where~$n=0,1,\dotsc,8$, i.e.~adds code to the right of that key.
+ The syntax is identical to the one for~\mylst!define keys[$n$]!.
+
+ \item
+ \mylst!pre append keys[$n$]={$\<key definitions\>$}!
+
+ Pre-appends keys taking $n$~values, where~$n=0,1,\dotsc,8$, i.e.~adds code to the left of that key.
+ The syntax is identical to the one for~\mylst!define keys[$n$]!.
+
+ \item
+ \mylst!remove key=$\<key name\>$!
Removes the key~\<key name\> taking no values.
\item
- \mylst!removekey[$n$]=$\<key name\>$!
+ \mylst!remove key[$n$]=$\<key name\>$!
- Removes the key~\<key name\> taking $n$~values, where $n=0,1,2,\ldots,9$.
+ Removes the key~\<key name\> taking $n$~values, where $n=0,1,2,\dotsc,8$.
\item
- \mylst!defineargkeys={$\<key definitions\>$}!
+ \mylst!define arg keys={$\<key definitions\>$}!
Defines argument keys taking no values.
- The syntax is similar to the one for~\lstinline!definekeys!.
+ The syntax is similar to the one for~\lstinline!define keys!.
+
+ \item
+ \mylst!define arg keys[$n$]={$\<key definitions\>$}!
+
+ Defines argument keys taking $n$~values, where $n=0,1,2,\dotsc,8$.
+ The syntax is similar to the one for~\mylst!define keys[$n$]!.
+
+ \item
+ \mylst!append arg keys={$\<key definitions\>$}!
+ Appending argument keys taking no values, i.e.~adds code to the right of that key.
+ The syntax is identical to the one for~\lstinline!define arg keys!.
+
+ \item
+ \mylst!pre append arg keys={$\<key definitions\>$}!
+
+ Pre-appending argument keys taking no values, i.e.~adds code to the left of that key.
+ The syntax is identical to the one for~\lstinline!define arg keys!.
+
\item
- \mylst!defineargkeys[$n$]={$\<key definitions\>$}!
+ \mylst!append arg keys[$n$]={$\<key definitions\>$}!
- Defines argument keys taking $n$~values, where $n=0,1,2,\ldots,9$.
- The syntax is similar to the one for~\mylst!definekeys[$n$]!.
+ Appending argument keys taking $n$~values, where~$n=0,1,\dotsc,8$, i.e.~adds code to the right of that key.
+ The syntax is identical to the one for~\mylst!define arg keys[$n$]!.
\item
- \mylst!removeargkey=$\<key name\>$!
+ \mylst!pre arg append keys[$n$]={$\<key definitions\>$}!
+
+ Pre-appending argument keys taking $n$~values, where~$n=0,1,\dotsc,8$, i.e.~adds code to the left of that key.
+ The syntax is identical to the one for~\mylst!define arg keys[$n$]!.
+
+ \item
+ \mylst!remove arg key=$\<key name\>$!
Removes the argument key~\<key name\> taking no values.
\item
- \mylst!removeargkey[$n$]=$\<key name\>$!
+ \mylst!remove arg key[$n$]=$\<key name\>$!
- Removes the argument key~\<key name\> taking $n$~values, where $n=0,1,2,\ldots,9$.
+ Removes the argument key~\<key name\> taking $n$~values, where $n=0,1,2,\dotsc,8$.
\end{itemize}
\section{Programming keys}\label{sec:programming_keys}
@@ -3212,135 +3248,135 @@ In the following sections, we include the full list.
Executes the \<\TeX\ code\> on the spot.
\item
- \mylst!setkeys={$\<keys\>$}!,
- \mylst!keysset={$\<keys\>$}!
+ \mylst!set keys={$\<keys\>$}!,
+ \mylst!keys set={$\<keys\>$}!
Sets the keys \<keys\>.
\item
- \mylst!setkeysx={$\<keys\>$}!,
- \mylst!keyssetx={$\<keys\>$}!
+ \mylst!set keys x={$\<keys\>$}!,
+ \mylst!keys set x={$\<keys\>$}!
Sets the keys \<keys\>, but fully expands their values.
\item
- \mylst!dataprovide={$\<data\>$}!
+ \mylst!data provide={$\<data\>$}!
Provides a new piece of data consisting of a token list.
\item
- \mylst!dataset={$\<data\>$}{$\<value\>$}!
+ \mylst!data set={$\<data\>$}{$\<value\>$}!
Sets the \<data\> to \<value\>.
\item
- \mylst!datasetx={$\<data\>$}{$\<value\>$}!
+ \mylst!data set x={$\<data\>$}{$\<value\>$}!
Sets the \<data\> to \<value\>, but fully expands the \<value\> first.
\item
- \mylst!dataputleft={$\<data\>$}{$\<value\>$}!
+ \mylst!data put left={$\<data\>$}{$\<value\>$}!
Adds the \<value\> to the left of \<data\>.
\item
- \mylst!dataputleftx={$\<data\>$}{$\<value\>$}!
+ \mylst!data put left x={$\<data\>$}{$\<value\>$}!
Adds the \<value\> to the left of \<data\>, but fully expands the \<value\> first.
\item
- \mylst!dataputright={$\<data\>$}{$\<value\>$}!
+ \mylst!data put right={$\<data\>$}{$\<value\>$}!
Adds the \<value\> to the right of \<data\>.
\item
- \mylst!dataputrightx={$\<data\>$}{$\<value\>$}!
+ \mylst!data put right x={$\<data\>$}{$\<value\>$}!
Adds the \<value\> to the right of \<data\>, but fully expands the \<value\> first.
\item
- \mylst!dataclear={$\<data\>$}!
+ \mylst!data clear={$\<data\>$}!
Clears the piece of data~\<data\>.
\item
- \mylst!boolprovide={$\<boolean\>$}!
+ \mylst!bool provide={$\<boolean\>$}!
Provides a new piece of data consisting of a boolean.
\item
- \mylst!boolsettrue={$\<boolean\>$}!
+ \mylst!bool set true={$\<boolean\>$}!
Sets the \<boolean\> to true.
\item
- \mylst!boolsettrue={$\<boolean\>$}!
+ \mylst!bool set false={$\<boolean\>$}!
Sets the \<boolean\> to false.
\item
- \mylst!boolifTF={$\<boolean\>$}{$\<if true\>$}{$\<if false\>$}!, \\
- \mylst!boolifT={$\<boolean\>$}{$\<if true\>$}!, \\
- \mylst!boolifTF={$\<boolean\>$}{$\<if false\>$}!
+ \mylst!bool if TF={$\<boolean\>$}{$\<if true\>$}{$\<if false\>$}!, \\
+ \mylst!bool if T={$\<boolean\>$}{$\<if true\>$}!, \\
+ \mylst!bool if TF={$\<boolean\>$}{$\<if false\>$}!
Runs \<if~true\> or \<if~false\>, depending on the value of \<boolean\>.
\item
- \mylst!intprovide={$\<integer\>$}!
+ \mylst!int provide={$\<integer\>$}!
Provides a new piece of data consisting of an integer.
\item
- \mylst!intset={$\<integer\>$}{$\<value\>$}!
+ \mylst!int set={$\<integer\>$}{$\<value\>$}!
Sets the \<integer\> to \<value\>.
\item
- \mylst!intincr={$\<integer\>$}!
+ \mylst!int incr={$\<integer\>$}!
Increases the \<integer\> by~\( 1 \).
\item
- \mylst!intifeqTF={$\<integer\num{1}\>$}{$\<integer\num{2}\>$}{$\<if true\>$}{$\<if false\>$}!, \\
- \mylst!intifeqT={$\<integer\num{1}\>$}{$\<integer\num{2}\>$}{$\<if true\>$}!, \\
- \mylst!intifeqF={$\<integer\num{1}\>$}{$\<integer\num{2}\>$}{$\<if false\>$}!
+ \mylst!int if ieq TF={$\<integer\num{1}\>$}{$\<integer\num{2}\>$}{$\<if true\>$}{$\<if false\>$}!, \\
+ \mylst!int if ieq T={$\<integer\num{1}\>$}{$\<integer\num{2}\>$}{$\<if true\>$}!, \\
+ \mylst!int if ieq F={$\<integer\num{1}\>$}{$\<integer\num{2}\>$}{$\<if false\>$}!
Checks whether the integers \<integer\num{1}\> and \<integer\num{2}\> are equal,
and runs \<if~true\> or \<if~false\> accordingly.
\item
- \mylst!intifgreaterTF={$\<integer\num{1}\>$}{$\<integer\num{2}\>$}{$\<if true\>$}{$\<if false\>$}!, \\
- \mylst!intifgreaterT={$\<integer\num{1}\>$}{$\<integer\num{2}\>$}{$\<if true\>$}!, \\
- \mylst!intifgreaterF={$\<integer\num{1}\>$}{$\<integer\num{2}\>$}{$\<if false\>$}!
+ \mylst!int if greater TF={$\<integer\num{1}\>$}{$\<integer\num{2}\>$}{$\<if true\>$}{$\<if false\>$}!, \\
+ \mylst!int if greater T={$\<integer\num{1}\>$}{$\<integer\num{2}\>$}{$\<if true\>$}!, \\
+ \mylst!int if greater F={$\<integer\num{1}\>$}{$\<integer\num{2}\>$}{$\<if false\>$}!
Checks whether the integer \<integer\num{1}\> is greater than~\<integer\num{2}\>,
and runs \<if~true\> or \<if~false\> accordingly.
\item
- \mylst!intiflessTF={$\<integer\num{1}\>$}{$\<integer\num{2}\>$}{$\<if true\>$}{$\<if false\>$}!, \\
- \mylst!intiflessT={$\<integer\num{1}\>$}{$\<integer\num{2}\>$}{$\<if true\>$}!, \\
- \mylst!intiflessF={$\<integer\num{1}\>$}{$\<integer\num{2}\>$}{$\<if false\>$}!
+ \mylst!int if less TF={$\<integer\num{1}\>$}{$\<integer\num{2}\>$}{$\<if true\>$}{$\<if false\>$}!, \\
+ \mylst!int if less T={$\<integer\num{1}\>$}{$\<integer\num{2}\>$}{$\<if true\>$}!, \\
+ \mylst!int if less F={$\<integer\num{1}\>$}{$\<integer\num{2}\>$}{$\<if false\>$}!
Checks whether the integer \<integer\num{1}\> is less than~\<integer\num{2}\>,
and runs \<if~true\> or \<if~false\> accordingly.
\item
- \mylst!intclear={$\<integer\>$}!
+ \mylst!int clear={$\<integer\>$}!
Clears the \<integer\>, i.e.~sets it to~\( 0 \).
\item
- \mylst!ifblankTF={$\<tokens\>$}{$\<if true\>$}{$\<if false\>$}!,\\
- \mylst!ifblankT={$\<tokens\>$}{$\<if true\>$}!,\\
- \mylst!ifblankF={$\<tokens\>$}{$\<if false\>$}!
+ \mylst!if blank TF={$\<tokens\>$}{$\<if true\>$}{$\<if false\>$}!,\\
+ \mylst!if blank T={$\<tokens\>$}{$\<if true\>$}!,\\
+ \mylst!if blank F={$\<tokens\>$}{$\<if false\>$}!
Fully expands the \<tokens\> and checks if it is blank,
and runs \<if true\> or \<if false\> according to this.
\item
- \mylst!strifeqTF={$\<string\num{1}\>$}{$\<string\num{2}\>$}{$\<if true\>$}{$\<if false\>$}!, \\
- \mylst!strifeqT={$\<string\num{1}\>$}{$\<string\num{2}\>$}{$\<if true\>$}!, \\
- \mylst!strifeqF={$\<string\num{1}\>$}{$\<string\num{2}\>$}{$\<if false\>$}!
+ \mylst!str if eq TF={$\<string\num{1}\>$}{$\<string\num{2}\>$}{$\<if true\>$}{$\<if false\>$}!, \\
+ \mylst!str if eq T={$\<string\num{1}\>$}{$\<string\num{2}\>$}{$\<if true\>$}!, \\
+ \mylst!str if eq F={$\<string\num{1}\>$}{$\<string\num{2}\>$}{$\<if false\>$}!
Checks whether the strings \<string\num{1}\> and \<string\num{2}\> are equal,
and runs \<if~true\> or \<if~false\> accordingly.
@@ -3352,12 +3388,12 @@ In the following sections, we include the full list.
or \enquote{class~\usercommand\<Class name\> on line~\<line number\>}.
\item
- \mylst!ERRORkeyvaluenotfound={$\<key\>$}{$\<value\>$}!
+ \mylst!ERROR key value not found={$\<key\>$}{$\<value\>$}!
Issues an error, saying that the key~\<key\> was set to the unknown value~\<value\>.
\item
- \mylst!ERRORargkeyvaluenotfound={$\<key\>$}{$\<value\>$}!
+ \mylst!ERROR arg key value not found={$\<key\>$}{$\<value\>$}!
Issues an error, saying that the argument key~\<key\> was set to the unknown value~\<value\>.
\end{itemize}
@@ -3390,30 +3426,30 @@ In the following sections, we include the full list.
the height phantom and the slanting phantom are set to the same value.
\item
- \mylst!symbolputleft={$\<value\>$}!
+ \mylst!symbol put left={$\<value\>$}!
Adds \<value\> to the left of the symbol. No change is made to the height
phantom or the slanting phantom.
\item
- \mylst!symbolputright={$\<value\>$}!
+ \mylst!symbol put right={$\<value\>$}!
Adds \<value\> to the right of the symbol. No change is made to the height
phantom or the slanting phantom.
\item
- \mylst!heightphantom={$\<value\>$}!
+ \mylst!height phantom={$\<value\>$}!
Sets the height phantom to~\<value\>.
\item
- \mylst!slantingphantom={$\<value\>$}!
+ \mylst!slanting phantom={$\<value\>$}!
Sets the slanting phantom to~\<value\>.
\item
- \mylst!gradingposition={$\values\<\default{upper}|lower\>$}!, \\
- \mylst!gradingpos={$\values\<\default{upper}|lower\>$}!
+ \mylst!grading position={$\values\<\default{upper}|lower\>$}!, \\
+ \mylst!grading pos={$\values\<\default{upper}|lower\>$}!
Sets whether to use upper (\enquote{cohomological})
or lower (\enquote{homological}) grading.
@@ -3425,7 +3461,7 @@ In the following sections, we include the full list.
Applies the \<command\> to the symbol.
\item
- \mylst!clearcommand!
+ \mylst!clear command!
Clears the list of commands to be applied to the symbol.
@@ -3435,47 +3471,47 @@ In the following sections, we include the full list.
Invokes the return routine, i.e.\ adds all commands, indices, and arguments to the symbol, if any such exist.
\item
- \mylst!innerreturn!
+ \mylst!inner return!
Invokes the inner return routine, i.e.\ adds all commands to the symbol, if any such exist.
\item
- \mylst!rightreturn!
+ \mylst!right return!
Invokes the right return routine, i.e.\ adds all commands, right indices, and right arguments to the symbol, if any such exist.
\item
- \mylst!leftreturn!
+ \mylst!left return!
Invokes the left return routine, i.e.\ adds all commands, left indices, and left arguments to the symbol, if any such exist.
\item
- \mylst!leftindexreturn!
+ \mylst!left index return!
Adds the left indices to the symbol, if any such exists.
\item
- \mylst!rightindexreturn!
+ \mylst!right index return!
Adds the right indices to the symbol, if any such exists.
\item
- \mylst!indexreturn!
+ \mylst!index return!
Adds all indices, left and right to the symbol, if any such exists.
\item
- \mylst!leftargreturn!
+ \mylst!left arg return!
Adds the left argument, if any such exists, to the symbol.
\item
- \mylst!rightargreturn!
+ \mylst!right arg return!
Adds the right argument, if any such exists, to the symbol.
\item
- \mylst!argreturn!
+ \mylst!arg return!
Adds the argument, if any such exists, to the symbol.
@@ -3485,7 +3521,7 @@ In the following sections, we include the full list.
Sets the output class to~\<Class\>.
\item
- \mylst!dooutput={$\values\<true|\default{false}\>$}!
+ \mylst!do output={$\values\<true|\default{false}\>$}!
Sets whether the current object/class should output or not.
The default is false, but the system will automatically
@@ -3494,13 +3530,13 @@ In the following sections, we include the full list.
cause an infinite loop.
\item
- \mylst!outputoptions={$\<keys\>$}!
+ \mylst!output options={$\<keys\>$}!
Adds the \<keys\> to the output options,
i.e.\ those options passed to the output class.
\item
- \mylst!parseoptions={$\<keys\>$}!
+ \mylst!parse options={$\<keys\>$}!
Adds the \<keys\> to the parse options.
@@ -3510,7 +3546,7 @@ In the following sections, we include the full list.
Invokes the parse routine.
\item
- \mylst!mathclass={$\<command\>$}!
+ \mylst!math class={$\<command\>$}!
Sets the \TeX\ math class to be~\<command\>.
The intended values are \lstinline!\mathord!, \lstinline!\mathop!, \lstinline!\mathbin!, \lstinline!\mathrel!, \lstinline!\mathopen!, \lstinline!\mathclose!, and~\lstinline!\mathpunct!.
@@ -3521,16 +3557,16 @@ In the following sections, we include the full list.
This is the key that is applied whenever the
user writes something in the options which is not a key,
e.g.~the~\lstinline!1! in~\lstinline!\vf[1]!.
- By default, this keys has been set to be equal to~\lstinline!sepi!,
+ By default, this keys has been set to be equal to~\lstinline!sep i!,
but it is meant to be changeable by the user.
\item
- \mylst!degreedefault={$\<value\>$}!
+ \mylst!degree default={$\<value\>$}!
This is the key where the grading goes.
- It is the one used by \lstinline!Cohomology! class types.
- By default, this key has been set to be equal to~\lstinline!sepd!,
- but it is meant to be changable by the user.
+ It is the one used by the (now deprecated) \lstinline!Cohomology! class type.
+ By default, this key has been set to be equal to~\lstinline!sep d!,
+ but it is meant to be changeable by the user.
\item
\mylst!*!
@@ -3553,14 +3589,14 @@ In the following sections, we include the full list.
Adds three dots to the \lstinline!i!-index.
\item
- \mylst!*withothersep={$\<separator\>$}!
+ \mylst!* with other sep={$\<separator\>$}!
Adds a bullet to the \lstinline!d!-index,
separated by the \<separator\>
from any previous \lstinline!d!-indices.
\item
- \mylst!**withothersep={$\<separator\>$}!
+ \mylst!** with other sep={$\<separator\>$}!
Adds a double bullet to the \lstinline!d!-index,
separated by the \<separator\>
@@ -3571,20 +3607,20 @@ In the following sections, we include the full list.
The key that is applied whenever the user adds
an argument via the standard syntax, e.g.~\lstinline!\vf{\vx}!.
- By default, it is set to be equal to \lstinline!setargsinglekeys!,
+ By default, it is set to be equal to \lstinline!set arg single keys!,
but it is meant to be changable by the user.
\item
\mylst!smash!
Applies the command~\lstinline!\smash! to the symbol.
- Equivalent to~\lstinline!command=\smash!.
+ Equivalent to~\lstinline!return, command=\smash!.
\item
\mylst!prime!, \mylst!'!, \mylst!''!, \mylst!'''!
Adds one or more primes to the symbol in the upper index.
- The first one is equivalent to \lstinline!upper={\prime},nextupperwithsep=false!,
+ The first one is equivalent to \lstinline!upper={\prime},next upper with sep=false!,
and the rest are equivalent to multiple iterations
of~\lstinline!prime!.
\end{itemize}
@@ -3595,24 +3631,24 @@ In the following sections, we include the full list.
\item
\mylst!par!
- Turns parentheses on. Equivalent to \lstinline!usepar=true!.
+ Turns parentheses on. Equivalent to \lstinline!use par=true!.
\item
- \mylst!nopar!
+ \mylst!no par!
Turns parentheses off, but still prints them if more
than one argument is received.
- Equivalent to \lstinline!usepar=false!.
+ Equivalent to \lstinline!use par=false!.
\item
- \mylst!neverpar!
+ \mylst!never par!
Turns parentheses completely off, even if more than one argument
is received. (This is ugly and should only be used for special constructions.)
- Equivalent to \lstinline!usepar=never!.
+ Equivalent to \lstinline!use par=never!.
\item
- \mylst!usepar={$\values\<\default{true}|false|never\>$}!
+ \mylst!use par={$\values\<\default{true}|false|never\>$}!
Sets whether or not to use parentheses.
If~\lstinline!true!, turns parentheses on (this is the default behaviour).
@@ -3623,26 +3659,26 @@ In the following sections, we include the full list.
The default value is~\lstinline!true!.
\item
- \mylst!parsize={$\values\<\default{normal}|auto|*|{\textit{other}}\>$}!
+ \mylst!par size={$\values\<\default{normal}|auto|*|{\textit{other}}\>$}!
Sets the parentheses size.
Here,~\lstinline!normal! means normal size
parentheses,
\lstinline!auto! and~\lstinline!*!
- mean auto-scaled parentheses using~\lstinline!\left...\right!.
+ mean auto-scaled parentheses using~\lstinline!\left ...\right!.
If another value is received, that value
is used for the parenthesis size,
so the intended values are~\lstinline!\big!, \lstinline!\Big!,
\lstinline!\bigg!,~\lstinline!\Bigg!.
\item
- \mylst!leftpar={$\<parenthesis\>$}!
+ \mylst!left par={$\<parenthesis\>$}!
Sets the left parenthesis.
The default value is~\lstinline!(!.
\item
- \mylst!rightpar={$\<parenthesis\>$}!
+ \mylst!right par={$\<parenthesis\>$}!
Sets the right parenthesis.
The default value is~\lstinline!)!.
@@ -3664,50 +3700,50 @@ In the following sections, we include the full list.
Here,~\lstinline!normal! means normal size
parentheses,
\lstinline!auto! and~\lstinline!*!
- mean auto-scaled parentheses using~\lstinline!\left...\right!.
+ mean auto-scaled parentheses using~\lstinline!\left ...\right!.
If another value is received, that value
is used for the parenthesis size,
so the intended values are~\lstinline!\big!, \lstinline!\Big!,
\lstinline!\bigg!,~\lstinline!\Bigg!.
\item
- \mylst!sparsize={$\values\<\default{normal}|auto|*|{\textit{other}}\>$}!
+ \mylst!spar size={$\values\<\default{normal}|auto|*|{\textit{other}}\>$}!
Sets the \lstinline!spar! parenthesis size.
Here,~\lstinline!normal! means normal size
parentheses,
\lstinline!auto! and~\lstinline!*!
- mean auto-scaled parentheses using~\lstinline!\left...\right!.
+ mean auto-scaled parentheses using~\lstinline!\left ...\right!.
If another value is received, that value
is used for the parenthesis size,
so the intended values are~\lstinline!\big!, \lstinline!\Big!,
\lstinline!\bigg!,~\lstinline!\Bigg!.
\item
- \mylst!leftspar={$\<parenthesis\>$}!
+ \mylst!left spar={$\<parenthesis\>$}!
Sets the left parenthesis for the \lstinline!spar! routine.
The default value is~\lstinline!(!.
\item
- \mylst!rightspar={$\<parenthesis\>$}!
+ \mylst!right spar={$\<parenthesis\>$}!
Sets the right parenthesis for the \lstinline!spar! routine.
The default value is~\lstinline!)!.
\item
- \mylst!otherspar={$\<left parenthesis\>$}{$\<right parenthesis\>$}!
+ \mylst!other spar={$\<left parenthesis\>$}{$\<right parenthesis\>$}!
Invokes the \lstinline!spar! routine, but with the assigned parentheses.
\item
- \mylst!Otherspar={$\<left parenthesis\>$}{$\<right parenthesis\>$}{$\values\<normal|auto|*|{\textit{other}}\>$}!
+ \mylst!Other spar={$\<left parenthesis\>$}{$\<right parenthesis\>$}{$\values\<normal|auto|*|{\textit{other}}\>$}!
Invokes the \lstinline!spar! routine, but with the assigned parentheses and size.
Here, \lstinline!normal! means normal size
parentheses,
\lstinline!auto! and~\lstinline!*!
- mean auto-scaled parentheses using~\lstinline!\left...\right!.
+ mean auto-scaled parentheses using~\lstinline!\left ...\right!.
If another value is received, that value
is used for the parenthesis size,
so the intended values are~\lstinline!\big!, \lstinline!\Big!,
@@ -3718,20 +3754,20 @@ In the following sections, we include the full list.
\begin{itemize}
\item
- \mylst!setargkeys={$\<keys\>$}!,
- \mylst!argkeysset={$\<keys\>$}!
+ \mylst!set arg keys={$\<keys\>$}!,
+ \mylst!arg keys set={$\<keys\>$}!
Sets the argument keys \<keys\>.
\item
- \mylst!setargkeysx={$\<keys\>$}!,
- \mylst!argkeyssetx={$\<keys\>$}!
+ \mylst!set arg keys x={$\<keys\>$}!,
+ \mylst!arg keys set x={$\<keys\>$}!
Sets the argynebt keys \<keys\>, but fully expands their values.
\item
- \mylst!setargsinglekeys={$\<keys\>$}!,
- \mylst!argsinglekeysset={$\<keys\>$}!
+ \mylst!set arg single keys={$\<keys\>$}!,
+ \mylst!arg single keys set={$\<keys\>$}!
Sets the argument keys \<keys\>,
but only supports keys taking no values.
@@ -3739,8 +3775,8 @@ In the following sections, we include the full list.
signs without causing issues.
\item
- \mylst!setargsinglekeysx={$\<keys\>$}!,
- \mylst!argsinglekeyssetx={$\<keys\>$}!
+ \mylst!set arg single keys x={$\<keys\>$}!,
+ \mylst!arg single keys set x={$\<keys\>$}!
Sets the argument keys \<keys\>,
but only supports keys taking no values.
@@ -3750,16 +3786,16 @@ In the following sections, we include the full list.
signs without causing issues.
\item
- \mylst!setoneargsinglekey={$\<key\>$}!,
- \mylst!oneargsinglekeyset={$\<key\>$}!
+ \mylst!set one arg single key={$\<key\>$}!,
+ \mylst!one arg single key set={$\<key\>$}!
Sets one single argument key taking no values.
This allows the argument to contain
equality signs and commas without cuasing issues.
\item
- \mylst!setoneargsinglekeyx={$\<key\>$}!,
- \mylst!oneargsinglekeysetx={$\<key\>$}!
+ \mylst!set one arg single key x={$\<key\>$}!,
+ \mylst!one arg single key set x={$\<key\>$}!
Sets one single argument key taking no values,
If the key is not found, the value
@@ -3768,65 +3804,66 @@ In the following sections, we include the full list.
equality signs and commas without cuasing issues.
\item
- \mylst!setargwithoutkeyval={$\<value\>$}!,
- \mylst!argwithoutkeyvalset={$\<value\>$}!
+ \mylst!set arg without keyval={$\<value\>$}!,
+ \mylst!arg without keyval set={$\<value\>$}!
Sets the argument, allowing no keyval syntax.
\item
- \mylst!setargwithoutkeyvalx={$\<value\>$}!,
- \mylst!argwithoutkeyvalsetx={$\<value\>$}!
+ \mylst!set arg without keyval x={$\<value\>$}!,
+ \mylst!arg without keyval set x={$\<value\>$}!
Sets the argument, fully expanding its value,
and allowing no keyval syntax.
\item
- \mylst!prearg={$\<value\>$}!
+ \mylst!pre arg={$\<value\>$}!
Sets the pre-argument.
\item
- \mylst!postarg={$\<value\>$}!
+ \mylst!post arg={$\<value\>$}!
Sets the post-argument.
\item
- \mylst!setargsep={$\<value\>$}!
+ \mylst!set arg sep={$\<value\>$}!
Sets the argument separator.
The default value is a comma.
\item
- \mylst!setargslot={$\<value\>$}!
+ \mylst!set arg slot={$\<value\>$}!
Sets the argument slot.
The default value is~\lstinline!{-}!.
\item
- \mylst!setargdots={$\<value\>$}!
+ \mylst!set arg dots={$\<value\>$}!
Sets the argument dots.
The default value is~\lstinline!\dots!.
\item
- \mylst!argkeyval={$\values\<true|false|\default{singlekeys}|onesinglekey\>$}!
+ \mylst!arg keyval={$\values\<true|false|\default{single keys}|one single key\>$}!
Sets whether to use argument keyval syntax or not.
- If \lstinline!true!, \lstinline!arg! is set equal to~\lstinline!setargkeys!.
- If \lstinline!false!, it is set to~\lstinline!setargwithoutkeyval!.
- If \lstinline!singlekeys!, it is set to~\lstinline!setargsinglekeys!.
- If \lstinline!onesinglekey!, it is set to~\lstinline!setoneargsinglekey!.
- The default value is~\lstinline!singlekeys!.
+ If \lstinline!true!, \lstinline!arg! is set equal to~\lstinline!set arg keys!.
+ If \lstinline!false!, it is set to~\lstinline!set arg without keyval!.
+ If \lstinline!single keys!, it is set to~\lstinline!set arg single keys!.
+ If \lstinline!one single key!, it is set to~\lstinline!set one arg single key!.
+ The default value is~\lstinline!single keys!.
\item
- \mylst!argposition={$\values\<left|\default{right}\>$}!
+ \mylst!arg position={$\values\<left|\default{right}\>$}!,
+ \mylst!arg pos={$\values\<left|\default{right}\>$}!
Sets the position of the argument.
The default is~\lstinline!right!, so the argument
will be printed to the right of the symbol.
\item
- \mylst!nextargwithsep={$\values\<true|\default{false}\>$}!
+ \mylst!next arg with sep={$\values\<true|\default{false}\>$}!
Sets whether the next argument should be
separated from the current one with a
@@ -3835,77 +3872,77 @@ In the following sections, we include the full list.
system will automatically change this when needed.
\item
- \mylst!separg={$\<value\>$}!
+ \mylst!sep arg={$\<value\>$}!
Adds \<value\> to the argument, separated from any previous
argument by the default argument separator.
\item
- \mylst!commarg={$\<value\>$}!
+ \mylst!comma arg={$\<value\>$}!
Adds \<value\> to the argument, separated from any previous
argument by a comma.
\item
- \mylst!argwithothersep={$\<separator\>$}{$\<value\>$}!
+ \mylst!arg with other sep={$\<separator\>$}{$\<value\>$}!
Adds \<value\> to the argument, separated from any previous
argument by \<separator\>.
\item
- \mylst!arg...withothersep={$\<separator\>$}!,
- \mylst!argdotswithothersep={$\<separator\>$}!
+ \mylst!arg ... with other sep={$\<separator\>$}!,
+ \mylst!arg dots with other sep={$\<separator\>$}!
Adds three dots to the argument, separated from any previous
argument by the \<separator\>.
\item
- \mylst!arg-withothersep={$\<separator\>$}!,
- \mylst!argslotwithothersep={$\<separator\>$}!
+ \mylst!arg - with other sep={$\<separator\>$}!,
+ \mylst!arg slot with other sep={$\<separator\>$}!
Adds a slot to the argument, separated from any previous
argument by the \<separator\>.
\item
- \mylst!argdots!, \mylst!arg...!
+ \mylst!arg dots!, \mylst!arg ...!
Adds three dots to the argument,
separated from any previous arguments
by the standard separator.
\item
- \mylst!commargdots!, \mylst!commarg...!
+ \mylst!comma arg dots!, \mylst!comma arg ...!
Adds three dots to the argument,
separated from any previous arguments
by a comma.
\item
- \mylst!argslot!, \mylst!arg-!
+ \mylst!arg slot!, \mylst!arg -!
Adds a slot to the argument,
separated from any previous arguments
by the standard separator.
\item
- \mylst!commargslot!, \mylst!commarg-!
+ \mylst!comma arg slot!, \mylst!comma arg -!
Adds a slot to the argument,
separated from any previous arguments
by a comma.
\item
- \mylst!cleararg!
+ \mylst!clear arg!
Clears the argument.
\item
- \mylst!clearprearg!
+ \mylst!clear pre arg!
Clears the pre-argument.
\item
- \mylst!clearpostarg!
+ \mylst!clear post arg!
Clears the post-argument.
\end{itemize}
@@ -3921,191 +3958,191 @@ In the following sections, we include the full list.
with no separator from any previous upper index.
\item
- \mylst!sepupper={$\<value\>$}!
+ \mylst!sep upper={$\<value\>$}!
Adds to the upper index,
separated from any previous upper
index by the default separator.
\item
- \mylst!commaupper={$\<value\>$}!
+ \mylst!comma upper={$\<value\>$}!
Adds to the upper index,
separated from any previous upper
index by a comma.
\item
- \mylst!preupper={$\<value\>$}!
+ \mylst!pre upper={$\<value\>$}!
Sets the pre-upper index.
\item
- \mylst!postupper={$\<value\>$}!
+ \mylst!post upper={$\<value\>$}!
Sets the post-upper index.
\item
- \mylst!upperputleft={$\<value\>$}!
+ \mylst!upper put left={$\<value\>$}!
Adds something to the left of the upper index.
As with keys like~\lstinline!upper!, this
will also increase the number of registered
upper indices by~\( 1 \), and
it will
- set \lstinline!nextupperwithsep=true!.
+ set \lstinline!next upper with sep=true!.
\item
- \mylst!setuppersep={$\<value\>$}!
+ \mylst!set upper sep={$\<value\>$}!
Sets the upper index separator to~\<value\>.
By default, this is a comma.
\item
- \mylst!nextupperwithsep={$\values\<true|\default{false}\>$}!
+ \mylst!next upper with sep={$\values\<true|\default{false}\>$}!
Sets whether the next upper index should
be separated from the current one by a separator.
\item
- \mylst!upperwithothersep={$\<separator\>$}{$\<value\>$}!
+ \mylst!upper with other sep={$\<separator\>$}{$\<value\>$}!
Adds \<value\> to the upper index, separated from
any prevous upper index by~\<separator\>.
\item
- \mylst!upper-!, \mylst!upperslot!
+ \mylst!upper -!, \mylst!upper slot!
Adds a slot to the upper index,
with no separator from any previous upper index.
\item
- \mylst!sepupper-!, \mylst!sepupperslot!
+ \mylst!sep upper -!, \mylst!sep upper slot!
Adds a slot to the upper index,
separated from any previous upper
index by the default separator.
\item
- \mylst!commaupper-!, \mylst!commaupperslot!
+ \mylst!comma upper -!, \mylst!comma upper slot!
Adds a slot to the upper index,
separated from any previous upper
index by a comma.
\item
- \mylst!setupperslot={$\<value\>$}!
+ \mylst!set upper slot={$\<value\>$}!
Sets the slot for the upper index.
By default, this is~\lstinline!{-}!.
\item
- \mylst!upper-withothersep={$\<separator\>$}!,
- \mylst!upperslotwithothersep={$\<separator\>$}!
+ \mylst!upper - with other sep={$\<separator\>$}!,\\
+ \mylst!upper slot with other sep={$\<separator\>$}!
Adds a slot to the upper index, separated
from any previous upper index by~\<separator\>.
\item
- \mylst!upper...!, \mylst!upperdots!
+ \mylst!upper ...!, \mylst!upper dots!
Adds three dots to the upper index,
with no separator from any previous upper index.
\item
- \mylst!sepupper...!, \mylst!sepupperdots!
+ \mylst!sep upper ...!, \mylst!sep upper dots!
Adds three dots to the upper index,
separated from any previous upper
index by the default separator.
\item
- \mylst!commaupper...!, \mylst!commaupperdots!
+ \mylst!comma upper ...!, \mylst!comma upper dots!
Adds three dots to the upper index,
separated from any previous upper
index by a comma.
\item
- \mylst!setupperdots={$\<value\>$}!
+ \mylst!set upper dots={$\<value\>$}!
Sets the dots for the upper index.
By default, this is~\lstinline!\dots!.
\item
- \mylst!upper...withothersep={$\<separator\>$}!,
- \mylst!upperdotswithothersep={$\<separator\>$}!
+ \mylst!upper ... with other sep={$\<separator\>$}!,\\
+ \mylst!upper dots with other sep={$\<separator\>$}!
Adds three dots to the upper index,
separated from any previous upper index
by~\<separator\>.
\item
- \mylst!upper*!
+ \mylst!upper *!
Adds a bullet to the upper index,
with no separator from any previous upper index.
\item
- \mylst!upper**!
+ \mylst!upper **!
Adds a double bullet to the upper index,
with no separator from any previous upper index.
\item
- \mylst!sepupper*!
+ \mylst!sep upper *!
Adds a bullet to the upper index,
separated from any previous upper
index by the default separator.
\item
- \mylst!sepupper**!
+ \mylst!sep upper **!
Adds a double bullet to the upper index,
separated from any previous upper
index by the default separator.
\item
- \mylst!commaupper*!
+ \mylst!comma upper *!
Adds a bullet to the upper index,
separated from any previous upper
index by a comma.
\item
- \mylst!commaupper**!
+ \mylst!comma upper **!
Adds a double bullet to the upper index,
separated from any previous upper
index by a comma.
\item
- \mylst!upper*withothersep={$\<separator\>$}!
+ \mylst!upper * with other sep={$\<separator\>$}!
Adds a bullet to the upper index,
separated from any previous upper index
by~\<separator\>.
\item
- \mylst!upper**withothersep={$\<separator\>$}!
+ \mylst!upper ** with other sep={$\<separator\>$}!
Adds a double bullet to the upper index,
separated from any previous upper index
by~\<separator\>.
\item
- \mylst!clearupper!
+ \mylst!clear upper!
Clears the upper index.
\item
- \mylst!clearpreupper!
+ \mylst!clear pre upper!
Clears the pre-upper index.
\item
- \mylst!clearpostupper!
+ \mylst!clear post upper!
Clears the post-upper index.
\end{itemize}
@@ -4120,174 +4157,174 @@ In the following sections, we include the full list.
with no separator from any previous lower index.
\item
- \mylst!seplower={$\<value\>$}!
+ \mylst!sep lower={$\<value\>$}!
Adds to the lower index,
separated from any previous lower
index by the default separator.
\item
- \mylst!commalower={$\<value\>$}!
+ \mylst!comma lower={$\<value\>$}!
Adds to the lower index,
separated from any previous lower
index by a comma.
\item
- \mylst!prelower={$\<value\>$}!
+ \mylst!pre lower={$\<value\>$}!
Sets the pre-lower index.
\item
- \mylst!postlower={$\<value\>$}!
+ \mylst!post lower={$\<value\>$}!
Sets the post-lower index.
\item
- \mylst!lowerputleft={$\<value\>$}!
+ \mylst!lower put left={$\<value\>$}!
Adds something to the left of the lower index.
As with keys like~\lstinline!lower!, this
will also increase the number of registered
lower indices by~\( 1 \), and
it will
- set \lstinline!nextlowerwithsep=true!.
+ set \lstinline!next lower with sep=true!.
\item
- \mylst!setlowersep={$\<value\>$}!
+ \mylst!set lower sep={$\<value\>$}!
Sets the lower index separator to~\<value\>.
By default, this is a comma.
\item
- \mylst!nextlowerwithsep={$\values\<true|\default{false}\>$}!
+ \mylst!next lower with sep={$\values\<true|\default{false}\>$}!
Sets whether the next lower index should
be separated from the current one by a separator.
\item
- \mylst!lowerwithothersep={$\<separator\>$}{$\<value\>$}!
+ \mylst!lower with other sep={$\<separator\>$}{$\<value\>$}!
Adds \<value\> to the lower index, separated from
any prevous lower index by~\<separator\>.
\item
- \mylst!lower-!, \mylst!lowerslot!
+ \mylst!lower -!, \mylst!lower slot!
Adds a slot to the lower index,
with no separator from any previous lower index.
\item
- \mylst!seplower-!, \mylst!seplowerslot!
+ \mylst!sep lower -!, \mylst!sep lower slot!
Adds a slot to the lower index,
separated from any previous lower
index by the default separator.
\item
- \mylst!commalower-!, \mylst!commalowerslot!
+ \mylst!comma lower -!, \mylst!comma lower slot!
Adds a slot to the lower index,
separated from any previous lower
index by a comma.
\item
- \mylst!setlowerslot={$\<value\>$}!
+ \mylst!set lower slot={$\<value\>$}!
Sets the slot for the lower index.
By default, this is~\lstinline!{-}!.
\item
- \mylst!lower-withothersep={$\<separator\>$}!,
- \mylst!lowerslotwithothersep={$\<separator\>$}!
+ \mylst!lower - with other sep={$\<separator\>$}!,\\
+ \mylst!lower slot with other sep={$\<separator\>$}!
Adds a slot to the lower index, separated
from any previous lower index by~\<separator\>.
\item
- \mylst!lower...!, \mylst!lowerdots!
+ \mylst!lower ...!, \mylst!lower dots!
Adds three dots to the lower index,
with no separator from any previous lower index.
\item
- \mylst!seplower...!, \mylst!seplowerdots!
+ \mylst!sep lower ...!, \mylst!sep lower dots!
Adds three dots to the lower index,
separated from any previous lower
index by the default separator.
\item
- \mylst!commalower...!, \mylst!commalowerdots!
+ \mylst!comma lower ...!, \mylst!comma lower dots!
Adds three dots to the lower index,
separated from any previous lower
index by a comma.
\item
- \mylst!setlowerdots={$\<value\>$}!
+ \mylst!set lower dots={$\<value\>$}!
Sets the dots for the lower index.
By default, this is~\lstinline!\dots!.
\item
- \mylst!lower...withothersep={$\<separator\>$}!,
- \mylst!lowerdotswithothersep={$\<separator\>$}!
+ \mylst!lower ... with other sep={$\<separator\>$}!,\\
+ \mylst!lower dots with other sep={$\<separator\>$}!
Adds three dots to the lower index,
separated from any previous lower index
by~\<separator\>.
\item
- \mylst!lower*!
+ \mylst!lower *!
Adds a bullet to the lower index,
with no separator from any previous lower index.
\item
- \mylst!lower**!
+ \mylst!lower **!
Adds a double bullet to the lower index,
with no separator from any previous lower index.
\item
- \mylst!seplower*!
+ \mylst!sep lower *!
Adds a bullet to the lower index,
separated from any previous lower
index by the default separator.
\item
- \mylst!seplower**!
+ \mylst!sep lower **!
Adds a double bullet to the lower index,
separated from any previous lower
index by the default separator.
\item
- \mylst!commalower*!
+ \mylst!comma lower *!
Adds a bullet to the lower index,
separated from any previous lower
index by a comma.
\item
- \mylst!commalower**!
+ \mylst!comma lower **!
Adds a double bullet to the lower index,
separated from any previous lower
index by a comma.
\item
- \mylst!lower*withothersep={$\<separator\>$}!
+ \mylst!lower * with other sep={$\<separator\>$}!
Adds a bullet to the lower index,
separated from any previous lower index
by~\<separator\>.
\item
- \mylst!lower**withothersep={$\<separator\>$}!
+ \mylst!lower ** with other sep={$\<separator\>$}!
Adds a double bullet to the lower index,
separated from any previous lower index
@@ -4299,12 +4336,12 @@ In the following sections, we include the full list.
Clears the lower index.
\item
- \mylst!clearprelower!
+ \mylst!clear pre lower!
Clears the pre-lower index.
\item
- \mylst!clearpostlower!
+ \mylst!clear post lower!
Clears the post-lower index.
\end{itemize}
@@ -4313,197 +4350,197 @@ In the following sections, we include the full list.
\begin{itemize}
\item
- \mylst!upperleft={$\<value\>$}!
+ \mylst!upper left={$\<value\>$}!
Adds to the upper left index,
with no separator from any previous upper left index.
\item
- \mylst!sepupperleft={$\<value\>$}!
+ \mylst!sep upper left={$\<value\>$}!
Adds to the upper left index,
separated from any previous upper left
index by the default separator.
\item
- \mylst!commaupperleft={$\<value\>$}!
+ \mylst!comma upper left={$\<value\>$}!
Adds to the upper left index,
separated from any previous upper left
index by a comma.
\item
- \mylst!preupperleft={$\<value\>$}!
+ \mylst!pre upper left={$\<value\>$}!
Sets the pre-upper left index.
\item
- \mylst!postupperleft={$\<value\>$}!
+ \mylst!post upper left={$\<value\>$}!
Sets the post-upper left index.
\item
- \mylst!upperleftputright={$\<value\>$}!
+ \mylst!upper left put right={$\<value\>$}!
Adds something to the right of the upper left index.
- As with keys like~\lstinline!upperleft!, this
+ As with keys like~\lstinline!upper left!, this
will also increase the number of registered
upper left indices by~\( 1 \), and
it will
- set \lstinline!nextupperleftwithsep=true!.
+ set \lstinline!next upper left with sep=true!.
\item
- \mylst!setupperleftsep={$\<value\>$}!
+ \mylst!set upper left sep={$\<value\>$}!
Sets the upper left index separator to~\<value\>.
By default, this is a comma.
\item
- \mylst!nextupperleftwithsep={$\values\<true|\default{false}\>$}!
+ \mylst!next upper left with sep={$\values\<true|\default{false}\>$}!
Sets whether the next upper left index should
be separated from the current one by a separator.
\item
- \mylst!upperleftwithothersep={$\<separator\>$}{$\<value\>$}!
+ \mylst!upper left with other sep={$\<separator\>$}{$\<value\>$}!
Adds \<value\> to the upper left index, separated from
any prevous upper left index by~\<separator\>.
\item
- \mylst!upperleft-!, \mylst!upperleftslot!
+ \mylst!upper left -!, \mylst!upper left slot!
Adds a slot to the upper left index,
with no separator from any previous upper left index.
\item
- \mylst!sepupperleft-!, \mylst!sepupperleftslot!
+ \mylst!sep upper left -!, \mylst!sep upper left slot!
Adds a slot to the upper left index,
separated from any previous upper left
index by the default separator.
\item
- \mylst!commaupperleft-!, \mylst!commaupperleftslot!
+ \mylst!comma upper left -!, \mylst!comma upper left slot!
Adds a slot to the upper left index,
separated from any previous upper left
index by a comma.
\item
- \mylst!setupperleftslot={$\<value\>$}!
+ \mylst!set upper left slot={$\<value\>$}!
Sets the slot for the upper left index.
By default, this is~\lstinline!{-}!.
\item
- \mylst!upperleft-withothersep={$\<separator\>$}!,
- \mylst!upperleftslotwithothersep={$\<separator\>$}!
+ \mylst!upper left - with other sep={$\<separator\>$}!,\\
+ \mylst!upper left slot with other sep={$\<separator\>$}!
Adds a slot to the upper left index, separated
from any previous upper left index by~\<separator\>.
\item
- \mylst!upperleft...!, \mylst!upperleftdots!
+ \mylst!upper left ...!, \mylst!upper left dots!
Adds three dots to the upper left index,
with no separator from any previous upper left index.
\item
- \mylst!sepupperleft...!, \mylst!sepupperleftdots!
+ \mylst!sep upper left ...!, \mylst!sep upper left dots!
Adds three dots to the upper left index,
separated from any previous upper left
index by the default separator.
\item
- \mylst!commaupperleft...!, \mylst!commaupperleftdots!
+ \mylst!comma upper left ...!, \mylst!comma upper left dots!
Adds three dots to the upper left index,
separated from any previous upper left
index by a comma.
\item
- \mylst!setupperleftdots={$\<value\>$}!
+ \mylst!set upper left dots={$\<value\>$}!
Sets the dots for the upper left index.
By default, this is~\lstinline!\dots!.
\item
- \mylst!upperleft...withothersep={$\<separator\>$}!,
- \mylst!upperleftdotswithothersep={$\<separator\>$}!
+ \mylst!upper left ... with other sep={$\<separator\>$}!,\\
+ \mylst!upper left dots with other sep={$\<separator\>$}!
Adds three dots to the upper left index,
separated from any previous upper left index
by~\<separator\>.
\item
- \mylst!upperleft*!
+ \mylst!upper left *!
Adds a bullet to the upper left index,
with no separator from any previous upper left index.
\item
- \mylst!upperleft**!
+ \mylst!upper left **!
Adds a double bullet to the upper left index,
with no separator from any previous upper left index.
\item
- \mylst!sepupperleft*!
+ \mylst!sep upper left *!
Adds a bullet to the upper left index,
separated from any previous upper left
index by the default separator.
\item
- \mylst!sepupperleft**!
+ \mylst!sep upper left **!
Adds a double bullet to the upper left index,
separated from any previous upper left
index by the default separator.
\item
- \mylst!commaupperleft*!
+ \mylst!comma upper left *!
Adds a bullet to the upper left index,
separated from any previous upper left
index by a comma.
\item
- \mylst!commaupperleft**!
+ \mylst!comma upper left **!
Adds a double bullet to the upper left index,
separated from any previous upper left
index by a comma.
\item
- \mylst!upperleft*withothersep={$\<separator\>$}!
+ \mylst!upper left * with other sep={$\<separator\>$}!
Adds a bullet to the upper left index,
separated from any previous upper left index
by~\<separator\>.
\item
- \mylst!upperleft**withothersep={$\<separator\>$}!
+ \mylst!upper left ** with other sep={$\<separator\>$}!
Adds a double bullet to the upper left index,
separated from any previous upper left index
by~\<separator\>.
\item
- \mylst!clearupperleft!
+ \mylst!clearupper left!
Clears the upper left index.
\item
- \mylst!clearpreupperleft!
+ \mylst!clear pre upper left!
Clears the pre-upper left index.
\item
- \mylst!clearpostupperleft!
+ \mylst!clear post upper left!
Clears the post-upper left index.
\end{itemize}
@@ -4512,197 +4549,197 @@ In the following sections, we include the full list.
\begin{itemize}
\item
- \mylst!lowerleft={$\<value\>$}!
+ \mylst!lower left={$\<value\>$}!
Adds to the lower left index,
with no separator from any previous lower left index.
\item
- \mylst!seplowerleft={$\<value\>$}!
+ \mylst!sep lower left={$\<value\>$}!
Adds to the lower left index,
separated from any previous lower left
index by the default separator.
\item
- \mylst!commalowerleft={$\<value\>$}!
+ \mylst!comma lower left={$\<value\>$}!
Adds to the lower left index,
separated from any previous lower left
index by a comma.
\item
- \mylst!prelowerleft={$\<value\>$}!
+ \mylst!pre lower left={$\<value\>$}!
Sets the pre-lower left index.
\item
- \mylst!postlowerleft={$\<value\>$}!
+ \mylst!post lower left={$\<value\>$}!
Sets the post-lower left index.
\item
- \mylst!lowerleftputright={$\<value\>$}!
+ \mylst!lower left put right={$\<value\>$}!
Adds something to the right of the lower left index.
- As with keys like~\lstinline!lowerleft!, this
+ As with keys like~\lstinline!lower left!, this
will also increase the number of registered
lower left indices by~\( 1 \), and
it will
- set \lstinline!nextlowerleftwithsep=true!.
+ set \lstinline!next lower left with sep=true!.
\item
- \mylst!setlowerleftsep={$\<value\>$}!
+ \mylst!set lower left sep={$\<value\>$}!
Sets the lower left index separator to~\<value\>.
By default, this is a comma.
\item
- \mylst!nextlowerleftwithsep={$\values\<true|\default{false}\>$}!
+ \mylst!next lower left with sep={$\values\<true|\default{false}\>$}!
Sets whether the next lower left index should
be separated from the current one by a separator.
\item
- \mylst!lowerleftwithothersep={$\<separator\>$}{$\<value\>$}!
+ \mylst!lower left with other sep={$\<separator\>$}{$\<value\>$}!
Adds \<value\> to the lower left index, separated from
any prevous lower left index by~\<separator\>.
\item
- \mylst!lowerleft-!, \mylst!lowerleftslot!
+ \mylst!lower left -!, \mylst!lower left slot!
Adds a slot to the lower left index,
with no separator from any previous lower left index.
\item
- \mylst!seplowerleft-!, \mylst!seplowerleftslot!
+ \mylst!sep lower left -!, \mylst!sep lower left slot!
Adds a slot to the lower left index,
separated from any previous lower left
index by the default separator.
\item
- \mylst!commalowerleft-!, \mylst!commalowerleftslot!
+ \mylst!comma lower left -!, \mylst!comma lower left slot!
Adds a slot to the lower left index,
separated from any previous lower left
index by a comma.
\item
- \mylst!setlowerleftslot={$\<value\>$}!
+ \mylst!set lower left slot={$\<value\>$}!
Sets the slot for the lower left index.
By default, this is~\lstinline!{-}!.
\item
- \mylst!lowerleft-withothersep={$\<separator\>$}!,
- \mylst!lowerleftslotwithothersep={$\<separator\>$}!
+ \mylst!lower left - with other sep={$\<separator\>$}!,\\
+ \mylst!lower left slot with other sep={$\<separator\>$}!
Adds a slot to the lower left index, separated
from any previous lower left index by~\<separator\>.
\item
- \mylst!lowerleft...!, \mylst!lowerleftdots!
+ \mylst!lower left ...!, \mylst!lower left dots!
Adds three dots to the lower left index,
with no separator from any previous lower left index.
\item
- \mylst!seplowerleft...!, \mylst!seplowerleftdots!
+ \mylst!sep lower left ...!, \mylst!sep lower left dots!
Adds three dots to the lower left index,
separated from any previous lower left
index by the default separator.
\item
- \mylst!commalowerleft...!, \mylst!commalowerleftdots!
+ \mylst!comma lower left ...!, \mylst!comma lower left dots!
Adds three dots to the lower left index,
separated from any previous lower left
index by a comma.
\item
- \mylst!setlowerleftdots={$\<value\>$}!
+ \mylst!set lower left dots={$\<value\>$}!
Sets the dots for the lower left index.
By default, this is~\lstinline!\dots!.
\item
- \mylst!lowerleft...withothersep={$\<separator\>$}!,
- \mylst!lowerleftdotswithothersep={$\<separator\>$}!
+ \mylst!lower left ... with other sep={$\<separator\>$}!,\\
+ \mylst!lower left dots with other sep={$\<separator\>$}!
Adds three dots to the lower left index,
separated from any previous lower left index
by~\<separator\>.
\item
- \mylst!lowerleft*!
+ \mylst!lower left *!
Adds a bullet to the lower left index,
with no separator from any previous lower left index.
\item
- \mylst!lowerleft**!
+ \mylst!lower left **!
Adds a double bullet to the lower left index,
with no separator from any previous lower left index.
\item
- \mylst!seplowerleft*!
+ \mylst!sep lower left *!
Adds a bullet to the lower left index,
separated from any previous lower left
index by the default separator.
\item
- \mylst!seplowerleft**!
+ \mylst!sep lower left **!
Adds a double bullet to the lower left index,
separated from any previous lower left
index by the default separator.
\item
- \mylst!commalowerleft*!
+ \mylst!comma lower left *!
Adds a bullet to the lower left index,
separated from any previous lower left
index by a comma.
\item
- \mylst!commalowerleft**!
+ \mylst!comma lower left **!
Adds a double bullet to the lower left index,
separated from any previous lower left
index by a comma.
\item
- \mylst!lowerleft*withothersep={$\<separator\>$}!
+ \mylst!lower left * with other sep={$\<separator\>$}!
Adds a bullet to the lower left index,
separated from any previous lower left index
by~\<separator\>.
\item
- \mylst!lowerleft**withothersep={$\<separator\>$}!
+ \mylst!lower left ** with other sep={$\<separator\>$}!
Adds a double bullet to the lower left index,
separated from any previous lower left index
by~\<separator\>.
\item
- \mylst!clearlowerleft!
+ \mylst!clearlower left!
Clears the lower left index.
\item
- \mylst!clearprelowerleft!
+ \mylst!clear pre lower left!
Clears the pre-lower left index.
\item
- \mylst!clearpostlowerleft!
+ \mylst!clear post lower left!
Clears the post-lower left index.
\end{itemize}
@@ -4717,190 +4754,190 @@ In the following sections, we include the full list.
with no separator from any previous \lstinline!d!-index.
\item
- \mylst!sepd={$\<value\>$}!
+ \mylst!sep d={$\<value\>$}!
Adds to the \lstinline!d!-index,
separated from any previous \lstinline!d!-index
by the default separator.
\item
- \mylst!commad={$\<value\>$}!
+ \mylst!comma d={$\<value\>$}!
Adds to the \lstinline!d!-index,
separated from any previous \lstinline!d!-index
by a comma.
\item
- \mylst!pred={$\<value\>$}!
+ \mylst!pre d={$\<value\>$}!
Sets the pre-\lstinline!d!-index.
\item
- \mylst!postd={$\<value\>$}!
+ \mylst!post d={$\<value\>$}!
Sets the post-\lstinline!d!-index.
\item
- \mylst!dputleft={$\<value\>$}!
+ \mylst!d put left={$\<value\>$}!
Adds something to the left of the \lstinline!d!-index.
As with keys like~\lstinline!d!, this
will also increase the number of registered
\lstinline!d!-indices by~\( 1 \), and
it will
- set \lstinline!nextdwithsep=true!.
+ set \lstinline!next d with sep=true!.
\item
- \mylst!setdsep={$\<value\>$}!
+ \mylst!set d sep={$\<value\>$}!
Sets the \lstinline!d!-index separator to~\<value\>.
By default, this is a comma.
\item
- \mylst!nextdwithsep={$\values\<true|\default{false}\>$}!
+ \mylst!next d with sep={$\values\<true|\default{false}\>$}!
Sets whether the next \lstinline!d!-index should
be separated from the current one by a separator.
\item
- \mylst!dwithothersep={$\<separator\>$}{$\<value\>$}!
+ \mylst!d with other sep={$\<separator\>$}{$\<value\>$}!
Adds \<value\> to the \lstinline!d!-index, separated from
any prevous \lstinline!d!-index by~\<separator\>.
\item
- \mylst!d-!, \mylst!dslot!
+ \mylst!d -!, \mylst!d slot!
Adds a slot to the \lstinline!d!-index,
with no separator from any previous \lstinline!d!-index.
\item
- \mylst!sepd-!, \mylst!sepdslot!
+ \mylst!sep d -!, \mylst!sep d slot!
Adds a slot to the \lstinline!d!-index,
separated from any previous \lstinline!d!-index
by the default separator.
\item
- \mylst!commad-!, \mylst!commadslot!
+ \mylst!comma d -!, \mylst!comma d slot!
Adds a slot to the \lstinline!d!-index,
separated from any previous \lstinline!d!-index
by a comma.
\item
- \mylst!setdslot={$\<value\>$}!
+ \mylst!set d slot={$\<value\>$}!
Sets the slot for the \lstinline!d!-index.
By default, this is~\lstinline!{-}!.
\item
- \mylst!d-withothersep={$\<separator\>$}!,
- \mylst!dslotwithothersep={$\<separator\>$}!
+ \mylst!d - with other sep={$\<separator\>$}!,
+ \mylst!d slot with other sep={$\<separator\>$}!
Adds a slot to the \lstinline!d!-index, separated
from any previous \lstinline!d!-index by~\<separator\>.
\item
- \mylst!d...!, \mylst!ddots!
+ \mylst!d ...!, \mylst!d dots!
Adds three dots to the \lstinline!d!-index,
with no separator from any previous \lstinline!d!-index.
\item
- \mylst!sepd...!, \mylst!sepddots!
+ \mylst!sep d ...!, \mylst!sep d dots!
Adds three dots to the \lstinline!d!-index,
separated from any previous \lstinline!d!-index
by the default separator.
\item
- \mylst!commad...!, \mylst!commaddots!
+ \mylst!comma d ...!, \mylst!comma d dots!
Adds three dots to the \lstinline!d!-index,
separated from any previous \lstinline!d!-index
by a comma.
\item
- \mylst!setddots={$\<value\>$}!
+ \mylst!set d dots={$\<value\>$}!
Sets the dots for the \lstinline!d!-index.
By default, this is~\lstinline!\dots!.
\item
- \mylst!d...withothersep={$\<separator\>$}!,
- \mylst!ddotswithothersep={$\<separator\>$}!
+ \mylst!d ... with other sep={$\<separator\>$}!,
+ \mylst!d dots with other sep={$\<separator\>$}!
Adds three dots to the \lstinline!d!-index,
separated from any previous \lstinline!d!-index
by~\<separator\>.
\item
- \mylst!d*!
+ \mylst!d *!
Adds a bullet to the \lstinline!d!-index,
with no separator from any previous \lstinline!d!-index.
\item
- \mylst!d**!
+ \mylst!d **!
Adds a double bullet to the \lstinline!d!-index,
with no separator from any previous \lstinline!d!-index.
\item
- \mylst!sepd*!
+ \mylst!sep d *!
Adds a bullet to the \lstinline!d!-index,
separated from any previous \lstinline!d!-index
by the default separator.
\item
- \mylst!sepd**!
+ \mylst!sep d **!
Adds a double bullet to the \lstinline!d!-index,
separated from any previous \lstinline!d!-index
by the default separator.
\item
- \mylst!commad*!
+ \mylst!comma d *!
Adds a bullet to the \lstinline!d!-index,
separated from any previous \lstinline!d!-index
by a comma.
\item
- \mylst!commad**!
+ \mylst!comma d **!
Adds a double bullet to the \lstinline!d!-index,
separated from any previous \lstinline!d!-index
by a comma.
\item
- \mylst!d*withothersep={$\<separator\>$}!
+ \mylst!d * with other sep={$\<separator\>$}!
Adds a bullet to the \lstinline!d!-index,
separated from any previous \lstinline!d!-index
by~\<separator\>.
\item
- \mylst!d**withothersep={$\<separator\>$}!
+ \mylst!d ** with other sep={$\<separator\>$}!
Adds a double bullet to the \lstinline!d!-index,
separated from any previous \lstinline!d!-index
by~\<separator\>.
\item
- \mylst!cleard!
+ \mylst!clear d!
Clears the \lstinline!d!-index.
\item
- \mylst!clearpred!
+ \mylst!clear pre d!
Clears the pre-\lstinline!d!-index.
\item
- \mylst!clearpostd!
+ \mylst!clear post d!
Clears the post-\lstinline!d!-index.
\end{itemize}
@@ -4915,191 +4952,191 @@ In the following sections, we include the full list.
with no separator from any previous \lstinline!i!-index.
\item
- \mylst!sepi={$\<value\>$}!
+ \mylst!sep i={$\<value\>$}!
Adds to the \lstinline!i!-index,
separated from any previous
\lstinline!i!-index by the default separator.
\item
- \mylst!commai={$\<value\>$}!
+ \mylst!comma i={$\<value\>$}!
Adds to the \lstinline!i!-index,
separated from any previous
\lstinline!i!-index by a comma.
\item
- \mylst!prei={$\<value\>$}!
+ \mylst!pre i={$\<value\>$}!
Sets the pre-\lstinline!i!-index.
\item
- \mylst!posti={$\<value\>$}!
+ \mylst!post i={$\<value\>$}!
Sets the post-\lstinline!i!-index.
\item
- \mylst!iputleft={$\<value\>$}!
+ \mylst!i put left={$\<value\>$}!
Adds something to the left of the \lstinline!i!-index.
As with keys like~\lstinline!i!, this
will also increase the number of registered
\lstinline!i!-indices by~\( 1 \), and
it will
- set \lstinline!nextiwithsep=true!.
+ set \lstinline!next i with sep=true!.
\item
- \mylst!setisep={$\<value\>$}!
+ \mylst!set i sep={$\<value\>$}!
Sets the \lstinline!i!-index separator to~\<value\>.
By default, this is a comma.
\item
- \mylst!nextiwithsep={$\values\<true|\default{false}\>$}!
+ \mylst!next i with sep={$\values\<true|\default{false}\>$}!
Sets whether the next \lstinline!i!-index should
be separated from the current one by a separator.
\item
- \mylst!iwithothersep={$\<separator\>$}{$\<value\>$}!
+ \mylst!i with other sep={$\<separator\>$}{$\<value\>$}!
Adds \<value\> to the \lstinline!i!-index, separated from
any prevous \lstinline!i!-index by~\<separator\>.
\item
- \mylst!i-!, \mylst!islot!
+ \mylst!i -!, \mylst!i slot!
Adds a slot to the \lstinline!i!-index,
with no separator from any previous \lstinline!i!-index.
\item
- \mylst!sepi-!, \mylst!sepislot!
+ \mylst!sep i -!, \mylst!sep i slot!
Adds a slot to the \lstinline!i!-index,
separated from any previous \lstinline!i!-index
by the default separator.
\item
- \mylst!commai-!, \mylst!commaislot!
+ \mylst!comma i -!, \mylst!comma i slot!
Adds a slot to the \lstinline!i!-index,
separated from any previous \lstinline!i!-index
by a comma.
\item
- \mylst!setislot={$\<value\>$}!
+ \mylst!set i slot={$\<value\>$}!
Sets the slot for the \lstinline!i!-index.
By default, this is~\lstinline!{-}!.
\item
- \mylst!i-withothersep={$\<separator\>$}!,
- \mylst!islotwithothersep={$\<separator\>$}!
+ \mylst!i - with other sep={$\<separator\>$}!,
+ \mylst!i slot with other sep={$\<separator\>$}!
Adds a slot to the \lstinline!i!-index, separated
from any previous \lstinline!i!-index by~\<separator\>.
\item
- \mylst!i...!, \mylst!idots!
+ \mylst!i ...!, \mylst!i dots!
Adds three dots to the \lstinline!i!-index,
with no separator from any previous \lstinline!i!-index.
\item
- \mylst!sepi...!, \mylst!sepidots!
+ \mylst!sep i ...!, \mylst!sep i dots!
Adds three dots to the \lstinline!i!-index,
separated from any previous \lstinline!i!-index
by the default separator.
\item
- \mylst!commai...!, \mylst!commaidots!
+ \mylst!comma i ...!, \mylst!comma i dots!
Adds three dots to the \lstinline!i!-index,
separated from any previous \lstinline!i!-index
by a comma.
\item
- \mylst!setidots={$\<value\>$}!
+ \mylst!set i dots={$\<value\>$}!
Sets the dots for the \lstinline!i!-index.
By default, this is~\lstinline!\dots!.
\item
- \mylst!i...withothersep={$\<separator\>$}!,
- \mylst!idotswithothersep={$\<separator\>$}!
+ \mylst!i ... with other sep={$\<separator\>$}!,
+ \mylst!i dots with other sep={$\<separator\>$}!
Adds three dots to the \lstinline!i!-index,
separated from any previous \lstinline!i!-index
by~\<separator\>.
\item
- \mylst!i*!
+ \mylst!i *!
Adds a bullet to the \lstinline!i!-index,
with no separator from any previous \lstinline!i!-index.
\item
- \mylst!i**!
+ \mylst!i **!
Adds a double bullet to the \lstinline!i!-index,
with no separator from any previous \lstinline!i!-index.
\item
- \mylst!sepi*!
+ \mylst!sep i *!
Adds a bullet to the \lstinline!i!-index,
separated from any previous
\lstinline!i!-index by the default separator.
\item
- \mylst!sepi**!
+ \mylst!sep i **!
Adds a double bullet to the \lstinline!i!-index,
separated from any previous
\lstinline!i!-index by the default separator.
\item
- \mylst!commai*!
+ \mylst!comma i *!
Adds a bullet to the \lstinline!i!-index,
separated from any previous
\lstinline!i!-index by a comma.
\item
- \mylst!commai**!
+ \mylst!comma i **!
Adds a double bullet to the \lstinline!i!-index,
separated from any previous
\lstinline!i!-index by a comma.
\item
- \mylst!i*withothersep={$\<separator\>$}!
+ \mylst!i * with other sep={$\<separator\>$}!
Adds a bullet to the \lstinline!i!-index,
separated from any previous \lstinline!i!-index
by~\<separator\>.
\item
- \mylst!i**withothersep={$\<separator\>$}!
+ \mylst!i ** with other sep={$\<separator\>$}!
Adds a double bullet to the \lstinline!i!-index,
separated from any previous \lstinline!i!-index
by~\<separator\>.
\item
- \mylst!cleari!
+ \mylst!clear i!
Clears the \lstinline!i!-index.
\item
- \mylst!clearprei!
+ \mylst!clear pre i!
Clears the pre-\lstinline!i!-index.
\item
- \mylst!clearposti!
+ \mylst!clear post i!
Clears the post-\lstinline!i!-index.
\end{itemize}
@@ -5119,32 +5156,32 @@ These are the predefined keys that work inside the argument.
by the other logic keys.
\item
- \mylst!setkeys={$\<keys\>$}!,
- \mylst!keysset={$\<keys\>$}!
+ \mylst!set keys={$\<keys\>$}!,
+ \mylst!keys set={$\<keys\>$}!
Sets the keys \<keys\>.
\item
- \mylst!setkeysx={$\<keys\>$}!,
- \mylst!keyssetx={$\<keys\>$}!
+ \mylst!set keys x={$\<keys\>$}!,
+ \mylst!keys set x={$\<keys\>$}!
Sets the keys \<keys\>, but fully expands their values.
\item
- \mylst!setargkeys={$\<keys\>$}!,
- \mylst!argkeysset={$\<keys\>$}!
+ \mylst!set arg keys={$\<keys\>$}!,
+ \mylst!arg keys set={$\<keys\>$}!
Sets the argument keys \<keys\>.
\item
- \mylst!setargkeysx={$\<keys\>$}!,
- \mylst!argkeyssetx={$\<keys\>$}!
+ \mylst!set arg keys x={$\<keys\>$}!,
+ \mylst!arg keys set x={$\<keys\>$}!
- Sets the argynebt keys \<keys\>, but fully expands their values.
+ Sets the argument keys \<keys\>, but fully expands their values.
\item
- \mylst!setargsinglekeys={$\<keys\>$}!,
- \mylst!argsinglekeysset={$\<keys\>$}!
+ \mylst!set arg single keys={$\<keys\>$}!,
+ \mylst!arg single keys set={$\<keys\>$}!
Sets the argument keys \<keys\>,
but only supports keys taking no values.
@@ -5152,8 +5189,8 @@ These are the predefined keys that work inside the argument.
signs without causing issues.
\item
- \mylst!setargsinglekeysx={$\<keys\>$}!,
- \mylst!argsinglekeyssetx={$\<keys\>$}!
+ \mylst!set arg single keys x={$\<keys\>$}!,
+ \mylst!arg single keys set x={$\<keys\>$}!
Sets the argument keys \<keys\>,
but only supports keys taking no values.
@@ -5163,16 +5200,16 @@ These are the predefined keys that work inside the argument.
signs without causing issues.
\item
- \mylst!setoneargsinglekey={$\<key\>$}!,
- \mylst!oneargsinglekeyset={$\<key\>$}!
+ \mylst!set one arg single key={$\<key\>$}!,
+ \mylst!one arg single key set={$\<key\>$}!
Sets one single argument key taking no values.
This allows the argument to contain
equality signs and commas without cuasing issues.
\item
- \mylst!setoneargsinglekeyx={$\<key\>$}!,
- \mylst!oneargsinglekeysetx={$\<key\>$}!
+ \mylst!set one arg single key x={$\<key\>$}!,
+ \mylst!one arg single key set x={$\<key\>$}!
Sets one single argument key taking no values,
If the key is not found, the value
@@ -5181,14 +5218,14 @@ These are the predefined keys that work inside the argument.
equality signs and commas without cuasing issues.
\item
- \mylst!setargwithoutkeyval={$\<value\>$}!,
- \mylst!argwithoutkeyvalset={$\<value\>$}!
+ \mylst!set arg without keyval={$\<value\>$}!,
+ \mylst!arg without keyval set={$\<value\>$}!
Sets the argument, allowing no keyval syntax.
\item
- \mylst!setargwithoutkeyvalx={$\<value\>$}!,
- \mylst!argwithoutkeyvalsetx={$\<value\>$}!
+ \mylst!set arg without keyval x={$\<value\>$}!,
+ \mylst!arg without keyval set x={$\<value\>$}!
Sets the argument, fully expanding its value,
and allowing no keyval syntax.
@@ -5225,7 +5262,7 @@ These are the predefined keys that work inside the argument.
by the default separator.
\item
- \mylst!comma-!, \mylst!commaslot!
+ \mylst!comma -!, \mylst!comma slot!
Adds a slot to the argument,
separated from any previous argument
@@ -5239,29 +5276,29 @@ These are the predefined keys that work inside the argument.
by the default separator.
\item
- \mylst!comma...!, \mylst!commadots!
+ \mylst!comma ...!, \mylst!comma dots!
Adds three dots to the argument,
separated from any previous argument
by a comma.
\item
- \mylst!othersep={$\<separator\>$}{$\<value\>$}!
+ \mylst!other sep={$\<separator\>$}{$\<value\>$}!
Adds \<value\> to the argument,
separated from any previous argument
by~\<separator\>.
\item
- \mylst!-withothersep={$\<separator\>$}! ,
- \mylst!slotwithothersep={$\<separator\>$}!
+ \mylst!- with other sep={$\<separator\>$}! ,
+ \mylst!slot with other sep={$\<separator\>$}!
Adds a slot to the argument, separated
from any previous argument by \<separator\>.
\item
- \mylst!...withothersep={$\<separator\>$}! ,
- \mylst!dotswithothersep={$\<separator\>$}!
+ \mylst!... with other sep={$\<separator\>$}! ,
+ \mylst!dots with other sep={$\<separator\>$}!
Adds three dots to the argument, separated
from any previous argument by~\<separator\>.
@@ -5543,11 +5580,11 @@ class types:
\begin{lstlisting}
@\usercommand\<object\>@[@\<options\>@]{@\<argument\>@}
\end{lstlisting}
- \item \lstinline!Cohomology!:
+ \item \lstinline!Symbol!:
A new class is declared with the
syntax
\begin{lstlisting}
- \NewCohomologyClass@\usercommand\<Class\>@[@\<options\>@]
+ \NewSimpleClass@\usercommand\<Class\>@[@\<options\>@]
\end{lstlisting}
A new object is declared by
\begin{lstlisting}
@@ -5555,9 +5592,9 @@ class types:
\end{lstlisting}
The syntax for this object is
\begin{lstlisting}
- @\usercommand\<object\>@[@\<options\>@]{@\<degree\>@}{@\<argument\>@}
+ @\usercommand\<object\>@[@\<options\>@]
\end{lstlisting}
- \item \lstinline!Symbol!:
+ \item \lstinline!Simple!:
A new class is declared with the
syntax
\begin{lstlisting}
@@ -5569,42 +5606,48 @@ class types:
\end{lstlisting}
The syntax for this object is
\begin{lstlisting}
- @\usercommand\<object\>@[@\<options\>@]
+ @\usercommand\<object\>@
\end{lstlisting}
- \item \lstinline!Delimiter!:
- A new class is declared with the syntax
+\end{itemize}
+
+Let me add that \semantex uses a very clear separation between the input syntax and the underlying machinery. Because of this, if the user needs a different kind of class type, it is not very hard to create one. You must simply open the source code of \semantex, find the class you want to modify, and then copy the definition of the command~\mylst!\New$\<Class type\>$Class! and modify it in whatever way you want.
+
+The last class type, called \lstinline!Simple!,
+is the class type of the class~\lstinline!\SemantexBaseObject!. This class is pretty useless as all it does is print its symbol, without allowing any keyval syntax. So you simply should not use it.
+
+There are also a few extra class types which are now deprecated, as their syntax will only cause confusion.
+They are still included for backwards compatibility, but I highly discourage their use:
+
+\begin{itemize}
+ \item \lstinline!Cohomology!:
+ A new class is declared with the
+ syntax
\begin{lstlisting}
- \NewDelimiterClass@\usercommand\<Class\>@[@\<options\>@]
+ \NewCohomologyClass@\usercommand\<Class\>@[@\<options\>@]
\end{lstlisting}
A new object is declared by
\begin{lstlisting}
- \NewObject@\usercommand\<Class\>@@\usercommand\<object\>@{@\<left bracket\>@}{@\<right bracket\>@}[@\<options\>@]
+ \NewObject@\usercommand\<Class\>@@\usercommand\<object\>@{@\<symbol\>@}[@\<options\>@]
\end{lstlisting}
The syntax for this object is
\begin{lstlisting}
- @\usercommand\<object\>@[@\<options\>@]{@\<argument\>@}
+ @\usercommand\<object\>@[@\<options\>@]{@\<degree\>@}{@\<argument\>@}
\end{lstlisting}
- \item \lstinline!Simple!:
- A new class is declared with the
- syntax
+ \item \lstinline!Delimiter!:
+ A new class is declared with the syntax
\begin{lstlisting}
- \NewSimpleClass@\usercommand\<Class\>@[@\<options\>@]
+ \NewDelimiterClass@\usercommand\<Class\>@[@\<options\>@]
\end{lstlisting}
A new object is declared by
\begin{lstlisting}
- \NewObject@\usercommand\<Class\>@@\usercommand\<object\>@{@\<symbol\>@}[@\<options\>@]
+ \NewObject@\usercommand\<Class\>@@\usercommand\<object\>@{@\<left bracket\>@}{@\<right bracket\>@}[@\<options\>@]
\end{lstlisting}
The syntax for this object is
\begin{lstlisting}
- @\usercommand\<object\>@
+ @\usercommand\<object\>@[@\<options\>@]{@\<argument\>@}
\end{lstlisting}
\end{itemize}
-Let me add that \semantex uses a very clear separation between the input syntax and the underlying machinery. Because of this, if the user needs a different kind of class type, it is not very hard to create one. You must simply open the source code of \semantex, find the class you want to modify, and then copy the definition of the command~\mylst!\New$\<Class type\>$Class! and modify it in whatever way you want.
-
-The last class type, called \lstinline!Simple!,
-is the class type of the class~\lstinline!\SemantexBaseObject!. This class is pretty useless as all it does is print its symbol, without allowing any keyval syntax. So you simply should not use it.
-
\section{The predefined data}
By default, the following data are defined for each class or object and are accessible via
@@ -5620,74 +5663,69 @@ the programming keys and commands:
(token list):
the name of the output class.
\item
- \mylst!outputoptions!
+ \mylst!output options!
(token list):
the output options, i.e.~the options to be passed to the output class.
\item
- \mylst!parseoptions!
- (token list):
- the parse options, i.e.~the options that are invoked
- during the parse routine.
- \item
- \mylst!mathclass!
+ \mylst!math class!
(token list):
the \TeX\ math class command that the final output
is evnetually wrapped around;
the intended use of this is the \TeX\ commands
\lstinline!\mathord!, \lstinline!\mathop!, \lstinline!\mathbin!, \lstinline!\mathrel!, \lstinline!\mathopen!, \lstinline!\mathclose!, and~\lstinline!\mathpunct!.
\item
- \lstinline!heightphantom!
+ \lstinline!height phantom!
(token list):
the height phantom that is used
for calculating the height of left indices.
\item
- \lstinline!slantingphantom!
+ \lstinline!slanting phantom!
(token list):
the slanting phantom that is used for
calculating the slanting of left indices.
\item
- \lstinline!parsize!
+ \lstinline!par size!
(token list):
the size of the argument parentheses.
Here, the value~\lstinline!normal! means normal size
parentheses,
\lstinline!auto! and~\lstinline!*!
- mean auto-scaled parentheses using~\lstinline!\left...\right!.
+ mean auto-scaled parentheses using~\lstinline!\left ...\right!.
If another value is received, that value
is used for the parenthesis size,
so the intended values are~\lstinline!\big!, \lstinline!\Big!,
\lstinline!\bigg!,~\lstinline!\Bigg!.
The default value is \lstinline!normal!.
\item
- \lstinline!leftpar!
+ \lstinline!left par!
(token list):
the left argument parenthesis;
the default value is~\lstinline!(!.
\item
- \lstinline!rightpar!
+ \lstinline!right par!
(token list):
the right argument parenthesis;
the default value is~\lstinline!)!.
\item
- \lstinline!sparsize!
+ \lstinline!spar size!
(token list):
the size of the symbol parentheses (for use with the \lstinline!spar!~routine).
Here, the value~\lstinline!normal! means normal size
parentheses,
\lstinline!auto! and~\lstinline!*!
- mean auto-scaled parentheses using~\lstinline!\left...\right!.
+ mean auto-scaled parentheses using~\lstinline!\left ...\right!.
If another value is received, that value
is used for the parenthesis size,
so the intended values are~\lstinline!\big!, \lstinline!\Big!,
\lstinline!\bigg!,~\lstinline!\Bigg!.
The default value is \lstinline!normal!.
\item
- \lstinline!leftspar!
+ \lstinline!left spar!
(token list):
the left symbol parenthesis (for use with the \lstinline!spar!~routine);
the default value is~\lstinline!(!.
\item
- \lstinline!rightspar!
+ \lstinline!right spar!
(token list):
the right symbol parenthesis (for use with the \lstinline!spar!~routine);
the default value is~\lstinline!)!.
@@ -5696,25 +5734,25 @@ the programming keys and commands:
(token list):
the argument.
\item
- \lstinline!prearg!
+ \lstinline!pre arg!
(token list):
to be printed in front of the argument, if the argument is non-empty.
\item
- \lstinline!postarg!
+ \lstinline!post arg!
(token list):
to be printed after the argument, if the argument is non-empty.
\item
- \lstinline!argsep!
+ \lstinline!arg sep!
(token list):
the argument separator;
comma by default.
\item
- \lstinline!argslot!
+ \lstinline!arg slot!
(token list):
the argument slot;
\lstinline!{-}!~by default.
\item
- \lstinline!argdots!
+ \lstinline!arg dots!
(token list):
the argument dots;
\lstinline!\dots!~by default.
@@ -5724,26 +5762,26 @@ the programming keys and commands:
(token list):
the upper index.
\item
- \lstinline!preupper!
+ \lstinline!pre upper!
(token list):
the pre-upper index, to be printed in front of the upper index,
if the upper index is non-empty.
\item
- \mylst!postupper!
+ \mylst!post upper!
(token list)
the post-upper index, to be printed after the upper index,
if the upper index is non-empty.
\item
- \mylst!uppersep!
+ \mylst!upper sep!
(token list):
the upper index separator;
comma by default.
\item
- \mylst!upperdots!
+ \mylst!upper dots!
(token list):
the upper dots; \lstinline!\dots!~by default.
\item
- \mylst!upperslot!
+ \mylst!upper slot!
(token list):
the upper slot; \lstinline!{-}!~by default.
% Lower index:
@@ -5752,86 +5790,86 @@ the programming keys and commands:
(token list):
the lower index.
\item
- \lstinline!prelower!
+ \lstinline!pre lower!
(token list):
the pre-lower index, to be printed in front of the lower index,
if the lower index is non-empty.
\item
- \mylst!postlower!
+ \mylst!post lower!
(token list)
the post-lower index, to be printed after the lower index,
if the lower index is non-empty.
\item
- \mylst!lowersep!
+ \mylst!lower sep!
(token list):
the lower index separator;
comma by default.
\item
- \mylst!lowerdots!
+ \mylst!lower dots!
(token list):
the lower dots; \lstinline!\dots!~by default.
\item
- \mylst!lowerslot!
+ \mylst!lower slot!
(token list):
the lower slot; \lstinline!{-}!~by default.
% Upper left index:
\item
- \lstinline!upperleft!
+ \lstinline!upper left!
(token list):
the upper left index.
\item
- \lstinline!preupperleft!
+ \lstinline!pre upper left!
(token list):
the pre-upper left index, to be printed in front of the upper left index,
if the upper left index is non-empty.
\item
- \mylst!postupperleft!
+ \mylst!post upper left!
(token list)
the post-upper left index, to be printed after the upper left index,
if the upper left index is non-empty.
\item
- \mylst!upperleftsep!
+ \mylst!upper left sep!
(token list):
the upper left index separator;
comma by default.
\item
- \mylst!upperleftdots!
+ \mylst!upper left dots!
(token list):
the upper left dots; \lstinline!\dots!~by default.
\item
- \mylst!upperleftslot!
+ \mylst!upper left slot!
(token list):
the upper left slot; \lstinline!{-}!~by default.
% Lower left index:
\item
- \lstinline!lowerleft!
+ \lstinline!lower left!
(token list):
the lower left index.
\item
- \lstinline!prelowerleft!
+ \lstinline!pre lower left!
(token list):
the pre-lower left index, to be printed in front of the lower left index,
if the lower left index is non-empty.
\item
- \mylst!postlowerleft!
+ \mylst!post lower left!
(token list)
the post-lower left index, to be printed after the lower left index,
if the lower left index is non-empty.
\item
- \mylst!lowerleftsep!
+ \mylst!lower left sep!
(token list):
the lower left index separator;
comma by default.
\item
- \mylst!lowerleftdots!
+ \mylst!lower left dots!
(token list):
the lower left dots; \lstinline!\dots!~by default.
\item
- \mylst!lowerleftslot!
+ \mylst!lower left slot!
(token list):
the lower left slot; \lstinline!{-}!~by default.
\item
- \mylst!uppergrading!
+ \mylst!upper grading!
(boolean):
whether or not to use
upper (cohomological) grading; true by default.
@@ -5840,55 +5878,55 @@ the programming keys and commands:
(boolean):
whether or not to use parentheses; true by default.
\item
- \mylst!flexpar!
+ \mylst!flex par!
(boolean):
- if \mylst!par! is set to false, setting \mylst!flexpar! to true
+ if \mylst!par! is set to false, setting \mylst!flex par! to true
will still print a pair of parentheses when there is more than one argument;
false by default.
\item
- \mylst!leftargument!
+ \mylst!left argument!
(boolean):
if true, the argument (and parentheses)
will be printed to the \emph{left} of the symbol;
false by default.
\item
- \mylst!nextargwithsep!
+ \mylst!next arg with sep!
(boolean):
if true, the next argument will have a separator printed in front of it.
\item
- \mylst!nextupperwithsep!
+ \mylst!next upper with sep!
(boolean):
If true, the next upper index will have a separator printed in front of it.
\item
- \mylst!nextlowerwithsep!
+ \mylst!next lower with sep!
(boolean):
If true, the next lower index will have a separator printed in front of it.
\item
- \mylst!nextupperleftwithsep!
+ \mylst!next upper left with sep!
(boolean):
If true, the next upper left index will have a separator printed in front of it.
\item
- \mylst!nextlowerleftwithsep!
+ \mylst!next lower left with sep!
(boolean):
If true, the next lower upper index will have a separator printed in front of it.
\item
- \mylst!numberofarguments!
+ \mylst!number of arguments!
(integer):
the number of arguments.
\item
- \mylst!numberofupperindices!
+ \mylst!number of upper indices!
(integer):
the number of upper indices.
\item
- \mylst!numberoflowerindices!
+ \mylst!number of lower indices!
(integer):
the number of lower indices.
\item
- \mylst!numberofupperleftindices!
+ \mylst!number of upper left indices!
(integer):
the number of upper left indices.
\item
- \mylst!numberoflowerindices!
+ \mylst!number of lower left indices!
(integer):
the number of lower left indices.
\end{itemize}
diff --git a/macros/latex/contrib/semantex/stripsemantex.sty b/macros/latex/contrib/semantex/stripsemantex.sty
index 1a3d69f78e..c4fce11d95 100644
--- a/macros/latex/contrib/semantex/stripsemantex.sty
+++ b/macros/latex/contrib/semantex/stripsemantex.sty
@@ -1,11 +1,11 @@
\RequirePackage{xparse}
-\ProvidesExplPackage{stripsemantex}{2020/11/05}{0.463}{}
+\ProvidesExplPackage{stripsemantex}{2021/06/10}{0.500}{}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% stripSemanTeX -- strip the document of SemanTeX markup %
% https://ctan.org/pkg/semantex %
-% (C) 2020 Sebastian Ørsted %
+% (C) 2021 Sebastian Ørsted %
% sorsted@gmail.com %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/macros/latex/contrib/tiscreen/README b/macros/latex/contrib/tiscreen/README
index d5e7e22e3f..dd49e6c91b 100644
--- a/macros/latex/contrib/tiscreen/README
+++ b/macros/latex/contrib/tiscreen/README
@@ -4,7 +4,8 @@ This package mimics the screen of older Texas instruments dot matrix display
calculators, specifically the TI-82 STATS.
Changes:
-- 2021/07/07 Simplified characters table in documentation
+- 2021/06/10 Simplified example code in documentation
+- 2021/06/07 Simplified characters table in documentation
- 2021/06/01 Added more characters
- 2021/05/21 Minor README and documentation issues
- 2021/05/17 Initial version
diff --git a/macros/latex/contrib/tiscreen/doc/tiscreen-doc.pdf b/macros/latex/contrib/tiscreen/doc/tiscreen-doc.pdf
index 145a8be716..ff9ccf19b0 100644
--- a/macros/latex/contrib/tiscreen/doc/tiscreen-doc.pdf
+++ b/macros/latex/contrib/tiscreen/doc/tiscreen-doc.pdf
Binary files differ
diff --git a/macros/latex/contrib/tiscreen/doc/tiscreen-doc.tex b/macros/latex/contrib/tiscreen/doc/tiscreen-doc.tex
index b4112c2524..925cb809f8 100644
--- a/macros/latex/contrib/tiscreen/doc/tiscreen-doc.tex
+++ b/macros/latex/contrib/tiscreen/doc/tiscreen-doc.tex
@@ -6,17 +6,20 @@
\usepackage[color]{tiscreen}
\usepackage{multicol}
\usepackage{hyperref}
-
-\usepackage{listings}
-\lstset{
- numbers=left, numberstyle=\tiny,
+\usepackage{xspace}
+\usepackage{array}
+\usepackage{fancyvrb-ex}
+\fvset{
frame=single,
- basicstyle=\footnotesize\ttfamily,
- language=Tex,
+ label=\fbox{Source},
+ framesep=4mm,
+ numbers=left,
+ fontsize=\footnotesize,
}
\newcommand{\LCDsymb}[1]{\large \textLCD{1}|{#1}~|}
\newcommand{\LCDcode}[1]{\texttt{\{#1\}}}
+\newcommand{\LCDcmd}{\textbackslash\texttt{LCD}\xspace}
\title{TI calculator display\\{\small(TI-82 STATS)}}
\author{Mustafa Ibrahim}
@@ -39,96 +42,83 @@
\newpage
\section{Quickstart}
-\tiscreen
-|4+1 |
-| 5|
-|Ans{sq} |
-| 25|
-| |
-| |
-| |
-| |
-\begin{lstlisting}
-\documentclass{article}
-\usepackage[color]{tiscreen}
-% Remove 'color' to display in back and white
-
-\begin{document}
+\begin{SideBySideExample}[xrightmargin=6cm]
+%\usepackage[color]{tiscreen}
\tiscreen
|4+1 |
| 5|
|Ans{sq} |
| 25|
+|{fcur} |
| |
| |
| |
-| |
+\end{SideBySideExample}
-\end{document}
-\end{lstlisting}
\section{Package option(s)}
\subsection{Color}
-Using the \texttt{color} option will change the colors used by the
-\textbackslash\texttt{LCD} command. The colors are defined as
-\texttt{tiscreenfg} (foreground. i.e. font color) and \texttt{tiscreenbg}
-(background). These colors can be redefined like this:
+Using the \texttt{color} option will change the colors used by the \LCDcmd
+command. The colors are defined as \texttt{tiscreenfg} (foreground. i.e. font
+color) and \texttt{tiscreenbg} (background). These colors can be redefined like
+this:
-\begin{lstlisting}
+\begin{Verbatim}
% Add this to your preamble
\definecolor{tiscreenbg}{HTML}{5d9345}
\definecolor{tiscreenfg}{HTML}{FFFFFF}
-\end{lstlisting}
+\end{Verbatim}
\section{LCD size}
-The default LCD size is $8\times 16$ (the size of the TI-82 STATS). It can be
-changed by redefining the variables used to determine the size of the display
-or by using the original {\textbackslash LCD} command.
+The default LCD size is $8\times 16$ (the size of the TI-82
+STATS). It can be changed by redefining the variables used to
+determine the size of the display or by using the original
+\LCDcmd command.
-\begin{lstlisting}
-% First method:
+\begin{Verbatim}
+% First method (For entire document)
\def\tiscreenX{16}
\def\tiscreenY{8}
-% Second method:
+% Second method (Only once)
\LCD{5}{11}
|ANOTHER |
|EXAMPLE |
|WITH A |
|DIFFERENT|
|SIZE |
-\end{lstlisting}
+\end{Verbatim}
\section{Additional defined characters} \LCDcolors{black}{white}
-\begin{tabular}{l|l|l}
+\begin{tabular}{l|l|>{\ttfamily}l}
\hline
\multicolumn{3}{c}{\textbf{Added characters}} \\
\hline \hline
- Name & Symbol & Code \\
+ Name & Symbol &\normalfont{\LCDcmd Code} \\
\hline
- E & \LCDsymb{sciE} & \LCDcode{sciE} \\
- $\sigma$ & \LCDsymb{sigma} & \LCDcode{sigma} \\
- $\bar x$ & \LCDsymb{barx} & \LCDcode{barx} \\
- $\bar y$ & \LCDsymb{bary} & \LCDcode{bary} \\
- $^\wedge 2$ & \LCDsymb{sq} & \LCDcode{sq} \\
- $^\wedge (-1)$ & \LCDsymb{ar} & \LCDcode{ar} \\
- $_1$ & \LCDsymb{sub1} & \LCDcode{sub1} \\
- $_2$ & \LCDsymb{sub2} & \LCDcode{sub2} \\
- $_3$ & \LCDsymb{sub3} & \LCDcode{sub3} \\
- $_4$ & \LCDsymb{sub4} & \LCDcode{sub4} \\
- $_5$ & \LCDsymb{sub5} & \LCDcode{sub5} \\
- $_6$ & \LCDsymb{sub6} & \LCDcode{sub6} \\
+ E & \LCDsymb{sciE} & \{sciE\} \\
+ $\sigma$ & \LCDsymb{sigma} & \{sigma\} \\
+ $\bar x$ & \LCDsymb{barx} & \{barx\} \\
+ $\bar y$ & \LCDsymb{bary} & \{bary\} \\
+ $x^2$ & \LCDsymb{sq} & \{sq\} \\
+ $x^{-1}$ & \LCDsymb{ar} & \{ar\} \\
+ $x_1$ & \LCDsymb{sub1} & \{sub1\} \\
+ $x_2$ & \LCDsymb{sub2} & \{sub2\} \\
+ $x_3$ & \LCDsymb{sub3} & \{sub3\} \\
+ $x_4$ & \LCDsymb{sub4} & \{sub4\} \\
+ $x_5$ & \LCDsymb{sub5} & \{sub5\} \\
+ $x_6$ & \LCDsymb{sub6} & \{sub6\} \\
\hline
\multicolumn{3}{c}{\textbf{Redefined characters}} \\
\hline \hline
- ! & \LCDsymb{!} & \LCDcode{!} \\
- $\sqrt{\hphantom{0}}$ & \LCDsymb{sqrt} & \LCDcode{sqrt} \\
- e & \LCDsymb{e} & \texttt{e} \\
- i & \LCDsymb{i} & \texttt{i} \\
- v & \LCDsymb{v} & \texttt{v} \\
- w & \LCDsymb{w} & \texttt{w} \\
+ ! & \LCDsymb{!} & \{!\} \\
+ $\sqrt{x}$ & \LCDsymb{sqrt} & \{sqrt\} \\
+ e & \LCDsymb{e} & e \\
+ i & \LCDsymb{i} & i \\
+ v & \LCDsymb{v} & v \\
+ w & \LCDsymb{w} & w \\
\end{tabular}
\end{document}
diff --git a/macros/latex/contrib/tiscreen/tex/tiscreen.sty b/macros/latex/contrib/tiscreen/tex/tiscreen.sty
index d1693eb1b2..3cc0136c8c 100644
--- a/macros/latex/contrib/tiscreen/tex/tiscreen.sty
+++ b/macros/latex/contrib/tiscreen/tex/tiscreen.sty
@@ -4,7 +4,7 @@
% license is at: http://www.latex-project.org/lppl.txt
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{tiscreen}[2021/06/07 Ti calculator screen]
+\ProvidesPackage{tiscreen}[2021/06/10 Ti calculator screen]
% TODO
% Scaling option
diff --git a/macros/luatex/generic/luatexko/ChangeLog b/macros/luatex/generic/luatexko/ChangeLog
index 87afc21887..07a26993c6 100644
--- a/macros/luatex/generic/luatexko/ChangeLog
+++ b/macros/luatex/generic/luatexko/ChangeLog
@@ -1,3 +1,20 @@
+2021-06-10 Dohyun Kim <nomos at ktug org>
+
+ Version 3.2
+
+ * luatexko.lua:
+ - support automatic josa selection after hanja characters
+ - dotemph/uline/ruby routines are now called from hpack_filter,
+ pre_linebreak_filter, and post_linebreak_filter callbacks.
+
+ * luatexko.sty:
+ - use LaTeX's selectfont hook which require LaTeX 2021/06/01 or later
+ - a new LaTeX environment: verticaltypesetting
+ - new plain TeX commands: \sethangulfont \sethanjafont \setfallbackfont
+ \beginverticaltypesetting \endverticaltypesetting
+ - vertical/horizontal environments now honor empty argument, which means
+ natural width.
+
2021-04-20 Dohyun Kim <nomos at ktug org>
Version 3.1
diff --git a/macros/luatex/generic/luatexko/README b/macros/luatex/generic/luatexko/README
index 1b9329ffca..f3e1feb636 100644
--- a/macros/luatex/generic/luatexko/README
+++ b/macros/luatex/generic/luatexko/README
@@ -1,4 +1,4 @@
-LuaTeX-ko Package version 3.1 (2021/04/20)
+LuaTeX-ko Package version 3.2 (2021/06/10)
===========================================
This is a Lua(La)TeX macro package that supports typesetting Korean
diff --git a/macros/luatex/generic/luatexko/luatexko-doc.pdf b/macros/luatex/generic/luatexko/luatexko-doc.pdf
index dc87222ab2..7b4c4336e6 100644
--- a/macros/luatex/generic/luatexko/luatexko-doc.pdf
+++ b/macros/luatex/generic/luatexko/luatexko-doc.pdf
Binary files differ
diff --git a/macros/luatex/generic/luatexko/luatexko-doc.tex b/macros/luatex/generic/luatexko/luatexko-doc.tex
index d23b010e8f..9153b572ed 100644
--- a/macros/luatex/generic/luatexko/luatexko-doc.tex
+++ b/macros/luatex/generic/luatexko/luatexko-doc.tex
@@ -41,7 +41,6 @@
}
}
\defaultfontfeatures+{Renderer=HarfBuzz}
-\setmainfont{Latin Modern Roman}[Expansion] % for hb tlig
\setmainhangulfont{Noto Serif CJK KR}[
Scale=0.98,
AutoFakeSlant,
@@ -50,9 +49,9 @@
UprightFont=* Light,
BoldFont=* Bold,
InterLatinCJK=.125em,
+ CompressPunctuations,
Expansion, Protrusion=notoserifcjk,
]
-\setsansfont{Latin Modern Sans}
\setsanshangulfont{Noto Sans CJK KR}[
Scale=0.98,
Script=Hangul,
@@ -74,7 +73,8 @@
CharRaise=-.125ex,
Color=MidnightBlue,
]
-\setmathhangulfont{Noto Sans CJK KR}[
+\setmathhangulfont{Noto Sans CJK KR}
+[
Script=Hangul,
Language=Korean,
SizeFeatures={
@@ -110,7 +110,7 @@
\AddToHook{env/itemize/begin}{\small}
\AddToHook{env/verbatim/begin}{\linespread{1.1}}
-\catcode`|=13 \protected\def|{\verb|\let\\=\textbackslash}
+\catcode`|=13 \protected\def|{\verb|\let\\=\textbackslash} %|
\def\nohyphen{\language\csname l@nohyphenation\endcsname}
\protected\def\cs#1{\texttt{\nohyphen \textbackslash\detokenize{#1}}}
\protected\def\pkgkwd#1#{\leavevmode
@@ -125,6 +125,14 @@
\def\kotex{\logoko\kern-.1ex .\kern-.1667em \TeX}
\def\hemph#1{\textsf{\bfseries #1}}
\def\ldots{$\dots$}
+\newenvironment{plaintex}{%
+ \par\bigskip
+ \begin{narrower}\small\parindent=0pt
+ \leavevmode\llap{\color{gray}plain \TeX\quad}\ignorespaces
+}{
+ \par
+ \end{narrower}%
+}
\widowpenalty5000
\clubpenalty5000
@@ -134,7 +142,7 @@
\author{Dohyun Kim \normalsize |<nomos at ktug org>| \and
Soojin Nam \normalsize |<jsunam at gmail com>| \and
\normalsize <\url{http://github.com/dohyunkim/luatexko}>}
-\date{Version 3.1\quad 2021/04/20}
+\date{Version 3.2\quad 2021/06/10}
\maketitle
\begin{quote}
@@ -181,13 +189,7 @@ fontspec 문서 참조.
첫 두 줄, 즉 main/sans 글꼴들에는 |Ligatures=TeX| 옵션이 자동으로 주어진다.%
\footnote{%
\cs{adhochangulfont} \cs{adhochanjafont} \cs{addhocfallbackfont}는
- 마지막 줄 명령들의 다른 이름들이다. }\,%
-\footnote{%
- 플레인텍에서 한글 글꼴 설정은 다음과 같이 한다:\par
- \leftskip=3em\noindent
- \cs{hangulfont=UnDotum\relax}\\
- \cs{hanjafont=UnDotum at 14pt}\\
- \cs{fallbackfont=HanaMinB at 12pt} }
+ 마지막 줄 명령들의 다른 이름들이다. }
\begin{verbatim}
\setmainhangulfont \setmainhanjafont \setmainfallbackfont
\setsanshangulfont \setsanshanjafont \setsansfallbackfont
@@ -198,6 +200,27 @@ fontspec 문서 참조.
\hangulfontspec \hanjafontspec \fallbackfontspec
\end{verbatim}
+\begin{plaintex}
+ 플레인텍에서 한글 글꼴 설정은 다음과 같이 할 수 있다:
+\begin{verbatim}
+ \hangulfont=UnDotum\relax
+ \hanjafont="Noto Sans CJK KR" at 10pt
+ \fallbackfont=HanaMinA at 10pt
+\end{verbatim}
+
+ v3.2부터는 한글폰트의 기본값으로 \hemph{은바탕}을 로드한다.
+ 또한 다음 명령들도 제공한다:
+\begin{verbatim}
+ \sethangulfont\taza=UnTaza at 12pt
+ \sethanjafont\dotum=UnDotum at 12pt
+ \setfallbackfont\noto={Noto Sans CJK KR} at 12pt
+\end{verbatim}
+ 그리하여 다음처럼 지시할 수 있게 된다:
+\begin{verbatim}
+ \expandafter\def\expandafter\tt\expandafter{\tt\taza\dotum\noto}
+\end{verbatim}
+\end{plaintex}
+
\section{글꼴 대체}\label{sec:fontswitch}
원칙적으로 \luatexko는 지시된 글자가 영문폰트에 없으면 한글폰트에서,
@@ -219,15 +242,15 @@ fontspec 문서 참조.
|0|을 지시해야 이 기능이 비로소 꺼진다.
verbatim 코드를 식자할 때는 이 기능이 작동하지 않으며,%
\footnote{%
- 정확히 말하자면 |\\language=\\l@nohyphenation|, 즉 하이프네이션이
- 허용 안 되는 상황에서는 작동하지 않는다.
+ 정확히 말하자면 |\\language=\\l@nohyphenation| (플레인텍에서는 |\\language=-1|인 경우),
+ 즉 하이프네이션이 허용 안 되는 상황에서는 작동하지 않는다.
부연하건대, |\\language=\\l@nohyphenation| 상황에서 작동하지 않는
그밖의 기능은 다음과 같다: 줄바꿈 허용, InterCharacter, InterHangul,
InterLatinCJK, CompressPunctuations, RemoveClassicSpaces,
한글^^b7한자 폰트 문자 다음의 공백 크기 조정 등. 마지막의
한글^^b7한자 다음의 공백 크기 조정은 영문자가 고정폭 글꼴일 때에도
작동하지 않는다. }
-문장부호가 고정폭 글꼴일 때에도 작동하지 않는다.
+문장부호가 고정폭 글꼴이거나 tfm 폰트일 때에도 작동하지 않는다.
영향 받는 문장부호들의 기본값은 다음과 같다:
\begin{verbatim}
[0x21] ! [0x27] ' [0x28] ( [0x29] )
@@ -374,7 +397,9 @@ fontspec의 글꼴 옵션 외에 \luatexko가 따로 제공하는 것들이 있
|Vertical=HalfMetrics|와 거의 같은 기능을 한다.%
\footnote{%
플레인텍에서는 각각 |+halt| 및 |+vhal|이다. 이들과 완전 동일하진
- 않다. 가령 U+3002 (\char"3002) 처리의 경우.}
+ 않다. 가령 U+00B7\;(^^b7)의 경우 및 고문헌조판 모드에서
+ U+2018\;(^^^^2018) U+2019\;(^^^^2019) U+201C\;(^^^^201c) U+201D\;(^^^^201d)
+ 처리의 경우.}
\item[Protrusion] \pkgkwd*{Protrusion}%
특정 글자가 행 끝에 왔을 때 판면 바깥으로 끌어내는
@@ -417,12 +442,16 @@ fontspec의 글꼴 옵션 외에 \luatexko가 따로 제공하는 것들이 있
}\label{fig:gomun}
\end{figure}
-고문헌 조판을 위해 \pkgkwd{typesetclassic} 환경을 제공한다.%
+고문헌 조판을 위해 \pkgkwd{typesetclassic} 환경을 제공한다.
+전처리부에 \cs{typesetclassic}을 선언할 수도 있다.%
\footnote{%
플레인텍에서는 (문서 전체에 적용하지 않는다면 그룹 안에서)
- \cs{typesetclassic}을 사용한다.
+ \cs{typesetclassic}을 사용한다. }\,%
+\footnote{%
|japanese|, |chinese|, |Schinese|, |Tchinese|, |korean| 따위의 환경은
- 지난 버전과의 호환성을 위해 당분간 제공되고 있을 뿐이다. }
+ 지난 버전과의 호환성을 위해 제공되고 있을 뿐이다.
+ 그렇더라도 중국어나 일본어 폰트를 사용한다면 이들 환경을 사용하는 것이 좋다.
+ |chinese|는 |Schinese|와 동의어이다. }
그림~\ref{fig:gomun} 참조.
v2.0부터는 고문헌 조판에서 한글^^b7한자와 영문자가 붙어 나오더라도 자동으로
@@ -464,6 +493,13 @@ v2.0부터는 고문헌 조판에서 한글^^b7한자와 영문자가 붙어 나
세로쓰기에서 |CharRaise| 옵션의 효과에 대해서는 제\ref{sec:fontoption}절을
참조.
+문서의 일부를 세로쓰기하려면
+|\begin{|\pkgkwd{vertical}|}{<dimen>}| \ldots\ |\end{vertical}|
+환경을 이용한다. 인자 |<dimen>|으로 세로쓰기 박스의 높이를 지시한다.
+그림~\ref{fig:vertical},~\ref{fig:vertical3} 및 \ref{fig:vertical2} 참조.
+만약 인자가 비어있거나 \cs{empty}이면 본문을 한 줄짜리 박스로 식자하며,
+이때 높이는 natural height가 된다.
+
\begin{figure}
\fboxsep=5pt
\framebox[\linewidth]{
@@ -472,7 +508,9 @@ v2.0부터는 고문헌 조판에서 한글^^b7한자와 영문자가 붙어 나
\hunmintxt
\end{vertical}
}
- \caption{세로쓰기의 예. 박스 높이 |20em|을 지시했다.}\label{fig:vertical}
+ \caption{세로쓰기의 예. 박스 높이 |20em|을 지시했다.
+ 아직 HarfBuzz 모드를 쓸 수 없으므로 폰트에 |Renderer=Node| 옵션을 명시했다.
+ }\label{fig:vertical}
\end{figure}
\begin{figure}
@@ -494,24 +532,6 @@ v2.0부터는 고문헌 조판에서 한글^^b7한자와 영문자가 붙어 나
}\label{fig:vertical3}
\end{figure}
-문서의 일부를 세로쓰기하려면
-|\begin{|\pkgkwd{vertical}|}{<dimen>}| \ldots\ |\end{vertical}|
-환경을 이용한다. |<dimen>|으로 세로쓰기 박스의 높이를 지시한다.%
-\footnote{%
- 플레인텍에서는 \cs{vertical{<dimen>}} \ldots\ \cs{endvertical}. }
-그림~\ref{fig:vertical},~\ref{fig:vertical3} 및 \ref{fig:vertical2} 참조.
-
-문서 전체를 세로쓰기한다면 이 환경을 쓰는 대신
-\pkgkwd{\verticaltypesetting} 명령을 전처리부에 선언한다.
-이때 면주는 가로로 식자되며 면주 폰트의 설정은 사용자의 몫이다.
-
-세로쓰기 도중에 문서의 일부를 가로쓰기하려면
-|\begin{|\pkgkwd{horizontal}|}{<dimen>}| \ldots\ |\end{horizontal}|
-환경을 이용한다. |<dimen>|은 가로쓰기 박스의 너비를 지시한다.%
-\footnote{%
- 플레인텍에서는 \cs{horizontal{<dimen>}} \ldots\ \cs{endhorizontal}. }
-가로쓰기 영역의 폰트 설정은 사용자의 몫이다.
-
\begin{figure}
\fboxsep=5pt
\framebox[\linewidth]{
@@ -541,6 +561,33 @@ v2.0부터는 고문헌 조판에서 한글^^b7한자와 영문자가 붙어 나
}\label{fig:vertical2}
\end{figure}
+문서 전체를 세로쓰기한다면 이 환경을 쓰는 대신
+\pkgkwd{\verticaltypesetting} 명령을 전처리부에 선언한다.
+이때 면주는 가로로 식자되며 면주 폰트의 설정은 사용자의 몫이다.
+
+몇몇 페이지를 세로쓰기로 식자하려면 본문 중에
+|\begin{|\pkgkwd{verticaltypesetting}|}| \ldots\ |\end{verticaltypesetting}|
+환경을 이용한다.
+이때도 면주는 가로로 식자되며, 환경의 시작과 끝에서 쪽나눔이 행해진다.
+
+세로쓰기 도중에 문서의 일부를 가로쓰기하려면
+|\begin{|\pkgkwd{horizontal}|}{<dimen>}| \ldots\ |\end{horizontal}|
+환경을 이용한다. |<dimen>|은 가로쓰기 박스의 너비를 지시한다.
+만약 인자가 비어있거나 \cs{empty}이면 본문을 한 줄짜리 박스로 식자하며,
+이때 너비는 당연히 natural width가 된다.
+
+\begin{plaintex}
+ 문서의 일부를 세로쓰기하려면 |\vertical{<dimen>}| \ldots\ |\endvertical|.
+ 인자는 비워둘 수 있다.
+
+ 문서 전체를 세로쓰기하려면 문서 첫머리에 \cs{verticaltypesetting}.
+
+ 몇몇 페이지를 세로쓰기하려면 \cs{beginverticaltypesetting} \ldots\ \cs{endverticaltypesetting}.
+
+ 세로쓰기 도중에 가로쓰기를 넣으려면 |\horizontal{<dimen>}| \ldots\ |\endhorizontal|.
+ 인자는 비워둘 수 있다.
+\end{plaintex}
+
\section{드러냄표}\label{sec:dotemph}
\pkgkwd{\dotemph} 명령으로 \dotemph{드러냄표}%
@@ -575,9 +622,7 @@ v2.0부터는 고문헌 조판에서 한글^^b7한자와 영문자가 붙어 나
\footnote{%
플레인텍에서는 루비의 글꼴크기를 따로 조정해주지 않는다.
사용자가 \cs{rubyfont}를 설정할 때 크기도 함께 지시하도록 한다.
- 가령:\par
- \leftskip=3em\noindent
- |\\font\\rubyfont=UnBatang at \\rubysize em| }
+ 가령: |\\font\\rubyfont=UnBatang at \\rubysize em| }
③~|\def|\pkgkwd{\rubysep}|{0.1ex}|: 루비와 본문 글자 사이의 간격을 지정
@@ -635,12 +680,12 @@ ulem 패키지가 \luatexko와 궁합이 맞지 않아{\small (줄바꿈에 문
\begin{verbatim}
\def\ymarker{%
\markoverwith{%
- \hbox{{\color{yellow!50}\vrule width 1pt height 9pt depth 2pt}}%
+ \hbox{\color{yellow!50}\vrule width 1pt height 9pt depth 2pt}%
}}
\end{verbatim}
\def\ymarker{\markoverwith{%
- \hbox{{\color{yellow!50}\vrule width 1pt height 9pt depth 2pt}}}}
+ \hbox{\color{yellow!50}\vrule width 1pt height 9pt depth 2pt}}}
\cs{ymarker{노란색을 칠해서 강조한다}}\quad$\Rightarrow$\quad
\ymarker{노란색을 칠해서 강조한다}.
@@ -679,23 +724,26 @@ ulem 패키지가 \luatexko와 궁합이 맞지 않아{\small (줄바꿈에 문
수식 한글 폰트를 설정하면 수식 모드에서도 한글을 {\small(hbox로 감싸지 않고)}
직접 입력할 수 있다.%
\footnote{%
- 플레인텍에서는 \cs{mathhangulfont=UnBatang}과 같이 설정한다.
- 또는 좀 더 그럴듯하게 하려면:\par
- \leftskip=3em\noindent
- |\\font\\texthangul="Noto Sans CJK KR DemiLight" at 10pt|\\
- |\\font\\scripthangul="Noto Sans CJK KR Regular" at 7pt|\\
- |\\font\\scriptscripthangul="Noto Sans CJK KR Medium" at 5pt|\\
- |\\setmathhangulfonts\\texthangul\\scripthangul\\scriptscripthangul| }
+ |\\hbox|를 쓰지 않고 직접 입력하는 수식 한글이
+ \uline{디스플레이 수식} 안에 사용된 경우,
+ 앞서 기술한 드러냄표 강조, 밑줄 강조, 한글 글꼴 옵션 등의 기능이 현재로는
+ 전혀 작동하지 않는다. 구현은 비교적 간단하지만, 과연 수식에서
+ 저러한 기능을 써야 할 경우가 있을까 의문이기 때문이다.
+ 사용자의 요청이 있으면 즉시 반영하겠다.
+}
v2.0부터는 자동으로 수식 한글을 잡아주지 않는다.%
\pkgkwd*{\setmathhangulfont}
\begin{verbatim}
- \setmathhangulfont{Noto Sans CJK KR}[
+ \setmathhangulfont{Noto Sans CJK KR}
+ [
SizeFeatures={
{Size=-6, Font=* Medium},
{Size=6-9, Font=* Regular},
{Size=9-, Font=* DemiLight},
- } ]
+ }
+ ]
\end{verbatim}
+
현재 한글만 쓸 수 있게 설정되어 있다. 한자도 수식에 직접 입력하려면 사용자는
다음 명령으로 유니코드 블럭을 추가 지정해야 한다.%
\pkgkwd*{\setmathhangulblock}
@@ -703,6 +751,18 @@ v2.0부터는 자동으로 수식 한글을 잡아주지 않는다.%
\setmathhangulblock{4E00}{9FC3}
\end{verbatim}
+\begin{plaintex}
+ 플레인텍에서는 \cs{mathhangulfont=UnBatang}과 같이 설정한다.
+
+ 또는 좀 더 그럴듯하게 하려면:
+\begin{verbatim}
+ \font\texthangul="Noto Sans CJK KR DemiLight" at 10pt
+ \font\scripthangul="Noto Sans CJK KR Regular" at 7pt
+ \font\scriptscripthangul="Noto Sans CJK KR Medium" at 5pt
+ \setmathhangulfonts\texthangul\scripthangul\scriptscripthangul
+\end{verbatim}
+\end{plaintex}
+
\section{한국어 항목 번호}\label{sec:hangulnums}
\kotex과 동일하게 항목 번호를 한국어 기호로 붙일 수 있다.%
@@ -719,7 +779,9 @@ v2.0부터는 자동으로 수식 한글을 잡아주지 않는다.%
유사하다.%
\footnote{%
변환기능은 |lua-uni-algos| 패키지를 이용하므로
- 이 패키지를 설치해두어야 한다. 또한 HarfBuzz 모드에서는
+ 이 패키지를 설치해두어야 한다. }\,%
+\footnote{%
+ HarfBuzz 모드에서는
첫가끝 자모로의 입력변환이 효과를 못볼 수도 있으니 유의할 것.
}
@@ -732,7 +794,8 @@ v2.0부터는 자동으로 수식 한글을 잡아주지 않는다.%
|0|을 할당하면 다시 UTF-8 입력으로 간주한다. \XeTeX의 \cs{XeTeXinputencoding}
명령과 유사하나, 오직 한국어 문자만 처리할 수 있다.%
\footnote{%
- 윈도 운영체제에서의 한글 파일이름 불러오기 기능은 v2.0부터는 제공하지 않는다.
+ CP949 인코딩 파일시스템을 사용하는 윈도 운영체제에서의
+ 한글 파일이름 불러오기 기능은 v2.0부터는 제공하지 않는다.
대신 |luatex -cmdx ...|, |lualatex -cmdx ...|와 같이 컴파일시 명령행에
|-cmdx| 옵션을 주면 된다고 하니 테스트해 보시기 바란다. }
@@ -743,6 +806,14 @@ v2.0부터는 자동으로 수식 한글을 잡아주지 않는다.%
\section*{주요 변경 이력}
\begin{itemize}\linespread{1.1}\selectfont
+ \item[v3.2] ------
+ \item 한자 뒤에서도 자동조사 기능이 대체로 동작하게끔 하였다.
+ \XeTeX-\logoko{} 패키지가 설치돼 있을 것을 요구한다.
+ \item \hyperref[sec:verttype]{|vertical| 및 |horizontal| 환경의 인자를 비워둘 수 있다}.
+ \item \hyperref[sec:verttype]{|verticaltypesetting|을 환경으로도 쓸 수 있다.
+ 플레인텍에서는 \cs{beginverticaltypesetting} \cs{endverticaltypesetting}}.
+ \item \hyperref[sec:fontcmds]{플레인텍 명령
+ \cs{sethangulfont} \cs{sethanjafont} \cs{setfallbackfont} 추가}
\item[v3.0] ------
\item \hyperref[sec:fontoption]{세로쓰기에서 |CharRaise| 옵션은
이제 글자들의 \dotemph{추가적인} 이동 길이를 나타낸다.}
diff --git a/macros/luatex/generic/luatexko/luatexko-normalize.lua b/macros/luatex/generic/luatexko/luatexko-normalize.lua
index a86b709390..96a0d12cf3 100644
--- a/macros/luatex/generic/luatexko/luatexko-normalize.lua
+++ b/macros/luatex/generic/luatexko/luatexko-normalize.lua
@@ -13,8 +13,8 @@
luatexbase.provides_module({
name = "luatexko-normalize",
- version = "3.1",
- date = "2021/04/20",
+ version = "3.2",
+ date = "2021/06/10",
author = "Dohyun Kim, Soojin Nam",
description = "Hangul normalization",
license = "LPPL v1.3+",
diff --git a/macros/luatex/generic/luatexko/luatexko-uhc2utf8.lua b/macros/luatex/generic/luatexko/luatexko-uhc2utf8.lua
index d3d86fcb25..2c5fd64f9e 100644
--- a/macros/luatex/generic/luatexko/luatexko-uhc2utf8.lua
+++ b/macros/luatex/generic/luatexko/luatexko-uhc2utf8.lua
@@ -13,8 +13,8 @@
luatexbase.provides_module({
name = "luatexko-uhc2utf8",
- version = "3.1",
- date = "2021/04/20",
+ version = "3.2",
+ date = "2021/06/10",
author = "Dohyun Kim, Soojin Nam",
description = "UHC (CP949) input encoding",
license = "LPPL v1.3+",
diff --git a/macros/luatex/generic/luatexko/luatexko.lua b/macros/luatex/generic/luatexko/luatexko.lua
index d0360a8b72..aa1aa4149f 100644
--- a/macros/luatex/generic/luatexko/luatexko.lua
+++ b/macros/luatex/generic/luatexko/luatexko.lua
@@ -13,8 +13,8 @@
luatexbase.provides_module {
name = 'luatexko',
- date = '2021/04/20',
- version = '3.1',
+ date = '2021/06/10',
+ version = '3.2',
description = 'typesetting Korean with LuaTeX',
author = 'Dohyun Kim, Soojin Nam',
license = 'LPPL v1.3+',
@@ -72,6 +72,7 @@ local attributes = luatexbase.attributes
local call_callback = luatexbase.call_callback
local create_callback = luatexbase.create_callback
local module_warning = luatexbase.module_warning
+local new_attribute = luatexbase.new_attribute
local new_user_whatsit = luatexbase.new_user_whatsit
local registernumber = luatexbase.registernumber
@@ -85,6 +86,7 @@ local glueid = node.id"glue"
local glyphid = node.id"glyph"
local hlistid = node.id"hlist"
local kernid = node.id"kern"
+local localparid = node.id"local_par"
local mathid = node.id"math"
local penaltyid = node.id"penalty"
local ruleid = node.id"rule"
@@ -98,6 +100,7 @@ local italcorr = 3
local lua_number = 100
local lua_value = 108
local spaceskip = 13
+local indentbox = 3
local nohyphen = registernumber"l@nohyphenation" or -1 -- verbatim
local langkor = registernumber"koreanlanguage" or 16383
@@ -107,11 +110,12 @@ local fallbackfontattr = attributes.luatexkofallbackfontattr
local autojosaattr = attributes.luatexkoautojosaattr
local classicattr = attributes.luatexkoclassicattr
local dotemphattr = attributes.luatexkodotemphattr
-local ulineattr = attributes.luatexkoulineattr
local rubyattr = attributes.luatexkorubyattr
local hangulbyhangulattr = attributes.luatexkohangulbyhangulattr
local hanjabyhanjaattr = attributes.luatexkohanjabyhanjaattr
+local unicodeattr = new_attribute"luatexkounicodeattr"
+
local stretch_f = 5/100 -- should be consistent for ruby
local function get_font_data (fontid)
@@ -537,12 +541,15 @@ local special_classes = {
[0xFF01] = 4, [0xFF1A] = 2, [0xFF1B] = 2, [0xFF1F] = 4,
}, { __index = charclass }),
setmetatable({ -- TC
- [0x3001] = 3, [0x3002] = 3, [0xFF0C] = 3, [0xFF0E] = 3,
+ [0x3001] = 3, [0x3002] = 5, [0xFF0C] = 3, [0xFF0E] = 5,
}, { __index = charclass }),
setmetatable({ -- TC vert
- [0x3001] = 3, [0x3002] = 3, [0xFF0C] = 3, [0xFF0E] = 3,
+ [0x3001] = 3, [0x3002] = 5, [0xFF0C] = 3, [0xFF0E] = 5,
[0xFF1A] = 7, [0xFF1B] = 7, -- 0xFE13, 0xFE14
}, { __index = charclass }),
+ setmetatable({ -- JP vert
+ [0xFF1B] = 7, -- 0xFE14
+ }, { __index = charclass }),
}
local function get_char_class (c, classic)
@@ -684,8 +691,8 @@ local function process_fonts (head)
while curr do
local id = curr.id
if id == glyphid then
- local props = my_node_props(curr)
- if not props.unicode then
+ if curr.font ~= 0 -- exclude nullfont
+ and not has_attribute(curr, unicodeattr) then
local c = curr.char
@@ -735,7 +742,7 @@ local function process_fonts (head)
end
end
- props.unicode = c
+ set_attribute(curr, unicodeattr, c)
end
elseif id == discid then
curr.pre = process_fonts(curr.pre)
@@ -779,11 +786,11 @@ local function hbox_char_font (box, init, glyfonly)
while curr do
local id = curr.id
if id == glyphid then
- local c = my_node_props(curr).unicode or curr.char
+ local c = has_attribute(curr, unicodeattr) or curr.char
if c and not is_cjk_combining(c) then
return c, curr.font
end
- elseif id == hlistid and curr.list then
+ elseif curr.list then
return hbox_char_font(curr, init, glyfonly)
elseif not glyfonly and is_blocking_node(curr) then
return
@@ -858,7 +865,7 @@ local function process_linebreak (head, par)
while curr do
local id = curr.id
if id == glyphid then
- local c = my_node_props(curr).unicode or curr.char
+ local c = has_attribute(curr, unicodeattr) or curr.char
if c and not is_unicode_var_sel(c) then
local old = has_attribute(curr, classicattr)
head, pc, pcl = maybe_linebreak(head, curr, pc, pcl, c, old, curr.font, par)
@@ -913,7 +920,7 @@ local function process_interhangul (head, par)
while curr do
local id = curr.id
if id == glyphid then
- local c = my_node_props(curr).unicode or curr.char
+ local c = has_attribute(curr, unicodeattr) or curr.char
if c and not is_unicode_var_sel(c) then
head, pc = do_interhangul_option(head, curr, pc, c, curr.font, par)
@@ -975,7 +982,7 @@ local function process_interlatincjk (head, par)
while curr do
local id = curr.id
if id == glyphid then
- local c = my_node_props(curr).unicode or curr.char
+ local c = has_attribute(curr, unicodeattr) or curr.char
if c and not is_unicode_var_sel(c) then
head, pc, pf, pcl = do_interlatincjk_option(head, curr, pc, pf, pcl, c, curr.font, par)
pc = breakable_after[c] and pc or 0
@@ -1033,7 +1040,7 @@ local function process_glyph_width (head)
if curr.lang ~= nohyphen
and fontoptions.compresspunctuations[curr.font] then
- local cc = my_node_props(curr).unicode or curr.char
+ local cc = has_attribute(curr, unicodeattr) or curr.char
local old = has_attribute(curr, classicattr)
local class = get_char_class(cc, old)
if class >= 1 and class <= 4 and
@@ -1087,11 +1094,11 @@ local function process_remove_spaces (head)
local vchar, vfont
if id == glyphid and v.lang ~= nohyphen then
- local c = my_node_props(v).unicode or v.char or 0
+ local c = has_attribute(v, unicodeattr) or v.char or 0
if is_unicode_var_sel(c) then
v = getprev(v) or v
end
- vchar, vfont = my_node_props(v).unicode or v.char, v.font
+ vchar, vfont = has_attribute(v, unicodeattr) or v.char, v.font
elseif id == hlistid and v.list then
vchar, vfont = hbox_char_font(v, k == "n")
end
@@ -1131,6 +1138,23 @@ local josa_table = {
[0xC774] = {0xC774, nil, 0xC774}, -- 이(라) = 이, , 이
}
+local hanja2hangul = { }
+
+local function add_to_hanja2hangul (filename, i, last)
+ local f = kpse.find_file(filename)
+ if f then
+ for c in io.lines(f) do
+ hanja2hangul[i] = tonumber(c)
+ i = i + 1
+ end
+ else
+ warning("cannot find %s", filename)
+ for c = i, last do
+ hanja2hangul[c] = c
+ end
+ end
+end
+
local josa_code = setmetatable({
[0x30] = 3, [0x31] = 1, [0x33] = 3, [0x36] = 3,
[0x37] = 1, [0x38] = 1, [0x4C] = 1, [0x4D] = 3,
@@ -1156,16 +1180,37 @@ local josa_code = setmetatable({
[0xFF13] = 3, [0xFF16] = 3, [0xFF17] = 1, [0xFF18] = 1,
[0xFF2C] = 1, [0xFF2D] = 3, [0xFF2E] = 3, [0xFF4C] = 1,
[0xFF4D] = 3, [0xFF4E] = 3,
-},{ __index = function(_,c)
+},{ __index = function(t, cc)
+ local c = cc
+ -- xetexko에 포함된 .tab 파일들을 이용해 한자를 한글로 변환
+ if c >= 0x4E00 and c <= 0x9FA5 then
+ if not hanja2hangul[c] then
+ add_to_hanja2hangul("hanja_hangul.tab", 0x4E00, 0x9FA5)
+ end
+ c = hanja2hangul[c]
+ elseif c >= 0xF900 and c <= 0xFA2D then
+ if not hanja2hangul[c] then
+ add_to_hanja2hangul("hanjacom_hangul.tab", 0xF900, 0xFA2D)
+ end
+ c = hanja2hangul[c]
+ elseif c >= 0x3400 and c <= 0x4DB5 then
+ if not hanja2hangul[c] then
+ add_to_hanja2hangul("hanjaexa_hangul.tab", 0x3400, 0x4DB5)
+ end
+ c = hanja2hangul[c]
+ end
if is_hangul(c) then
c = (c - 0xAC00) % 28 + 0x11A7
end
if is_chosong(c) then
- return c == 0x1105 and 1 or 3
+ c = c == 0x1105 and 1 or 3
+ t[cc] = c; return c
elseif is_jungsong(c) then
- return c ~= 0x1160 and 2
+ c = c ~= 0x1160 and 2
+ t[cc] = c; return c
elseif is_jongsong(c) then
- return c == 0x11AF and 1 or 3
+ c = c == 0x11AF and 1 or 3
+ t[cc] = c; return c
elseif is_noncjk_char(c) and c <= 0x7A
or c >= 0x2160 and c <= 0x217F -- roman
or c >= 0x2460 and c <= 0x24E9 -- ①
@@ -1175,11 +1220,13 @@ local josa_code = setmetatable({
or c >= 0xFF10 and c <= 0xFF19 -- 0
or c >= 0xFF21 and c <= 0xFF3A -- A
or c >= 0xFF41 and c <= 0xFF5A -- a
- then return 2
+ then
+ t[cc] = 2; return 2
elseif c >= 0x3131 and c <= 0x314E or c >= 0x3165 and c <= 0x3186 -- ㄱ
or c >= 0x3200 and c <= 0x320D -- ㈀
or c >= 0x3260 and c <= 0x326D -- ㉠
- then return 3
+ then
+ t[cc] = 3; return 3
end
end })
@@ -1188,7 +1235,7 @@ local function prevjosacode (n, parenlevel, ignore_parens)
while n do
local id = n.id
if id == glyphid then
- local c = my_node_props(n).unicode or n.char -- beware hlist/vlist
+ local c = has_attribute(n, unicodeattr) or n.char -- beware hlist/vlist
if ignore_parens and c == 0x29 then -- )
parenlevel = parenlevel + 1
elseif ignore_parens and c == 0x28 then -- (
@@ -1287,8 +1334,8 @@ local function process_dotemph (head)
elseif curr.id == glyphid then
local dotattr = has_attribute(curr, dotemphattr)
- if dotattr then
- local c = my_node_props(curr).unicode or curr.char
+ if dotattr and dotemphbox[dotattr] then
+ local c = has_attribute(curr, unicodeattr) or curr.char
if is_hangul(c) or
is_compat_jamo(c) or
is_chosong(c) or
@@ -1425,7 +1472,7 @@ end
local ulitems = {}
local function process_uline (head, parent, level)
- local curr, level, attr = head, level or 0
+ local curr, level = head, level or 0
while curr do
if curr.list then
curr.list = process_uline(curr.list, curr, level+1)
@@ -1439,33 +1486,28 @@ local function process_uline (head, parent, level)
list = list,
subtype = subtype,
level = level,
+ start = getnext(curr) or curr,
}
else
local item = ulitems[value]
if item then
head = draw_uline(head, curr, parent, item, true)
ulitems[value] = nil
- attr = nil
end
end
- else
- local currattr = has_attribute(curr, ulineattr)
- if currattr then
- local item = ulitems[currattr]
- if item and not item.start then
- item.start = curr
- attr = currattr
- end
- end
+ local to_free = curr
+ head, curr = noderemove(head, curr)
+ nodefree(to_free)
+ goto nextnode
end
curr = getnext(curr)
+ ::nextnode::
end
- if attr then
- local item = ulitems[attr]
- if item and item.level == level then
+ for _, item in pairs(ulitems) do
+ if item.level == level then
head = draw_uline(head, nodeslide(head), parent, item)
item.start = nil
end
@@ -1496,13 +1538,23 @@ local function process_ruby_pre_linebreak (head)
local rubyid = has_attribute(curr, rubyattr)
if rubyid then
local ruby_t = rubybox[rubyid]
- if ruby_t[3] then -- rubyoverlap
+ if ruby_t and ruby_t[3] then -- rubyoverlap
local side = (ruby_t[1].width - curr.width)/2
if side > 0 then -- ruby is wide
local k, r = nodenew(kernid), nodenew(ruleid)
k.subtype, k.kern = userkern, -side
r.width, r.height, r.depth = side, 0, 0
local k2, r2 = nodecopy(k), nodecopy(r)
+
+ local prev = curr.prev -- 문단 첫머리에 루비 돌출 방지
+ if prev then
+ if prev.id == localparid or
+ prev.id == hlistid and prev.subtype == indentbox and prev.width == 0
+ then
+ k.kern = 0
+ end
+ end
+
head = insert_before(head, curr, k)
head = insert_before(head, curr, r)
head, curr = insert_after(head, curr, r2)
@@ -1540,17 +1592,19 @@ local function process_ruby_post_linebreak (head)
-- consider charraise
local shift = shift_put_top(curr, ruby)
- local _, f = hbox_char_font(curr, true, true)
- local ascender = tableunpack(fontoptions.asc_desc[f]) or curr.height
- ruby.shift = shift - ascender - ruby.depth - ruby_t[2] -- rubysep
+ local f, ascender, descender
+ _, f = hbox_char_font(curr, true, true)
+ ascender = fontoptions.asc_desc[f][1] or curr.height
+ _, f = hbox_char_font(ruby, true, true)
+ descender = fontoptions.asc_desc[f][2] or ruby.depth
+
+ ruby.shift = shift - ascender - descender - ruby_t[2] -- rubysep
head = insert_before(head, curr, ruby)
end
- ruby_t = nil
- elseif curr.list then
- curr.list = process_ruby_post_linebreak(curr.list)
+ rubybox[rubyid] = nil
end
- elseif curr.list then
- curr.list = process_ruby_post_linebreak(curr.list)
+ elseif id == mathid then
+ curr = end_of_math(curr)
end
curr = getnext(curr)
end
@@ -1600,7 +1654,7 @@ local function process_reorder_tonemarks (head)
fontoptions.is_not_harf[curr.font] and
fontoptions.is_hangulscript[curr.font] then
- local uni = my_node_props(curr).unicode or curr.char
+ local uni = has_attribute(curr, unicodeattr) or curr.char
if is_hangul(uni) or is_chosong(uni) or uni == 0x25CC then
init = curr
elseif is_jungsong(uni) or is_jongsong(uni) then
@@ -1609,7 +1663,7 @@ local function process_reorder_tonemarks (head)
local n, syllable = init, { init = init }
while n do
if n.id == glyphid then
- local u = my_node_props(n).unicode or n.char
+ local u = has_attribute(n, unicodeattr) or n.char
if u then tableinsert(syllable, u) end
end
if n == curr then break end
@@ -1912,7 +1966,7 @@ end
-- charraise
-local raiseattr = luatexbase.new_attribute"luatexkoraiseattr"
+local raiseattr = new_attribute"luatexkoraiseattr"
local function process_charraise (head)
local curr = head
@@ -1957,7 +2011,7 @@ local function process_fake_slant_corr (head) -- for font fallback
tableinsert(t, char_in_font(p.font, p.char).italic or 0)
end
- local c = my_node_props(p).unicode or p.char
+ local c = has_attribute(p, unicodeattr) or p.char
if is_jungsong(c) or is_jongsong(c) or hangul_tonemark[c] then
else
break
@@ -2034,13 +2088,6 @@ end,
local pass_fun = function(...) return ... end
create_callback("luatexko_prelinebreak_first", "data", pass_fun)
create_callback("luatexko_prelinebreak_second", "data", pass_fun)
-create_callback("luatexko_do_atbegshi", "data", pass_fun)
-
-function luatexko.process_atbegshi (box)
- if box and box.list then
- box.list = call_callback("luatexko_do_atbegshi", box.list)
- end
-end
add_to_callback("pre_shaping_filter", function(h, gc)
local par = gc == ""
@@ -2250,14 +2297,20 @@ otfregister {
local auxiliary_procs = {
dotemph = {
- luatexko_do_atbegshi = process_dotemph,
+ post_linebreak_filter = process_dotemph,
+ hpack_filter = process_dotemph,
},
uline = {
- luatexko_do_atbegshi = process_uline,
+ post_linebreak_filter = function(h) return process_uline(h) end,
+ hpack_filter = function(h) return process_uline(h) end,
},
ruby = {
- pre_linebreak_filter = process_ruby_pre_linebreak,
- luatexko_do_atbegshi = process_ruby_post_linebreak,
+ pre_linebreak_filter = function(h)
+ h = process_ruby_pre_linebreak(h)
+ h = process_ruby_post_linebreak(h)
+ return h
+ end,
+ hpack_filter = process_ruby_post_linebreak,
},
autojosa = {
luatexko_prelinebreak_first = process_josa,
@@ -2267,9 +2320,16 @@ local auxiliary_procs = {
},
}
+-- dotemph 등을 수식 한글에서도 작동하게 하려면
+-- post_mlist_to_hlist_filter 콜백을 이용해야 한다.
+
function luatexko.activate (name)
for cbnam, cbfun in pairs( auxiliary_procs[name] ) do
- add_to_callback(cbnam, cbfun, "luatexko."..cbnam.."."..name)
+ local prior
+ if cbnam == "hpack_filter" then
+ prior = luatexbase.priority_in_callback(cbnam, "luaotfload.color_handler") or nil
+ end
+ add_to_callback(cbnam, cbfun, "luatexko."..cbnam.."."..name, prior)
end
active_processes[name] = true
end
@@ -2281,8 +2341,9 @@ function luatexko.deactivateall (str)
for _, name in ipairs{ "pre_shaping_filter",
"post_shaping_filter",
"pre_linebreak_filter",
+ "hpack_filter",
"hyphenate",
- "luatexko_do_atbegshi", -- might not work properly
+ "post_linebreak_filter",
} do
local t = {}
for i, v in ipairs( luatexbase.callback_descriptions(name) ) do
@@ -2304,7 +2365,3 @@ function luatexko.reactivateall ()
luatexko.deactivated = nil
end
-function luatexko.currenthashangulchars (cnt)
- texcount[cnt] = char_in_font(fontcurrent(), 0xAC00) and 1 or 0
-end
-
diff --git a/macros/luatex/generic/luatexko/luatexko.sty b/macros/luatex/generic/luatexko/luatexko.sty
index c44ccedcbe..b3f78f4ba4 100644
--- a/macros/luatex/generic/luatexko/luatexko.sty
+++ b/macros/luatex/generic/luatexko/luatexko.sty
@@ -12,9 +12,9 @@
% version 2006/05/20 or later.
\ifdefined\luatexkohangulfontattr \endinput\fi
-\ifdefined\selectfont
- \NeedsTeXFormat{LaTeX2e}[2020/10/01]
- \ProvidesPackage{luatexko}[2021/04/20 v3.1 typesetting Korean with LuaTeX]
+\ifdefined\ProvidesPackage
+ \NeedsTeXFormat{LaTeX2e}[2021/06/01]
+ \ProvidesPackage{luatexko}[2021/06/10 v3.2 typesetting Korean with LuaTeX]
\RequirePackage{luatexbase}
\RequirePackage{fontspec}[2020/02/03]
\else
@@ -25,52 +25,43 @@
\catcode`\@=11
\fi
\newlanguage\koreanlanguage
-\protected\def\pdfliteral{\pdfextension literal}
\newattribute\luatexkohangulfontattr
\newattribute\luatexkohanjafontattr
\newattribute\luatexkofallbackfontattr
\newattribute\luatexkoautojosaattr
\newattribute\luatexkoclassicattr
\newattribute\luatexkodotemphattr
-\newattribute\luatexkoulineattr
\newattribute\luatexkorubyattr \chardef\luatexkorubyalloc\allocationnumber
\newattribute\luatexkohangulbyhangulattr
\newattribute\luatexkohanjabyhanjaattr
\directlua{ require"luatexko" }
-\ifdefined\AtBegShi@Hook
- \edef\AtBegShi@Hook{% occupy the first position
- \unexpanded{%
- \AtBegShi@Item{%
- \directlua{%
- luatexko.process_atbegshi(tex.getbox(\the\AtBeginShipoutBox))
- }%
- }%
- }%
- \unexpanded\expandafter{\AtBegShi@Hook}%
- }
-\else
- \AddToHook{shipout/before}{%
- \directlua{ luatexko.process_atbegshi(tex.getbox(\the\ShipoutBox)) }%
- }
- \DeclareHookRule{shipout/before}{.}{before}{luacolor}
-\fi
-% classic
-\protected\def\typesetclassic{% 0
+% classics
+% 0: horizontal KO, JP
+% 1: vertical KO, SC
+% 2: horizontal SC
+% 3: horizontal TC
+% 4: vertical TC
+% 5: vertical JP
+\chardef\luatexkolangCJK=\z@ % 0:KO, 1:JP, 2:SC, 3:TC
+\protected\def\typesetclassic{%
\ifnum\luatexkoclassicattr<\z@
\luatexkoclassicattr\z@
\parindent1em
\fi
}
-\protected\def\typesetvertical{% 1
- \ifcase\luatexkoclassicattr
+\protected\def\typesetvertical{% 1, 4, 5
+ \ifcase\luatexkolangCJK
\luatexkoclassicattr\@ne
\parindent1em
\or
+ \luatexkoclassicattr=5\relax
+ \parindent1em
\or
\luatexkoclassicattr\@ne
+ \parindent2em
\or
\luatexkoclassicattr=4\relax
- \or
+ \parindent2em
\else
\luatexkoclassicattr\@ne
\parindent1em
@@ -78,7 +69,25 @@
}
\protected\def\typesetmodern{\unsetattribute\luatexkoclassicattr}
\protected\def\inhibitglue{\hskip\z@skip}
+\protected\def\japanese{% 0, 5
+ \chardef\luatexkolangCJK=\@ne
+ \ifcase\luatexkoclassicattr
+ \or
+ \luatexkoclassicattr=5\relax
+ \or
+ \luatexkoclassicattr\z@
+ \or
+ \luatexkoclassicattr\z@
+ \or
+ \luatexkoclassicattr=5\relax
+ \or
+ \else
+ \luatexkoclassicattr\z@
+ \fi
+ \parindent1em
+ }
\protected\def\Schinese{% 2, 1
+ \chardef\luatexkolangCJK=\tw@
\ifcase\luatexkoclassicattr
\luatexkoclassicattr\tw@
\or
@@ -87,12 +96,15 @@
\luatexkoclassicattr\tw@
\or
\luatexkoclassicattr\@ne
+ \or
+ \luatexkoclassicattr\@ne
\else
\luatexkoclassicattr\tw@
\fi
\parindent2em
}
\protected\def\Tchinese{% 3, 4
+ \chardef\luatexkolangCJK=\thr@@
\ifcase\luatexkoclassicattr
\luatexkoclassicattr\thr@@
\or
@@ -101,12 +113,14 @@
\luatexkoclassicattr\thr@@
\or
\or
+ \or
+ \luatexkoclassicattr=4\relax
\else
\luatexkoclassicattr\thr@@
\fi
\parindent2em
}
-\let\korean\typesetmodern \let\japanese\typesetclassic \let\chinese\Schinese
+\let\korean\typesetmodern \let\chinese\Schinese
% josa
\count@"AC00
\loop
@@ -189,19 +203,16 @@
% dotemph
\newcount\luatexkodotemphcount
\def\dotemphraise{1ex }
-\unless\ifdefined\bfseries\let\bfseries\bf\fi
-\def\dotemphchar{\bfseries\char"02D9 }
+\edef\dotemphchar{\expandafter\noexpand\ifdefined\bfseries\bfseries\else\bf\fi ^^^^02d9}
\protected\def\dotemph#1{%
\global\advance\luatexkodotemphcount\@ne
+ \ifnum\luatexkodotemphcount=\@ne \directlua{ luatexko.activate"dotemph" }\fi
\begingroup
+ \count@=\luatexkodotemphcount
\setbox\z@\hbox{\raise\dotemphraise\hbox{\dotemphchar}}%
- \directlua{
- if \the\luatexkodotemphcount == 1 then luatexko.activate("dotemph") end
- luatexko.dotemphbox[\the\luatexkodotemphcount] = node.copy(tex.box[0])
- }\luatexkodotemphattr\luatexkodotemphcount #1%
- \directlua{
- luatexko.dotemphboundary(\the\luatexkodotemphattr)
- }%
+ \directlua{ luatexko.dotemphbox[\number\count@] = node.copy(tex.box[0]) }%
+ \luatexkodotemphattr\count@ #1\relax
+ \directlua{ luatexko.dotemphboundary(\number\count@) }%
\endgroup }
% uline
\newcount\luatexkoulinecount
@@ -215,19 +226,15 @@
\luatexkomarkoverwith }
\def\luatexkomarkoverwith#1#2{%
\global\advance\luatexkoulinecount\@ne
+ \ifnum\luatexkoulinecount=\@ne \directlua{ luatexko.activate"uline" }\fi
\begingroup
+ \count@=\luatexkoulinecount
\leavevmode
\setbox\z@\hbox{#1}%
- \directlua{
- if \the\luatexkoulinecount == 1 then luatexko.activate("uline") end
- luatexko.ulboundary(\the\luatexkoulinecount,
- tex.box[0].list,
- \luatexkoleaderstype)
- }%
- \luatexkoulineattr\luatexkoulinecount #2\relax
- \directlua{
- luatexko.ulboundary(\the\luatexkoulineattr)
- }\endgroup }
+ \directlua{ luatexko.ulboundary(\number\count@, tex.box[0].list, \luatexkoleaderstype) }%
+ #2\relax
+ \directlua{ luatexko.ulboundary(\number\count@) }%
+ \endgroup }
\protected\def\uline{\markoverwith{%
\vrule width\z@ height-\ulinedown depth\dimexpr\ulinedown+\ulinewidth\relax }}
\protected\def\dashuline{\markoverwith*{%
@@ -271,15 +278,16 @@
\let\rubynooverlap\ruby@overlapfalse
\rubyoverlap % ruby may hangover neighboring chars
\newcount\luatexkorubycount
-\def\luatexkorubybasehbox{\hbox attr\luatexkorubyalloc=\luatexkorubycount}
\protected\def\ruby#1#2{%
\global\advance\luatexkorubycount\@ne
+ \ifnum\luatexkorubycount=\@ne \directlua{ luatexko.activate"ruby" }\fi
\begingroup
+ \count@=\luatexkorubycount
\leavevmode
- \setbox\z@\luatexkorubybasehbox{#1}% base
+ \setbox\z@\hbox attr\luatexkorubyalloc=\count@{#1}% base
\setbox\tw@\hbox{% ruby
\ifdefined\rubyfont \rubyfont \fi
- \ifdefined\selectfont % <- latex
+ \ifcsname ver@luatexko.sty\endcsname % <- latex
\dimen@\dimexpr\rubysize em\relax
\fontsize\dimen@\dimen@\selectfont
\fi
@@ -291,13 +299,13 @@
\ifruby@overlap
\dimen@\dimexpr\wd\tw@-\wd\z@-\dimen@ii\relax % overhang .5 rubysize
\ifdim\dimen@ > \z@
- \setbox\z@\luatexkorubybasehbox spread\dimen@{%
+ \setbox\z@\hbox attr\luatexkorubyalloc=\count@ spread\dimen@{%
\hskip\z@ plus \luatexkostretchfactor em\relax
\unhbox\z@
\hskip\z@ plus \luatexkostretchfactor em\relax }%
\fi
\else
- \setbox\z@\luatexkorubybasehbox to\wd\tw@{%
+ \setbox\z@\hbox attr\luatexkorubyalloc=\count@ to\wd\tw@{%
\hskip\z@ plus \luatexkostretchfactor em\relax
\unhbox\z@
\hskip\z@ plus \luatexkostretchfactor em\relax }%
@@ -316,8 +324,7 @@
\fi
\fi
\directlua{
- if \the\luatexkorubycount == 1 then luatexko.activate("ruby") end
- luatexko.rubybox[\the\luatexkorubycount] = {
+ luatexko.rubybox[\number\count@] = {
node.copy(tex.box[2]),
\number\numexpr\dimexpr\rubysep\relax\relax,
\ifruby@overlap true\else false\fi, }}%
@@ -337,56 +344,62 @@
% vertical writing
\protected\def\vertical#1{%
\leavevmode
- \setbox\z@\vbox\bgroup
- \hsize#1\relax
- \typesetvertical }
+ \ifx\empty#1\empty
+ \setbox\z@\hbox\bgroup
+ \else
+ \setbox\z@\vbox\bgroup \hsize#1\relax
+ \fi
+ \typesetvertical }
\protected\def\endvertical{%
\egroup
\luatexkorotatebox\z@
\box\z@ }
\protected\def\luatexkorotatebox#1{%
- \setbox#1\hbox to\dimexpr\ht#1+\dp#1{%
+ \dimen@\dimexpr\ht#1+\dp#1\relax
+ \setbox#1\hbox to\dimen@\bgroup
\hfil
- \vbox to\wd#1{%
- \wd#1\z@ \ht#1\z@ \dp#1\z@
- \pdfliteral{q 0 -1 1 0 0 0 cm}\box#1\pdfliteral{Q}%
- \vfil }}}
+ \vbox to\wd#1\bgroup
+ \wd#1\z@
+ \pdfextension save\relax
+ \pdfextension setmatrix{0 -1 1 0}\relax
+ \box#1\relax
+ \kern-\dimen@
+ \pdfextension restore\relax
+ \vfil
+ \egroup
+ \egroup
+}
% horizontal box inside vertical writing
\def\luatexkohorizboxmoveright{0.5ex}
\protected\def\horizontal#1{%
\directlua{ luatexko.gethorizboxmoveright() }%
\leavevmode
- \setbox\z@\vbox\bgroup
- \hsize#1\relax
- \typesetmodern }
+ \ifx\empty#1\empty
+ \setbox\z@\hbox\bgroup
+ \else
+ \setbox\z@\vbox\bgroup \hsize#1\relax
+ \fi
+ \typesetmodern }
\protected\def\endhorizontal{%
\egroup
- \dimen@=\dimexpr.5\wd\z@-\luatexkohorizboxmoveright\relax
\luatexkounrotatebox\z@
- \lower\dimen@\box\z@ }
+ \raise\luatexkohorizboxmoveright
+ \box\z@ }
\protected\def\luatexkounrotatebox#1{%
- \setbox#1\hbox to\dimexpr\ht#1+\dp#1{%
- \vbox to\wd#1{%
+ \dimen@\dimexpr\ht#1+\dp#1\relax
+ \setbox#1\hbox to\dimen@\bgroup
+ \lower.5\wd#1\vbox to\wd#1\bgroup
\vfil
- \wd#1\z@ \ht#1\z@ \dp#1\z@
- \pdfliteral{q 0 1 -1 0 0 0 cm}\box#1\pdfliteral{Q}}%
- \hfil }}
-% do not veticalize headline/footline
-\ifdefined\selectfont
- \def\verticaltypesetting{%
- \maxdepth\z@ \typesetvertical
- \dimen@\textwidth \textwidth\textheight \textheight\dimen@
- \edef\@outputpage{\unexpanded{\luatexkorotatebox\@outputbox
- \textwidth\textheight}\unexpanded\expandafter{\@outputpage}}}
-\else
- \def\verticaltypesetting{%
- \dimen@\hsize \hsize\vsize \vsize\dimen@
- \edef\plainoutput{\unexpanded{\dimen@\hsize \hsize\vsize \vsize\dimen@}%
- \unexpanded\expandafter{\plainoutput}}%
- \def\pagebody{\setbox\z@\vbox to\hsize{\boxmaxdepth=\maxdepth
- \pagecontents}\luatexkorotatebox\z@\box\z@}%
- \maxdepth\z@ \typesetvertical }
-\fi
+ \wd#1\z@
+ \pdfextension save\relax
+ \pdfextension setmatrix{0 1 -1 0}\relax
+ \box#1\relax
+ \kern-\dimen@
+ \pdfextension restore\relax
+ \egroup
+ \hfil
+ \egroup
+}
% hangul normalize
\def\luatexhangulnormalize{%
\directlua{require"luatexko-normalize"}%
@@ -443,16 +456,51 @@
\fi
\fi }
% plain
-\ifdefined\selectfont\else
+\ifcsname ver@luatexko.sty\endcsname\else
+ % do not verticalize headline/footline.
+ \def\verticaltypesetting{%
+ \dimen@\hsize \hsize\vsize \vsize\dimen@
+ \edef\plainoutput{\dimen@\hsize \hsize\vsize \vsize\dimen@
+ \unexpanded\expandafter{\plainoutput}}%
+ \def\pagebody{\setbox\z@\vbox to\hsize{\boxmaxdepth=\maxdepth \pagecontents}%
+ \luatexkorotatebox\z@\box\z@}%
+ \maxdepth\z@ \typesetvertical
+ \let\verticaltypesetting\relax % prevent multiple running
+ }
+ \def\beginverticaltypesetting{\vfill\supereject \begingroup \verticaltypesetting}
+ \def\endverticaltypesetting{\vfill\supereject \endgroup}
+ % hangul fonts
\protected\def\hangulfont{%
\afterassignment\luatexkohangulselectfont\font\luatexkohangulfont}
\protected\def\hanjafont{%
\afterassignment\luatexkohanjaselectfont\font\luatexkohanjafont}
\protected\def\fallbackfont{%
\afterassignment\luatexkofallbackselectfont\font\luatexkofallbackfont}
- \newfam\symmathhangul
+ \def\sethangulfont#1{%
+ \def\@tempa{#1}\edef\@tempb{\csstring#1}%
+ \expandafter\afterassignment\expandafter\luatexko@sethangulfont
+ \expandafter\font\csname luatexko.hangulfont.\@tempb\endcsname }
+ \def\luatexko@sethangulfont{%
+ \expandafter\protected\expandafter\edef\@tempa{%
+ \luatexkohangulfontattr\fontid\csname luatexko.hangulfont.\@tempb\endcsname\relax }}
+ \def\sethanjafont#1{%
+ \def\@tempa{#1}\edef\@tempb{\csstring#1}%
+ \expandafter\afterassignment\expandafter\luatexko@sethanjafont
+ \expandafter\font\csname luatexko.hanjafont.\@tempb\endcsname }
+ \def\luatexko@sethanjafont{%
+ \expandafter\protected\expandafter\edef\@tempa{%
+ \luatexkohanjafontattr\fontid\csname luatexko.hanjafont.\@tempb\endcsname\relax }}
+ \def\setfallbackfont#1{%
+ \def\@tempa{#1}\edef\@tempb{\csstring#1}%
+ \expandafter\afterassignment\expandafter\luatexko@setfallbackfont
+ \expandafter\font\csname luatexko.fallbackfont.\@tempb\endcsname }
+ \def\luatexko@setfallbackfont{%
+ \expandafter\protected\expandafter\edef\@tempa{%
+ \luatexkofallbackfontattr\fontid\csname luatexko.fallbackfont.\@tempb\endcsname\relax }}
+ \hangulfont={UnBatang:mode=node;script=hang;+tlig} at 10pt % default: unbatang
\protected\def\setmathhangulfonts#1#2#3{% font identifiers
- \ifnum\Umathcharfam"AC00=\symmathhangul\else
+ \ifnum\Umathcodenum"AC00="AC00\relax
+ \csname newfam\endcsname\symmathhangul
\setmathhangulblock{AC00}{D7A3}%
\fi
\textfont\symmathhangul=#1\relax
@@ -471,17 +519,41 @@
\catcode`\@=\luatexkoatcatcode
\endinput\fi
% latex
-\IfHookExistsTF{selectfont}{
- \AddToHook{selectfont}{%
- \luatexkohangulselectfont
- \luatexkohanjaselectfont
- \luatexkofallbackselectfont }
-}{
- \RequirePackage{everysel}
- \EverySelectfont{%
- \luatexkohangulselectfont
- \luatexkohanjaselectfont
- \luatexkofallbackselectfont }
+% do not verticalize headline/footline
+\def\verticaltypesetting{%
+ \ifx\@nodocument\relax % not in the preamble
+ \clearpage
+ \begingroup
+ \fi
+ \hsize\textheight \vsize\textwidth
+ \textwidth\hsize \textheight\vsize
+ \@colroom\vsize \@colht\vsize
+ \if@twocolumn
+ \columnwidth=.5\dimexpr\textwidth-\columnsep\relax
+ \linewidth\columnwidth \hsize\columnwidth
+ \else
+ \linewidth\hsize \columnwidth\hsize
+ \fi
+ \expandafter\def\expandafter\@outputpage\expandafter{%
+ \expandafter\luatexkorotatebox\expandafter\@outputbox
+ \expandafter\textwidth\expandafter\textheight
+ \@outputpage
+ }%
+ \maxdepth\z@ \typesetvertical
+ \let\verticaltypesetting\relax % prevent multiple running
+}
+\def\endverticaltypesetting{%
+ \clearpage
+ \endgroup
+ \global\@colroom\textheight
+ \global\@colht\textheight
+ \global\vsize\textheight
+}
+% hangul fonts
+\AddToHook{selectfont}{%
+ \luatexkohangulselectfont
+ \luatexkohanjaselectfont
+ \luatexkofallbackselectfont
}
\AddToHook{rmfamily}{%
\let\luatexkohangulfont \luatexkomainhangulfont
@@ -505,26 +577,9 @@
}
% fontspec-like
\ExplSyntaxOn
-\cs_new_nopar:Npn \l_luatexko_silent_upshape {
- \tl_map_inline:nn { \mddefault \bfdefault }
- {
- \cs_if_exist:cF
- { \g_fontspec_encoding_tl/\l_fontspec_family_tl/##1/\updefault }
- {
- \cs_if_exist:cT
- { \g_fontspec_encoding_tl/\l_fontspec_family_tl/##1/\shapedefault }
- {
- \cs_set_eq:cc
- { \g_fontspec_encoding_tl/\l_fontspec_family_tl/##1/\updefault }
- { \g_fontspec_encoding_tl/\l_fontspec_family_tl/##1/\shapedefault }
- }
- }
- }
-}
\DeclareDocumentCommand \setmainhangulfont { O{} m O{} }
{
\fontspec_set_family:Nnn \luatexkomainhangulfamily { Ligatures=TeX, #1, #3 } { #2 }
- \l_luatexko_silent_upshape
\cs_set_protected_nopar:Npn \luatexkomainhangulfont
{
\fontencoding \g_fontspec_encoding_tl
@@ -541,7 +596,6 @@
\DeclareDocumentCommand \setsanshangulfont { O{} m O{} }
{
\fontspec_set_family:Nnn \luatexkosanshangulfamily { Ligatures=TeX, #1, #3 } { #2 }
- \l_luatexko_silent_upshape
\cs_set_protected_nopar:Npn \luatexkosanshangulfont
{
\fontencoding \g_fontspec_encoding_tl
@@ -558,7 +612,6 @@
\DeclareDocumentCommand \setmonohangulfont { O{} m O{} }
{
\fontspec_set_family:Nnn \luatexkomonohangulfamily { #1, #3 } { #2 }
- \l_luatexko_silent_upshape
\cs_set_protected_nopar:Npn \luatexkomonohangulfont
{
\fontencoding \g_fontspec_encoding_tl
@@ -575,7 +628,6 @@
\DeclareDocumentCommand \newhangulfontfamily { m O{} m O{} }
{
\fontspec_set_family:cnn { luatexko_user_family_ \cs_to_str:N #1 } { #2, #4 } { #3 }
- \l_luatexko_silent_upshape
\cs_set_protected_nopar:Npn #1
{
\cs_set_nopar:Npn \luatexkohangulfont
@@ -594,7 +646,6 @@
\DeclareDocumentCommand \hangulfontspec { O{} m O{} }
{
\fontspec_set_family:Nnn \luatexkohangulfontfamily { #1, #3 } { #2 }
- \l_luatexko_silent_upshape
\cs_set_nopar:Npn \luatexkohangulfont
{
\fontencoding \g_fontspec_encoding_tl
@@ -606,7 +657,6 @@
\DeclareDocumentCommand \setmainhanjafont { O{} m O{} }
{
\fontspec_set_family:Nnn \luatexkomainhanjafamily { Ligatures=TeX, #1, #3 } { #2 }
- \l_luatexko_silent_upshape
\cs_set_protected_nopar:Npn \luatexkomainhanjafont
{
\fontencoding \g_fontspec_encoding_tl
@@ -623,7 +673,6 @@
\DeclareDocumentCommand \setsanshanjafont { O{} m O{} }
{
\fontspec_set_family:Nnn \luatexkosanshanjafamily { Ligatures=TeX, #1, #3 } { #2 }
- \l_luatexko_silent_upshape
\cs_set_protected_nopar:Npn \luatexkosanshanjafont
{
\fontencoding \g_fontspec_encoding_tl
@@ -640,7 +689,6 @@
\DeclareDocumentCommand \setmonohanjafont { O{} m O{} }
{
\fontspec_set_family:Nnn \luatexkomonohanjafamily { #1, #3 } { #2 }
- \l_luatexko_silent_upshape
\cs_set_protected_nopar:Npn \luatexkomonohanjafont
{
\fontencoding \g_fontspec_encoding_tl
@@ -657,7 +705,6 @@
\DeclareDocumentCommand \newhanjafontfamily { m O{} m O{} }
{
\fontspec_set_family:cnn { luatexko_user_family_ \cs_to_str:N #1 } { #2, #4 } { #3 }
- \l_luatexko_silent_upshape
\cs_set_protected_nopar:Npn #1
{
\cs_set_nopar:Npn \luatexkohanjafont
@@ -676,7 +723,6 @@
\DeclareDocumentCommand \hanjafontspec { O{} m O{} }
{
\fontspec_set_family:Nnn \luatexkohanjafontfamily { #1, #3 } { #2 }
- \l_luatexko_silent_upshape
\cs_set_nopar:Npn \luatexkohanjafont
{
\fontencoding \g_fontspec_encoding_tl
@@ -689,7 +735,6 @@
\DeclareDocumentCommand \setmainfallbackfont { O{} m O{} }
{
\fontspec_set_family:Nnn \luatexkomainfallbackfamily { Ligatures=TeX, #1, #3 } { #2 }
- \l_luatexko_silent_upshape
\cs_set_protected_nopar:Npn \luatexkomainfallbackfont
{
\fontencoding \g_fontspec_encoding_tl
@@ -706,7 +751,6 @@
\DeclareDocumentCommand \setsansfallbackfont { O{} m O{} }
{
\fontspec_set_family:Nnn \luatexkosansfallbackfamily { Ligatures=TeX, #1, #3 } { #2 }
- \l_luatexko_silent_upshape
\cs_set_protected_nopar:Npn \luatexkosansfallbackfont
{
\fontencoding \g_fontspec_encoding_tl
@@ -723,7 +767,6 @@
\DeclareDocumentCommand \setmonofallbackfont { O{} m O{} }
{
\fontspec_set_family:Nnn \luatexkomonofallbackfamily { #1, #3 } { #2 }
- \l_luatexko_silent_upshape
\cs_set_protected_nopar:Npn \luatexkomonofallbackfont
{
\fontencoding \g_fontspec_encoding_tl
@@ -740,7 +783,6 @@
\DeclareDocumentCommand \newfallbackfontfamily { m O{} m O{} }
{
\fontspec_set_family:cnn { luatexko_user_family_ \cs_to_str:N #1 } { #2, #4 } { #3 }
- \l_luatexko_silent_upshape
\cs_set_protected_nopar:Npn #1
{
\cs_set_nopar:Npn \luatexkofallbackfont
@@ -759,7 +801,6 @@
\DeclareDocumentCommand \fallbackfontspec { O{} m O{} }
{
\fontspec_set_family:Nnn \luatexkofallbackfontfamily { #1, #3 } { #2 }
- \l_luatexko_silent_upshape
\cs_set_nopar:Npn \luatexkofallbackfont
{
\fontencoding \g_fontspec_encoding_tl
@@ -771,9 +812,8 @@
\DeclareDocumentCommand \setmathhangulfont { O{} m O{} }
{
\fontspec_set_family:Nnn \luatexkomathhangulfamily { #1, #3 } { #2 }
- \l_luatexko_silent_upshape
\DeclareSymbolFont { mathhangul }
- \g_fontspec_encoding_tl \luatexkomathhangulfamily \mddefault \updefault
+ \g_fontspec_encoding_tl \luatexkomathhangulfamily \seriesdefault \shapedefault
\int_compare:nNnF { \Umathcharfam"AC00 } = { \symmathhangul }
{
\setmathhangulblock{AC00}{D7A3}
@@ -785,22 +825,11 @@
\let\adhochanjafont\hanjafontspec
\let\adhocfallbackfont\fallbackfontspec
% interhangul, interlatincjk, charraise
-\def\luatexkosilentupshape{%
- \@tfor \@tempa := \mddefault \bfdefault \do {%
- \ifcsname \f@encoding/\f@family/\@tempa/\updefault\endcsname \else
- \ifcsname \f@encoding/\f@family/\@tempa/\shapedefault\endcsname
- \global \expandafter\let
- \csname \f@encoding/\f@family/\@tempa/\updefault \expandafter\endcsname
- \csname \f@encoding/\f@family/\@tempa/\shapedefault\endcsname
- \fi\fi
- }%
-}
\protected\def\addhangulfontfeature#1{%
\begingroup
\ifdefined\luatexkohangulfont
- \fontseries\mddefault\fontshape\shapedefault \luatexkohangulfont \fi
+ \fontseries\seriesdefault\fontshape\shapedefault \luatexkohangulfont \fi
\addfontfeature{#1}%
- \luatexkosilentupshape
\edef\x{\endgroup
\def\noexpand\luatexkohangulfont{%
\noexpand\fontencoding{\UTFencname}%
@@ -811,9 +840,8 @@
\protected\def\addhanjafontfeature#1{%
\begingroup
\ifdefined\luatexkohanjafont
- \fontseries\mddefault\fontshape\shapedefault \luatexkohanjafont \fi
+ \fontseries\seriesdefault\fontshape\shapedefault \luatexkohanjafont \fi
\addfontfeature{#1}%
- \luatexkosilentupshape
\edef\x{\endgroup
\def\noexpand\luatexkohanjafont{%
\noexpand\fontencoding{\UTFencname}%
@@ -824,9 +852,8 @@
\protected\def\addfallbackfontfeature#1{%
\begingroup
\ifdefined\luatexkofallbackfont
- \fontseries\mddefault\fontshape\shapedefault \luatexkofallbackfont \fi
+ \fontseries\seriesdefault\fontshape\shapedefault \luatexkofallbackfont \fi
\addfontfeature{#1}%
- \luatexkosilentupshape
\edef\x{\endgroup
\def\noexpand\luatexkofallbackfont{%
\noexpand\fontencoding{\UTFencname}%
@@ -854,25 +881,22 @@
\AtBeginDocument{
% default hangul fonts
\ifdefined\luatexkomainhangulfont\else
- \begingroup\rmfamily
- \directlua{ luatexko.currenthashangulchars(255) }\expandafter\endgroup
- \ifnum\count@=\z@
+ \begingroup\rmfamily\expandafter\endgroup
+ \iffontchar\font"AC00 \else
\IfFontExistsTF{UnBatang.ttf}
{\setmainhangulfont{UnBatang}[Script=Hangul,Language=Korean]}
{}
\fi
\fi
\ifdefined\luatexkosanshangulfont\else
- \begingroup\sffamily
- \directlua{ luatexko.currenthashangulchars(255) }\expandafter\endgroup
- \ifnum\count@=\z@
+ \begingroup\sffamily\expandafter\endgroup
+ \iffontchar\font"AC00 \else
\IfFontExistsTF{UnDotum.ttf}{\setsanshangulfont{UnDotum}}{}
\fi
\fi
\ifdefined\luatexkomonohangulfont\else
- \begingroup\ttfamily
- \directlua{ luatexko.currenthashangulchars(255) }\expandafter\endgroup
- \ifnum\count@=\z@
+ \begingroup\ttfamily\expandafter\endgroup
+ \iffontchar\font"AC00 \else
\def\@tempa{lmtt}\def\@tempb{LatinModernMono(0)}
\ifnum 0\ifx\ttdefault\@tempa 1\else\ifx\ttdefault\@tempb 1\fi\fi >\z@
\IfFontExistsTF{UnDotum.ttf}
diff --git a/macros/luatex/generic/minim-xmp/EUPL-1.2-EN.txt b/macros/luatex/generic/minim-xmp/EUPL-1.2-EN.txt
new file mode 100644
index 0000000000..4153cd3775
--- /dev/null
+++ b/macros/luatex/generic/minim-xmp/EUPL-1.2-EN.txt
@@ -0,0 +1,287 @@
+ EUROPEAN UNION PUBLIC LICENCE v. 1.2
+ EUPL © the European Union 2007, 2016
+
+This European Union Public Licence (the ‘EUPL’) applies to the Work (as defined
+below) which is provided under the terms of this Licence. Any use of the Work,
+other than as authorised under this Licence is prohibited (to the extent such
+use is covered by a right of the copyright holder of the Work).
+
+The Work is provided under the terms of this Licence when the Licensor (as
+defined below) has placed the following notice immediately following the
+copyright notice for the Work:
+
+ Licensed under the EUPL
+
+or has expressed by any other means his willingness to license under the EUPL.
+
+1. Definitions
+
+In this Licence, the following terms have the following meaning:
+
+- ‘The Licence’: this Licence.
+
+- ‘The Original Work’: the work or software distributed or communicated by the
+ Licensor under this Licence, available as Source Code and also as Executable
+ Code as the case may be.
+
+- ‘Derivative Works’: the works or software that could be created by the
+ Licensee, based upon the Original Work or modifications thereof. This Licence
+ does not define the extent of modification or dependence on the Original Work
+ required in order to classify a work as a Derivative Work; this extent is
+ determined by copyright law applicable in the country mentioned in Article 15.
+
+- ‘The Work’: the Original Work or its Derivative Works.
+
+- ‘The Source Code’: the human-readable form of the Work which is the most
+ convenient for people to study and modify.
+
+- ‘The Executable Code’: any code which has generally been compiled and which is
+ meant to be interpreted by a computer as a program.
+
+- ‘The Licensor’: the natural or legal person that distributes or communicates
+ the Work under the Licence.
+
+- ‘Contributor(s)’: any natural or legal person who modifies the Work under the
+ Licence, or otherwise contributes to the creation of a Derivative Work.
+
+- ‘The Licensee’ or ‘You’: any natural or legal person who makes any usage of
+ the Work under the terms of the Licence.
+
+- ‘Distribution’ or ‘Communication’: any act of selling, giving, lending,
+ renting, distributing, communicating, transmitting, or otherwise making
+ available, online or offline, copies of the Work or providing access to its
+ essential functionalities at the disposal of any other natural or legal
+ person.
+
+2. Scope of the rights granted by the Licence
+
+The Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
+sublicensable licence to do the following, for the duration of copyright vested
+in the Original Work:
+
+- use the Work in any circumstance and for all usage,
+- reproduce the Work,
+- modify the Work, and make Derivative Works based upon the Work,
+- communicate to the public, including the right to make available or display
+ the Work or copies thereof to the public and perform publicly, as the case may
+ be, the Work,
+- distribute the Work or copies thereof,
+- lend and rent the Work or copies thereof,
+- sublicense rights in the Work or copies thereof.
+
+Those rights can be exercised on any media, supports and formats, whether now
+known or later invented, as far as the applicable law permits so.
+
+In the countries where moral rights apply, the Licensor waives his right to
+exercise his moral right to the extent allowed by law in order to make effective
+the licence of the economic rights here above listed.
+
+The Licensor grants to the Licensee royalty-free, non-exclusive usage rights to
+any patents held by the Licensor, to the extent necessary to make use of the
+rights granted on the Work under this Licence.
+
+3. Communication of the Source Code
+
+The Licensor may provide the Work either in its Source Code form, or as
+Executable Code. If the Work is provided as Executable Code, the Licensor
+provides in addition a machine-readable copy of the Source Code of the Work
+along with each copy of the Work that the Licensor distributes or indicates, in
+a notice following the copyright notice attached to the Work, a repository where
+the Source Code is easily and freely accessible for as long as the Licensor
+continues to distribute or communicate the Work.
+
+4. Limitations on copyright
+
+Nothing in this Licence is intended to deprive the Licensee of the benefits from
+any exception or limitation to the exclusive rights of the rights owners in the
+Work, of the exhaustion of those rights or of other applicable limitations
+thereto.
+
+5. Obligations of the Licensee
+
+The grant of the rights mentioned above is subject to some restrictions and
+obligations imposed on the Licensee. Those obligations are the following:
+
+Attribution right: The Licensee shall keep intact all copyright, patent or
+trademarks notices and all notices that refer to the Licence and to the
+disclaimer of warranties. The Licensee must include a copy of such notices and a
+copy of the Licence with every copy of the Work he/she distributes or
+communicates. The Licensee must cause any Derivative Work to carry prominent
+notices stating that the Work has been modified and the date of modification.
+
+Copyleft clause: If the Licensee distributes or communicates copies of the
+Original Works or Derivative Works, this Distribution or Communication will be
+done under the terms of this Licence or of a later version of this Licence
+unless the Original Work is expressly distributed only under this version of the
+Licence — for example by communicating ‘EUPL v. 1.2 only’. The Licensee
+(becoming Licensor) cannot offer or impose any additional terms or conditions on
+the Work or Derivative Work that alter or restrict the terms of the Licence.
+
+Compatibility clause: If the Licensee Distributes or Communicates Derivative
+Works or copies thereof based upon both the Work and another work licensed under
+a Compatible Licence, this Distribution or Communication can be done under the
+terms of this Compatible Licence. For the sake of this clause, ‘Compatible
+Licence’ refers to the licences listed in the appendix attached to this Licence.
+Should the Licensee's obligations under the Compatible Licence conflict with
+his/her obligations under this Licence, the obligations of the Compatible
+Licence shall prevail.
+
+Provision of Source Code: When distributing or communicating copies of the Work,
+the Licensee will provide a machine-readable copy of the Source Code or indicate
+a repository where this Source will be easily and freely available for as long
+as the Licensee continues to distribute or communicate the Work.
+
+Legal Protection: This Licence does not grant permission to use the trade names,
+trademarks, service marks, or names of the Licensor, except as required for
+reasonable and customary use in describing the origin of the Work and
+reproducing the content of the copyright notice.
+
+6. Chain of Authorship
+
+The original Licensor warrants that the copyright in the Original Work granted
+hereunder is owned by him/her or licensed to him/her and that he/she has the
+power and authority to grant the Licence.
+
+Each Contributor warrants that the copyright in the modifications he/she brings
+to the Work are owned by him/her or licensed to him/her and that he/she has the
+power and authority to grant the Licence.
+
+Each time You accept the Licence, the original Licensor and subsequent
+Contributors grant You a licence to their contributions to the Work, under the
+terms of this Licence.
+
+7. Disclaimer of Warranty
+
+The Work is a work in progress, which is continuously improved by numerous
+Contributors. It is not a finished work and may therefore contain defects or
+‘bugs’ inherent to this type of development.
+
+For the above reason, the Work is provided under the Licence on an ‘as is’ basis
+and without warranties of any kind concerning the Work, including without
+limitation merchantability, fitness for a particular purpose, absence of defects
+or errors, accuracy, non-infringement of intellectual property rights other than
+copyright as stated in Article 6 of this Licence.
+
+This disclaimer of warranty is an essential part of the Licence and a condition
+for the grant of any rights to the Work.
+
+8. Disclaimer of Liability
+
+Except in the cases of wilful misconduct or damages directly caused to natural
+persons, the Licensor will in no event be liable for any direct or indirect,
+material or moral, damages of any kind, arising out of the Licence or of the use
+of the Work, including without limitation, damages for loss of goodwill, work
+stoppage, computer failure or malfunction, loss of data or any commercial
+damage, even if the Licensor has been advised of the possibility of such damage.
+However, the Licensor will be liable under statutory product liability laws as
+far such laws apply to the Work.
+
+9. Additional agreements
+
+While distributing the Work, You may choose to conclude an additional agreement,
+defining obligations or services consistent with this Licence. However, if
+accepting obligations, You may act only on your own behalf and on your sole
+responsibility, not on behalf of the original Licensor or any other Contributor,
+and only if You agree to indemnify, defend, and hold each Contributor harmless
+for any liability incurred by, or claims asserted against such Contributor by
+the fact You have accepted any warranty or additional liability.
+
+10. Acceptance of the Licence
+
+The provisions of this Licence can be accepted by clicking on an icon ‘I agree’
+placed under the bottom of a window displaying the text of this Licence or by
+affirming consent in any other similar way, in accordance with the rules of
+applicable law. Clicking on that icon indicates your clear and irrevocable
+acceptance of this Licence and all of its terms and conditions.
+
+Similarly, you irrevocably accept this Licence and all of its terms and
+conditions by exercising any rights granted to You by Article 2 of this Licence,
+such as the use of the Work, the creation by You of a Derivative Work or the
+Distribution or Communication by You of the Work or copies thereof.
+
+11. Information to the public
+
+In case of any Distribution or Communication of the Work by means of electronic
+communication by You (for example, by offering to download the Work from a
+remote location) the distribution channel or media (for example, a website) must
+at least provide to the public the information requested by the applicable law
+regarding the Licensor, the Licence and the way it may be accessible, concluded,
+stored and reproduced by the Licensee.
+
+12. Termination of the Licence
+
+The Licence and the rights granted hereunder will terminate automatically upon
+any breach by the Licensee of the terms of the Licence.
+
+Such a termination will not terminate the licences of any person who has
+received the Work from the Licensee under the Licence, provided such persons
+remain in full compliance with the Licence.
+
+13. Miscellaneous
+
+Without prejudice of Article 9 above, the Licence represents the complete
+agreement between the Parties as to the Work.
+
+If any provision of the Licence is invalid or unenforceable under applicable
+law, this will not affect the validity or enforceability of the Licence as a
+whole. Such provision will be construed or reformed so as necessary to make it
+valid and enforceable.
+
+The European Commission may publish other linguistic versions or new versions of
+this Licence or updated versions of the Appendix, so far this is required and
+reasonable, without reducing the scope of the rights granted by the Licence. New
+versions of the Licence will be published with a unique version number.
+
+All linguistic versions of this Licence, approved by the European Commission,
+have identical value. Parties can take advantage of the linguistic version of
+their choice.
+
+14. Jurisdiction
+
+Without prejudice to specific agreement between parties,
+
+- any litigation resulting from the interpretation of this License, arising
+ between the European Union institutions, bodies, offices or agencies, as a
+ Licensor, and any Licensee, will be subject to the jurisdiction of the Court
+ of Justice of the European Union, as laid down in article 272 of the Treaty on
+ the Functioning of the European Union,
+
+- any litigation arising between other parties and resulting from the
+ interpretation of this License, will be subject to the exclusive jurisdiction
+ of the competent court where the Licensor resides or conducts its primary
+ business.
+
+15. Applicable Law
+
+Without prejudice to specific agreement between parties,
+
+- this Licence shall be governed by the law of the European Union Member State
+ where the Licensor has his seat, resides or has his registered office,
+
+- this licence shall be governed by Belgian law if the Licensor has no seat,
+ residence or registered office inside a European Union Member State.
+
+Appendix
+
+‘Compatible Licences’ according to Article 5 EUPL are:
+
+- GNU General Public License (GPL) v. 2, v. 3
+- GNU Affero General Public License (AGPL) v. 3
+- Open Software License (OSL) v. 2.1, v. 3.0
+- Eclipse Public License (EPL) v. 1.0
+- CeCILL v. 2.0, v. 2.1
+- Mozilla Public Licence (MPL) v. 2
+- GNU Lesser General Public Licence (LGPL) v. 2.1, v. 3
+- Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) for
+ works other than software
+- European Union Public Licence (EUPL) v. 1.1, v. 1.2
+- Québec Free and Open-Source Licence — Reciprocity (LiLiQ-R) or Strong
+ Reciprocity (LiLiQ-R+).
+
+The European Commission may update this Appendix to later versions of the above
+licences without producing a new version of the EUPL, as long as they provide
+the rights granted in Article 2 of this Licence and protect the covered Source
+Code from exclusive appropriation.
+
+All other changes or additions to this Appendix require the production of a new
+EUPL version.
diff --git a/macros/luatex/generic/minim-xmp/README b/macros/luatex/generic/minim-xmp/README
new file mode 100644
index 0000000000..0383085ee2
--- /dev/null
+++ b/macros/luatex/generic/minim-xmp/README
@@ -0,0 +1,30 @@
+Version: 2021/1.0
+
+SUMMARY
+
+This package enables the inclusion of XMP (eXtensible Metadata Platform) data
+in the pdf output generated by (plain) LuaTeX. The use of XMP is required by
+PDF standards such as PDF/A.
+
+In-line definition of new metadata schemas is supported, as well as setting
+and querying metadata values programmatically. For PDF/A documents, the
+necessary PDF/A extension schema definitions will be generated and included
+automatically.
+
+
+DOCUMENTATION
+
+In order to obtain the typeset manual of this package, simply say:
+
+ luatex minim-xmp.doc
+
+
+COPYING
+
+(c) 2021 Esger Renkema
+
+These files may be distributed under the terms of the European Union Public
+Licence (EUPL) version 1.2 or later. A copy can be obtained at:
+
+https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+
diff --git a/macros/luatex/generic/minim-xmp/minim-xmp.doc b/macros/luatex/generic/minim-xmp/minim-xmp.doc
new file mode 100644
index 0000000000..01d2084f6c
--- /dev/null
+++ b/macros/luatex/generic/minim-xmp/minim-xmp.doc
@@ -0,0 +1,196 @@
+
+\input minim-doc.sty
+
+\manual{minim-xmp}
+
+\ifchapter \chapter Metadata
+
+\else \startmetadata
+ author {Esger Renkema}
+ title {minim-xmp}
+ date {2021-06-01}
+ version {2021/1.0}
+ keywords {LuaTeX; Plain TeX; XMP; metadata; PDF/A;}
+ stopmetadata
+\maketitle \fi
+
+This package enables simple XMP (eXtensible Metadata Platform) packet inclusion
+and will automatically generate pdf/a extension schemas. Use it by saying
+⟦\input minim-xmp.tex⟧.
+Thereafter, you can use ⟦*\setmetadata key {value}⟧ and ⟦*\getmetadata key⟧ for
+setting and retrieving document-level metadata values.
+
+You do not need this package if you have your metadata ready-made in a separate
+file, for then you can simply say
+\startelement{Code}
+\startsinglecontentitem$$\halign{#\hfil\cr
+⟦\immediate\pdfextension obj uncompressed⟧ \cr
+\qquad⟦stream attr {/Type/Metadata /Subtype/XML}⟧ \cr
+\qquad⟦file {your-file.xmp}⟧ \cr
+⟦\pdfextension catalog⟧ \cr
+\qquad⟦{/Metadata \pdffeedback lastobj 0 R}⟧\cr
+}$$\stopsinglecontentitem
+\vskip-\belowdisplayskip
+
+\section Setting metadata
+
+Metadata fields that contain (ordered or unordered) lists will be split on the
+⟦*\metadataseparator⟧ character; this is a semicolon by default.
+Alternatively, you can just make multiple assignments: these will be
+concatenated.
+
+Where applicable, language alternatives can be given like
+⟦\setmetadata /de⟧ ⟦dc:title {...}⟧ or
+⟦\setmetadata /{de_DE} dc:title {...}⟧.
+Braces are necessary in the second case because the catcode of the underscore
+is not 11~or~12.
+When no alternative is given, the value ⟦*x-default⟧ will be used.
+
+Instead of using ⟦*\setmetadata⟧, multiple fields can be set in one go with
+⟦*\startmetadata⟧.
+This way is particularly useful when assigning structured data to a key (see
+later on).
+In this example, ⟦key1⟧ contains a normal value, ⟦key2⟧ language alternatives
+and ⟦key3⟧ structured data:
+
+⟦\startmetadata
+ key1 {...}
+ key2 {... (default) ...}
+ /alt1 {...}
+ /alt2 {...}
+ key3
+ /field1 {...}
+ /field2 {...}
+ stopmetadata⟧
+
+Since metadata values are read by lua as text, linebreaks and paragraphs are
+not preserved. You can work around this by saying
+⟦{\def\par{\Uchar"A\Uchar"A} \setmetadata abstract {...}}⟧.
+
+\section Getting metadata
+
+Metadata values can be retrieved again with ⟦*\getmetadata key⟧. This command
+is fully expandible.
+
+If the data is a list, it will be returned according to the current value of
+⟦\metadataseparator⟧.
+If the data has language alternatives, the ⟦x-default⟧ value will be returned:
+the alternatives are accessible by ⟦*\getmetadata /lang key⟧.
+
+For structured types (discussed below), ⟦\getmetadata /field key⟧ will return
+the value of a single field and ⟦\getmetadata key⟧ will return all fields as
+⟦/{field1} {value1} /{field2} {value2} ...⟧ (this can be used again as input to
+⟦\startmetadata⟧).
+
+\section Supported metadata keys
+
+Initially, the ⟦\setmetadata⟧ and ⟦\getmetadata⟧ recognise all pdf/a compatible
+fields in the ⟦pdf⟧, ⟦pdfaid⟧, ⟦dc⟧, ⟦xmp⟧, ⟦xmpMM⟧ and ⟦xmpRights⟧ namespaces.
+Keys should be prefixed with their namespace, e.g. ⟦dc:creator⟧ or
+⟦xmp:CreatorTool⟧.
+Note that the ⟦dc⟧ namespace has lower-case fields; field names are
+case-sensitive.
+
+Because the precise details of the above metadata namespaces can be confusing,
+you might want use one of the aliases
+⟦author⟧ (dc:creator), ⟦title⟧ (dc:title), ⟦date⟧ (dc:date and xmp:CreateDate),
+⟦language⟧ (dc:language), ⟦keywords⟧ (dc:subject and pdf:Keywords), ⟦publisher⟧
+(dc:publisher), ⟦abstract⟧ (dc:description), ⟦copyright⟧ (dc:rights), ⟦version⟧
+(xmpMM:VersionID) and ⟦identifier⟧ (dc:identifier).
+New aliases can be defined in the ⟦aliases⟧ table of the lua module.
+
+
+\section Adding new keys and schemas
+
+\directlua{require('minim-xmp').add_namespace(
+ 'Example namespace', 'colours',
+ 'http://example.com/minim/colours/', {
+ Favourite = { 'Colour', 'The author’s favourite colour' },
+ }, {
+ Colour = { 'RGB Colour', {
+ R = { 'Integer', 'Red component' },
+ G = { 'Integer', 'Green component' },
+ B = { 'Integer', 'Blue component' }
+ }, prefix = 'c' },
+ })}
+\startmetadata colours:Favourite /R 0 /G 0 /B 255 stopmetadata
+
+New metadata namespaces can be added in the following way:
+
+⟦require('minim-xmp').add_namespace(
+ 'Example namespace', 'colours',
+ 'http://example.com/minim/colours/', {
+ -- metadata keys
+ Favourite = { 'Colour', 'The author’s favourite colour' },
+ }, {
+ -- value types
+ Colour = { 'RGB Colour', {
+ R = { 'Integer', 'Red component' },
+ G = { 'Integer', 'Green component' },
+ B = { 'Integer', 'Blue component' }
+ }, prefix = 'c' },
+ })⟧
+
+This will setup a namespace with prefix ⟦colours⟧ and one key: ⟦Favourite⟧, of
+type ⟦Colour⟧. That value type happens to be a structured type with three
+fields, which are also described.
+You can now use this namespace as
+
+⟦\startmetadata colours:Favourite /R 0 /G 0 /B 255 stopmetadata⟧
+
+or the equivalent but more verbose
+
+⟦\setmetadata/R colours:Favourite 0
+\setmetadata/G colours:Favourite 0
+\setmetadata/B colours:Favourite 255⟧
+
+after which the generated XMP code will be
+
+⟦ <rdf:Description rdf:about=""
+ xmlns:colours="http://example.com/minim/colours/"
+ xmlns:c="http://example.com/minim/colours/">
+ <colours:Favourite rdf:parseType="Resource">
+ <c:B>255</c:B>
+ <c:G>0</c:G>
+ <c:R>0</c:R>
+ </colours:Favourite>
+ </rdf:Description>⟧
+
+You probably will not need defining your own value types,
+so in most cases you should omit the fifth argument to ⟦add_namespace⟧.
+If you do define a new value type, you can specify its prefix if it differs
+from the namespace prefix (as is done above) and likewise its ⟦uri⟧ identifier
+if it differs from the namespace URI.
+
+List types can be given as ⟦'Bag TypeName'⟧ or ⟦'Seq TypeName'⟧; language
+alternatives as ⟦'Lang Alt'⟧. All other types will be treated as ⟦'Text'⟧,
+though for ⟦'Boolean'⟧, ⟦'Integer'⟧ and ⟦'Date'⟧ some validation is performed
+when setting values.
+
+Additional metadata value type handling can be defined in the ⟦getters⟧ and
+⟦setters⟧ tables of the lua module.
+Appropriate entries to those tables will be generated automatically for new
+structured types (which is why you could set the colour like we did above).
+Value types without fields, however, will be stored and retrieved as if they
+were ⟦Text⟧ until you provide another way.
+
+
+\section Generated XMP
+
+All metadata will be written to the PDF file uncompressed.
+
+The ⟦*\metadatamodification⟧ setting controls whether XMP packets will be
+marked as read-only (value~0; default) or writeable (value~1).
+Writeable XMP packets will be padded with about 2\thinspace kB of whitespace.
+
+If the document-level metadata contains values in the ⟦pdfaid⟧ namespace,
+metadata extension schemas will be appended to the document-level metadata
+packet automatically.
+These extension schema’s will only include keys that have been set somewhere,
+though they need not have been set in the document-level metadata.
+No extension schemas are generated for the built-in namespaces, as they are
+already included in the pdf/a standards.
+
+
+\endmanual
+
diff --git a/macros/luatex/generic/minim-xmp/minim-xmp.lua b/macros/luatex/generic/minim-xmp/minim-xmp.lua
new file mode 100644
index 0000000000..ba01344ccd
--- /dev/null
+++ b/macros/luatex/generic/minim-xmp/minim-xmp.lua
@@ -0,0 +1,583 @@
+
+local M = { }
+local alloc = require('minim-alloc')
+alloc.remember('minim-xmp')
+
+local function sorted_pairs(t)
+ local keys, i = { }, 0
+ for k, _ in pairs(t) do table.insert(keys, k) end
+ table.sort(keys)
+ return function()
+ i = i + 1
+ local k = keys[i]
+ if k then
+ return k, t[k]
+ end
+ end
+end
+
+-- 1 Reading and writing metadata values
+
+M.getters = {
+ Text = function(v) return v or '' end,
+ ['Lang Alt'] = function(t, a) return t[a or 'x-default'] or '' end,
+}
+
+M.setters = {
+ Text = function(new, orig, opt, k)
+ if opt then alloc.msg('Warning: no alternative for %s', k) end
+ if orig then alloc.msg('Warning: overwriting metadata field %s', k) end
+ return new
+ end,
+ ['Lang Alt'] = function(value, orig, lang)
+ orig = orig or { }
+ orig[lang or 'x-default'] = value
+ return orig
+ end,
+ Integer = function(new, orig, opt, k)
+ if opt then alloc.msg('Warning: no alternative for %s', k) end
+ if orig then alloc.msg('Warning: overwriting metadata field %s', k) end
+ return tonumber(new) and new or alloc.err('Not a number: %s', new)
+ end,
+ Date = function(new, orig, opt, k)
+ if opt then alloc.msg('Warning: no alternative for %s', k) end
+ if orig then alloc.msg('Warning: overwriting metadata field %s', k) end
+ return string.match(new, '^%d%d%d%d')
+ and new or alloc.err('Date must start with year')
+ end,
+ Boolean = function(s)
+ return s == 'True'
+ or s == 'False'
+ and s or alloc.err('Boolean value must be True or False')
+ end,
+}
+
+-- 1 Namespace definitions
+
+local namespace_info = alloc.saved_table ('metadata namespace info')
+
+function M.add_key(prefix, name, t)
+ namespace_info[prefix].keys[name] = {
+ type = t.type or t[1],
+ description = t.description or t[2],
+ isInternal = t.isInternal or t[3] or false,
+ inUse = false,
+ }
+end
+
+function M.add_valuetype(prefix, name, t)
+ local ns = namespace_info[prefix]
+ ns.valuetypes = ns.valuetypes or { }
+ ns.valuetypes[name] = {
+ description = t.description or t[1],
+ uri = t.uri or ns.uri,
+ prefix = t.prefix or ns.prefix,
+ inUse = false,
+ }
+ t.fields = t.fields or t[2]
+ if t.fields then
+ local fields = { }
+ ns.valuetypes[name].fields = fields
+ for n, f in pairs(t.fields) do
+ fields[n] = { type = f.type or f[1], description = f.description or f[2] }
+ end
+ M.getters[name] = function(t, k)
+ if k then
+ return (fields[k] or alloc.err('Unknown field ‘%s’', k))
+ and t and t[k] or 'not found'
+ else
+ local res = { }
+ for k, v in sorted_pairs(t) do
+ table.insert(res, string.format('/{%s} {%s}', k, v))
+ end
+ return table.concat(res, ' ')
+ end
+ end
+ M.setters[name] = function(value, orig, key, k)
+ if not key then
+ alloc.err('Missing key for metadata field %s', k)
+ elseif not fields[key] then
+ alloc.err('Unknown field ‘%s’', key)
+ else
+ orig = orig or { }
+ local setter = M.setters[fields[key].type] or M.setters.Text
+ orig[key] = setter(value, orig[key], nil, k)
+ end
+ return orig
+ end
+ end
+end
+
+function M.add_namespace(description, prefix, uri, keys, valuetypes, predefined)
+ namespace_info[prefix] = {
+ uri = uri,
+ description = description,
+ keys = { },
+ predefined = predefined or false,
+ inUse = false,
+ }
+ for name, t in pairs(keys) do
+ M.add_key(prefix, name, t)
+ end
+ for name, t in pairs(valuetypes or { }) do
+ M.add_valuetype(prefix, name, t)
+ end
+end
+
+local function get_resource_type(ns, vtype)
+ local vtypes = namespace_info[ns].valuetypes
+ return vtypes and vtypes[vtype] and vtypes[vtype].fields
+ and vtypes[vtype] or false
+end
+
+local function parse_type_name(vtype)
+ local c = string.sub(vtype, 1, 4)
+ local t = string.sub(vtype, 5)
+ if c == 'Bag ' then
+ return t, 'Bag'
+ elseif c == 'Seq ' then
+ return t, 'Seq'
+ else
+ return vtype, false
+ end
+end
+
+-- 1 Built-in namespaces
+
+M.add_namespace('Adobe PDF', 'pdf', 'http://ns.adobe.com/pdf/1.3/', {
+ Keywords = { 'Text', 'Keywords' },
+ PDFVersion = { 'Text', 'PDF version ', true},
+ Producer = { 'AgentName', 'Creator tool', true },
+}, nil, true)
+
+M.add_namespace('PDF/A Identification', 'pdfaid', 'http://www.aiim.org/pdfa/ns/id/', {
+ amd = { 'Text', 'Amendment identifier', true },
+ corr = { 'Text', 'Corrigendum identifier', true },
+ conformance = { 'Text', 'Conformance level', true },
+ part = { 'Integer', 'Version identifier', true },
+}, nil, true)
+
+M.add_namespace('Dublin Core', 'dc', 'http://purl.org/dc/elements/1.1/', {
+ contributor = { 'Bag ProperName', 'Other contributors' },
+ coverage = { 'Text', 'Extent or scope' },
+ creator = { 'Seq ProperName', 'Authors' },
+ date = { 'Seq Date', 'Relevant dates' },
+ description = { 'Lang Alt', 'Description of contents' },
+ format = { 'MIMEType', 'File format (application/pdf)', true },
+ identifier = { 'Text', 'Unique identifier' },
+ language = { 'Bag Locale', 'Used languages', true },
+ publisher = { 'Bag ProperName', 'Publishers' },
+ relation = { 'Bag Text', 'Relationships to other documents', true },
+ rights = { 'Lang Alt', 'Copyright statement' },
+ source = { 'Text', 'Document source unique identifier' },
+ subject = { 'Bag Text', 'Keywords' },
+ title = { 'Lang Alt', 'Title' },
+ type = { 'Bag Text', 'Document type' },
+}, nil, true)
+
+M.add_namespace('XMP Basic', 'xmp', 'http://ns.adobe.com/xap/1.0/', {
+ BaseUrl = { 'URL', 'Base for relative URLs in the document', true },
+ CreateDate = { 'Date', 'Creation date' },
+ CreatorTool = { 'AgentName', 'Creator tool', true },
+ Identifier = { 'Bag Text', 'Multiple identifiers' },
+ MetadataDate = { 'Date', 'Metadata modification date', true },
+ ModifyDate = { 'Date', 'Document modification date', true },
+ Nickname = { 'Text', 'Informal name' },
+}, nil, true)
+
+M.add_namespace('XMP Rights Management', 'xmpRights', 'http://ns.adobe.com/xap/1.0/rights/', {
+ Certificate = { 'URL', 'Online rights management cerfificate' },
+ Marked = { 'Boolean', 'Indicates this is a rights-managed resource' },
+ Owner = { 'Bag ProperName', 'Right holders' },
+ UsageTerms = { 'Lang Alt', 'Instructions on usage' },
+ WebStatement = { 'URL', 'Location of rights statement' },
+}, nil, true)
+
+M.add_namespace('XMP Media Managament', 'xmpMM', 'http://ns.adobe.com/xap/1.0/mm/', {
+ DerivedFrom = { 'ResourceRef', 'Reference to original document', true },
+ DocumentID = { 'URI', 'UUID-based identifier across versions', true },
+ History = { 'Seq ResourceEvent', 'Human-readable history of changes', true },
+ ManagedFrom = { 'ResourceRef', 'Reference to unmanaged document', true },
+ Manager = { 'AgentName', 'Asset management system', true },
+ ManagerVariant = { 'Text', 'Particular variant', true },
+ ManageTo = { 'URI', 'Managed resource identifier', true },
+ ManageUI = { 'URI', 'Web browser interface', true },
+ RenditionClass = { 'RenditionClass', 'Rendition class name', true },
+ RenditionParams = { 'Text', 'Additional rendition parameters', true },
+ VersionID = { 'Text', 'Document version identifier', true },
+ Versions = { 'Seq Version', 'Version history', true },
+}, {
+ ResourceEvent = { 'Reference to a resource', {
+ action = { 'Text', 'Action that occurred' },
+ instanceID = { 'URI', 'Instance ID of modifier resource' },
+ parameters = { 'Text', 'Additional description' },
+ softwareAgent = { 'AgentName', 'Software agent performing the action' },
+ when = { 'Date', 'Optional timestamp of the action' },
+ }, prefix = 'stEvt', uri = 'http://ns.adobe.com/xap/1.0/sType/ResourceEvent#' },
+ ResourceRef = { 'Reference to a resource', {
+ instanceID = { 'URI', 'referenced xmpMM:instanceID' },
+ documentID = { 'URI', 'referenced xmpMM:documentID' },
+ versionID = { 'Text', 'referenced xmpMM:versionID' },
+ renditionClass = { 'RenditionClass', 'referenced xmpMM:renditionClass' },
+ renditionParams = { 'Text', 'referenced xmpMM:renditionParams' },
+ manager = { 'AgentName', 'referenced xmpMM:manager' },
+ managerVariant = { 'Text', 'referenced xmpMM:managerVariant' },
+ manageTo = { 'URI', 'referenced xmpMM:manageTo' },
+ manageUI = { 'URI', 'referenced xmpMM:manageUI' },
+ }, prefix = 'stRef', uri = 'http://ns.adobe.com/xap/1.0/sType/ResourceRef#' },
+ Version = { 'Document version', {
+ comments = { 'Text', 'Description of changes' },
+ event = { 'Text', 'Description of changes' },
+ modifyDate = { 'Date', 'Check-in date' },
+ modifier = { 'ProperName', 'Person making the modifications' },
+ version = { 'Text', 'New version number' },
+ }, prefix = 'stVer', uri = 'http://ns.adobe.com/xap/1.0/sType/Version#' },
+}, true)
+
+-- 1 Writing metadata packets
+
+local XMP = alloc.saved_table('metadata values')
+XMP[1] = XMP[1] or { dc = { format = 'application/pdf' } } -- document-level metadata
+
+function M.push_metadata()
+ XMP[#XMP+1] = { }
+end
+
+local function get_xmp()
+ return XMP[#XMP]
+end
+
+local function escape_xml_content(s)
+ -- NB not to be used for attribute values
+ s = string.gsub(s, '&', '&amp;')
+ return string.gsub(s, '<', '&lt;')
+end
+
+-- 2 extension schemas
+
+local function get_metadata_extensions()
+ local namespaces, anyInUse = { }, false
+ for prefix, ns in pairs(namespace_info) do
+ if not ns.predefined and ns.inUse then
+ namespaces[prefix] = ns
+ anyInUse = true
+ end
+ end
+ if not anyInUse then return false end
+ local rv = { [[ <rdf:Description rdf:about=""
+ xmlns:pdfaExtension="http://www.aiim.org/pdfa/ns/extension/"
+ xmlns:pdfaSchema="http://www.aiim.org/pdfa/ns/schema#"
+ xmlns:pdfaProperty="http://www.aiim.org/pdfa/ns/property#"
+ xmlns:pdfaType="http://www.aiim.org/pdfa/ns/type#"
+ xmlns:pdfaField="http://www.aiim.org/pdfa/ns/field#" >
+ <pdfaExtension:schemas>
+ <rdf:Bag>]] }
+ local add = function (...) table.insert(rv, string.format(...)) end
+ for prefix, ns in sorted_pairs(namespaces) do
+ add(' <rdf:li rdf:parseType="Resource">')
+ add(' <pdfaSchema:schema>%s</pdfaSchema:schema>', ns.description)
+ add(' <pdfaSchema:namespaceURI>%s</pdfaSchema:namespaceURI>', ns.uri)
+ add(' <pdfaSchema:prefix>%s</pdfaSchema:prefix>', prefix)
+ table.insert(rv, ' <pdfaSchema:property>\n <rdf:Seq>')
+ for name, key in sorted_pairs(ns.keys) do if key.inUse then
+ add(' <rdf:li rdf:parseType="Resource">')
+ add(' <pdfaProperty:name>%s</pdfaProperty:name>', name)
+ add(' <pdfaProperty:valueType>%s</pdfaProperty:valueType>', key.type)
+ add(' <pdfaProperty:category>%s</pdfaProperty:category>', key.isInternal and 'internal' or 'external')
+ add(' <pdfaProperty:description>%s</pdfaProperty:description>', key.description)
+ add(' </rdf:li>')
+ end end
+ add(' </rdf:Seq>\n </pdfaSchema:property>')
+ if ns.valuetypes then
+ add(' <pdfaSchema:valueType>\n <rdf:Seq>')
+ for name, vtype in sorted_pairs(ns.valuetypes) do
+ if vtype.inUse then
+ add(' <rdf:li rdf:parseType="Resource">')
+ add(' <pdfaType:type>%s</pdfaType:type>', name)
+ if vtype.fields then
+ add(' <pdfaType:namespaceURI>%s</pdfaType:namespaceURI>', vtype.uri)
+ add(' <pdfaType:prefix>%s</pdfaType:prefix>', vtype.prefix)
+ end
+ add(' <pdfaType:description>%s</pdfaType:description>', vtype.description)
+ if vtype.fields then
+ add(' <pdfaType:field>\n <rdf:Seq>')
+ for name, field in sorted_pairs(vtype.fields) do
+ add(' <rdf:li rdf:parseType="Resource">')
+ add(' <pdfaField:name>%s</pdfaField:name>', name)
+ add(' <pdfaField:valueType>%s</pdfaField:valueType>', field.type)
+ add(' <pdfaField:description>%s</pdfaField:description>', field.description)
+ add(' </rdf:li>')
+ end
+ add(' </rdf:Seq>\n </pdfaType:field>')
+ end
+ add(' </rdf:li>')
+ end
+ end
+ add(' </rdf:Seq>\n </pdfaSchema:valueType>')
+ end
+ add(' </rdf:li>')
+ end
+ add(' </rdf:Bag>\n </pdfaExtension:schemas>\n </rdf:Description>')
+ return table.concat(rv, '\n')
+end
+
+-- 2 main xmp packet
+
+local function write_fields(add, res, value, pre, name, indent)
+ indent = indent or ''
+ if res then
+ add('%s <%s:%s rdf:parseType="Resource">', indent, pre, name)
+ for k, _ in sorted_pairs(res.fields) do
+ if value[k] then
+ add('%s <%s:%s>%s</%s:%s>', indent, res.prefix, k, value[k], res.prefix, k)
+ end
+ end
+ add('%s </%s:%s>', indent, pre, name)
+ else
+ add('%s <%s:%s>%s</%s:%s>', indent, pre, name, escape_xml_content(value), pre, name)
+ end
+end
+
+local function make_xmp_packet(xmp)
+ local rv = { } ; local add = function(...) table.insert(rv, string.format(...)) end
+ -- wrapper and opening tags
+ add('<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>')
+ add('<x:xmpmeta xmlns:x="adobe:ns:meta/">')
+ add('<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">')
+ -- namespaces
+ for id, keys in sorted_pairs(xmp) do
+ local info = namespace_info[id]
+ -- xml namespaces in enclosing description element
+ add(' <rdf:Description rdf:about="" xmlns:%s="%s"', id, info.uri)
+ local xmlns_uris = { }
+ for _, vt in pairs(info.valuetypes or {}) do
+ if vt.fields and vt.inUse
+ and (vt.prefix ~= id or vt.uri ~= info.uri) then
+ xmlns_uris[vt.prefix] = vt.uri
+ end
+ end
+ for pre, uri in pairs(xmlns_uris) do
+ add(' xmlns:%s="%s"', pre, uri)
+ end
+ rv[#rv] = rv[#rv] .. '>'
+ -- metadata namespace contents
+ for key, value in sorted_pairs(keys) do
+ local vtype, lst = parse_type_name(info.keys[key].type)
+ local res = get_resource_type(id, vtype)
+ -- list values
+ if lst then
+ add(' <%s:%s>\n <rdf:%s>', id, key, lst)
+ for _, v in ipairs(value) do
+ write_fields(add, res, v, 'rdf', 'li', ' ')
+ end
+ add(' </rdf:%s>\n </%s:%s>', lst, id, key)
+ -- language alternatives
+ elseif vtype == 'Lang Alt' then
+ add(' <%s:%s>\n <rdf:Alt>', id, key)
+ for lang, v in sorted_pairs(value) do
+ add(' <rdf:li xml:lang="%s">%s</rdf:li>', lang, escape_xml_content(v))
+ end
+ add(' </rdf:Alt>\n </%s:%s>', id, key)
+ -- simple values
+ else
+ if lst then value = value[1] end
+ write_fields(add, res, value, id, key)
+ end
+ end
+ add(' </rdf:Description>')
+ end
+ -- extension schemas
+ if #XMP == 1 and xmp.pdfaid then
+ local schemas = get_metadata_extensions()
+ if schemas then add(schemas) end
+ end
+ -- closing tags and wrapper
+ local editable = tex.count['metadatamodification'] > 0
+ add('</rdf:RDF>\n</x:xmpmeta>')
+ if editable then add(string.rep(string.rep(' ', 80), 25, '\n')) end
+ add('<?xpacket end="%s"?>', editable and 'w' or 'r')
+ return table.concat(rv, '\n')
+end
+
+-- 2
+
+function M.write_metadata()
+ local xmp = make_xmp_packet(XMP[#XMP])
+ local nr = pdf.obj {
+ type = 'stream',
+ attr = '/Type/Metadata /Subtype/XML',
+ immediate = true,
+ compresslevel = 0,
+ string = xmp,
+ }
+ XMP[#XMP] = nil
+ return nr
+end
+
+-- 1 Getting and setting metadata values
+
+local function get_metadata_info(fullkey)
+ local id, k = string.match(fullkey, '([^:]+):(.+)')
+ if not id then return alloc.err('Malformed metadata key %s', fullkey) end
+ local ns = namespace_info[id]
+ if not ns then return alloc.err('Unknown namespace %s', id) end
+ local key = ns.keys[k]
+ if not key then return alloc.err('Unknown key %s in namespace %s', k, id) end
+ local vtype, lst = parse_type_name(key.type)
+ ns.inUse, key.inUse = true, true
+ if ns.valuetypes and ns.valuetypes[vtype] then ns.valuetypes[vtype].inUse = true end
+ return id, k, lst, vtype
+end
+
+local function get_separator()
+ return string.utfcharacter(tex.count['metadataseparator'])
+end
+
+function M.get_metadata(k, a)
+ local xmp = get_xmp()
+ local ns, key, lst, vtype = get_metadata_info(k)
+ local getter = M.getters[vtype] or M.getters.Text
+ if not ns or not xmp[ns] then
+ return ''
+ elseif lst then
+ local rv = { }
+ for _, v in ipairs(xmp[ns][key]) do
+ table.insert(rv, getter(v, a))
+ end
+ return table.concat(rv, get_separator())
+ else
+ return getter(xmp[ns][key], a)
+ end
+end
+
+local function split_metadata_input(s)
+ local rv = string.explode(s, get_separator())
+ for i = 1, #rv do
+ rv[i] = string.gsub(rv[i], '^ *', '')
+ rv[i] = string.gsub(rv[i], ' *$', '')
+ end
+ return rv
+end
+
+function M.set_metadata(k, v, o)
+ local ns, key, lst, vtype = get_metadata_info(k)
+ if not ns then return end -- an error has already occurred
+ local xmp = get_xmp()
+ xmp[ns] = xmp[ns] or { }
+ local setter = M.setters[vtype] or M.setters.Text
+ if not v or v == '' then
+ xmp[ns][key] = nil
+ elseif lst then
+ local l = xmp[ns][key] or { }
+ xmp[ns][key] = l
+ local nst = namespace_info[ns].valuetypes
+ local f = nst and nst[vtype] and nst[vtype].fields
+ if o and #l>0 and f and f[o] and not l[#l][o] then
+ -- special case: add to property type
+ l[#l] = setter(v, l[#l], o, l)
+ else
+ for _, val in ipairs(split_metadata_input(v)) do
+ table.insert(l, setter(val, nil, o, k))
+ end
+ end
+ else
+ xmp[ns][key] = setter(v, xmp[ns][key], o, k)
+ end
+end
+
+-- 1 Callbacks and tex interface
+
+M.aliases = {
+ author = { 'dc:creator' },
+ title = { 'dc:title' },
+ date = { 'dc:date', 'xmp:CreateDate', 'xmp:ModifyDate' },
+ language = { 'dc:language' },
+ keywords = { 'dc:subject',
+ also = function(values)
+ local kw = M.get_metadata('pdf:Keywords')
+ if kw ~= '' then kw = kw..', ' end
+ M.set_metadata('pdf:Keywords') -- prevent warning
+ M.set_metadata('pdf:Keywords', kw..table.concat(split_metadata_input(values), ', '))
+ end },
+ publisher = { 'dc:publisher' },
+ abstract = { 'dc:description' },
+ copyright = { 'dc:rights' },
+ identifier = { 'dc:identifier' },
+ version = { 'xmpMM:VersionID' },
+}
+
+callback.register('finish_pdffile', function()
+ if #XMP > 1 then
+ alloc.err('Not all metadata has been written out.')
+ XMP = { [1] = XMP[1] }
+ elseif #XMP > 0 then
+ local metadata_obj = M.write_metadata()
+ local catalog = pdf.getcatalog() or ''
+ pdf.setcatalog(catalog..string.format('/Metadata %s 0 R', metadata_obj))
+ end
+end)
+
+alloc.luadef('getmetadata', function()
+ local option = token.scan_keyword('/') and token.scan_string()
+ local keyname = token.scan_word()
+ local alias = M.aliases[keyname]
+ local key = alias and alias[1] or keyname
+ tex.sprint(M.get_metadata(key, option))
+end)
+
+local function set_aliased_metadata(keyname, value, option)
+ local keys = M.aliases[keyname] or { keyname }
+ for _, key in ipairs(keys) do
+ M.set_metadata(key, value, option)
+ end
+ if keys.also then keys.also(value, option) end
+end
+
+alloc.luadef('setmetadata', function()
+ local option = token.scan_keyword('/') and token.scan_string()
+ local keyname = token.scan_word()
+ local value = token.scan_string()
+ set_aliased_metadata(keyname, value, option)
+end, 'protected')
+
+alloc.luadef('startmetadata', function()
+ local key = token.scan_word()
+ local opt = token.scan_keyword('/') and token.scan_string()
+ repeat
+ repeat
+ set_aliased_metadata(key, token.scan_string(), opt)
+ opt = token.scan_keyword('/') and token.scan_string()
+ until not opt
+ key = token.scan_word()
+ opt = token.scan_keyword('/') and token.scan_string()
+ until key == 'stopmetadata'
+end)
+
+alloc.luadef('newmetadata', function()
+ M.push_metadata()
+end, 'protected')
+
+alloc.luadef('writemetadata', function()
+ tex.sprint(M.write_metadata())
+end)
+
+alloc.luadef('includemetadata', function()
+ local file = kpse.find_file(token.scan_string())
+ if not file then
+ alloc.err('Metadata file not found');
+ tex.sprint(0);
+ else
+ tex.sprint( pdf.obj {
+ type = 'stream',
+ attr = '/Type/Metadata /Subtype/XML',
+ immediate = true,
+ compresslevel = 0,
+ file = file,
+ })
+ end
+end)
+
+-- 
+
+return M
+
diff --git a/macros/luatex/generic/minim-xmp/minim-xmp.pdf b/macros/luatex/generic/minim-xmp/minim-xmp.pdf
new file mode 100644
index 0000000000..fdf048a857
--- /dev/null
+++ b/macros/luatex/generic/minim-xmp/minim-xmp.pdf
Binary files differ
diff --git a/macros/luatex/generic/minim-xmp/minim-xmp.tex b/macros/luatex/generic/minim-xmp/minim-xmp.tex
new file mode 100644
index 0000000000..2ec4adc895
--- /dev/null
+++ b/macros/luatex/generic/minim-xmp/minim-xmp.tex
@@ -0,0 +1,34 @@
+
+\ifdefined\minimxmploaded
+ \message{(skipped)}
+ \expandafter\endinput\fi
+\chardef\minimxmploaded=\catcode`\:
+\catcode`\:=11
+
+\input minim-alloc
+\directlua { require('minim-xmp') }
+
+% do not add pdf metadata by default
+\pdfvariable suppressoptionalinfo = 255
+
+% \metadatamodification
+\newcount \metadatamodification
+\metadatamodification = 0
+
+% \metadataseparator
+\newcount \metadataseparator
+\metadataseparator = `\;
+
+% Defined from the lua side:
+%
+% \getmetadata ns:key
+% \setmetadata ns:key {value}
+% \startmetadata
+%
+% idem, but undocumented as of yet:
+% \newmetadata
+% \writemetadata (expands to pdf object number)
+% \includemetadata{filename} (expands to pdf object number)
+
+\catcode`\:=\minimxmploaded
+
diff --git a/macros/xetex/generic/xetexko/ChangeLog b/macros/xetex/generic/xetexko/ChangeLog
index 3bf0a6d42f..486d2ddf12 100644
--- a/macros/xetex/generic/xetexko/ChangeLog
+++ b/macros/xetex/generic/xetexko/ChangeLog
@@ -1,3 +1,14 @@
+2021-06-10 Dohyun Kim <nomos at ktug org>
+
+ Version 3.6
+
+ * LaTeX 2021/06/01 or later is required.
+ * vertical/horizontal environments now honor empty argument, which
+ means natural width.
+ * new LaTeX environment: verticaltypesetting
+ * new plain TeX commands: \beginverticaltypesetting and
+ \endverticaltypesetting
+
2021-05-20 Dohyun Kim <nomos at ktug org>
Version 3.5
diff --git a/macros/xetex/generic/xetexko/README b/macros/xetex/generic/xetexko/README
index 4c6fb27c10..8546016217 100644
--- a/macros/xetex/generic/xetexko/README
+++ b/macros/xetex/generic/xetexko/README
@@ -1,4 +1,4 @@
-XeTeX-ko Package version 3.5 (2021/05/20)
+XeTeX-ko Package version 3.6 (2021/06/10)
=========================================
XeTeX-ko is a macro package for Xe(La)TeX which supports typesetting
diff --git a/macros/xetex/generic/xetexko/xetexko-doc.pdf b/macros/xetex/generic/xetexko/xetexko-doc.pdf
index 40ea182bff..654bedda95 100644
--- a/macros/xetex/generic/xetexko/xetexko-doc.pdf
+++ b/macros/xetex/generic/xetexko/xetexko-doc.pdf
Binary files differ
diff --git a/macros/xetex/generic/xetexko/xetexko-doc.tex b/macros/xetex/generic/xetexko/xetexko-doc.tex
index 7969d1ca5a..fed8d24e1b 100644
--- a/macros/xetex/generic/xetexko/xetexko-doc.tex
+++ b/macros/xetex/generic/xetexko/xetexko-doc.tex
@@ -38,20 +38,21 @@
\def\grayhrule{{\color{white!80!black}\hrule height2pt}}
\def\grayvrule{{\color{white!80!black}\vrule width 2pt}}
\newenvironment{plaintex}
- {\setbox0=\vbox\bgroup\hsize=\dimexpr\textwidth-12pt\relax
- \hrule width0pt\kern5pt\par\small
- \parindent0pt }
- {\par \vskip-\lastskip\kern5pt\hrule width0pt\egroup \par\medskip\par
+ {\par\medskip
+ \setbox0=\vbox\bgroup\kern5pt\leftskip15pt \small
+ \parindent0pt }
+ {\par \kern5pt\egroup
\dimen0=\dimexpr\pagegoal-\pagetotal\relax
- \ifdim\dimen0<2\baselineskip\relax \dimen0\maxdimen \fi
+ \ifdim\dimen0<\baselineskip\relax \dimen0\maxdimen \fi
\ifdim\ht0<\dimen0
- \hbox{\grayvrule\kern10pt\box0}%
+ \hbox{\grayvrule \box0}%
\else
\setbox2=\vsplit0 to\dimen0
\lineskip0pt
- \ifvoid2 \else\hbox{\grayvrule\kern10pt\box2}\fi
- \ifvoid0 \else\hbox{\grayvrule\kern10pt\box0}\fi
- \fi \par\medskip\par }
+ \ifvoid2 \else\hbox{\grayvrule \box2}\fi
+ \ifvoid0 \else\hbox{\grayvrule \box0}\fi
+ \fi \par\smallskip
+ }
\newenvironment{example}
{\hbox\bgroup\grayvrule
\vbox\bgroup\hsize\dimexpr\textwidth-4pt\relax
@@ -61,7 +62,7 @@
\def\hemph#1{\textsf{\bfseries #1}}
\def\hparen#1{{\small\hangulparens(#1)}}
\let\hparens\hparen
-\def\keyword#1{\cs{#1}\marginpar{\hfuzz\maxdimen\footnotesize{\color{blue!70}\cs{#1}}}}
+\def\keyword#1{\cs{#1}\marginpar{\hfuzz\maxdimen\footnotesize{\color{blue!80}\cs{#1}}}}
\def\vernote#1{v#1\marginpar{\hfuzz\maxdimen\footnotesize{\color{red}☜ v#1}}}
\hangingpunctuations
@@ -73,7 +74,7 @@
\title{\xetexko\ 간단 매뉴얼}
\author{Dohyun Kim \normalsize <\texttt{nomos at ktug org}> \and
\normalsize <\url{http://github.com/dohyunkim/xetexko}>}
-\date{Version 3.5\quad 2021/05/20}
+\date{Version 3.6\quad 2021/06/10}
\maketitle
\begin{quote}\small
@@ -88,21 +89,21 @@
BOM (Byte Order Mark)은 있어도 좋고 없어도 좋다.
EUC-KR이나 CP949 입력도 지원하는데, 다음과 같은 선언이 있으면 된다.
\begin{verbatim}
- \XeTeXinputencoding="korean"
- \XeTeXdefaultencoding="korean"
+ \XeTeXinputencoding="korean"
+ \XeTeXdefaultencoding="korean"
\end{verbatim}
\section{\XeTeX\ 자체 기능}
\XeTeX 은 자체적으로 유니코드를 잘 지원하므로 \xetexko 를 사용하지
않더라도 한글을 찍는 데 문제가 없다.
\begin{verbatim}
- \usepackage{fontspec}
- \setmainfont{UnBatang}
- \setsansfont{UnDotum}
- \setmonofont{UnTaza}
- \XeTeXlinebreaklocale="ko"
- \XeTeXlinebreakpenalty=50
- \XeTeXlinebreakskip=0pt plus.1ex minus.05ex
+ \usepackage{fontspec}
+ \setmainfont{UnBatang}
+ \setsansfont{UnDotum}
+ \setmonofont{UnTaza}
+ \XeTeXlinebreaklocale="ko"
+ \XeTeXlinebreakpenalty=50
+ \XeTeXlinebreakskip=0pt plus.1ex minus.05ex
\end{verbatim}
하지만 이렇게 사용하면 영문자와 한글이 같은 글꼴로 식자될 뿐만 아니라,
한글 사이 자간이나 영문자와 한글 사이 간격 따위의 \xetexko 가 제공하는
@@ -130,15 +131,15 @@ fontspec에 옵션을 주려면 \xetexko를 부르기 전에 fontspec을 따로
\section{글꼴 명령}\label{sec:fontcmds}
\begin{verbatim}
- \setmainfont {Linux Libertine}
- \setmainhangulfont{NanumMyeongjo}
- \setmainhanjafont {UnBatang}
+ \setmainfont {Linux Libertine}
+ \setmainhangulfont{NanumMyeongjo}
+ \setmainhanjafont {UnBatang}
\end{verbatim}
각 명령의 의미는 이름이 뜻하는 그대로이며, fontspec 매뉴얼에 따라
설정한다. 마찬가지로 다음 명령들도 제공한다.
\begin{verbatim}
- \setsansfont \setsanshangulfont \setsanshanjafont
- \setmonofont \setmonohangulfont \setmonohanjafont
+ \setsansfont \setsanshangulfont \setsanshanjafont
+ \setmonofont \setmonohangulfont \setmonohanjafont
\end{verbatim}
main/sans hangul/hanja 폰트에는 따로 \verb|Ligatures=TeX| 옵션을 지시하지
않더라도 자동으로 주어진다.
@@ -177,23 +178,23 @@ main/sans hangul/hanja 폰트에는 따로 \verb|Ligatures=TeX| 옵션을 지시
\section{글꼴 명령 (계속)}
\begin{verbatim}
- \hangulfontspec{NanumGothic}[Ligatures=TeX]
- \hanjafontspec {UnGungseo}[Ligatures=TeX]
+ \hangulfontspec{NanumGothic}[Ligatures=TeX]
+ \hanjafontspec {UnGungseo}[Ligatures=TeX]
\end{verbatim}
임시로 사용할 한글·한자 글꼴을 지시한다.
\cs{adhochangulfont}와 \cs{adhochanjafont}는 이들 명령의 다른 이름이다.
\begin{verbatim}
- \newhangulfontfamily\myhangul{NanumGothic}[Ligatures=TeX]
- \newhanjafontfamily \myhanja {UnGungseo}[Ligatures=TeX]
- \newhangulfontface \myhangul{NanumGothic Bold}[Ligatures=TeX]
- \newhanjafontface \myhanja {UnDotumBold}[Ligatures=TeX]
+ \newhangulfontfamily\myhangul{NanumGothic}[Ligatures=TeX]
+ \newhanjafontfamily \myhanja {UnGungseo}[Ligatures=TeX]
+ \newhangulfontface \myhangul{NanumGothic Bold}[Ligatures=TeX]
+ \newhanjafontface \myhanja {UnDotumBold}[Ligatures=TeX]
\end{verbatim}
fontspec 패키지의 \cs{setfontfamily} \cs{setfontface} 명령에 해당한다.
\begin{verbatim}
- \addhangulfontfeature{Color=FF0000,InterHangul=-.1em}
- \addhanjafontfeature {Color=00FF00}
+ \addhangulfontfeature{Color=FF0000,InterHangul=-.1em}
+ \addhanjafontfeature {Color=00FF00}
\end{verbatim}
fontspec의 \cs{addfontfeature} 명령을 구현한 것이다.
fontspec과 마찬가지로 각 명령의 끝에 `s'를 붙여도 된다.
@@ -208,7 +209,7 @@ fontspec과 마찬가지로 각 명령의 끝에 `s'를 붙여도 된다.
\section{기호 글꼴 명령}\label{sec:symbolfont}
라틴 문자나 CJK 기호를 어떤 폰트로 식자할 것인가를 사용자가 지정할 수 있다.
\begin{verbatim}
- \xetexkofontregime{hangul}[parens=latin, puncts=prevfont]
+ \xetexkofontregime{hangul}[parens=latin, puncts=prevfont]
\end{verbatim}
모든 라틴 문자와 CJK 기호들을 원칙적으로 한글 폰트로 식자하되,
괄호류는 라틴 폰트로 찍고 마침표 따위는 현재 폰트를 따라간다는 의미이다.
@@ -238,23 +239,23 @@ fontspec과 마찬가지로 각 명령의 끝에 `s'를 붙여도 된다.
기본값은 다음 명령을 준 것과 동일하다.
\vernote{3.0}부터 괄호류의 기본글꼴이 한글이 되었음도 유의하라.
\begin{verbatim}
- \xetexkofontregime {latin}%
- [ puncts=prevfont, colons=prevfont,
- parens=hangul, cjksymbols=hangul ]
+ \xetexkofontregime {latin}%
+ [ puncts=prevfont, colons=prevfont,
+ parens=hangul, cjksymbols=hangul ]
\end{verbatim}
\begin{plaintex}
플레인텍에서는 다음 명령을 사용한다. \LaTeX에서도 쓸 수 있다.
\begin{verbatim}
- \latinalphs \hangulalphs \hanjaalphs \prevfontalphs
- \latinparens \hangulparens \hanjaparens \prevfontparens
- \latincolons \hangulcolons \hanjacolons \prevfontcolons
- \latinhyphens \hangulhyphens \hanjahyphens \prevfonthyphens
- \latinpuncts \hangulpuncts \hanjapuncts \prevfontpuncts
- \latincjksymbols \hangulcjksymbols \hanjacjksymbols \prevfontcjksymbols
+ \latinalphs \hangulalphs \hanjaalphs \prevfontalphs
+ \latinparens \hangulparens \hanjaparens \prevfontparens
+ \latincolons \hangulcolons \hanjacolons \prevfontcolons
+ \latinhyphens \hangulhyphens \hanjahyphens \prevfonthyphens
+ \latinpuncts \hangulpuncts \hanjapuncts \prevfontpuncts
+ \latincjksymbols \hangulcjksymbols \hanjacjksymbols \prevfontcjksymbols
\end{verbatim}
다음 명령은 이상의 모든 라틴 문자를 식자할 폰트를 지시한다.
\begin{verbatim}
- \latinmarks \hangulmarks \hanjamarks \prevfontmarks
+ \latinmarks \hangulmarks \hanjamarks \prevfontmarks
\end{verbatim}
\end{plaintex}
@@ -262,7 +263,7 @@ fontspec과 마찬가지로 각 명령의 끝에 `s'를 붙여도 된다.
\dotemph{고정폭 글꼴을 제외한} 한글·한자 글꼴 명령에 미세 간격 옵션을
쓸 수 있다. 예컨대
\begin{verbatim}
- \setsanshangulfont{NanumGothic}[InterHangul=-.04em]
+ \setsanshangulfont{NanumGothic}[InterHangul=-.04em]
\end{verbatim}
이 때 나눔고딕 글꼴에 한글 마이너스 자간이 작동한다.
@@ -303,9 +304,9 @@ fontspec과 마찬가지로 각 명령의 끝에 `s'를 붙여도 된다.
\begin{plaintex}
플레인텍에서는 다음과 같은 방법으로 제어할 수 있다. 기본값은 \LaTeX에서와 같다.
\begin{verbatim}
- \def\xetexkohu{0.05em }
- \def\xetexkointerhchar{-0.04em }
- \def\xetexkocharraise{-0.1ex }
+ \def\xetexkohu{0.05em }
+ \def\xetexkointerhchar{-0.04em }
+ \def\xetexkocharraise{-0.1ex }
\end{verbatim}
이것들을 선언해두고나서 \cs{hangulfont} 명령 등으로 글꼴을
지정하면 기 정의된 옵션들이 한글폰트 명령에 자동 포함된다.
@@ -395,13 +396,10 @@ Source Han Serif (본명조), Noto Sans CJK, Noto Serif CJK,
\end{figure}
\begin{verbatim}
- \setmainhangulfont{Malgun Gothic}[ Script=Hangul ]
+ \setmainhangulfont{Malgun Gothic}[ Script=Hangul ]
\end{verbatim}
\begin{plaintex}
-플레인텍이라면,
-\begin{verbatim}
- \hangulfont="Malgun Gothic:script=hang" at 10pt
-\end{verbatim}
+플레인텍이라면, \cs{hangulfont="Malgun Gothic:script=hang" at 10pt}.
\end{plaintex}
\section{세로쓰기}\label{sec:verttype}
@@ -409,8 +407,8 @@ Source Han Serif (본명조), Noto Sans CJK, Noto Serif CJK,
세로쓰기를 위한 글꼴 지정은 다음과 같다.
역시 고급 오픈타입 기능을 이용하는 것이므로 폰트가 이를 지원해야 한다.
\begin{verbatim}
- \setmainhangulfont{Noto Sans CJK KR}[
- Vertical=Alternates, RawFeature=vertical ]
+ \newhangulfontfamily\vertfont{Noto Sans CJK KR}
+ [Vertical=Alternates, RawFeature=vertical]
\end{verbatim}
문서 전체를 세로쓰기할 때 \keyword{verticaltypesetting}을 선언하면
@@ -418,8 +416,15 @@ Source Han Serif (본명조), Noto Sans CJK, Noto Serif CJK,
\texttt{vertical} 옵션이 없어야 할 것이다.
면주 글꼴을 따로 지정하는 것은 사용자의 몫이다. }
+\vernote{3.6}부터 \verb|verticaltypesetting| 환경을 이용하여
+몇몇 페이지만 세로쓰기로 조판할 수 있다.
+역시 면주는 가로로 조판되며, 환경의 앞뒤에서 쪽나눔이 행해진다.
+
문서의 일부를 세로쓰기 하려면 \verb|vertical| 환경을 이용한다.
-vertical 환경의 인자는 세로쓰기 박스의 세로 길이이다.
+vertical 환경에는 세로쓰기 박스의 높이를 인자로 준다.
+\vernote{3.6}부터는 만약 인자가 비어있거나 \cs{empty}이면
+본문을 한 줄짜리 박스로 식자하도록 했다. 이때 높이는 natural height가 된다.
+
\begin{figure}
\begin{example}
\hfil\begin{vertical}{18em}
@@ -443,8 +448,7 @@ vertical 환경의 인자는 세로쓰기 박스의 세로 길이이다.
\end{vertical}\hfil
\end{example}
\caption{\linespread{1.2}\selectfont
- 세로쓰기 보기.\quad
- \sffamily\small
+ 세로쓰기 보기.
Noto Sans CJK KR 글꼴을 이용했다. 이 글꼴의 세로쓰기 어간이 1em으로
매우 커서 \cs{spaceskip=0.5em plus.25em minus.125em}을 강제했다.
\texttt{CharRaise=.5ex}도 글꼴 옵션에 추가했다.
@@ -454,30 +458,42 @@ vertical 환경의 인자는 세로쓰기 박스의 세로 길이이다.
\end{figure}
\begin{verbatim}
- \begin{vertical}{12em}
- \hangulfontspec{Noto Sans CJK KR}[
- Vertical=Alternates, RawFeature=vertical ]
- 세로쓰기로 식자할 부분
- \end{vertical}
+ \begin{vertical}{12em}
+ \vertfont
+ \hanjabyhangulfont
+ 세로쓰기로 植字할 부분
+ \end{vertical}
\end{verbatim}
+
혹시 세로로 식자되지 않는 라틴문자 부분이 있다면
베이스라인이 한글과 어울리지 않을 수 있다. 이를 교정하려면
\verb|CharRaise| 옵션을 한글 폰트에 준다.\footnote{%
+ 세로쓰기에서는 일반적으로 \texttt{CharRaise} 옵션을 주는 쪽이 권장된다.
이 방법이 여의치 않으면 라틴문자 부분을 \cs{vertlatin} 명령으로 감쌀 수도
- 있는데, 이때 인자가 박스로 처리되어 그 안에서 줄바꿈이 일어나지 않는다.}
-\medbreak
+ 있는데, 이때 인자가 박스로 처리되어 줄바꿈이 일어나지 않는다.}
+
+세로쓰기 도중에 문서의 일부를 가로쓰기로 삽입하려면
+\verb|horizontal| 환경을 이용한다.
+horizontal 환경에는 가로쓰기 박스의 너비를 인자로 준다.
+\vernote{3.6}부터는 만약 인자가 비어있거나 \cs{empty}이면
+본문을 한 줄짜리 박스로 식자하도록 했다. 이때 너비는 당연히 natural width가 된다.
+
\begin{plaintex}
-플레인텍이라면,
+ 플레인텍에서 문서 전체를 세로쓰기하려면 문서 첫머리에 \cs{verticaltypesetting}.
+
+ 몇몇 페이지만 세로로 쓰려면 \cs{beginverticaltypesetting} \ldots\ \cs{endverticaltypesetting}.
+
+ 문서 일부를 세로쓰기하려면 가령,
\begin{verbatim}
- \vertical{16em}\hangulfont="Noto Sans CJK KR:vertical;+vert"
- 세로쓰기로 식자할 부분
- \endvertical
+ \vertical{}
+ \hangulfont="Noto Sans CJK KR:vertical;+vert"
+ \hanjabyhangulfont
+ 세로쓰기로 植字할 부분
+ \endvertical
\end{verbatim}
+
+ 세로쓰기 중에 잠시 가로로 식자하려면 \cs{horizontal\{\}} \ldots\ \cs{endhorizontal}.
\end{plaintex}
-세로쓰기 도중에 문서의 일부를 가로쓰기로 삽입하려면
-\verb|horizontal| 환경을 이용한다.
-horizontal 환경에는 가로쓰기 박스의 너비를 인자로 주어야 한다.
-가로쓰기 영역의 폰트 설정은 사용자의 몫이다.
\section{고문헌 조판}
@@ -497,11 +513,11 @@ horizontal 환경에는 가로쓰기 박스의 너비를 인자로 주어야 한
\begin{plaintex}
플레인텍에서는 다음 방식으로 사용한다.
- \begin{verbatim}
+\begin{verbatim}
\begingroup \typesetclassic
...
\endgroup
- \end{verbatim}
+\end{verbatim}
\end{plaintex}
@@ -526,8 +542,8 @@ horizontal 환경에는 가로쓰기 박스의 너비를 인자로 주어야 한
\sffamily\typesetclassic
\analect
\end{example}
-\caption{고문헌 조판 보기.\quad
- \sffamily\small
+\caption{\linespread{1.2}\selectfont
+ 고문헌 조판 보기.
typesetclassic 환경을 이용했다.
\cs{removeclassicspaces}도 선언했다.
}\label{fig:ancientdoc}
@@ -542,8 +558,8 @@ horizontal 환경에는 가로쓰기 박스의 너비를 인자로 주어야 한
\analect
\end{vertical}\hfil
\end{example}
- \caption{고문헌 세로쓰기 조판 보기.\quad
- \sffamily\small
+ \caption{\linespread{1.2}\selectfont
+ 고문헌 세로쓰기 조판 보기.
vertical 환경을 이용했다.
\cs{hangingpunctuations}가 선언되어 있어서 구두점이
행 끝에 걸린 것을 볼 수 있다.
@@ -603,29 +619,29 @@ microtype 패키지의 protrusion 기능이 잘 작동하지 않는 경우가
\vernote{3.0}부터는
자동으로 수식한글을 잡아주지 않으므로 사용자가 다음과 같이 명시적으로 선언해야 한다.
\begin{verbatim}
- \setmathhangulfont{Noto Sans CJK KR}[
- SizeFeatures={ {Size=-6, Font=* Medium},
- {Size=6-9, Font=*},
- {Size=9-, Font=* DemiLight} }
- ]
+ \setmathhangulfont{Noto Sans CJK KR}[
+ SizeFeatures={ {Size=-6, Font=* Medium},
+ {Size=6-9, Font=*},
+ {Size=9-, Font=* DemiLight} }
+ ]
\end{verbatim}
\begin{plaintex}
플레인텍에서는 \cs{mathhangulfont="[UnBatang.ttf]"}와 같이 설정한다.
또는 좀 더 그럴듯하게 하려면:\par
\leftskip=3em\noindent
- \begin{verbatim}
- \font\texthangul="Noto Sans CJK KR DemiLight" at 10pt
- \font\scripthangul="Noto Sans CJK KR Regular" at 7pt
- \font\scriptscripthangul="Noto Sans CJK KR Medium" at 5pt
- \setmathhangulfonts\texthangul\scripthangul\scriptscripthangul
- \end{verbatim}
+\begin{verbatim}
+ \font\texthangul="Noto Sans CJK KR DemiLight" at 10pt
+ \font\scripthangul="Noto Sans CJK KR Regular" at 7pt
+ \font\scriptscripthangul="Noto Sans CJK KR Medium" at 5pt
+ \setmathhangulfonts\texthangul\scripthangul\scriptscripthangul
+\end{verbatim}
\end{plaintex}
현재 한글만 쓸 수 있게 설정되어 있다.
한자도 수식에 직접 입력하려면 사용자는
\begin{verbatim}
- \setmathhangulblock{4E00}{9FC3}
+ \setmathhangulblock{4E00}{9FC3}
\end{verbatim}
명령으로 유니코드 블럭을 추가 지정해야 한다.
@@ -637,9 +653,9 @@ microtype 패키지의 protrusion 기능이 잘 작동하지 않는 경우가
\cs{jong} \cs{jung} \cs{rieul} 중 하나를
미리 선언해 둘 수 있다. 이를테면,
\begin{verbatim}
- \def\mypage{페이지\jung}
- \def\mypage{쪽\jong}
- \def\mystar{별\rieul}
+ \def\mypage{페이지\jung}
+ \def\mypage{쪽\jong}
+ \def\mystar{별\rieul}
\end{verbatim}
\section{드러냄표}
@@ -648,8 +664,8 @@ microtype 패키지의 protrusion 기능이 잘 작동하지 않는 경우가
기본은 글자 위에 점을 찍는 형태이나 다음 명령을 이용해 개인적으로 선호하는
기호를 드러냄표로 쓸 수 있다.
\begin{verbatim}
- \def\dotemphraise{0.4em }
- \def\dotemphchar{\bfseries ^^^^02d9}
+ \def\dotemphraise{0.4em }
+ \def\dotemphchar{\bfseries ^^^^02d9}
\end{verbatim}
전자는 드러냄표를 피강조 글자 위로 끌어올리는 길이를,
후자는 드러냄표 기호 자체를 정의한다.
@@ -680,11 +696,19 @@ microtype 패키지의 protrusion 기능이 잘 작동하지 않는 경우가
%\hfill \fboxsep=-\fboxrule \fbox{\vbox to1em{\hbox to1em{\hss}\vss}}
\bigskip
+\centerline{\hfil\vrule width.5\textwidth height.4pt \relax\hfil}
\section*{주요 변경 이력}
\begin{small}\linespread{1.2}\selectfont
\begin{description}\itemsep=0pt
+ \item[v3.6] 2021-06-10
+ \begin{itemize}
+ \item \hyperref[sec:verttype]
+ {\cs{verticaltypesetting}을 환경으로도 쓸 수 있다}.
+ \item \hyperref[sec:verttype]
+ {\texttt{vertical} 및 \texttt{horizontal} 환경의 인자를 비워둘 수 있다}.
+ \end{itemize}
\item[v3.4] 2021-05-15
\begin{itemize}
\item \hyperref[sec:fontcmds]
diff --git a/macros/xetex/generic/xetexko/xetexko.sty b/macros/xetex/generic/xetexko/xetexko.sty
index ce95a1488b..e82c85aabd 100644
--- a/macros/xetex/generic/xetexko/xetexko.sty
+++ b/macros/xetex/generic/xetexko/xetexko.sty
@@ -15,8 +15,8 @@
\catcode`@=11
\ifdefined\ProvidesPackage
- \NeedsTeXFormat{LaTeX2e}[2020/10/01]
- \ProvidesPackage{xetexko}[2021/05/20 v3.5 typesetting Korean with XeTeX]
+ \NeedsTeXFormat{LaTeX2e}[2021/06/01]
+ \ProvidesPackage{xetexko}[2021/06/10 v3.6 typesetting Korean with XeTeX]
\else
\ifdefined\@tempcnta\else \newcount\@tempcnta \fi
\ifdefined\@sptoken \else
@@ -393,9 +393,12 @@
}
\protected\def\vertical#1{%
\leavevmode
- \setbox\z@\vbox\bgroup
- \hsize#1\relax
- \typesetvertical
+ \ifx\empty#1\empty
+ \setbox\z@\hbox\bgroup
+ \else
+ \setbox\z@\vbox\bgroup \hsize#1\relax
+ \fi
+ \typesetvertical
}
\protected\def\endvertical{%
\egroup
@@ -404,65 +407,50 @@
}
\protected\def\horizontal#1{%
\leavevmode
- \setbox\z@\vbox\bgroup
- \hsize#1\relax
- \typesethorizontal
+ \ifx\empty#1\empty
+ \setbox\z@\hbox\bgroup
+ \else
+ \setbox\z@\vbox\bgroup \hsize#1\relax
+ \fi
+ \typesethorizontal
}
\protected\def\endhorizontal{%
\egroup
\XeKo@unrotatebox\z@
- \lower\dimexpr.5\ht\z@\ifdefined\xetexkocharraise-\xetexkocharraise\fi\relax
+ \ifdefined\xetexkocharraise \raise\xetexkocharraise \fi
\box\z@
}
\def\XeKo@rotatebox#1{%
- \setbox#1\hbox to\dimexpr\ht#1+\dp#1\bgroup
+ \dimen@\dimexpr\ht#1+\dp#1\relax
+ \setbox#1\hbox to\dimen@\bgroup
\hfil
\vbox to\wd#1\bgroup
- \wd#1\z@ \ht#1\z@ \dp#1\z@
- \special{x:gsave}\special{x:rotate -90}\box#1\special{x:grestore}%
+ \wd#1\z@
+ \special{x:gsave}\relax
+ \special{x:rotate -90}\relax
+ \box#1\relax
+ \kern-\dimen@
+ \special{x:grestore}\relax
\vfil
\egroup
\kern-.5ex
\egroup
}
\def\XeKo@unrotatebox#1{%
- \setbox#1\hbox to\dimexpr\ht#1+\dp#1\bgroup
- \vbox to\wd#1\bgroup
+ \dimen@\dimexpr\ht#1+\dp#1\relax
+ \setbox#1\hbox to\dimen@\bgroup
+ \lower.5\wd#1\vbox to\wd#1\bgroup
\vfil
- \wd#1\z@ \ht#1\z@ \dp#1\z@
- \special{x:gsave}\special{x:rotate 90}\box#1\special{x:grestore}%
+ \wd#1\z@
+ \special{x:gsave}\relax
+ \special{x:rotate 90}\relax
+ \box#1\relax
+ \kern-\dimen@
+ \special{x:grestore}\relax
\egroup
\hfil
\egroup
}
-\ifcsname ver@xetexko.sty\endcsname
- \IfFormatAtLeastTF{2021/06/01}{
- \def\verticaltypesetting{%
- \maxdepth\z@ \typesetvertical
- \dimen@\textwidth \textwidth\textheight \textheight\dimen@
- \AddToHook{cmd/@outputpage/before}{\XeKo@rotatebox\@outputbox \textwidth\textheight}%
- \let\verticaltypesetting\relax % prevent multiple running
- }
- }{
- \def\verticaltypesetting{%
- \maxdepth\z@ \typesetvertical
- \dimen@\textwidth \textwidth\textheight \textheight\dimen@
- \edef\@outputpage{\unexpanded{\XeKo@rotatebox\@outputbox
- \textwidth\textheight}\unexpanded\expandafter{\@outputpage}}%
- \let\verticaltypesetting\relax % prevent multiple running
- }
- }
-\else
- \def\verticaltypesetting{%
- \dimen@\hsize \hsize\vsize \vsize\dimen@
- \edef\plainoutput{\unexpanded{\dimen@\hsize \hsize\vsize \vsize\dimen@}%
- \unexpanded\expandafter{\plainoutput}}%
- \def\pagebody{\setbox\z@\vbox to\hsize{\boxmaxdepth=\maxdepth
- \pagecontents}\XeKo@rotatebox\z@\box\z@}%
- \maxdepth\z@ \typesetvertical
- \let\verticaltypesetting\relax % prevent multiple running
- }
-\fi
\protected\def\vertlatin#1{\leavevmode\lower.5ex\hbox{\latinmarks #1}} % compat
@@ -1835,6 +1823,18 @@
%%% plain
\ifcsname ver@xetexko.sty\endcsname \else
+ \def\verticaltypesetting{%
+ \dimen@\hsize \hsize\vsize \vsize\dimen@
+ \edef\plainoutput{\dimen@\hsize \hsize\vsize \vsize\dimen@
+ \unexpanded\expandafter{\plainoutput}}%
+ \def\pagebody{\setbox\z@\vbox to\hsize{\boxmaxdepth=\maxdepth \pagecontents}%
+ \XeKo@rotatebox\z@\box\z@}%
+ \maxdepth\z@ \typesetvertical
+ \let\verticaltypesetting\relax % prevent multiple running
+ }
+ \def\beginverticaltypesetting{\vfill\supereject \begingroup \verticaltypesetting}
+ \def\endverticaltypesetting{\vfill\supereject \endgroup}
+ % hangul fonts
\protected\def\hangulfont{%
\afterassignment\XeKo@hangulfont@setup\font\XeKo@hangul@font
}
@@ -1895,9 +1895,9 @@
}
\protected\def\hanjabyhangulfont{\let\XeKo@hanja@font\XeKo@hangul@font }
% math hangul
- \newfam\symmathhangul
\protected\def\setmathhangulfonts#1#2#3{% font identifiers
\ifnum\Umathcodenum"AC00="AC00\relax
+ \csname newfam\endcsname\symmathhangul
\setmathhangulblock{AC00}{D7A3}%
\fi
\textfont\symmathhangul=#1\relax
@@ -1926,6 +1926,37 @@
\endinput\fi
%%% latex
+
+\def\verticaltypesetting{%
+ \ifx\@nodocument\relax % not in the preamble
+ \clearpage
+ \begingroup
+ \fi
+ \hsize\textheight \vsize\textwidth
+ \textwidth\hsize \textheight\vsize
+ \@colroom\vsize \@colht\vsize
+ \if@twocolumn
+ \columnwidth=.5\dimexpr\textwidth-\columnsep\relax
+ \linewidth\columnwidth \hsize\columnwidth
+ \else
+ \linewidth\hsize \columnwidth\hsize
+ \fi
+ \expandafter\def\expandafter\@outputpage\expandafter{%
+ \expandafter\XeKo@rotatebox\expandafter\@outputbox
+ \expandafter\textwidth\expandafter\textheight
+ \@outputpage
+ }%
+ \maxdepth\z@ \typesetvertical
+ \let\verticaltypesetting\relax % prevent multiple running
+}
+\def\endverticaltypesetting{%
+ \clearpage
+ \endgroup
+ \global\@colroom\textheight
+ \global\@colht\textheight
+ \global\vsize\textheight
+}
+
\RequirePackage{fontspec}[2020/02/03]
\AddToHook{rmfamily}{%
\let \xetexkohangulfont \xetexkomainhangulfont
@@ -1947,19 +1978,10 @@
\latinalphs\latinparens\latinpuncts\latincolons\latinhyphens
\disablehangulspacing
}
-\IfFormatAtLeastTF{2021/06/01}{
- \AddToHook{cmd/verbatim@font/after}{%
- \disablehangulspacingandlinebreak
- \aftergroup\enablehangulspacingandlinebreak
- }
-}{
- \edef\verbatim@font{%
- \unexpanded\expandafter{%
- \verbatim@font
- \disablehangulspacingandlinebreak
- \aftergroup\enablehangulspacingandlinebreak
- }}
-}
+\AddToHook{cmd/verbatim@font/after}{%
+ \disablehangulspacingandlinebreak
+ \aftergroup\enablehangulspacingandlinebreak
+ }
\AddToHook{normalfont}{%
\let \xetexkohangulfont \xetexkodefaulthangulfont
\let \xetexkohanguloption \xetexkodefaulthanguloption
@@ -1969,19 +1991,10 @@
\AddToHook{env/picture/begin}{%
\latinalphs\latinparens\latinpuncts\latincolons\latinhyphens
}
-
-\IfHookExistsTF{selectfont}{
- \AddToHook{selectfont}{%
- \XeKo@hanja@selectfont
- \XeKo@hangul@selectfont
- }
-}{
- \RequirePackage{everysel}
- \EverySelectfont{%
- \XeKo@hanja@selectfont
- \XeKo@hangul@selectfont
- }
-}
+\AddToHook{selectfont}{%
+ \XeKo@hanja@selectfont
+ \XeKo@hangul@selectfont
+ }
\def\XeKo@hangul@selectfont{%
\ifdefined\XeKo@in@selectfont\else
\ifdefined\xetexkohangulfont
@@ -2051,21 +2064,6 @@
\tl_clear:N \l_xtxko_font_opts_tl
\keys_set_known:nxN { xtxko-font } {#1} \l_xtxko_rest_opts_tl
}
-% suppress upshape font warnings
-\cs_new_nopar:Npn \l_xetexko_pacify_upshape {
- \tl_map_inline:nn { \mddefault \bfdefault }
- {
- \cs_if_exist:cF { \g_fontspec_encoding_tl/\l_fontspec_family_tl/##1/\updefault }
- {
- \cs_if_exist:cT { \g_fontspec_encoding_tl/\l_fontspec_family_tl/##1/\shapedefault }
- {
- \cs_set_eq:cc
- { \g_fontspec_encoding_tl/\l_fontspec_family_tl/##1/\updefault }
- { \g_fontspec_encoding_tl/\l_fontspec_family_tl/##1/\shapedefault }
- }
- }
- }
-}
\DeclareDocumentCommand \setmainhangulfont { O{} m O{} }
{
\__xtxko_assign_font_opts:n { #1, #3 }
@@ -2168,7 +2166,7 @@
\DeclareDocumentCommand \addhangulfontfeature { m }
{
\group_begin:
- \fontseries\mddefault\fontshape\shapedefault \xetexkohangulfont
+ \fontseries\seriesdefault\fontshape\shapedefault \xetexkohangulfont
\cs_set_eq:NN \l_xtxko_font_opts_tl \xetexkohanguloption
\keys_set_known:nxN { xtxko-font } { #1 } \l_xtxko_rest_opts_tl
\addfontfeature { \l_xtxko_rest_opts_tl }
@@ -2292,7 +2290,7 @@
\DeclareDocumentCommand \addhanjafontfeature { m }
{
\group_begin:
- \fontseries\mddefault\fontshape\shapedefault \xetexkohanjafont
+ \fontseries\seriesdefault\fontshape\shapedefault \xetexkohanjafont
\cs_set_eq:NN \l_xtxko_font_opts_tl \xetexkohanjaoption
\keys_set_known:nxN { xtxko-font } { #1 } \l_xtxko_rest_opts_tl
\addfontfeature { \l_xtxko_rest_opts_tl }
@@ -2318,9 +2316,8 @@
\DeclareDocumentCommand \setmathhangulfont { O{} m O{} }
{
\fontspec_set_family:Nnn \xetexkomathhangulfamily { #1, #3 } { #2 }
- \l_xetexko_pacify_upshape
\DeclareSymbolFont { mathhangul }
- \g_fontspec_encoding_tl \xetexkomathhangulfamily \mddefault \updefault
+ \g_fontspec_encoding_tl \xetexkomathhangulfamily \seriesdefault \shapedefault
\int_compare:nNnT { \Umathcodenum"AC00 } = { "AC00 }
{
\setmathhangulblock{AC00}{D7A3}
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb b/systems/texlive/tlnet/tlpkg/texlive.tlpdb
index 4d58ee7bd1..4bb9345915 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb
@@ -26,7 +26,7 @@ depend container_split_src_files/1
depend frozen/0
depend minrelease/2016
depend release/2021
-depend revision/59539
+depend revision/59546
name 00texlive.image
category TLCore
@@ -78383,7 +78383,7 @@ catalogue-version 0.9b
name cooking-units
category Package
-revision 53403
+revision 59542
shortdesc Typeset and convert units for cookery books and recipes
relocated 1
longdesc The package provides commands to typeset amounts and units
@@ -78392,25 +78392,25 @@ longdesc convert one unit into another (for example 'dag' to 'g'; see
longdesc the documentation for more examples). This packages requires
longdesc expl3 and xparse, translations, xfrac, l3keys2e, and,
longdesc optionally, fmtcount.
-containersize 17464
-containerchecksum 4182a43bc869dca19d022ae019fd479ac658c609a792677b9cfe5e3271af890ee353974b15b9cd4bb667f39fb38b96ee1a31359ca4a89986a3c03053ffd1974c
-doccontainersize 697692
-doccontainerchecksum 71e7ab3f1a89984063e26d5532eb1c1533efb06b8d8164548b7b46eab966e88e8ce5300ca0c91c639ae896b95bf5e9487c8c149d2f90af7cca0168b674052c8e
-docfiles size=172
+containersize 20768
+containerchecksum b49ea95a00d3db95a67f32b2833d4e48feb26cabdf12670cbe7988af51f299c7c60f1f4ad42161b9be533d4e79db6b5fdc6676d99eea290214910f7cf3c6cbf0
+doccontainersize 725860
+doccontainerchecksum 9583096d5d88ba4703aa82c29ecbc28ce917457a2c528e1990add753f179e7a51b2e628719d6a4836e3ff7f6b3389a490bf2d0b029a0c167ae66b48595749a48
+docfiles size=184
RELOC/doc/latex/cooking-units/README.md details="Readme"
RELOC/doc/latex/cooking-units/cooking-units.pdf details="Package documentation"
-srccontainersize 56868
-srccontainerchecksum 8eb0c4698cf35fcb24b4e02db44f284c51f953ce1debc5f334fa514e4cee0ccb3278c74bdded88cfe379a47ac1f32efe089711f11fafa477f7a053e2e45a0092
-srcfiles size=72
+srccontainersize 68828
+srccontainerchecksum 4f2cc334c5f1698bd61af7d17f5fff362a4c4138ed90a3e4eb4850a680569f8da2e744b6ce6620ccee90cab787bb9b689815ffe548302acfc14e948f042dd7c4
+srcfiles size=86
RELOC/source/latex/cooking-units/cooking-units.dtx
RELOC/source/latex/cooking-units/cooking-units.ins
-runfiles size=32
+runfiles size=38
RELOC/tex/latex/cooking-units/cooking-units.sty
catalogue-contact-repository https://github.com/Vidabe/cooking-units
catalogue-ctan /macros/latex/contrib/cooking-units
-catalogue-license lppl
-catalogue-topics cooking units
-catalogue-version 1.46
+catalogue-license lppl1.3c
+catalogue-topics cooking units expl3
+catalogue-version 2.00
name cookingsymbols
category Package
@@ -186388,7 +186388,7 @@ catalogue-version 20210607.0
name luatexko
category Package
-revision 58928
+revision 59545
shortdesc Typeset Korean with Lua(La)TeX
relocated 1
longdesc This is a Lua(La)TeX macro package that supports typesetting
@@ -186399,16 +186399,16 @@ longdesc package rather than other Hangul macros operating on other
longdesc engines. LuaTeX version 1.10+ and luaotfload version 2.96+ are
longdesc required for this package to run. This package also requires
longdesc the cjk-ko package for its full functionality.
-containersize 22400
-containerchecksum be50a22424571de2bfc5ece11883903833df1bbc9c120122111900b90b47d7766fbad09a5c2307629f5b6710bee75bf30b7fb780def188fcee2e1a6d4c457dad
-doccontainersize 336848
-doccontainerchecksum f0ce1f5e7444238ac33ff52e96272ea1dfa3074680b5a9ad49ed191d3972c03d1028556891149dec71a1f8393c3935ed970aed8c59152104eb459acf774ec88e
-docfiles size=93
+containersize 23004
+containerchecksum 6ec3739445e76e2733759e75b0617d03ead8bdeee90136807c1a19827f4ee1035ead60956aff9542743bbcab081eb37ba09629e6ee72e69d9e0b85d22aaa9659
+doccontainersize 348984
+doccontainerchecksum e9a7ae0ed1c124c9c9488870df5c78e75b5b6ac7e384ecb433e88e1588de5e4b3eaf0931cb3b36db8202412538db38cac187c397447a7e37308975d2e3ee972c
+docfiles size=96
RELOC/doc/luatex/luatexko/ChangeLog
RELOC/doc/luatex/luatexko/README details="Readme"
RELOC/doc/luatex/luatexko/luatexko-doc.pdf details="Package documentation"
RELOC/doc/luatex/luatexko/luatexko-doc.tex
-runfiles size=28
+runfiles size=30
RELOC/tex/luatex/luatexko/luatexko-normalize.lua
RELOC/tex/luatex/luatexko/luatexko-uhc2utf8.lua
RELOC/tex/luatex/luatexko/luatexko.lua
@@ -186418,7 +186418,7 @@ catalogue-contact-repository https://github.com/dohyunkim/luatexko
catalogue-ctan /macros/luatex/generic/luatexko
catalogue-license lppl1.3c
catalogue-topics luatex korean
-catalogue-version 3.1
+catalogue-version 3.2
name luatextra
category Package
@@ -272075,7 +272075,7 @@ catalogue-version 0.302
name semantex
category Package
-revision 56863
+revision 59543
shortdesc Semantic, keyval-based mathematics
relocated 1
longdesc The SemanTeX package for LaTeX delivers a more semantic,
@@ -272092,22 +272092,22 @@ longdesc considered feature-complete and more or less stable, so using
longdesc it at this point should be safe. Still, suggestions, ideas, and
longdesc bug reports are more than welcome!
depend semtex
-containersize 23004
-containerchecksum d09b5dc2e6b8031c03b59254b442a8c5502cacd2d24c91f47ae6243cf5908062e79ab0e7a521c2208848ae7f9acb147716cd8a399b362a91a5cfdec87e213814
-doccontainersize 390728
-doccontainerchecksum 829286b336f1d05afa9561d3937fa526b6062b03950b3f350fb4fc586f45fa253d93939b6432685a08c967eb85c053d07c6fe3e08126869ef63fb43bd0acd992
-docfiles size=134
+containersize 26460
+containerchecksum e6b9e6ca89fc10d72e1ecd9a9e0b3e549c9c85fe1c33aa8c838f781e39c64a2815db6956db7226d700514de0d057670a395a6eb3edc191a85219bfade0607448
+doccontainersize 396124
+doccontainerchecksum 2cdab6be40b7f7694ddb149731d8eb3c3957bb3e736860a5b1a45c8c97c9d0b645f16b49d52753dfe3f0ee24d64984079b4435cf39575e939540fbd2db7f1a75
+docfiles size=136
RELOC/doc/latex/semantex/README.md details="Readme"
RELOC/doc/latex/semantex/semantex.pdf details="Package documentation"
RELOC/doc/latex/semantex/semantex.tex
-runfiles size=59
+runfiles size=79
RELOC/tex/latex/semantex/semantex.sty
RELOC/tex/latex/semantex/stripsemantex.lua
RELOC/tex/latex/semantex/stripsemantex.sty
catalogue-ctan /macros/latex/contrib/semantex
catalogue-license lppl1.3c
catalogue-topics maths expl3
-catalogue-version 0.463
+catalogue-version 0.500
name semantic
category Package
@@ -300157,7 +300157,7 @@ docfiles size=376
name texlive-scripts
category TLCore
-revision 59528
+revision 59541
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.
@@ -300165,10 +300165,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 108012
-containerchecksum 231a08cf01e68e5afb627474e267a2a5afbf667c5bae4ce0f254eba82f4d4c4bae6c1c1eef6ba147c251dc9dc4104d900e19fe3995c7fbcd78255677b1843e11
-doccontainersize 397492
-doccontainerchecksum 64b9aa7d2e643ad7e8aa47ed5c16dde828f4acd8ac2cea235b391dd054d57220816c72cbb78d76cc99fc85ea950636df669a4e8b9057ed5ffd36f7be74c7465e
+containersize 108008
+containerchecksum 1d94cfdfd4ac4e6ff03786b9788bdca4583a2ad157a8374d586002428ef7c849e733bbbcc3b937b61facac4f8ab85086c950db06bf22f1c75604af62b2628cf4
+doccontainersize 397696
+doccontainerchecksum e6cb77e7bfbc4385647efb5f0ce3951a371635ca2e452547b4b56b4ea4fc76d57955039884386a36417f23ff5b8934835e2a48831acc05f7405b1b8254663b3d
docfiles size=490
doc.html
texmf-dist/doc/man/man1/fmtutil-sys.1
@@ -307783,17 +307783,17 @@ catalogue-version 1.5
name tiscreen
category Package
-revision 59517
+revision 59544
shortdesc Mimic the screen of older Texas Instruments calculators
relocated 1
longdesc This package mimics the screen of older Texas Instruments dot
longdesc matrix display calculators, specifically the TI-82 STATS. It
longdesc relies on the lcd and xcolor packages.
containersize 1136
-containerchecksum 6b41272af602da2754988d4cb593322fe4dce067f03e8a1f727f3be52b81784c252901fe55d73acf2a074fafb6f85b83799e15c14241dce20673ed4b4f5d59f2
-doccontainersize 135172
-doccontainerchecksum 2d3c7ceba1989291b3c0354541fbc97348a0a82c6b81ba9babd86e7d0399a6ee24d8bfcdd15868f1365703834c2b0c58e8b04b083587c0e7a9c93a3c37690a45
-docfiles size=35
+containerchecksum ded3bcc3c4b89356462bb37b085799128fdcc068902ceb0be3d3d3da69ae89b9e5cc6796c0c1a3bbcaf8f7f08d0a39d34b32c7426893bb70996fbbd1fe2c646f
+doccontainersize 127244
+doccontainerchecksum 8eb8259529364ffe36dc5d70abaff11bb0e9190675c1131e410cca2657307a108500c1bc12da99a6e7ca270dbecfc9653430ab2dd9c62ddbc836b07791dea3c2
+docfiles size=33
RELOC/doc/latex/tiscreen/README details="Readme"
RELOC/doc/latex/tiscreen/tiscreen-doc.pdf details="Package documentation"
RELOC/doc/latex/tiscreen/tiscreen-doc.tex
@@ -336815,7 +336815,7 @@ catalogue-topics font-supp xetex
name xetexko
category Package
-revision 59282
+revision 59546
shortdesc Typeset Korean with Xe(La)TeX
relocated 1
longdesc The package supports typesetting Korean documents (including
@@ -336823,10 +336823,10 @@ longdesc old Hangul texts), using XeTeX. It enhances the existing
longdesc support, in XeTeX, providing features that provide quality
longdesc typesetting. This package requires the cjk-ko package for its
longdesc full functionality.
-containersize 53784
-containerchecksum bb86c22a91503bbea0f1d84a09909dd9b732eb25c3b55b9175f4c0fb15deb34eda2b38fdb83f09affd7cd3efcaa14e046957d6aa37938494cce630e08d733a16
-doccontainersize 264084
-doccontainerchecksum 0d1233090410aa524fc14434cc51eb2c7b72c1f67db2ffee771da0a230f2d16ea343eb45cd6cd3e61db3ee1b9d2f49c4e2d19765267ed0c9f365d735c46c7edc
+containersize 53752
+containerchecksum 9826ddfdf1cdcb53e86cd97d95b1697f79b070d9e78c03ce5f116652efbd8ae4affbd274313bdb48bd6ca542f067bb28908603bcec3f2d41247ec141773fc660
+doccontainersize 264392
+doccontainerchecksum 790bd2e66e2f0859a032aedbab4814e140213270d74ce6a6a6bb0645710a9c0a6d102a680f7c1cad2583e354c0d5304ed2a738141e99ad404b212d3ee02f6da9
docfiles size=75
RELOC/doc/xetex/xetexko/ChangeLog
RELOC/doc/xetex/xetexko/README details="Readme"
@@ -336846,7 +336846,7 @@ catalogue-contact-repository https://github.com/dohyunkim/xetexko
catalogue-ctan /macros/xetex/generic/xetexko
catalogue-license lppl1.3c
catalogue-topics korean xetex
-catalogue-version 3.5
+catalogue-version 3.6
name xetexref
category Package
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
index 73f8631178..8833cdb066 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
@@ -1 +1 @@
-b27212ff760e958cc3bfb015f814427e texlive.tlpdb
+83c0a73207f9649aca36b5d8b4aebedd texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
index 99a5634bb6..e2ae2194fc 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
@@ -1 +1 @@
-eb58e603d864393f47ec0b0f99328e887751cb08a272ce8cb162556cc0d9c300bca065284067d1b75068187c1a453977a4774a3d4360e2019bcfc2285b39be96 texlive.tlpdb
+4cd17fd1d8f8f5b92f95772041ad297dc09abcbfe838024c811612e3f6363bf0f392c41d5c7ad0171f7763c19d76ec7d9388a36acae361d0d36f68c7831726ab texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
index 1d1841709b..7e71b88f03 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-----
-iQEcBAEBCgAGBQJgwVQ6AAoJEEzhh34ZQ4xw7b8H/21UIZ1iQPPO0srrhCd/KW3C
-5sJ1ugNFJdJREKwp1PUTHNz18JiGkdPOQIEak2gtvEncRtjjP3rv61ay6RqV4pzl
-2ps1D3V09PSr9ARm0vvBGnS7FekvhR9lqeCHo3Ze7MCFiE/56gARvs1HwvHdbTQ+
-zpWuly61AMqgyRFq4/dAtuAqcNij/x9VzbyHaHm97Z06NbmkXvVBAu0upTF8aWA/
-30j2atUvfhEpvuQSydzUlXQ+NXUGoD0LmT8vfm0vmbD+CFrY8qQPivrL40wvOFFN
-DK3MRdFLwVB97+INWiulMCfsCjG/tBXZ17UAKXDP1as+oTtXwI7ouEZWwQmMwL8=
-=PBWr
+iQEcBAEBCgAGBQJgwqV6AAoJEEzhh34ZQ4xwSuEIAJcv/CWqVK5JCJmzHoiM36ql
+Q2I2wth40axBwaXFyzvHZ+EbJvrTw8DSZ3TRMmhWitT1+vyMoTrz2dng/tmp3/W4
+O1Nt6zCPDvIp4B7kp8lUCwcZQ02oqskPg6gbm30ZPCGLJLFFsh50DWYvZUc9UnsM
+NoOlA+Cl6BKRzlRH+f075DgAnqolvW3HUj8LLzYF7keNaE/1a2puNS1rtYR7LkAX
+bbJcELDwbPL8+3UyoRlaTAgfUwdT4QfHixhyoy3pzCWLEe6PbhCXdsMfI+bwQm9E
+30OnG0dbXj73IKGqWCHkzeUtw38uLT6/Q9PUISP6INpGGDOwgW0naC4uBbX+gIQ=
+=VuGZ
-----END PGP SIGNATURE-----
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
index bd1ebb3ae5..ff1b06726d 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
Binary files differ
diff --git a/systems/win32/miktex/tm/packages/files.csv.lzma b/systems/win32/miktex/tm/packages/files.csv.lzma
index 871f5481f0..d55c43210d 100644
--- a/systems/win32/miktex/tm/packages/files.csv.lzma
+++ b/systems/win32/miktex/tm/packages/files.csv.lzma
Binary files differ
diff --git a/systems/win32/miktex/tm/packages/next/files.csv.lzma b/systems/win32/miktex/tm/packages/next/files.csv.lzma
index bbaabdcf2f..5c473251f1 100644
--- a/systems/win32/miktex/tm/packages/next/files.csv.lzma
+++ b/systems/win32/miktex/tm/packages/next/files.csv.lzma
Binary files differ
diff --git a/systems/win32/miktex/tm/packages/next/pr.ini b/systems/win32/miktex/tm/packages/next/pr.ini
index 7724bed7eb..0db3634f35 100644
--- a/systems/win32/miktex/tm/packages/next/pr.ini
+++ b/systems/win32/miktex/tm/packages/next/pr.ini
@@ -1,13 +1,13 @@
[repository]
-date=1623269701
+date=1623356114
lastupd=miktex-arctrl-bin-2.9 miktex-arctrl-bin-x64-2.9 miktex-asymptote-bin-2.9 miktex-asymptote-bin-x64-2.9 miktex-autosp-bin-2.9 miktex-autosp-bin-x64-2.9 miktex-axohelp-bin-2.9 miktex-axohelp-bin-x64-2.9 miktex-bibarts-bin-2.9 miktex-bibarts-bin-x64-2.9 miktex-bibtex-bin-2.9 miktex-bibtex-bin-x64-2.9 miktex-bibtex8bit-bin-2.9 miktex-bibtex8bit-bin-x64-2.9 miktex-bzip2-bin-2.9 miktex-bzip2-bin-x64-2.9 miktex-cairo-bin-2.9 miktex-cairo-bin-x64-2.9 miktex-chktex-bin-2.9 miktex-chktex-bin-x64-2.9
-lstdigest=59cae72e056b7d3b994b058df584b99b
-numpkg=4274
+lstdigest=314a172ee39f7f5492b9a181b5fd6af1
+numpkg=4294
relstate=next
-version=7830
+version=7831
;;;;This configuration file is signed by a MiKTeX maintainer. The signature follows.
;;;;-----BEGIN MIKTEX SIGNATURE-----
-;;;; signature/miktex: EqVsCqq7bQiMVpfnk8faY103esPl/wRWbv+Ibw9/W7JUcMhI/fOy4fqzzNL3RLM5R8+D4LEWIkNUoIWSq2VbEzTUshJkSrz2sIh++9fXgxXC5YbQ4kdKwVKwnUKV1Asi5mm6Pt1MqguqtfgPdKVEzswg6Q+uAqcmvQ/5p9b0HrQCVfleq/4I44dJUIXm8ExMNYwRz1C9Dgf8cGCA8MLcirRWqhO7ISqtjGw4mtC6+sNOZW3p9bw//6eGUZm+UwcOcls2Bv3kCf5j62MGumx92J8mVHhCHBbeNxMV1t0dASOUarudwsiA5xh1HRKbsrf/gujol0W7Rj1X7URksUNKSw==
+;;;; signature/miktex: WGhZSqj25+g/DIK1LT4+dgdDD7UE9m+8pW4qxEHefILAjLP6tRZZbD4Sjf9HvA5Q2Hs652DqLfxDNjOcGJHglQzRU/Sk6fbbfw9e95fCuJ93zgZUo57rvLE1AXKp6xaSM1cELBGUvMflzqyj2o07+UeYUUJufIr84nAX0mLxaejO9z40kGnUI0R9p+MDZTzFKQfcRvpZKv2FHXaP7jgcY0A7BLdnhgCio0JIYq+HnkF5eTjdq1T8hW3sYgaKtUFmMfQUo4MV6Aw2+UUcBysmpvQz/3fkHMR2dDByHBSyr9UMwZLwrevjkqlz4v3b6ARteVCGndSaHFJDYHVm3i3oYQ==
;;;;-----END MIKTEX SIGNATURE-----
diff --git a/systems/win32/miktex/tm/packages/pr.ini b/systems/win32/miktex/tm/packages/pr.ini
index b33cb001c6..6ca7483861 100644
--- a/systems/win32/miktex/tm/packages/pr.ini
+++ b/systems/win32/miktex/tm/packages/pr.ini
@@ -1,13 +1,13 @@
[repository]
-date=1623269479
-lastupd=biblatex-ext biblatex-ext__doc biblatex-ext__source csvsimple csvsimple__doc easybook easybook__doc easybook__source keyfloat keyfloat__doc keyfloat__source latexmk latexmk__doc latexmk__source xintsession xintsession__doc bangla bangla__doc bangla__source bjfuthesis
-lstdigest=f57eb338a46912587f154b42711c77e7
-numpkg=4274
+date=1623355872
+lastupd=biblatex-mla biblatex-mla__doc biblatex-mla__source easybook easybook__doc easybook__source hvfloat hvfloat__doc jfmutil jfmutil__doc minim minim-hatching minim-hatching__doc minim-hatching__source minim-math minim-math__doc minim-math__source minim-mp minim-mp__doc minim-mp__source
+lstdigest=a892d1086cb3436314bcdcad7b1d2b75
+numpkg=4294
relstate=stable
-version=7830
+version=7831
;;;;This configuration file is signed by a MiKTeX maintainer. The signature follows.
;;;;-----BEGIN MIKTEX SIGNATURE-----
-;;;; signature/miktex: OqqTwxj2VBUz3fOQOKDHQqSVDH6wWx0reOiz/Xm/9/EACNuFMe0QN0t0ATvxHMohTciYnh8IDwkB/osk+cu7wfNjQ2pXzT2kefKT+/87z0onBqfyHc7QkE8ub7PqvUv3azrdTu3Y4NKDW7BWpBS5UZuWb0TXgHMRYtxVUlOYzRXOW+dC3qT7jvdeCBdM45VoBVf4a0uJyX6jTvTRGY+jD+k5M8pPWoxOZOAOaGFz/xfJQouWucMQI+d+0XjpwYlZNl9j06hCnW7q3rnt0c4TlgDP5a3Z+hg8hWMLeo6RKWvmWvnyGg2bid+HNKfAqbWU0KgOVNafSaDtr4mlIA6fhw==
+;;;; signature/miktex: MzwMA6dYj/buoQEK6eQONLxGQR+SZgAY2M/aJotDflYgodiIE/r2FAHuPEnQnXAiHIF8ozv0svauOtmYaB47IeIv8ca8DXkNMzcwgkODcSrmjhkyZMcL1gJTtadm2iyr8AcZqQ5TcGaYF5pgqCat7XFQhO+IRc1+slR6Pk6cVMT3w/R7kU6zeLNpc/ybpuO5JtS7HG2QuQeg71AsqRcj0Wi9/nv2OX//dvMM2kFcyS28PQqkGPDq7MhnEi9t+4bqMm9JI6rOZzbrxRrZoE+yZh8Syb+njF7wtuVBL39S1GGO08XIYHeXCn4pudChlH31kNo02cu7pLAZaG8LlmJixg==
;;;;-----END MIKTEX SIGNATURE-----
diff --git a/systems/win32/w32tex/ChangeLog b/systems/win32/w32tex/ChangeLog
index c55bb00d58..c0a151e225 100644
--- a/systems/win32/w32tex/ChangeLog
+++ b/systems/win32/w32tex/ChangeLog
@@ -1,5 +1,13 @@
W32TeX (x86 & x64) ChangeLog
+[2021/06/10]
+(01) biblatex-biber.tar.xz
+ Update biblatex-mla.
+(02) ltxpkgs.tar.xz
+ Update hvfloat and siunitx.
+(03) web2c-w32.tar.xz
+ Update jfmutil.
+
[2021/06/09]
(01) biblatex-biber.tar.xz
Update biblatex-ext.
diff --git a/timestamp b/timestamp
index a185bc1ea1..04cdd88c11 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:
-2021-06-10-02-02
+2021-06-11-02-02