summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2020-07-07 03:01:19 +0000
committerNorbert Preining <norbert@preining.info>2020-07-07 03:01:19 +0000
commitef87f13c4503a2aa4a9098cbf33e0bfcad19008e (patch)
tree3ffb99adbe8054f2bd6d04f982ea2a8e07a6bb62
parent2caa59ac79d64858cdff8486b3fecc9859111e38 (diff)
CTAN sync 202007070301
-rw-r--r--FILES.byname596
-rw-r--r--FILES.byname.gzbin2227709 -> 2227448 bytes
-rw-r--r--FILES.last07days558
-rw-r--r--graphics/pgf/contrib/circuitikz/README.md8
-rw-r--r--graphics/pgf/contrib/circuitikz/doc/changelog.tex34
-rw-r--r--graphics/pgf/contrib/circuitikz/doc/circuitikz-context.pdfbin17750 -> 17352 bytes
-rw-r--r--graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.pdfbin1003704 -> 1017702 bytes
-rw-r--r--graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.tex624
-rw-r--r--graphics/pgf/contrib/circuitikz/doc/ctikzmanutils.sty7
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/circuitikz.sty4
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/pgfcirc.defines.tex905
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/pgfcirccurrent.tex49
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/pgfcircflow.tex73
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/pgfcircpath.tex138
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/pgfcircvoltage.tex216
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/t-circuitikz.tex4
-rw-r--r--info/biblio/typeset.bib98
-rw-r--r--info/biblio/typeset.ltx12
-rw-r--r--macros/latex/contrib/semantex/README.md5
-rw-r--r--macros/latex/contrib/semantex/semantex.pdfbin221498 -> 234442 bytes
-rw-r--r--macros/latex/contrib/semantex/semantex.sty5107
-rw-r--r--macros/latex/contrib/semantex/semantex.tex1800
-rw-r--r--support/de-macro/README3
-rwxr-xr-x[-rw-r--r--]support/de-macro/de-macro1841
-rw-r--r--support/de-macro/user-guide.pdfbin50828 -> 54275 bytes
-rw-r--r--support/de-macro/user-guide.tex4
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb65
-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.xzbin2203540 -> 2200264 bytes
-rw-r--r--systems/win32/miktex/tm/packages/next/pr.ini8
-rw-r--r--systems/win32/miktex/tm/packages/pr.ini8
-rw-r--r--systems/win32/w32tex/ChangeLog10
-rw-r--r--timestamp2
35 files changed, 7564 insertions, 4633 deletions
diff --git a/FILES.byname b/FILES.byname
index 512ae9db67..e85568da62 100644
--- a/FILES.byname
+++ b/FILES.byname
@@ -1841,7 +1841,7 @@
1989/12/11 | 6196 | biblio/tib/tib.man
1989/03/29 | 23265 | biblio/tib/vitaMake
2005/12/15 | 366385 | biblio/tib.zip
-2020/07/05 | 16023 | CTAN.sites
+2020/07/06 | 15503 | CTAN.sites
1990/10/03 | 5032 | dviware/beebe/00readme.txt
1990/10/03 | 479 | dviware/beebe/doc/00dir.cmd
1990/10/03 | 1209 | dviware/beebe/doc/00dir.lst
@@ -5003,7 +5003,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
-2020/07/05 | 248133 | FILES.last07days
+2020/07/06 | 191100 | FILES.last07days
2018/06/27 | 99883 | fonts/academicons/academicons.pdf
2018/06/27 | 10779 | fonts/academicons/academicons.sty
2018/06/27 | 5774 | fonts/academicons/academicons.tex
@@ -135049,46 +135049,46 @@
2019/04/14 | 24014 | graphics/pgf/contrib/chordbox/chordbox.tex
2019/04/14 | 1125 | graphics/pgf/contrib/chordbox/README.md
2019/04/15 | 567774 | graphics/pgf/contrib/chordbox.zip
-2020/06/21 | 25204 | graphics/pgf/contrib/circuitikz/doc/changelog.tex
-2020/06/21 | 17750 | graphics/pgf/contrib/circuitikz/doc/circuitikz-context.pdf
-2020/06/21 | 938 | graphics/pgf/contrib/circuitikz/doc/circuitikz-context.tex
-2020/06/21 | 1003704 | graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.pdf
-2020/06/21 | 336814 | graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.tex
-2020/06/21 | 418 | graphics/pgf/contrib/circuitikz/doc/compatibility.tex
-2020/06/21 | 5862 | graphics/pgf/contrib/circuitikz/doc/ctikzmanutils.sty
-2020/06/21 | 3156 | graphics/pgf/contrib/circuitikz/README.md
-2020/06/21 | 364086 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.4.sty
-2020/06/21 | 393856 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.6.sty
-2020/06/21 | 403539 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.7.sty
-2020/06/21 | 422268 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.8.3.sty
-2020/06/21 | 690730 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.3.sty
-2020/06/21 | 758990 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.6.sty
-2020/06/21 | 841461 | graphics/pgf/contrib/circuitikz/tex/circuitikz-1.0.sty
-2020/06/21 | 937253 | graphics/pgf/contrib/circuitikz/tex/circuitikz-1.1.2.sty
-2020/06/21 | 11132 | graphics/pgf/contrib/circuitikz/tex/circuitikz.sty
-2020/06/21 | 280 | graphics/pgf/contrib/circuitikz/tex/ctikzstyle-example.tex
-2020/06/21 | 3098 | graphics/pgf/contrib/circuitikz/tex/ctikzstyle-legacy.tex
-2020/06/21 | 1875 | graphics/pgf/contrib/circuitikz/tex/ctikzstyle-romano.tex
-2020/06/21 | 225681 | graphics/pgf/contrib/circuitikz/tex/pgfcircbipoles.tex
-2020/06/21 | 7749 | graphics/pgf/contrib/circuitikz/tex/pgfcirccurrent.tex
-2020/06/21 | 99533 | graphics/pgf/contrib/circuitikz/tex/pgfcirc.defines.tex
-2020/06/21 | 7477 | graphics/pgf/contrib/circuitikz/tex/pgfcircflow.tex
-2020/06/21 | 14053 | graphics/pgf/contrib/circuitikz/tex/pgfcirclabel.tex
-2020/06/21 | 46195 | graphics/pgf/contrib/circuitikz/tex/pgfcircmonopoles.tex
-2020/06/21 | 140188 | graphics/pgf/contrib/circuitikz/tex/pgfcircmultipoles.tex
-2020/06/21 | 62847 | graphics/pgf/contrib/circuitikz/tex/pgfcircpath.tex
-2020/06/21 | 38750 | graphics/pgf/contrib/circuitikz/tex/pgfcircquadpoles.tex
-2020/06/21 | 30827 | graphics/pgf/contrib/circuitikz/tex/pgfcircshapes.tex
-2020/06/21 | 240141 | graphics/pgf/contrib/circuitikz/tex/pgfcirctripoles.tex
-2020/06/21 | 2678 | graphics/pgf/contrib/circuitikz/tex/pgfcircutils.tex
-2020/06/21 | 27663 | graphics/pgf/contrib/circuitikz/tex/pgfcircvoltage.tex
-2020/06/21 | 416850 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz-0.8.3.tex
-2020/06/21 | 683433 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz-0.9.3.tex
-2020/06/21 | 751663 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz-0.9.6.tex
-2020/06/21 | 834142 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.0.tex
-2020/06/21 | 929934 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.1.2.tex
-2020/06/21 | 3590 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz.tex
-2020/06/21 | 2062036 | graphics/pgf/contrib/circuitikz.zip
+2020/07/06 | 26187 | graphics/pgf/contrib/circuitikz/doc/changelog.tex
+2020/07/06 | 17352 | graphics/pgf/contrib/circuitikz/doc/circuitikz-context.pdf
+2020/07/06 | 938 | graphics/pgf/contrib/circuitikz/doc/circuitikz-context.tex
+2020/07/06 | 1017702 | graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.pdf
+2020/07/06 | 351216 | graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.tex
+2020/07/06 | 418 | graphics/pgf/contrib/circuitikz/doc/compatibility.tex
+2020/07/06 | 6106 | graphics/pgf/contrib/circuitikz/doc/ctikzmanutils.sty
+2020/07/06 | 3277 | graphics/pgf/contrib/circuitikz/README.md
+2020/07/06 | 364086 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.4.sty
+2020/07/06 | 393856 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.6.sty
+2020/07/06 | 403539 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.7.sty
+2020/07/06 | 422268 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.8.3.sty
+2020/07/06 | 690730 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.3.sty
+2020/07/06 | 758990 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.6.sty
+2020/07/06 | 841461 | graphics/pgf/contrib/circuitikz/tex/circuitikz-1.0.sty
+2020/07/06 | 937253 | graphics/pgf/contrib/circuitikz/tex/circuitikz-1.1.2.sty
+2020/07/06 | 11132 | graphics/pgf/contrib/circuitikz/tex/circuitikz.sty
+2020/07/06 | 280 | graphics/pgf/contrib/circuitikz/tex/ctikzstyle-example.tex
+2020/07/06 | 3098 | graphics/pgf/contrib/circuitikz/tex/ctikzstyle-legacy.tex
+2020/07/06 | 1875 | graphics/pgf/contrib/circuitikz/tex/ctikzstyle-romano.tex
+2020/07/06 | 225681 | graphics/pgf/contrib/circuitikz/tex/pgfcircbipoles.tex
+2020/07/06 | 8738 | graphics/pgf/contrib/circuitikz/tex/pgfcirccurrent.tex
+2020/07/06 | 101349 | graphics/pgf/contrib/circuitikz/tex/pgfcirc.defines.tex
+2020/07/06 | 9091 | graphics/pgf/contrib/circuitikz/tex/pgfcircflow.tex
+2020/07/06 | 14053 | graphics/pgf/contrib/circuitikz/tex/pgfcirclabel.tex
+2020/07/06 | 46195 | graphics/pgf/contrib/circuitikz/tex/pgfcircmonopoles.tex
+2020/07/06 | 140188 | graphics/pgf/contrib/circuitikz/tex/pgfcircmultipoles.tex
+2020/07/06 | 61988 | graphics/pgf/contrib/circuitikz/tex/pgfcircpath.tex
+2020/07/06 | 38750 | graphics/pgf/contrib/circuitikz/tex/pgfcircquadpoles.tex
+2020/07/06 | 30827 | graphics/pgf/contrib/circuitikz/tex/pgfcircshapes.tex
+2020/07/06 | 240141 | graphics/pgf/contrib/circuitikz/tex/pgfcirctripoles.tex
+2020/07/06 | 2678 | graphics/pgf/contrib/circuitikz/tex/pgfcircutils.tex
+2020/07/06 | 31707 | graphics/pgf/contrib/circuitikz/tex/pgfcircvoltage.tex
+2020/07/06 | 416850 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz-0.8.3.tex
+2020/07/06 | 683433 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz-0.9.3.tex
+2020/07/06 | 751663 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz-0.9.6.tex
+2020/07/06 | 834142 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.0.tex
+2020/07/06 | 929934 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.1.2.tex
+2020/07/06 | 3590 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz.tex
+2020/07/06 | 2081944 | graphics/pgf/contrib/circuitikz.zip
2019/07/12 | 14811 | graphics/pgf/contrib/codeanatomy/codeanatomy.dtx
2019/07/12 | 1475 | graphics/pgf/contrib/codeanatomy/codeanatomy.ins
2019/07/12 | 123921 | graphics/pgf/contrib/codeanatomy/codeanatomy.lstlisting.pdf
@@ -162976,7 +162976,7 @@
2020/01/08 | 13014086 | install/graphics/pgf/base/pgf.tds.zip
2013/02/23 | 92056 | install/graphics/pgf/contrib/battleship.tds.zip
2016/02/19 | 701759 | install/graphics/pgf/contrib/celtic.tds.zip
-2020/06/21 | 2075289 | install/graphics/pgf/contrib/circuitikz.tds.zip
+2020/07/06 | 2095479 | install/graphics/pgf/contrib/circuitikz.tds.zip
2020/06/12 | 573255 | install/graphics/pgf/contrib/commutative-diagrams.tds.zip
2017/06/01 | 1005947 | install/graphics/pgf/contrib/hobby.tds.zip
2014/06/15 | 843875 | install/graphics/pgf/contrib/logicpuzzle.tds.zip
@@ -201923,11 +201923,11 @@
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/05/30 | 1238 | macros/latex/contrib/semantex/README.md
-2020/05/30 | 221498 | macros/latex/contrib/semantex/semantex.pdf
-2020/05/30 | 91666 | macros/latex/contrib/semantex/semantex.sty
-2020/05/30 | 63890 | macros/latex/contrib/semantex/semantex.tex
-2020/05/30 | 248539 | macros/latex/contrib/semantex.zip
+2020/05/30 | 1233 | macros/latex/contrib/semantex/README.md
+2020/07/06 | 234442 | macros/latex/contrib/semantex/semantex.pdf
+2020/07/06 | 162096 | macros/latex/contrib/semantex/semantex.sty
+2020/07/06 | 75886 | macros/latex/contrib/semantex/semantex.tex
+2020/07/06 | 269216 | 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
@@ -243550,11 +243550,11 @@
2008/03/10 | 23456 | support/delig/DeLig.list
2008/03/12 | 2604 | support/delig/README
2008/03/13 | 96987 | support/delig.zip
-2007/02/06 | 34152 | support/de-macro/de-macro
-2007/02/05 | 3474 | support/de-macro/README
-2007/02/06 | 50828 | support/de-macro/user-guide.pdf
-2007/02/06 | 4040 | support/de-macro/user-guide.tex
-2007/02/06 | 59352 | support/de-macro.zip
+2020/07/06 | 28838 | support/de-macro/de-macro
+2020/07/06 | 3648 | support/de-macro/README
+2020/07/06 | 54275 | support/de-macro/user-guide.pdf
+2020/07/06 | 4222 | support/de-macro/user-guide.tex
+2020/07/06 | 65690 | support/de-macro.zip
2006/01/11 | 26 | support/dinbrief-gui/dinbrief.bat
2006/01/30 | 968630 | support/dinbrief-gui/dinbrief.exe
2006/01/30 | 24782 | support/dinbrief-gui/dinbrief.kit
@@ -251804,10 +251804,10 @@
2018/01/26 | 4655 | support/wp2latex/html2latex.htm
2007/07/22 | 600 | support/wp2latex/readme.1st
2018/06/13 | 7401 | support/wp2latex/readme.txt
-2016/04/10 | 5631378 | support/wp2latex/wp2latex-3.72b.zip
+2016/04/23 | 5636295 | support/wp2latex/wp2latex-3.73.zip
2018/01/26 | 45297 | support/wp2latex/wp2latex.doc.htm
2018/01/26 | 7259 | support/wp2latex/wp2latex.faq
-2016/02/07 | 881359 | support/wp2latex/WP2LaTeX_Installer-3.72.exe
+2016/05/08 | 886614 | support/wp2latex/WP2LaTeX_Installer-3.73.exe
2018/01/26 | 1241 | support/wp2latex/wp2latex.lsm
2018/01/26 | 35145 | support/wp2latex/wp2latex_pas-2.3.zip
2000/02/22 | 481 | support/wsuipa2tipa/README
@@ -255593,9 +255593,9 @@
2019/02/28 | 2726328 | systems/texlive/tlnet/archive/carlito.r35002.tar.xz
2019/02/28 | 520 | systems/texlive/tlnet/archive/carolmin-ps.doc.r15878.tar.xz
2019/02/28 | 105236 | systems/texlive/tlnet/archive/carolmin-ps.r15878.tar.xz
-2019/02/28 | 71224 | systems/texlive/tlnet/archive/cascade.doc.r48200.tar.xz
-2019/02/28 | 1840 | systems/texlive/tlnet/archive/cascade.r48200.tar.xz
-2019/02/28 | 5028 | systems/texlive/tlnet/archive/cascade.source.r48200.tar.xz
+2020/07/06 | 168008 | systems/texlive/tlnet/archive/cascade.doc.r55759.tar.xz
+2020/07/06 | 2280 | systems/texlive/tlnet/archive/cascade.r55759.tar.xz
+2020/07/06 | 6340 | systems/texlive/tlnet/archive/cascade.source.r55759.tar.xz
2019/02/28 | 88068 | systems/texlive/tlnet/archive/cascadilla.doc.r25144.tar.xz
2019/02/28 | 9668 | systems/texlive/tlnet/archive/cascadilla.r25144.tar.xz
2020/04/12 | 338912 | systems/texlive/tlnet/archive/cases.doc.r54682.tar.xz
@@ -256634,7 +256634,7 @@
2020/03/02 | 132068 | systems/texlive/tlnet/archive/cweb.amd64-freebsd.r53999.tar.xz
2020/03/02 | 109228 | systems/texlive/tlnet/archive/cweb.amd64-netbsd.r53995.tar.xz
2020/03/04 | 86904 | systems/texlive/tlnet/archive/cweb.armhf-linux.r54033.tar.xz
-2020/06/22 | 428876 | systems/texlive/tlnet/archive/cweb.doc.r55616.tar.xz
+2020/07/06 | 428876 | systems/texlive/tlnet/archive/cweb.doc.r55757.tar.xz
2020/06/02 | 64164 | systems/texlive/tlnet/archive/cweb.i386-cygwin.r55384.tar.xz
2020/03/02 | 100396 | systems/texlive/tlnet/archive/cweb.i386-freebsd.r53999.tar.xz
2020/03/02 | 110428 | systems/texlive/tlnet/archive/cweb.i386-linux.r53999.tar.xz
@@ -256643,7 +256643,7 @@
2019/02/28 | 240884 | systems/texlive/tlnet/archive/cweb-latex.doc.r28878.tar.xz
2019/02/28 | 36236 | systems/texlive/tlnet/archive/cweb-latex.r28878.tar.xz
2019/02/28 | 9720 | systems/texlive/tlnet/archive/cweb-old.r49271.tar.xz
-2020/06/22 | 23616 | systems/texlive/tlnet/archive/cweb.r55616.tar.xz
+2020/07/06 | 23636 | systems/texlive/tlnet/archive/cweb.r55757.tar.xz
2020/03/02 | 71020 | systems/texlive/tlnet/archive/cweb.win32.r53994.tar.xz
2020/06/02 | 73320 | systems/texlive/tlnet/archive/cweb.x86_64-cygwin.r55384.tar.xz
2020/03/02 | 103824 | systems/texlive/tlnet/archive/cweb.x86_64-darwinlegacy.r53999.tar.xz
@@ -257665,14 +257665,14 @@
2019/02/28 | 324 | systems/texlive/tlnet/archive/eplain.amd64-freebsd.r16472.tar.xz
2019/02/28 | 320 | systems/texlive/tlnet/archive/eplain.amd64-netbsd.r30191.tar.xz
2019/02/28 | 320 | systems/texlive/tlnet/archive/eplain.armhf-linux.r30015.tar.xz
-2020/03/24 | 982524 | systems/texlive/tlnet/archive/eplain.doc.r54498.tar.xz
+2020/07/06 | 982708 | systems/texlive/tlnet/archive/eplain.doc.r55758.tar.xz
2019/02/28 | 324 | systems/texlive/tlnet/archive/eplain.i386-cygwin.r13930.tar.xz
2019/02/28 | 324 | systems/texlive/tlnet/archive/eplain.i386-freebsd.r16472.tar.xz
2019/02/28 | 320 | systems/texlive/tlnet/archive/eplain.i386-linux.r3006.tar.xz
2019/02/28 | 320 | systems/texlive/tlnet/archive/eplain.i386-netbsd.r30191.tar.xz
2019/02/28 | 320 | systems/texlive/tlnet/archive/eplain.i386-solaris.r8102.tar.xz
-2020/03/24 | 42168 | systems/texlive/tlnet/archive/eplain.r54498.tar.xz
-2020/03/24 | 396220 | systems/texlive/tlnet/archive/eplain.source.r54498.tar.xz
+2020/07/06 | 42240 | systems/texlive/tlnet/archive/eplain.r55758.tar.xz
+2020/07/06 | 396576 | systems/texlive/tlnet/archive/eplain.source.r55758.tar.xz
2019/02/28 | 872 | systems/texlive/tlnet/archive/eplain.win32.r36810.tar.xz
2019/02/28 | 328 | systems/texlive/tlnet/archive/eplain.x86_64-cygwin.r33557.tar.xz
2019/02/28 | 332 | systems/texlive/tlnet/archive/eplain.x86_64-darwinlegacy.r43871.tar.xz
@@ -264659,8 +264659,8 @@
2020/03/24 | 280 | systems/texlive/tlnet/archive/texlive-cz.r54496.tar.xz
2020/03/29 | 1338300 | systems/texlive/tlnet/archive/texlive-de.doc.r54604.tar.xz
2020/03/29 | 272 | systems/texlive/tlnet/archive/texlive-de.r54604.tar.xz
-2020/07/05 | 167176 | systems/texlive/tlnet/archive/texlive-docindex.doc.r55745.tar.xz
-2020/07/05 | 388 | systems/texlive/tlnet/archive/texlive-docindex.r55745.tar.xz
+2020/07/06 | 167256 | systems/texlive/tlnet/archive/texlive-docindex.doc.r55754.tar.xz
+2020/07/06 | 388 | systems/texlive/tlnet/archive/texlive-docindex.r55754.tar.xz
2020/04/16 | 1891392 | systems/texlive/tlnet/archive/texlive-en.doc.r54755.tar.xz
2020/04/16 | 272 | systems/texlive/tlnet/archive/texlive-en.r54755.tar.xz
2020/03/22 | 3090144 | systems/texlive/tlnet/archive/texlive-es.doc.r54465.tar.xz
@@ -264689,7 +264689,7 @@
2020/03/25 | 276 | systems/texlive/tlnet/archive/texlive-it.r54534.tar.xz
2020/03/16 | 1522924 | systems/texlive/tlnet/archive/texlive-ja.doc.r54334.tar.xz
2020/03/16 | 276 | systems/texlive/tlnet/archive/texlive-ja.r54334.tar.xz
-2020/06/15 | 141284 | systems/texlive/tlnet/archive/texlive-msg-translations.r55543.tar.xz
+2020/07/06 | 141248 | systems/texlive/tlnet/archive/texlive-msg-translations.r55755.tar.xz
2019/02/28 | 344 | systems/texlive/tlnet/archive/texliveonfly.aarch64-linux.r46208.tar.xz
2019/02/28 | 344 | systems/texlive/tlnet/archive/texliveonfly.amd64-freebsd.r24062.tar.xz
2019/02/28 | 344 | systems/texlive/tlnet/archive/texliveonfly.amd64-netbsd.r30191.tar.xz
@@ -264716,7 +264716,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
-2020/07/05 | 218656 | systems/texlive/tlnet/archive/texlive-scripts.doc.r55748.tar.xz
+2020/07/06 | 218656 | systems/texlive/tlnet/archive/texlive-scripts.doc.r55754.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
@@ -264740,7 +264740,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
-2020/07/05 | 131892 | systems/texlive/tlnet/archive/texlive-scripts.r55748.tar.xz
+2020/07/06 | 131676 | systems/texlive/tlnet/archive/texlive-scripts.r55754.tar.xz
2020/05/31 | 36284 | systems/texlive/tlnet/archive/texlive-scripts.win32.r55357.tar.xz
2020/05/17 | 588 | systems/texlive/tlnet/archive/texlive-scripts.x86_64-cygwin.r55172.tar.xz
2020/05/12 | 592 | systems/texlive/tlnet/archive/texlive-scripts.x86_64-darwinlegacy.r55117.tar.xz
@@ -266378,16 +266378,16 @@
2020/01/24 | 138180 | systems/texlive/tlnet/archive/zxjatype.doc.r53500.tar.xz
2020/01/24 | 8760 | systems/texlive/tlnet/archive/zxjatype.r53500.tar.xz
2020/06/13 | 105829 | systems/texlive/tlnet/install-tl
-2020/07/05 | 5500523 | systems/texlive/tlnet/install-tl-unx.tar.gz
-2020/07/05 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
-2020/07/05 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2020/07/06 | 5500855 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2020/07/06 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2020/07/06 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
2020/05/31 | 4770 | systems/texlive/tlnet/install-tl-windows.bat
-2020/07/05 | 19382766 | systems/texlive/tlnet/install-tl-windows.exe
-2020/07/05 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
-2020/07/05 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2020/07/05 | 24269133 | systems/texlive/tlnet/install-tl.zip
-2020/07/05 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
-2020/07/05 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2020/07/06 | 19380217 | systems/texlive/tlnet/install-tl-windows.exe
+2020/07/06 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2020/07/06 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2020/07/06 | 24268914 | systems/texlive/tlnet/install-tl.zip
+2020/07/06 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2020/07/06 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
2020/03/05 | 1215 | systems/texlive/tlnet/README.md
2020/04/06 | 5961 | systems/texlive/tlnet/tlpkg/gpg/pubring.gpg
2016/04/12 | 600 | systems/texlive/tlnet/tlpkg/gpg/random_seed
@@ -266396,7 +266396,7 @@
2020/04/06 | 1280 | systems/texlive/tlnet/tlpkg/gpg/trustdb.gpg
2020/06/17 | 48858 | systems/texlive/tlnet/tlpkg/installer/config.guess
2010/11/11 | 11651 | systems/texlive/tlnet/tlpkg/installer/COPYING.MinGW-runtime.txt
-2020/07/03 | 5928 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+2020/07/05 | 4923 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2020/04/15 | 223687 | systems/texlive/tlnet/tlpkg/installer/curl/curl-ca-bundle.crt
2020/04/15 | 2606592 | systems/texlive/tlnet/tlpkg/installer/curl/curl.exe
2018/04/29 | 13647 | systems/texlive/tlnet/tlpkg/installer/DirSelect.pm
@@ -266443,12 +266443,12 @@
2020/05/17 | 20322 | systems/texlive/tlnet/tlpkg/TeXLive/TLCrypto.pm
2020/05/03 | 4786 | systems/texlive/tlnet/tlpkg/TeXLive/TLDownload.pm
2017/11/14 | 27560 | systems/texlive/tlnet/tlpkg/TeXLive/TLPaper.pm
-2020/07/05 | 16307883 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
-2020/07/05 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2020/07/06 | 16308142 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2020/07/06 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
2020/05/13 | 86417 | systems/texlive/tlnet/tlpkg/TeXLive/TLPDB.pm
-2020/07/05 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
-2020/07/05 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2020/07/05 | 2202996 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2020/07/06 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2020/07/06 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2020/07/06 | 2203540 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
2020/04/15 | 58761 | systems/texlive/tlnet/tlpkg/TeXLive/TLPOBJ.pm
2020/03/20 | 41736 | systems/texlive/tlnet/tlpkg/TeXLive/TLPSRC.pm
2020/05/11 | 15010 | systems/texlive/tlnet/tlpkg/TeXLive/TLTREE.pm
@@ -269092,26 +269092,26 @@
2020/03/17 | 3466 | systems/texlive/tlnet/tlpkg/tltcl/lib/tkConfig.sh
2018/11/30 | 1310 | systems/texlive/tlnet/tlpkg/tltcl/tlmgr.gif
2020/05/31 | 22132 | systems/texlive/tlnet/tlpkg/tltcl/tltcl.tcl
-2020/06/14 | 87013 | systems/texlive/tlnet/tlpkg/translations/cs.po
-2020/06/14 | 95538 | systems/texlive/tlnet/tlpkg/translations/de.po
-2020/06/14 | 86051 | systems/texlive/tlnet/tlpkg/translations/es.po
-2020/06/14 | 99848 | systems/texlive/tlnet/tlpkg/translations/fr.po
-2020/06/14 | 93138 | systems/texlive/tlnet/tlpkg/translations/it.po
-2020/06/14 | 77700 | systems/texlive/tlnet/tlpkg/translations/ja.po
-2020/06/14 | 58600 | systems/texlive/tlnet/tlpkg/translations/messages.pot
-2020/06/14 | 74766 | systems/texlive/tlnet/tlpkg/translations/nl.po
-2020/06/14 | 72938 | systems/texlive/tlnet/tlpkg/translations/pl.po
-2020/06/14 | 88422 | systems/texlive/tlnet/tlpkg/translations/pt_BR.po
+2020/07/05 | 87013 | systems/texlive/tlnet/tlpkg/translations/cs.po
+2020/07/05 | 95538 | systems/texlive/tlnet/tlpkg/translations/de.po
+2020/07/05 | 86051 | systems/texlive/tlnet/tlpkg/translations/es.po
+2020/07/05 | 99848 | systems/texlive/tlnet/tlpkg/translations/fr.po
+2020/07/05 | 93138 | systems/texlive/tlnet/tlpkg/translations/it.po
+2020/07/05 | 77700 | systems/texlive/tlnet/tlpkg/translations/ja.po
+2020/07/05 | 58600 | systems/texlive/tlnet/tlpkg/translations/messages.pot
+2020/07/05 | 74766 | systems/texlive/tlnet/tlpkg/translations/nl.po
+2020/07/05 | 72938 | systems/texlive/tlnet/tlpkg/translations/pl.po
+2020/07/05 | 88422 | systems/texlive/tlnet/tlpkg/translations/pt_BR.po
2019/03/25 | 430 | systems/texlive/tlnet/tlpkg/translations/README
-2020/06/14 | 112575 | systems/texlive/tlnet/tlpkg/translations/ru.po
-2020/06/14 | 94215 | systems/texlive/tlnet/tlpkg/translations/sk.po
-2020/06/14 | 75344 | systems/texlive/tlnet/tlpkg/translations/sl.po
-2020/06/14 | 109963 | systems/texlive/tlnet/tlpkg/translations/sr.po
+2020/07/05 | 112575 | systems/texlive/tlnet/tlpkg/translations/ru.po
+2020/07/05 | 94215 | systems/texlive/tlnet/tlpkg/translations/sk.po
+2020/07/05 | 75344 | systems/texlive/tlnet/tlpkg/translations/sl.po
+2020/07/05 | 109963 | systems/texlive/tlnet/tlpkg/translations/sr.po
2019/03/28 | 847 | systems/texlive/tlnet/tlpkg/translations/translators
-2020/06/14 | 87080 | systems/texlive/tlnet/tlpkg/translations/uk.po
-2020/06/14 | 96266 | systems/texlive/tlnet/tlpkg/translations/vi.po
-2020/06/14 | 72716 | systems/texlive/tlnet/tlpkg/translations/zh_CN.po
-2020/06/14 | 63275 | systems/texlive/tlnet/tlpkg/translations/zh_TW.po
+2020/07/05 | 87080 | systems/texlive/tlnet/tlpkg/translations/uk.po
+2020/07/05 | 96266 | systems/texlive/tlnet/tlpkg/translations/vi.po
+2020/07/05 | 72716 | systems/texlive/tlnet/tlpkg/translations/zh_CN.po
+2020/07/05 | 63275 | systems/texlive/tlnet/tlpkg/translations/zh_TW.po
2020/06/03 | 3995026 | systems/texlive/tlnet/update-tlmgr-r55382.exe
2020/06/03 | 154 | systems/texlive/tlnet/update-tlmgr-r55382.exe.sha512
2020/06/03 | 455 | systems/texlive/tlnet/update-tlmgr-r55382.exe.sha512.asc
@@ -270923,7 +270923,7 @@
2020/02/04 | 281488 | 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
-2020/07/05 | 539894 | systems/win32/miktex/tm/packages/files.csv.lzma
+2020/07/06 | 539894 | 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
@@ -272082,9 +272082,9 @@
2018/01/12 | 157226 | systems/win32/miktex/tm/packages/miktex-zip-bin-x64.tar.lzma
2020/06/30 | 39315 | systems/win32/miktex/tm/packages/miktex-zlib-bin-2.9.tar.lzma
2020/06/30 | 43053 | systems/win32/miktex/tm/packages/miktex-zlib-bin-x64-2.9.tar.lzma
-2020/07/05 | 201485 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
-2020/07/05 | 1205768 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
-2020/07/05 | 1124467 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
+2020/07/06 | 201504 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
+2020/07/06 | 1204712 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
+2020/07/06 | 1124836 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
2020/06/30 | 13117 | systems/win32/miktex/tm/packages/miktex-zzip-bin-2.9.tar.lzma
2020/06/30 | 14123 | 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
@@ -272238,192 +272238,192 @@
2018/04/09 | 400132 | systems/win32/miktex/tm/packages/newunicodechar.tar.lzma
2011/09/19 | 101312 | systems/win32/miktex/tm/packages/newvbtm.tar.lzma
2019/09/11 | 231430 | systems/win32/miktex/tm/packages/newverbs.tar.lzma
-2020/07/05 | 540973 | systems/win32/miktex/tm/packages/next/files.csv.lzma
-2020/07/05 | 59172 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
-2020/07/05 | 67327 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
-2020/07/05 | 957366 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
-2020/07/05 | 1060543 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
-2020/07/05 | 28617 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
-2020/07/05 | 30891 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
-2020/07/05 | 29320 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
-2020/07/05 | 34704 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
-2020/07/05 | 49696 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
-2020/07/05 | 57199 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
-2020/07/05 | 84388 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
-2020/07/05 | 93647 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
-2020/07/05 | 65602 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
-2020/07/05 | 73408 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
-2020/07/05 | 27037 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
-2020/07/05 | 30876 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
-2020/07/05 | 329721 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
-2020/07/05 | 392543 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
-2020/07/05 | 32134 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
-2020/07/05 | 36307 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
-2020/07/05 | 72071 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
-2020/07/05 | 79201 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
-2020/07/05 | 203502 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
-2020/07/05 | 223960 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
-2020/07/05 | 169762 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
-2020/07/05 | 184498 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
-2020/07/05 | 51920 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
-2020/07/05 | 58608 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
-2020/07/05 | 20770 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
-2020/07/05 | 22969 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
-2020/07/05 | 460274 | systems/win32/miktex/tm/packages/next/miktex-doc-2.9.tar.lzma
-2020/07/05 | 460366 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
-2020/07/05 | 45498 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
-2020/07/05 | 51044 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
-2020/07/05 | 273614 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
-2020/07/05 | 310933 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
-2020/07/05 | 40787 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
-2020/07/05 | 44983 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
-2020/07/05 | 115821 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
-2020/07/05 | 130330 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
-2020/07/05 | 1266025 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
-2020/07/05 | 1409381 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
-2020/07/05 | 95312 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
-2020/07/05 | 109774 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
-2020/07/05 | 43303 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
-2020/07/05 | 48048 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
-2020/07/05 | 46284 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
-2020/07/05 | 51240 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
-2020/07/05 | 57184 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
-2020/07/05 | 62928 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
-2020/07/05 | 133619 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
-2020/07/05 | 151909 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
-2020/07/05 | 73100 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
-2020/07/05 | 77567 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
-2020/07/05 | 68820 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
-2020/07/05 | 77428 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
-2020/07/05 | 246797 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
-2020/07/05 | 281691 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
-2020/07/05 | 25474 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
-2020/07/05 | 28976 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
-2020/07/05 | 100971 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
-2020/07/05 | 117131 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
-2020/07/05 | 63532 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
-2020/07/05 | 72600 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
-2020/07/05 | 94265 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
-2020/07/05 | 113698 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
-2020/07/05 | 58971 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
-2020/07/05 | 65575 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
-2020/07/05 | 462360 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
-2020/07/05 | 550400 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
-2020/07/05 | 141812 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
-2020/07/05 | 154454 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
-2020/07/05 | 94530 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
-2020/07/05 | 109016 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
-2020/07/05 | 15923 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
-2020/07/05 | 17622 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
-2020/07/05 | 27943 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
-2020/07/05 | 29633 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
-2020/07/05 | 623384 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
-2020/07/05 | 676983 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
-2020/07/05 | 500484 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
-2020/07/05 | 562946 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
-2020/07/05 | 544670 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
-2020/07/05 | 586876 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
-2020/07/05 | 93647 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
-2020/07/05 | 102563 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
-2020/07/05 | 1751872 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
-2020/07/05 | 2028475 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
-2020/07/05 | 67272 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
-2020/07/05 | 73667 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
-2020/07/05 | 26955 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
-2020/07/05 | 31223 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
-2020/07/05 | 7557 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
-2020/07/05 | 8581 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
-2020/07/05 | 171139 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
-2020/07/05 | 187110 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
-2020/07/05 | 269063 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
-2020/07/05 | 305168 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
-2020/07/05 | 96909 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
-2020/07/05 | 101910 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
-2020/07/05 | 79745 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
-2020/07/05 | 88780 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
-2020/07/05 | 170232 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
-2020/07/05 | 189216 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
-2020/07/05 | 159288 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
-2020/07/05 | 179905 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
-2020/07/05 | 196475 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
-2020/07/05 | 177269 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
-2020/07/05 | 84819 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
-2020/07/05 | 96516 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
-2020/07/05 | 31243 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
-2020/07/05 | 35046 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
-2020/07/05 | 57248 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
-2020/07/05 | 64200 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
-2020/07/05 | 63350 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
-2020/07/05 | 69875 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
-2020/07/05 | 45737 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
-2020/07/05 | 52206 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
-2020/07/05 | 193351 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
-2020/07/05 | 210650 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
-2020/07/05 | 35336 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-2.9.tar.lzma
-2020/07/05 | 35313 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
-2020/07/05 | 39508 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64-2.9.tar.lzma
-2020/07/05 | 39507 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
-2020/07/05 | 327003 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
-2020/07/05 | 360666 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
-2020/07/05 | 187768 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
-2020/07/05 | 194053 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
-2020/07/05 | 207505 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
-2020/07/05 | 243026 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
-2020/07/05 | 78144 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
-2020/07/05 | 87407 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
-2020/07/05 | 922565 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
-2020/07/05 | 1021925 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
-2020/07/05 | 20013 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
-2020/07/05 | 23596 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
-2020/07/05 | 31242 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
-2020/07/05 | 36860 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
-2020/07/05 | 63502 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
-2020/07/05 | 71534 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
-2020/07/05 | 42503 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
-2020/07/05 | 50904 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
-2020/07/05 | 1193673 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
-2020/07/05 | 1327713 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
-2020/07/05 | 42064 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
-2020/07/05 | 51416 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
-2020/07/05 | 76756 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-2.9.tar.lzma
-2020/07/05 | 76739 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
-2020/07/05 | 82832 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64-2.9.tar.lzma
-2020/07/05 | 82762 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
-2020/07/05 | 26875 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
-2020/07/05 | 29183 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
-2020/07/05 | 16017 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
-2020/07/05 | 17729 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
-2020/07/05 | 63495 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
-2020/07/05 | 69135 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
-2020/07/05 | 151031 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
-2020/07/05 | 164959 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
-2020/07/05 | 77603 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
-2020/07/05 | 88016 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
-2020/07/05 | 98014 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
-2020/07/05 | 104588 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
-2020/07/05 | 2534428 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
-2020/07/05 | 2659108 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
-2020/07/05 | 55579 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
-2020/07/05 | 61816 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
-2020/07/05 | 33137 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
-2020/07/05 | 36965 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
-2020/07/05 | 26630 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
-2020/07/05 | 32401 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
-2020/07/05 | 66119 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
-2020/07/05 | 70304 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
-2020/07/05 | 249729 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
-2020/07/05 | 279309 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
-2020/07/05 | 597672 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
-2020/07/05 | 638875 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
-2020/07/05 | 38946 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
-2020/07/05 | 43023 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
-2020/07/05 | 201631 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
-2020/07/05 | 1205512 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
-2020/07/05 | 1125012 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
-2020/07/05 | 13134 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
-2020/07/05 | 14115 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
+2020/07/06 | 540973 | systems/win32/miktex/tm/packages/next/files.csv.lzma
+2020/07/06 | 59173 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
+2020/07/06 | 67326 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
+2020/07/06 | 957364 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
+2020/07/06 | 1060544 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
+2020/07/06 | 28618 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
+2020/07/06 | 30892 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
+2020/07/06 | 29319 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
+2020/07/06 | 34704 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
+2020/07/06 | 49695 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
+2020/07/06 | 57197 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
+2020/07/06 | 84387 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
+2020/07/06 | 93648 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
+2020/07/06 | 65602 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
+2020/07/06 | 73407 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
+2020/07/06 | 27037 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
+2020/07/06 | 30875 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
+2020/07/06 | 329722 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
+2020/07/06 | 392543 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
+2020/07/06 | 32134 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
+2020/07/06 | 36307 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
+2020/07/06 | 72071 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
+2020/07/06 | 79199 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
+2020/07/06 | 203500 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
+2020/07/06 | 223962 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
+2020/07/06 | 169760 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
+2020/07/06 | 184497 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
+2020/07/06 | 51922 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
+2020/07/06 | 58608 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
+2020/07/06 | 20771 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
+2020/07/06 | 22969 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
+2020/07/06 | 460276 | systems/win32/miktex/tm/packages/next/miktex-doc-2.9.tar.lzma
+2020/07/06 | 460366 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
+2020/07/06 | 45498 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
+2020/07/06 | 51044 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
+2020/07/06 | 273610 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
+2020/07/06 | 310931 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
+2020/07/06 | 40787 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
+2020/07/06 | 44984 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
+2020/07/06 | 115819 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
+2020/07/06 | 130330 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
+2020/07/06 | 1266023 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
+2020/07/06 | 1409381 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
+2020/07/06 | 95313 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
+2020/07/06 | 109775 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
+2020/07/06 | 43305 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
+2020/07/06 | 48049 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
+2020/07/06 | 46284 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
+2020/07/06 | 51239 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
+2020/07/06 | 57184 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
+2020/07/06 | 62930 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
+2020/07/06 | 133618 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
+2020/07/06 | 151909 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
+2020/07/06 | 73102 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
+2020/07/06 | 77566 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
+2020/07/06 | 68820 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
+2020/07/06 | 77427 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
+2020/07/06 | 246796 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
+2020/07/06 | 281689 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
+2020/07/06 | 25474 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
+2020/07/06 | 28977 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
+2020/07/06 | 100970 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
+2020/07/06 | 117131 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
+2020/07/06 | 63529 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
+2020/07/06 | 72600 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
+2020/07/06 | 94262 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
+2020/07/06 | 113697 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
+2020/07/06 | 58973 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
+2020/07/06 | 65576 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
+2020/07/06 | 462359 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
+2020/07/06 | 550399 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
+2020/07/06 | 141816 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
+2020/07/06 | 154453 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
+2020/07/06 | 94531 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
+2020/07/06 | 109016 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
+2020/07/06 | 15923 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
+2020/07/06 | 17621 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
+2020/07/06 | 27943 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
+2020/07/06 | 29631 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
+2020/07/06 | 623384 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
+2020/07/06 | 676982 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
+2020/07/06 | 500484 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
+2020/07/06 | 562945 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
+2020/07/06 | 544668 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
+2020/07/06 | 586876 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
+2020/07/06 | 93645 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
+2020/07/06 | 102563 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
+2020/07/06 | 1751870 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
+2020/07/06 | 2028475 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
+2020/07/06 | 67271 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
+2020/07/06 | 73668 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
+2020/07/06 | 26955 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
+2020/07/06 | 31223 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
+2020/07/06 | 7557 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
+2020/07/06 | 8581 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
+2020/07/06 | 171138 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
+2020/07/06 | 187109 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
+2020/07/06 | 269063 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
+2020/07/06 | 305168 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
+2020/07/06 | 96909 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
+2020/07/06 | 101911 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
+2020/07/06 | 79744 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
+2020/07/06 | 88780 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
+2020/07/06 | 170232 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
+2020/07/06 | 189215 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
+2020/07/06 | 159287 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
+2020/07/06 | 179906 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
+2020/07/06 | 196477 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
+2020/07/06 | 177270 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
+2020/07/06 | 84819 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
+2020/07/06 | 96515 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
+2020/07/06 | 31242 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
+2020/07/06 | 35051 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
+2020/07/06 | 57249 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
+2020/07/06 | 64201 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
+2020/07/06 | 63351 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
+2020/07/06 | 69875 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
+2020/07/06 | 45737 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
+2020/07/06 | 52206 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
+2020/07/06 | 193352 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
+2020/07/06 | 210650 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
+2020/07/06 | 35336 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-2.9.tar.lzma
+2020/07/06 | 35313 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
+2020/07/06 | 39507 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64-2.9.tar.lzma
+2020/07/06 | 39508 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
+2020/07/06 | 327004 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
+2020/07/06 | 360665 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
+2020/07/06 | 187768 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
+2020/07/06 | 194054 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
+2020/07/06 | 207507 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
+2020/07/06 | 243027 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
+2020/07/06 | 78147 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
+2020/07/06 | 87407 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
+2020/07/06 | 922566 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
+2020/07/06 | 1021925 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
+2020/07/06 | 20012 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
+2020/07/06 | 23597 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
+2020/07/06 | 31242 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
+2020/07/06 | 36861 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
+2020/07/06 | 63502 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
+2020/07/06 | 71533 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
+2020/07/06 | 42502 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
+2020/07/06 | 50905 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
+2020/07/06 | 1193672 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
+2020/07/06 | 1327710 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
+2020/07/06 | 42064 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
+2020/07/06 | 51417 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
+2020/07/06 | 76757 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-2.9.tar.lzma
+2020/07/06 | 76738 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
+2020/07/06 | 82832 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64-2.9.tar.lzma
+2020/07/06 | 82762 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
+2020/07/06 | 26878 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
+2020/07/06 | 29182 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
+2020/07/06 | 16017 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
+2020/07/06 | 17729 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
+2020/07/06 | 63495 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
+2020/07/06 | 69136 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
+2020/07/06 | 151033 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
+2020/07/06 | 164960 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
+2020/07/06 | 77603 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
+2020/07/06 | 88015 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
+2020/07/06 | 98015 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
+2020/07/06 | 104589 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
+2020/07/06 | 2534428 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
+2020/07/06 | 2659107 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
+2020/07/06 | 55579 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
+2020/07/06 | 61818 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
+2020/07/06 | 33136 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
+2020/07/06 | 36964 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
+2020/07/06 | 26629 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
+2020/07/06 | 32401 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
+2020/07/06 | 66121 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
+2020/07/06 | 70303 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
+2020/07/06 | 249728 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
+2020/07/06 | 279308 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
+2020/07/06 | 597674 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
+2020/07/06 | 638874 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
+2020/07/06 | 38948 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
+2020/07/06 | 43024 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
+2020/07/06 | 201598 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
+2020/07/06 | 1204757 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
+2020/07/06 | 1124561 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
+2020/07/06 | 13135 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
+2020/07/06 | 14115 | 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
-2020/07/05 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini
+2020/07/06 | 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
@@ -272739,7 +272739,7 @@
2008/11/07 | 35981 | systems/win32/miktex/tm/packages/prettyref.tar.lzma
2017/07/26 | 201385 | systems/win32/miktex/tm/packages/preview.tar.lzma
2019/06/20 | 375963 | systems/win32/miktex/tm/packages/prftree.tar.lzma
-2020/07/05 | 857 | systems/win32/miktex/tm/packages/pr.ini
+2020/07/06 | 857 | 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
@@ -273885,7 +273885,7 @@
2020/06/18 | 4916176 | systems/win32/w32tex/aleph-w32.tar.xz
2020/06/28 | 66276404 | systems/win32/w32tex/biblatex-biber.tar.xz
2016/12/13 | 65971452 | systems/win32/w32tex/cbfonts.tar.xz
-2020/07/04 | 679209 | systems/win32/w32tex/ChangeLog
+2020/07/05 | 679589 | 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
@@ -273909,12 +273909,12 @@
2020/05/30 | 29268960 | systems/win32/w32tex/latex.tar.xz
2020/06/13 | 996116 | systems/win32/w32tex/lcdf-typetools-w32.tar.xz
2020/06/17 | 399352436 | systems/win32/w32tex/ltxpkgdocs.tar.xz
-2020/07/03 | 34926620 | systems/win32/w32tex/ltxpkgs.tar.xz
+2020/07/05 | 34937408 | systems/win32/w32tex/ltxpkgs.tar.xz
2020/07/01 | 3850916 | systems/win32/w32tex/luajittex-dev-w32.tar.xz
-2020/07/01 | 3839952 | systems/win32/w32tex/luajittex-exp-w32.tar.xz
+2020/07/05 | 3792812 | systems/win32/w32tex/luajittex-exp-w32.tar.xz
2020/07/01 | 3835476 | systems/win32/w32tex/luajittex-w32.tar.xz
2020/07/01 | 18144588 | systems/win32/w32tex/luatex-dev-w32.tar.xz
-2020/07/01 | 18165508 | systems/win32/w32tex/luatex-exp-w32.tar.xz
+2020/07/05 | 17919908 | systems/win32/w32tex/luatex-exp-w32.tar.xz
2020/06/13 | 69262820 | systems/win32/w32tex/luatexja.tar.xz
2020/07/01 | 17923720 | systems/win32/w32tex/luatex-w32.tar.xz
2020/06/13 | 1663176 | systems/win32/w32tex/makeindex-w32.tar.xz
@@ -273978,10 +273978,10 @@
2019/11/11 | 2568 | systems/win32/w32tex/win64/latex-dev-w64.tar.xz
2020/06/13 | 799528 | systems/win32/w32tex/win64/lcdf-typetools-w64.tar.xz
2020/07/01 | 3434248 | systems/win32/w32tex/win64/luajittex-dev-w64.tar.xz
-2020/07/01 | 3446840 | systems/win32/w32tex/win64/luajittex-exp-w64.tar.xz
+2020/07/05 | 3432564 | systems/win32/w32tex/win64/luajittex-exp-w64.tar.xz
2020/07/01 | 3429240 | systems/win32/w32tex/win64/luajittex-w64.tar.xz
2020/07/01 | 3099224 | systems/win32/w32tex/win64/luatex-dev-w64.tar.xz
-2020/07/01 | 3122876 | systems/win32/w32tex/win64/luatex-exp-w64.tar.xz
+2020/07/05 | 3117508 | systems/win32/w32tex/win64/luatex-exp-w64.tar.xz
2020/07/01 | 3096836 | systems/win32/w32tex/win64/luatex-w64.tar.xz
2020/06/13 | 1140856 | systems/win32/w32tex/win64/makeindex-w64.tar.xz
2020/06/13 | 431036 | systems/win32/w32tex/win64/mftools-w64.tar.xz
@@ -274101,7 +274101,7 @@
2004/06/04 | 404 | tds/tds.sed
2004/06/23 | 65418 | tds/tds.tex
2019/05/29 | 304264 | tds.zip
-2020/07/06 | 186 | timestamp
+2020/07/07 | 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 809c9e521a..5a56ab5432 100644
--- a/FILES.byname.gz
+++ b/FILES.byname.gz
Binary files differ
diff --git a/FILES.last07days b/FILES.last07days
index 5998c9d586..eacb4ab2f7 100644
--- a/FILES.last07days
+++ b/FILES.last07days
@@ -1,229 +1,313 @@
-2020/07/05 | 98014 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
-2020/07/05 | 96909 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
-2020/07/05 | 96516 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
-2020/07/05 | 957366 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
-2020/07/05 | 95312 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
+2020/07/06 | 982708 | systems/texlive/tlnet/archive/eplain.doc.r55758.tar.xz
+2020/07/06 | 98015 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
+2020/07/06 | 96909 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
+2020/07/06 | 96515 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
+2020/07/06 | 957364 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
+2020/07/06 | 95313 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
+2020/07/06 | 94531 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
+2020/07/06 | 94262 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
+2020/07/06 | 938 | graphics/pgf/contrib/circuitikz/doc/circuitikz-context.tex
+2020/07/06 | 937253 | graphics/pgf/contrib/circuitikz/tex/circuitikz-1.1.2.sty
+2020/07/06 | 93648 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
+2020/07/06 | 93645 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
+2020/07/06 | 929934 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.1.2.tex
+2020/07/06 | 922566 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
+2020/07/06 | 9091 | graphics/pgf/contrib/circuitikz/tex/pgfcircflow.tex
+2020/07/06 | 88780 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
+2020/07/06 | 88015 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
+2020/07/06 | 87407 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
+2020/07/06 | 8738 | graphics/pgf/contrib/circuitikz/tex/pgfcirccurrent.tex
+2020/07/06 | 8581 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
+2020/07/06 | 857 | systems/win32/miktex/tm/packages/pr.ini
+2020/07/06 | 84819 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
+2020/07/06 | 84387 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
+2020/07/06 | 841461 | graphics/pgf/contrib/circuitikz/tex/circuitikz-1.0.sty
+2020/07/06 | 834142 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.0.tex
+2020/07/06 | 82832 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64-2.9.tar.lzma
+2020/07/06 | 82762 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
+2020/07/06 | 79744 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
+2020/07/06 | 79199 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
+2020/07/06 | 78147 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
+2020/07/06 | 77603 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
+2020/07/06 | 77566 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
+2020/07/06 | 77427 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
+2020/07/06 | 76757 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-2.9.tar.lzma
+2020/07/06 | 76738 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
+2020/07/06 | 758990 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.6.sty
+2020/07/06 | 75886 | macros/latex/contrib/semantex/semantex.tex
+2020/07/06 | 7557 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
+2020/07/06 | 751663 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz-0.9.6.tex
+2020/07/06 | 73668 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
+2020/07/06 | 73407 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
+2020/07/06 | 73102 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
+2020/07/06 | 72600 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
+2020/07/06 | 72071 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
+2020/07/06 | 71533 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
+2020/07/06 | 70303 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
+2020/07/06 | 69875 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
+2020/07/06 | 69136 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
+2020/07/06 | 690730 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.3.sty
+2020/07/06 | 68820 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
+2020/07/06 | 683433 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz-0.9.3.tex
+2020/07/06 | 676982 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
+2020/07/06 | 67326 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
+2020/07/06 | 67271 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
+2020/07/06 | 66121 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
+2020/07/06 | 65690 | support/de-macro.zip
+2020/07/06 | 65602 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
+2020/07/06 | 65576 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
+2020/07/06 | 64201 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
+2020/07/06 | 638874 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
+2020/07/06 | 63529 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
+2020/07/06 | 63502 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
+2020/07/06 | 63495 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
+2020/07/06 | 6340 | systems/texlive/tlnet/archive/cascade.source.r55759.tar.xz
+2020/07/06 | 63351 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
+2020/07/06 | 62930 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
+2020/07/06 | 623384 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
+2020/07/06 | 61988 | graphics/pgf/contrib/circuitikz/tex/pgfcircpath.tex
+2020/07/06 | 61818 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
+2020/07/06 | 6106 | graphics/pgf/contrib/circuitikz/doc/ctikzmanutils.sty
+2020/07/06 | 597674 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
+2020/07/06 | 59173 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
+2020/07/06 | 58973 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
+2020/07/06 | 586876 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
+2020/07/06 | 58608 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
+2020/07/06 | 57249 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
+2020/07/06 | 57197 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
+2020/07/06 | 57184 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
+2020/07/06 | 562945 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
+2020/07/06 | 55579 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
+2020/07/06 | 550399 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
+2020/07/06 | 5500855 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2020/07/06 | 544668 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
+2020/07/06 | 54275 | support/de-macro/user-guide.pdf
+2020/07/06 | 540973 | systems/win32/miktex/tm/packages/next/files.csv.lzma
+2020/07/06 | 539894 | systems/win32/miktex/tm/packages/files.csv.lzma
+2020/07/06 | 52206 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
+2020/07/06 | 51922 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
+2020/07/06 | 51417 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
+2020/07/06 | 51239 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
+2020/07/06 | 51044 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
+2020/07/06 | 50905 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
+2020/07/06 | 500484 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
+2020/07/06 | 49695 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
+2020/07/06 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2020/07/06 | 48049 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
+2020/07/06 | 46284 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
+2020/07/06 | 462359 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
+2020/07/06 | 46195 | graphics/pgf/contrib/circuitikz/tex/pgfcircmonopoles.tex
+2020/07/06 | 460366 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
+2020/07/06 | 460276 | systems/win32/miktex/tm/packages/next/miktex-doc-2.9.tar.lzma
+2020/07/06 | 45737 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
+2020/07/06 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2020/07/06 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2020/07/06 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2020/07/06 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2020/07/06 | 45498 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
+2020/07/06 | 44984 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
+2020/07/06 | 43305 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
+2020/07/06 | 43024 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
+2020/07/06 | 428876 | systems/texlive/tlnet/archive/cweb.doc.r55757.tar.xz
+2020/07/06 | 42502 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
+2020/07/06 | 42240 | systems/texlive/tlnet/archive/eplain.r55758.tar.xz
+2020/07/06 | 4222 | support/de-macro/user-guide.tex
+2020/07/06 | 422268 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.8.3.sty
+2020/07/06 | 42064 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
+2020/07/06 | 418 | graphics/pgf/contrib/circuitikz/doc/compatibility.tex
+2020/07/06 | 416850 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz-0.8.3.tex
+2020/07/06 | 40787 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
+2020/07/06 | 403539 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.7.sty
+2020/07/06 | 396576 | systems/texlive/tlnet/archive/eplain.source.r55758.tar.xz
+2020/07/06 | 39508 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
+2020/07/06 | 39507 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64-2.9.tar.lzma
+2020/07/06 | 393856 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.6.sty
+2020/07/06 | 392543 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
+2020/07/06 | 38948 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
+2020/07/06 | 388 | systems/texlive/tlnet/archive/texlive-docindex.r55754.tar.xz
+2020/07/06 | 38750 | graphics/pgf/contrib/circuitikz/tex/pgfcircquadpoles.tex
+2020/07/06 | 36964 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
+2020/07/06 | 36861 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
+2020/07/06 | 3648 | support/de-macro/README
+2020/07/06 | 364086 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.4.sty
+2020/07/06 | 36307 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
+2020/07/06 | 360665 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
+2020/07/06 | 3590 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz.tex
+2020/07/06 | 35336 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-2.9.tar.lzma
+2020/07/06 | 35313 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
+2020/07/06 | 351216 | graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.tex
+2020/07/06 | 35051 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
+2020/07/06 | 34704 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
+2020/07/06 | 33136 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
+2020/07/06 | 329722 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
+2020/07/06 | 3277 | graphics/pgf/contrib/circuitikz/README.md
+2020/07/06 | 327004 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
+2020/07/06 | 32401 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
+2020/07/06 | 32134 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
+2020/07/06 | 31707 | graphics/pgf/contrib/circuitikz/tex/pgfcircvoltage.tex
+2020/07/06 | 31242 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
+2020/07/06 | 31242 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
+2020/07/06 | 31223 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
+2020/07/06 | 310931 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
+2020/07/06 | 3098 | graphics/pgf/contrib/circuitikz/tex/ctikzstyle-legacy.tex
+2020/07/06 | 30892 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
+2020/07/06 | 30875 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
+2020/07/06 | 30827 | graphics/pgf/contrib/circuitikz/tex/pgfcircshapes.tex
+2020/07/06 | 305168 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
+2020/07/06 | 29631 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
+2020/07/06 | 29319 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
+2020/07/06 | 29182 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
+2020/07/06 | 28977 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
+2020/07/06 | 28838 | support/de-macro/de-macro
+2020/07/06 | 28618 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
+2020/07/06 | 281689 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
+2020/07/06 | 280 | graphics/pgf/contrib/circuitikz/tex/ctikzstyle-example.tex
+2020/07/06 | 27943 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
+2020/07/06 | 279308 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
+2020/07/06 | 273610 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
+2020/07/06 | 27037 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
+2020/07/06 | 26955 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
+2020/07/06 | 269216 | macros/latex/contrib/semantex.zip
+2020/07/06 | 269063 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
+2020/07/06 | 26878 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
+2020/07/06 | 2678 | graphics/pgf/contrib/circuitikz/tex/pgfcircutils.tex
+2020/07/06 | 26629 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
+2020/07/06 | 2659107 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
+2020/07/06 | 26187 | graphics/pgf/contrib/circuitikz/doc/changelog.tex
+2020/07/06 | 25474 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
+2020/07/06 | 2534428 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
+2020/07/06 | 249728 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
+2020/07/06 | 246796 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
+2020/07/06 | 243027 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
+2020/07/06 | 24268914 | systems/texlive/tlnet/install-tl.zip
+2020/07/06 | 240141 | graphics/pgf/contrib/circuitikz/tex/pgfcirctripoles.tex
+2020/07/06 | 23636 | systems/texlive/tlnet/archive/cweb.r55757.tar.xz
+2020/07/06 | 23597 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
+2020/07/06 | 234442 | macros/latex/contrib/semantex/semantex.pdf
+2020/07/06 | 22969 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
+2020/07/06 | 2280 | systems/texlive/tlnet/archive/cascade.r55759.tar.xz
+2020/07/06 | 225681 | graphics/pgf/contrib/circuitikz/tex/pgfcircbipoles.tex
+2020/07/06 | 223962 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
+2020/07/06 | 2203540 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2020/07/06 | 218656 | systems/texlive/tlnet/archive/texlive-scripts.doc.r55754.tar.xz
+2020/07/06 | 210650 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
+2020/07/06 | 2095479 | install/graphics/pgf/contrib/circuitikz.tds.zip
+2020/07/06 | 2081944 | graphics/pgf/contrib/circuitikz.zip
+2020/07/06 | 20771 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
+2020/07/06 | 207507 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
+2020/07/06 | 203500 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
+2020/07/06 | 2028475 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
+2020/07/06 | 201598 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
+2020/07/06 | 201504 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
+2020/07/06 | 20012 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
+2020/07/06 | 196477 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
+2020/07/06 | 194054 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
+2020/07/06 | 19380217 | systems/texlive/tlnet/install-tl-windows.exe
+2020/07/06 | 193352 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
+2020/07/06 | 189215 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
+2020/07/06 | 187768 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
+2020/07/06 | 1875 | graphics/pgf/contrib/circuitikz/tex/ctikzstyle-romano.tex
+2020/07/06 | 187109 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
+2020/07/06 | 184497 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
+2020/07/06 | 179906 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
+2020/07/06 | 17729 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
+2020/07/06 | 177270 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
+2020/07/06 | 17621 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
+2020/07/06 | 1751870 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
+2020/07/06 | 17352 | graphics/pgf/contrib/circuitikz/doc/circuitikz-context.pdf
+2020/07/06 | 171138 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
+2020/07/06 | 170232 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
+2020/07/06 | 169760 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
+2020/07/06 | 168008 | systems/texlive/tlnet/archive/cascade.doc.r55759.tar.xz
+2020/07/06 | 167256 | systems/texlive/tlnet/archive/texlive-docindex.doc.r55754.tar.xz
+2020/07/06 | 164960 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
+2020/07/06 | 16308142 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2020/07/06 | 162096 | macros/latex/contrib/semantex/semantex.sty
+2020/07/06 | 16017 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
+2020/07/06 | 159287 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
+2020/07/06 | 15923 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
+2020/07/06 | 15503 | CTAN.sites
+2020/07/06 | 154453 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
+2020/07/06 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2020/07/06 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2020/07/06 | 151909 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
+2020/07/06 | 151033 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
+2020/07/06 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2020/07/06 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2020/07/06 | 141816 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
+2020/07/06 | 141248 | systems/texlive/tlnet/archive/texlive-msg-translations.r55755.tar.xz
+2020/07/06 | 14115 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
+2020/07/06 | 1409381 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
+2020/07/06 | 14053 | graphics/pgf/contrib/circuitikz/tex/pgfcirclabel.tex
+2020/07/06 | 140188 | graphics/pgf/contrib/circuitikz/tex/pgfcircmultipoles.tex
+2020/07/06 | 133618 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
+2020/07/06 | 1327710 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
+2020/07/06 | 131676 | systems/texlive/tlnet/archive/texlive-scripts.r55754.tar.xz
+2020/07/06 | 13135 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
+2020/07/06 | 130330 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
+2020/07/06 | 1266023 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
+2020/07/06 | 1204757 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
+2020/07/06 | 1204712 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
+2020/07/06 | 1193672 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
+2020/07/06 | 117131 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
+2020/07/06 | 115819 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
+2020/07/06 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini
+2020/07/06 | 113697 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
+2020/07/06 | 1124836 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
+2020/07/06 | 1124561 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
+2020/07/06 | 11132 | graphics/pgf/contrib/circuitikz/tex/circuitikz.sty
+2020/07/06 | 109775 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
+2020/07/06 | 109016 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
+2020/07/06 | 1060544 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
+2020/07/06 | 104589 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
+2020/07/06 | 102563 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
+2020/07/06 | 1021925 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
+2020/07/06 | 101911 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
+2020/07/06 | 1017702 | graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.pdf
+2020/07/06 | 101349 | graphics/pgf/contrib/circuitikz/tex/pgfcirc.defines.tex
+2020/07/06 | 100970 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
+2020/07/05 | 99848 | systems/texlive/tlnet/tlpkg/translations/fr.po
+2020/07/05 | 96266 | systems/texlive/tlnet/tlpkg/translations/vi.po
+2020/07/05 | 95538 | systems/texlive/tlnet/tlpkg/translations/de.po
2020/07/05 | 9515 | macros/latex/contrib/cascade/cascade-french.tex
-2020/07/05 | 94530 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
-2020/07/05 | 94265 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
-2020/07/05 | 93647 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
-2020/07/05 | 93647 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
-2020/07/05 | 922565 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
+2020/07/05 | 94215 | systems/texlive/tlnet/tlpkg/translations/sk.po
+2020/07/05 | 93138 | systems/texlive/tlnet/tlpkg/translations/it.po
2020/07/05 | 916 | systems/texlive/tlnet/archive/collection-plaingeneric.r55751.tar.xz
-2020/07/05 | 88780 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
-2020/07/05 | 88016 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
-2020/07/05 | 87407 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
-2020/07/05 | 8581 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
-2020/07/05 | 857 | systems/win32/miktex/tm/packages/pr.ini
-2020/07/05 | 84819 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
-2020/07/05 | 84388 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
+2020/07/05 | 88422 | systems/texlive/tlnet/tlpkg/translations/pt_BR.po
+2020/07/05 | 87080 | systems/texlive/tlnet/tlpkg/translations/uk.po
+2020/07/05 | 87013 | systems/texlive/tlnet/tlpkg/translations/cs.po
+2020/07/05 | 86051 | systems/texlive/tlnet/tlpkg/translations/es.po
2020/07/05 | 833 | macros/latex/contrib/cascade/README.md
-2020/07/05 | 82832 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64-2.9.tar.lzma
-2020/07/05 | 82762 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
-2020/07/05 | 79745 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
-2020/07/05 | 79201 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
-2020/07/05 | 78144 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
-2020/07/05 | 77603 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
-2020/07/05 | 77567 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
-2020/07/05 | 77428 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
-2020/07/05 | 76756 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-2.9.tar.lzma
-2020/07/05 | 76739 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
-2020/07/05 | 7557 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
+2020/07/05 | 77700 | systems/texlive/tlnet/tlpkg/translations/ja.po
+2020/07/05 | 75344 | systems/texlive/tlnet/tlpkg/translations/sl.po
+2020/07/05 | 74766 | systems/texlive/tlnet/tlpkg/translations/nl.po
2020/07/05 | 7468 | systems/texlive/tlnet/archive/expkv-opt.source.r55751.tar.xz
-2020/07/05 | 73667 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
-2020/07/05 | 73408 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
-2020/07/05 | 73100 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
-2020/07/05 | 72600 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
-2020/07/05 | 72071 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
-2020/07/05 | 71534 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
-2020/07/05 | 70304 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
-2020/07/05 | 69875 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
-2020/07/05 | 69135 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
-2020/07/05 | 68820 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
-2020/07/05 | 676983 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
-2020/07/05 | 67327 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
-2020/07/05 | 67272 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
-2020/07/05 | 66119 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
-2020/07/05 | 65602 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
-2020/07/05 | 65575 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
+2020/07/05 | 72938 | systems/texlive/tlnet/tlpkg/translations/pl.po
+2020/07/05 | 72716 | systems/texlive/tlnet/tlpkg/translations/zh_CN.po
+2020/07/05 | 679589 | systems/win32/w32tex/ChangeLog
2020/07/05 | 65039 | macros/latex/contrib/cascade/cascade-french.pdf
-2020/07/05 | 64200 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
-2020/07/05 | 638875 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
-2020/07/05 | 63532 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
-2020/07/05 | 63502 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
-2020/07/05 | 63495 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
-2020/07/05 | 63350 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
-2020/07/05 | 62928 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
-2020/07/05 | 623384 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
-2020/07/05 | 61816 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
-2020/07/05 | 597672 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
-2020/07/05 | 59172 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
-2020/07/05 | 58971 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
-2020/07/05 | 586876 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
-2020/07/05 | 58608 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
-2020/07/05 | 57248 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
-2020/07/05 | 57199 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
-2020/07/05 | 57184 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
-2020/07/05 | 562946 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
-2020/07/05 | 55579 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
-2020/07/05 | 550400 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
-2020/07/05 | 5500523 | systems/texlive/tlnet/install-tl-unx.tar.gz
-2020/07/05 | 544670 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
-2020/07/05 | 540973 | systems/win32/miktex/tm/packages/next/files.csv.lzma
-2020/07/05 | 539894 | systems/win32/miktex/tm/packages/files.csv.lzma
-2020/07/05 | 52206 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
-2020/07/05 | 51920 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
-2020/07/05 | 51416 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
-2020/07/05 | 51240 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
-2020/07/05 | 51044 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
-2020/07/05 | 50904 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
-2020/07/05 | 500484 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
-2020/07/05 | 49696 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
-2020/07/05 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
-2020/07/05 | 48048 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
-2020/07/05 | 46284 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
-2020/07/05 | 462360 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
-2020/07/05 | 460366 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
-2020/07/05 | 460274 | systems/win32/miktex/tm/packages/next/miktex-doc-2.9.tar.lzma
-2020/07/05 | 45737 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
-2020/07/05 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2020/07/05 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
-2020/07/05 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2020/07/05 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
-2020/07/05 | 45498 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
-2020/07/05 | 44983 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
-2020/07/05 | 43303 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
-2020/07/05 | 43023 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
-2020/07/05 | 42503 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
-2020/07/05 | 42064 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
-2020/07/05 | 40787 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
-2020/07/05 | 39508 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64-2.9.tar.lzma
-2020/07/05 | 39507 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
-2020/07/05 | 392543 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
+2020/07/05 | 63275 | systems/texlive/tlnet/tlpkg/translations/zh_TW.po
+2020/07/05 | 58600 | systems/texlive/tlnet/tlpkg/translations/messages.pot
+2020/07/05 | 4923 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2020/07/05 | 391332 | systems/texlive/tlnet/archive/expkv.doc.r55750.tar.xz
-2020/07/05 | 38946 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
-2020/07/05 | 388 | systems/texlive/tlnet/archive/texlive-docindex.r55745.tar.xz
+2020/07/05 | 3792812 | systems/win32/w32tex/luajittex-exp-w32.tar.xz
2020/07/05 | 3788 | systems/texlive/tlnet/archive/expkv-def.r55749.tar.xz
-2020/07/05 | 36965 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
-2020/07/05 | 36860 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
-2020/07/05 | 36307 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
-2020/07/05 | 360666 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
-2020/07/05 | 35336 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-2.9.tar.lzma
-2020/07/05 | 35313 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
-2020/07/05 | 35046 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
-2020/07/05 | 34704 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
-2020/07/05 | 33137 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
-2020/07/05 | 329721 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
-2020/07/05 | 327003 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
-2020/07/05 | 32401 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
+2020/07/05 | 34937408 | systems/win32/w32tex/ltxpkgs.tar.xz
+2020/07/05 | 3432564 | systems/win32/w32tex/win64/luajittex-exp-w64.tar.xz
2020/07/05 | 3228 | systems/texlive/tlnet/archive/expkv.r55750.tar.xz
-2020/07/05 | 32134 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
-2020/07/05 | 31243 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
-2020/07/05 | 31242 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
-2020/07/05 | 31223 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
-2020/07/05 | 310933 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
-2020/07/05 | 30891 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
-2020/07/05 | 30876 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
-2020/07/05 | 305168 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
+2020/07/05 | 3117508 | systems/win32/w32tex/win64/luatex-exp-w64.tar.xz
2020/07/05 | 299984 | systems/texlive/tlnet/archive/expkv-def.doc.r55749.tar.xz
-2020/07/05 | 29633 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
-2020/07/05 | 29320 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
-2020/07/05 | 29183 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
-2020/07/05 | 28976 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
-2020/07/05 | 28617 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
-2020/07/05 | 281691 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
-2020/07/05 | 27943 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
-2020/07/05 | 279309 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
-2020/07/05 | 273614 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
-2020/07/05 | 27037 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
-2020/07/05 | 26955 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
-2020/07/05 | 269063 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
-2020/07/05 | 26875 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
-2020/07/05 | 26630 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
-2020/07/05 | 2659108 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
2020/07/05 | 257152 | systems/texlive/tlnet/archive/expkv-opt.doc.r55751.tar.xz
-2020/07/05 | 25474 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
-2020/07/05 | 2534428 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
-2020/07/05 | 249729 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
-2020/07/05 | 246797 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
-2020/07/05 | 243026 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
-2020/07/05 | 24269133 | systems/texlive/tlnet/install-tl.zip
2020/07/05 | 2372 | systems/texlive/tlnet/archive/expkv-opt.r55751.tar.xz
-2020/07/05 | 23596 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
-2020/07/05 | 22969 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
2020/07/05 | 22554 | macros/latex/contrib/cascade/cascade.dtx
-2020/07/05 | 223960 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
-2020/07/05 | 2202996 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
-2020/07/05 | 218656 | systems/texlive/tlnet/archive/texlive-scripts.doc.r55748.tar.xz
-2020/07/05 | 210650 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
-2020/07/05 | 20770 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
-2020/07/05 | 207505 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
-2020/07/05 | 203502 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
-2020/07/05 | 2028475 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
-2020/07/05 | 201631 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
-2020/07/05 | 201485 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
-2020/07/05 | 20013 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
-2020/07/05 | 196475 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
-2020/07/05 | 194053 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
-2020/07/05 | 19382766 | systems/texlive/tlnet/install-tl-windows.exe
-2020/07/05 | 193351 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
-2020/07/05 | 189216 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
-2020/07/05 | 187768 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
-2020/07/05 | 187110 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
2020/07/05 | 18632 | systems/texlive/tlnet/archive/expkv.source.r55750.tar.xz
-2020/07/05 | 184498 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
-2020/07/05 | 179905 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
-2020/07/05 | 17729 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
-2020/07/05 | 177269 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
-2020/07/05 | 17622 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
-2020/07/05 | 1751872 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
+2020/07/05 | 17919908 | systems/win32/w32tex/luatex-exp-w32.tar.xz
2020/07/05 | 174640 | macros/latex/contrib/cascade.zip
-2020/07/05 | 171139 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
-2020/07/05 | 170232 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
-2020/07/05 | 169762 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
-2020/07/05 | 167176 | systems/texlive/tlnet/archive/texlive-docindex.doc.r55745.tar.xz
-2020/07/05 | 164959 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
-2020/07/05 | 16307883 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
-2020/07/05 | 16023 | CTAN.sites
-2020/07/05 | 16017 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
-2020/07/05 | 159288 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
-2020/07/05 | 15923 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
-2020/07/05 | 154454 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
-2020/07/05 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
2020/07/05 | 1530893 | macros/eplain.zip
-2020/07/05 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
-2020/07/05 | 151909 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
-2020/07/05 | 151031 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
-2020/07/05 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
-2020/07/05 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
-2020/07/05 | 141812 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
-2020/07/05 | 14115 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
-2020/07/05 | 1409381 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
-2020/07/05 | 133619 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
-2020/07/05 | 1327713 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
-2020/07/05 | 131892 | systems/texlive/tlnet/archive/texlive-scripts.r55748.tar.xz
2020/07/05 | 13152 | systems/texlive/tlnet/archive/expkv-def.source.r55749.tar.xz
-2020/07/05 | 13134 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
-2020/07/05 | 130330 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
-2020/07/05 | 1266025 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
-2020/07/05 | 1205768 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
-2020/07/05 | 1205512 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
-2020/07/05 | 1193673 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
-2020/07/05 | 117131 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
-2020/07/05 | 115821 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
-2020/07/05 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini
-2020/07/05 | 113698 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
-2020/07/05 | 1125012 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
-2020/07/05 | 1124467 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
-2020/07/05 | 109774 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
-2020/07/05 | 109016 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
+2020/07/05 | 112575 | systems/texlive/tlnet/tlpkg/translations/ru.po
+2020/07/05 | 109963 | systems/texlive/tlnet/tlpkg/translations/sr.po
2020/07/05 | 108503 | macros/latex/contrib/cascade/cascade.pdf
-2020/07/05 | 1060543 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
-2020/07/05 | 104588 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
-2020/07/05 | 102563 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
-2020/07/05 | 1021925 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
-2020/07/05 | 101910 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
-2020/07/05 | 100971 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
2020/07/04 | 99280296 | systems/win32/w32tex/web2c-lib.tar.xz
2020/07/04 | 9917 | usergrps/usergrps/labels.pdf
2020/07/04 | 952 | macros/eplain/doc/demo/Makefile
@@ -235,7 +319,6 @@
2020/07/04 | 749707 | macros/eplain/doc/eplain.html
2020/07/04 | 734393 | macros/eplain/doc/eplain.pdf
2020/07/04 | 70313 | macros/generic/expkv/expkv.dtx
-2020/07/04 | 679209 | systems/win32/w32tex/ChangeLog
2020/07/04 | 67511 | systems/texlive/tlnet/tlpkg/installer/install-tl-gui.tcl
2020/07/04 | 657 | macros/eplain/doc/AUTHORS
2020/07/04 | 65795 | macros/eplain/doc/lscommnt.jpg
@@ -328,7 +411,6 @@
2020/07/03 | 63452 | macros/latex/contrib/GuIT/GuITlogo/guit.dtx
2020/07/03 | 6318860 | systems/win32/w32tex/win64/pdftex-w64.tar.xz
2020/07/03 | 6060 | systems/texlive/tlnet/archive/xits.doc.r55730.tar.xz
-2020/07/03 | 5928 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2020/07/03 | 564966 | macros/latex/contrib/babel-contrib/french.zip
2020/07/03 | 547474 | systems/win32/miktex/tm/packages/xits.tar.lzma
2020/07/03 | 541240 | systems/texlive/tlnet/archive/xits.r55730.tar.xz
@@ -337,7 +419,6 @@
2020/07/03 | 470700 | systems/texlive/tlnet/archive/fbb.doc.r55728.tar.xz
2020/07/03 | 412055 | systems/win32/miktex/tm/packages/expkv.tar.lzma
2020/07/03 | 356853 | systems/win32/miktex/tm/packages/mnras.tar.lzma
-2020/07/03 | 34926620 | systems/win32/w32tex/ltxpkgs.tar.xz
2020/07/03 | 3477 | macros/latex/contrib/beamer-contrib/themes/beamerthemenord/beamerthemeNord.tex
2020/07/03 | 3336 | systems/texlive/tlnet/archive/beamerappendixnote.source.r55732.tar.xz
2020/07/03 | 328176 | systems/texlive/tlnet/archive/mnras.doc.r55729.tar.xz
@@ -2107,16 +2188,13 @@
2020/07/01 | 39933 | systems/win32/miktex/tm/packages/l3backend.tar.lzma
2020/07/01 | 38671 | macros/latex/contrib/draftwatermark/draftwatermark.dtx
2020/07/01 | 3850916 | systems/win32/w32tex/luajittex-dev-w32.tar.xz
-2020/07/01 | 3839952 | systems/win32/w32tex/luajittex-exp-w32.tar.xz
2020/07/01 | 3835476 | systems/win32/w32tex/luajittex-w32.tar.xz
2020/07/01 | 355328 | systems/texlive/tlnet/archive/erewhon.doc.r55705.tar.xz
2020/07/01 | 349529 | fonts/etbb/afm/ETbb-BoldItalic.afm
-2020/07/01 | 3446840 | systems/win32/w32tex/win64/luajittex-exp-w64.tar.xz
2020/07/01 | 3434248 | systems/win32/w32tex/win64/luajittex-dev-w64.tar.xz
2020/07/01 | 3429240 | systems/win32/w32tex/win64/luajittex-w64.tar.xz
2020/07/01 | 3390900 | systems/win32/w32tex/win64/web2c-w64.tar.xz
2020/07/01 | 3271 | macros/latex/contrib/draftwatermark/draftwatermark.ins
-2020/07/01 | 3122876 | systems/win32/w32tex/win64/luatex-exp-w64.tar.xz
2020/07/01 | 3099224 | systems/win32/w32tex/win64/luatex-dev-w64.tar.xz
2020/07/01 | 3096836 | systems/win32/w32tex/win64/luatex-w64.tar.xz
2020/07/01 | 2782144 | systems/win32/miktex/tm/packages/erewhon.tar.lzma
@@ -2141,7 +2219,6 @@
2020/07/01 | 19040 | systems/texlive/tlnet/archive/nicematrix.r55710.tar.xz
2020/07/01 | 1879060 | systems/win32/w32tex/win64/ptex-w64.tar.xz
2020/07/01 | 185803 | fonts/fbb/type1/fbb-Italic.pfb
-2020/07/01 | 18165508 | systems/win32/w32tex/luatex-exp-w32.tar.xz
2020/07/01 | 18144588 | systems/win32/w32tex/luatex-dev-w32.tar.xz
2020/07/01 | 1807540 | systems/win32/w32tex/win64/uptex-w64.tar.xz
2020/07/01 | 17952 | systems/texlive/tlnet/archive/tikzducks.r55713.tar.xz
@@ -2222,7 +2299,6 @@
2020/06/30 | 71534 | systems/win32/miktex/tm/packages/miktex-ps2pk-bin-x64-2.9.tar.lzma
2020/06/30 | 70096 | systems/win32/miktex/tm/packages/miktex-web-bin-x64-2.9.tar.lzma
2020/06/30 | 69792 | systems/win32/miktex/tm/packages/miktex-mtprint-bin-x64-2.9.tar.lzma
-2020/06/30 | 6966 | fonts/erewhon/tex/erewhon.sty
2020/06/30 | 69177 | systems/win32/miktex/tm/packages/miktex-tex4ht-bin-x64-2.9.tar.lzma
2020/06/30 | 6910 | systems/win32/miktex/setup/deb/dists/buster/universe/binary-amd64/Packages
2020/06/30 | 6910 | macros/context/contrib/context-vim/tex/context/third/vim/2context.vim
@@ -2577,51 +2653,3 @@
2020/06/30 | 1022504 | systems/win32/miktex/tm/packages/miktex-poppler-bin-x64-2.9.tar.lzma
2020/06/30 | 101452 | systems/win32/miktex/tm/packages/miktex-mfware-bin-x64-2.9.tar.lzma
2020/06/30 | 101040 | systems/win32/miktex/tm/packages/miktex-gd-bin-2.9.tar.lzma
-2020/06/29 | 93966 | install/macros/latex/contrib/qrbill.tds.zip
-2020/06/29 | 83953 | macros/latex/contrib/qrbill.zip
-2020/06/29 | 8015 | macros/latex/contrib/l3backend/l3backend-color.dtx
-2020/06/29 | 72627 | macros/latex/contrib/qrbill/qrbill.pdf
-2020/06/29 | 6572 | systems/texlive/tlnet/archive/fei.r55691.tar.xz
-2020/06/29 | 63388 | install/macros/latex/contrib/l3backend.tds.zip
-2020/06/29 | 6320 | systems/texlive/tlnet/archive/pdftexcmds.r55693.tar.xz
-2020/06/29 | 550 | macros/latex/contrib/l3backend/README.md
-2020/06/29 | 49466 | macros/latex/contrib/l3backend/l3backend-pdf.dtx
-2020/06/29 | 472 | systems/texlive/tlnet/archive/forest-quickstart.r55688.tar.xz
-2020/06/29 | 470752 | systems/texlive/tlnet/archive/libertinus-fonts.doc.r55689.tar.xz
-2020/06/29 | 42180 | macros/latex/contrib/langsci-avm/langsci-avm.dtx
-2020/06/29 | 419203 | info/dtk-bibliography.zip
-2020/06/29 | 41675 | macros/latex/contrib/l3backend/l3backend-draw.dtx
-2020/06/29 | 402954 | macros/latex/contrib/nicematrix/nicematrix.dtx
-2020/06/29 | 400273 | systems/win32/miktex/tm/packages/pdftexcmds.tar.lzma
-2020/06/29 | 379844 | systems/texlive/tlnet/archive/pdftexcmds.doc.r55693.tar.xz
-2020/06/29 | 37921 | macros/latex/contrib/qrbill/qrbill.dtx
-2020/06/29 | 343396 | macros/latex/contrib/metastr.zip
-2020/06/29 | 340592 | support/xml2pmx/Linux/xml2pmx-2020-06-29.tar.gz
-2020/06/29 | 3392 | systems/texlive/tlnet/archive/biblatex-software.r55690.tar.xz
-2020/06/29 | 327315 | systems/win32/miktex/tm/packages/fei.tar.lzma
-2020/06/29 | 2999 | macros/latex/contrib/l3backend/CHANGELOG.md
-2020/06/29 | 298200 | systems/texlive/tlnet/archive/biblatex-software.doc.r55690.tar.xz
-2020/06/29 | 29768 | systems/texlive/tlnet/archive/fei.source.r55691.tar.xz
-2020/06/29 | 289852 | systems/texlive/tlnet/archive/fei.doc.r55691.tar.xz
-2020/06/29 | 2460916 | systems/win32/miktex/tm/packages/xcharter.tar.lzma
-2020/06/29 | 226 | macros/latex/contrib/beamer-contrib/beamerappendixnote/example-backtop.tex
-2020/06/29 | 2139818 | systems/win32/miktex/tm/packages/libertinus-fonts.tar.lzma
-2020/06/29 | 21221 | macros/latex/contrib/l3backend/l3backend-graphics.dtx
-2020/06/29 | 2049 | macros/latex/contrib/langsci-avm/langsci-avm.ins
-2020/06/29 | 1666684 | systems/texlive/tlnet/archive/libertinus-fonts.r55689.tar.xz
-2020/06/29 | 1539 | macros/latex/contrib/qrbill/qrbill.ins
-2020/06/29 | 1504 | systems/texlive/tlnet/archive/collection-publishers.r55694.tar.xz
-2020/06/29 | 1455 | macros/latex/contrib/langsci-avm/README
-2020/06/29 | 14509 | macros/latex/contrib/l3backend/l3backend-box.dtx
-2020/06/29 | 14249 | macros/latex/contrib/l3backend/l3backend-header.dtx
-2020/06/29 | 14048 | systems/texlive/tlnet/archive/pdftexcmds.source.r55693.tar.xz
-2020/06/29 | 13468 | macros/latex/contrib/l3backend/l3backend-basics.dtx
-2020/06/29 | 1311 | macros/latex/contrib/qrbill/README.md
-2020/06/29 | 124297 | macros/latex/contrib/langsci-avm.zip
-2020/06/29 | 1153 | macros/latex/contrib/qrbill/qrbill_swiss-cross.pdf
-2020/06/29 | 113978 | macros/latex/contrib/langsci-avm/langsci-avm.pdf
-2020/06/29 | 112904 | macros/latex/contrib/nicematrix/nicematrix-french.tex
-2020/06/29 | 1107 | macros/latex/contrib/qrbill/qrbill-vocab.csv
-2020/06/29 | 1080 | systems/texlive/tlnet/archive/biblatex-software.source.r55690.tar.xz
-2020/06/29 | 107246 | systems/win32/miktex/tm/packages/forest-quickstart.tar.lzma
-2020/06/29 | 106464 | systems/texlive/tlnet/archive/forest-quickstart.doc.r55688.tar.xz
diff --git a/graphics/pgf/contrib/circuitikz/README.md b/graphics/pgf/contrib/circuitikz/README.md
index 26b73ef946..18614930e0 100644
--- a/graphics/pgf/contrib/circuitikz/README.md
+++ b/graphics/pgf/contrib/circuitikz/README.md
@@ -74,7 +74,13 @@ also the questions tagged `circuitikz` on https://tex.stackexchange.com/ are of
* Romano Giannetti (romano.giannetti@gmail.com)
-------------
-Copyright 2007-19 by Massimo Redaelli
+Copyright 2018-2020 by Romano Giannetti
+
+Copyright 2015-2020 by Stefan Lindner
+
+Copyright 2013-2020 by Stefan Erhardt
+
+Copyright 2007-2020 by Massimo Redaelli
This file may be distributed and/or modified
diff --git a/graphics/pgf/contrib/circuitikz/doc/changelog.tex b/graphics/pgf/contrib/circuitikz/doc/changelog.tex
index 80bc730a3e..a9e9200ee1 100644
--- a/graphics/pgf/contrib/circuitikz/doc/changelog.tex
+++ b/graphics/pgf/contrib/circuitikz/doc/changelog.tex
@@ -5,6 +5,40 @@ full list of changes.
\begin{itemize}
\item
+ Version 1.2.1 (2020-07-06)
+
+ Several changes, both internal and user-visible. These are quite
+ risky, although they \emph{should} be backeard-compatible.
+
+ From the user point of view:
+
+ \begin{itemize}
+ \tightlist
+ \item
+ there is now a new style of voltages (``raised American'')
+ \item
+ a powerful mechanism for customize voltages, current and flows has
+ been added.
+ \end{itemize}
+
+ The internal changes are basically the re-implementation of the macros
+ that draw the path elements (\texttt{to{[}...{]}}), which have been
+ completely rewritten. Please be sure to read the possible
+ incompatibilities in the manual (section 1.9).
+
+ \begin{itemize}
+ \tightlist
+ \item
+ Added access to voltages, currents and flows anchors
+ \item
+ Added ``raised american'' voltage style
+ \item
+ Rewrite of the path generation macros
+ \item
+ Several small bugs fixed (no one ever used some
+ ``f\^{}\textgreater{}'' options\ldots{})
+ \end{itemize}
+\item
Version 1.2.0 (2020-06-21)
In this release, the big change is the rewriting of the voltages
diff --git a/graphics/pgf/contrib/circuitikz/doc/circuitikz-context.pdf b/graphics/pgf/contrib/circuitikz/doc/circuitikz-context.pdf
index 11d0fef2f0..9853c5f419 100644
--- a/graphics/pgf/contrib/circuitikz/doc/circuitikz-context.pdf
+++ b/graphics/pgf/contrib/circuitikz/doc/circuitikz-context.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.pdf b/graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.pdf
index 1547fdaa57..d4b9b8b763 100644
--- a/graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.pdf
+++ b/graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.tex b/graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.tex
index 9ecca9a39a..300ee04f20 100644
--- a/graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.tex
+++ b/graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.tex
@@ -141,23 +141,23 @@
\draw (C.pin 20) -- ++(0,-8) node[ground](GND){};
\draw (C.pin 7) to[D, fill=blue] ++(0,-1) -- ++(0.5,0) to[R] ++(2,0)
coordinate(a1) to[short, -*]
- node[above left, blue]{Massimo A. Redaelli}
- node[below left,]{\email{m.redaelli@gmail.com}}
+ node[above left, blue, pos=1]{Massimo A. Redaelli}
+ node[below left, pos=1]{\email{m.redaelli@gmail.com}}
(a1-|GND);
\draw (C.pin 5) to[D, fill=red] ++(0,-3)-- ++(0.5,0) to[R] ++(2,0)
coordinate(a2) to[short, -*]
- node[above left, blue]{Stefan Lindner}
- node[below left,]{\email{stefan.lindner@fau.de}}
+ node[above left, blue, pos=1]{Stefan Lindner}
+ node[below left, pos=1]{\email{stefan.lindner@fau.de}}
(a2-|GND);
\draw (C.pin 3) to[D, fill=green] ++(0,-5)-- ++(0.5,0) to[R] ++(2,0)
coordinate(a3) to[short, -*]
- node[above left, blue]{Stefan Erhardt}
- node[below left,]{\email{stefan.erhardt@fau.de}}
+ node[above left, blue, pos=1]{Stefan Erhardt}
+ node[below left, pos=1]{\email{stefan.erhardt@fau.de}}
(a3-|GND);
\draw (C.pin 1) to[D, fill=yellow] ++(0,-7)-- ++(0.5,0) to[R] ++(2,0)
coordinate(a4) to[short, -*]
- node[above left, blue]{Romano Giannetti}
- node[below left,]{\email{romano.giannetti@gmail.com}}
+ node[above left, blue, pos=1]{Romano Giannetti}
+ node[below left, pos=1]{\email{romano.giannetti@gmail.com}}
(a4-|GND);
\end{circuitikz}
\par\bigskip\vfill}
@@ -273,13 +273,21 @@ Nevertheless, \href{https://tex.stackexchange.com/a/529159/38080}{Schrödinger'
\end{circuitikz}
\end{LTXexample}
-They \texttt{use fpu reciprocal} key seems to have no side effects, but given that it is patching an internal interface of \TikZ{} it can break any time, so it is advisable to use it only if and when needed.
+The \texttt{use fpu reciprocal} key seems to have no side effects, but given that it is patching an internal interface of \TikZ{} it can break any time, so it is advisable to use it only if and when needed.
\subsection{Incompabilities between version}
Here, we will provide a list of incompabilitys between different version of circuitikz. We will try to hold this list short, but sometimes it is easier to break with old syntax than including a lot of switches and compatibility layers.
You can check the used version at your local installation using the macro \verb!\pgfcircversion{}!.
\begin{itemize}
+ \item After v1.2.1: \textbf{Important:} the routine that implement the \texttt{to[...]} component positioning has been rewritten. That should enhance the line joins in path, and it's safer, but it can potentially change behavior.
+
+ One of the changes is that the previous routine did the wrong thing if you used \texttt{(node) to[...]} (you should use an anchor or a coordinate, not a node there --- like \texttt{(node.anchor) to[...]}).
+
+ The other one was that in the structure \texttt{... to[...] node[pos=\emph{something}] (coord)} the value of \texttt{pos} was completely wrong (even if you don't use \texttt{pos} explicitly, remeber it's \texttt{pos=0.5} by default).
+
+ Additionally, the old code disrupted the \TikZ{} path-fill mechanism, so that you could get away with using the \texttt{fill} option on paths and having just the components to be filled, not the path. That was incorrect, although sometime it was handy.
+
\item After v1.2.0: voltage arrows, symbols and label positions are calculated with a rewritten routine. There should be little change, \emph{unless} you touched internal values\dots
\item After v1.1.3: during the 1.1.0 --- 1.1.2 version, the inverted Schmitt buffer in IEEE style ports was called \texttt{inv schmitt} (with an additional space). The correct name is \texttt{invschmitt port} (the same as the legacy american port).
\item After v1.1.2: the position of \texttt{american} voltages for the \texttt{open} bipoles (you can revert to old behavior, see section~\ref{sec:sub-voltage-position}).
@@ -315,7 +323,12 @@ The easiest way to contact the authors is via the official Github repository: \u
\subsection{Package options}
\label{sec:package-options}
-\noindent Circuit people are very opinionated about their symbols. In order to meet the individual gusto you can set a bunch of package options. The standard options are what the authors like, for example you get this:
+Circuit people are very opinionated about their symbols. In order to meet the individual gusto you can set a bunch of package options.
+
+There are arguably way too much options in \Circuitikz, as you can see in the following list. Since version \texttt{1.0}, it is recommended to just use the basic ones --- voltage directions (you \textbf{should} specify one of them), \texttt{siunitx}, the global style (\texttt{american} or \texttt{european}) and use styles (see~\ref{sec:styling}) for the remaining options.
+
+The standard options are what the authors like, for example you get this:
+
\begin{LTXexample}[varwidth=true]
\begin{circuitikz}
\draw (0,0) to[R=2<\ohm>, i=?, v=84<\volt>] (2,0) --
@@ -5347,9 +5360,9 @@ Long names/styles for the bipoles can be used:
\subsection{Labels and Annotations}
\label{sec:labels-and-annotations}
-Since Version 0.7, beside the original label (l) option, there is a new option to place a second label, called annotation (a) at each bipole. Up to now this is a beta-test and there can be problems. For example, up to now this option is not compatible with the concurrent use of voltage labels.
+Since Version 0.7, beside the original label (\texttt{l}) option, there is a new option to place a second label, called annotation (\texttt{a}) at each bipole.
-The position of (a) and (l) labels can be adjusted with \_ and \^, respectively.
+The position of annotations and labels can be adjusted with \verb|_| and \verb|^|.
\begin{LTXexample}[varwidth=true]
\begin{circuitikz}
@@ -5364,7 +5377,7 @@ The position of (a) and (l) labels can be adjusted with \_ and \^, respectively.
\end{LTXexample}
\textbf{Caveat:} notice that the way in which \texttt{circuitikz} processes the options, there will be problems if the label (or annotation, voltage, or current) contains one of the characters $=$ (equal) or $,$ (comma), giving unexpected errors and wrong output.
-These two characters must be protected to the option parser using an \verb|\mbox| command, or redefining the characters with a \TeX\ \verb|\def|:
+These two characters must be protected from the option parser using an \verb|\mbox| command, or redefining the characters with a \TeX\ \verb|\def|:
\begin{LTXexample}[varwidth=true]
\def\eq{=}
@@ -5513,9 +5526,54 @@ as shown in the following examples.
This manual has been typeset with the option \texttt{\chosenvoltoption}.
+\subsubsection{Common properties of voltages and currents}
+\label{sec:common-vif-pos}
+
+Currents, voltages and flows (see later) are positioned along, or across, the part of the wires that connect the inner component to the rest of the circuit. So, changing the length of the connection (the coordinates that embrace the \texttt{to[...]} command) will change the position of the components.
+
+\begin{LTXexample}[varwidth=true]
+\begin{circuitikz}
+ \draw (-1,1) to[R, v=$v$, i=$i$, f>^=$f$] (1,1);
+ \draw (-2,0) to[R, v=$v$, i=$i$, f>^=$f$] (2,0);
+\end{circuitikz}
+\end{LTXexample}
+
+However, you can override the properties \texttt{voltage/distance from node} (default \texttt{0.5}: how distant from the initial and final points of the path the arrow starts and ends or the plus and minus symbols are drawn) and \texttt{voltage/bump b} (how high the bump of the arrow is --- how curved it is, default \texttt{1.5}), and also \texttt{voltage/european label distance} (how distant from the normal position the voltage label will be, default \texttt{1.4}) on a per-component basis, in order to fine-tune the voltages:
+
+\begin{LTXexample}[varwidth=true]
+\tikz \draw (0,0) to[R, v=1<\volt>] (2,0); \par
+\ctikzset{voltage/distance from node=.1}
+\ctikzset{voltage/bump b=2.5}
+\tikz \draw (0,0) to[R, v=1<\volt>] (2,0);
+\end{LTXexample}
+
+The same concept as \texttt{distance from node} applies to the key \texttt{current/distance} for the position of the current's arrow:
+
+\begin{LTXexample}[varwidth=true]
+\tikz \draw (0,0) to[C, i=$\imath$] (2,0); \par
+\ctikzset{current/distance = .2}
+\tikz \draw (0,0) to[C, i=$\imath$] (2,0);
+\end{LTXexample}
+
+You can change globally these parameters by defining a component-specific key; you have to use the internal name of the component (in the component list, is the \texttt{nodename} without the terminal ``\texttt{shape}'' part):
+
+\begin{LTXexample}[varwidth=true]
+\tikz \draw (0,0) to[R, v=1<\volt>] (1.5,0)
+ to[C, v=2<\volt>] (3,0); \par
+\ctikzset{bipoles/capacitor/voltage/distance from node/.initial=.7}
+\tikz \draw (0,0) to[R, v=1<\volt>] (1.5,0)
+ to[C, v=2<\volt>] (3,0); \par
+\end{LTXexample}
+
+Note the \texttt{.initial}; you have to create such key the first time you use it. These kind of adjustments are not guaranteed to work in future upgrades, though; if you have to create a key you are somehow touching the internal structure of the package; it's much safer to create a style.
+
+One common request is to change the style of the arrows (both head and line) of these elements. Voltages, currents and flows are part of the same path of the component, so this is not possible in simple way; you have to drawn your own with \TikZ{} commands using the facilities explained in section~\ref{sec:vif-anchors}.
+
\subsection{Currents}\label{sec:currents}
-Inline (along the wire) currents are selected with \verb|i_>|, \verb|i^<|, \verb|i>_|, \verb|i>^|, and various simplification; the default position and direction is obtained with the key \verb|i=...|.
+Inline (along the wire) currents are selected with \verb|i_>|, \verb|i^<|, \verb|i>_|, \verb|i>^|, and various combination; the default position and direction is obtained with the simple key \verb|i=...|.
+
+Basically, \verb|^| and \verb|_| control if the label is above or below the line (above and below \textbf{do} depend on the direction of the component path), and \verb|<| and \verb|>| the direction of the arrow; swapping them (from for example from \verb|i^>| to \verb|i>^|) will switch the side of the component where the symbol is drawn. See the following examples:
\begin{LTXexample}[varwidth=true]
@@ -5566,31 +5624,16 @@ Inline (along the wire) currents are selected with \verb|i_>|, \verb|i^<|, \verb
\end{circuitikz}
\end{LTXexample}
-Also:
+Also notice that the direction of the path is important:
\begin{LTXexample}[varwidth=true]
\begin{circuitikz}
+ \draw (2,1) to[R, i<=$i_1$] (0,1);
\draw (0,0) to[R, i<=$i_1$] (2,0);
\end{circuitikz}
\end{LTXexample}
-\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}
- \draw (0,0) to[R, i>=$i_1$] (2,0);
-\end{circuitikz}
-\end{LTXexample}
-
-\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}
- \draw (0,0) to[R, i^=$i_1$] (2,0);
-\end{circuitikz}
-\end{LTXexample}
-
-\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}
- \draw (0,0) to[R, i_=$i_1$] (2,0);
-\end{circuitikz}
-\end{LTXexample}
+Default directions can change if the component is active or passive,\footnote{This, in hindsight, has been a bad feature --- and I'm partly responsible for it. But removing it would create \emph{too small} variations in circuits, so it stays.} following the chosen global voltage direction strategy (see section~\ref{curr-and-volt}).
\begin{LTXexample}[varwidth=true]
\begin{circuitikz}
@@ -5599,8 +5642,8 @@ Also:
\end{LTXexample}
\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}
- \draw (0,0) to[V<=10V, i_=$i_1$] (2,0);
+\begin{circuitikz}[voltage dir=EF]
+ \draw (0,0) to[V=10V, i_=$i_1$] (2,0);
\end{circuitikz}
\end{LTXexample}
@@ -5616,22 +5659,27 @@ Also:
\end{circuitikz}
\end{LTXexample}
+Current generators with the direct label (the one obtained by, for example, \texttt{I = something}) will treat it as a current:
+
\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}[american]
- \draw (0,0) to[dcisource=1A, i_=$i_1$] (2,0);
+\begin{circuitikz}
+ \draw (0,0) to[I=$a_1$] (2,0);
\end{circuitikz}
\end{LTXexample}
+If you use the option \texttt{americancurrent} or using the style \texttt{[american currents]}
+you can changhe the style of current generators.
+
\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}[american]
- \draw (0,0) to[dcisource=1A,invert, i_=$i_1$] (2,0);
+\begin{circuitikz}[american currents]
+ \draw (0,0) to[I=$a_1$] (2,0);
\end{circuitikz}
\end{LTXexample}
+
\subsection{Flows}\label{flows}
-As an alternative for the current arrows, you can also use the following flows. They can also be used to indicate thermal or power flows. The syntax is pretty the same as for currents.
-\textit{This is a new beta feature since version 0.8.3; therefore, please provide bug reports or hints to optimize this feature regarding placement and appearance! This means that the appearance may change in the future!}
+As an alternative for the current arrows, you can also use the following ``flows''. They can also be used to indicate thermal or power flows. The syntax is pretty the same as for currents.
\begin{LTXexample}[varwidth=true]
\begin{circuitikz}
@@ -5676,9 +5724,13 @@ As an alternative for the current arrows, you can also use the following flows.
\end{LTXexample}
\subsection{Voltages}
-See introduction note at Currents and Voltages (chapter \ref{curr-and-volt}, page \pageref{curr-and-volt}) for the direction of the voltage and currents.
+See the introduction at Currents and Voltages (section~\ref{curr-and-volt}, page \pageref{curr-and-volt}) for the default direction of the voltage and currents.
+
+Voltages come in four different styles: European (with curved or straight arrows) and American (with signs that can stay near the wire or raised at the label level).
+
+Direction and position of the symbols are controlled in the same way as for the currents (see section~\ref{sec:currents}) with the \verb|_^<>| symbols.
-\subsubsection{European style} The default, with arrows. Use option \texttt{europeanvoltage} or style \verb![european voltages]!, or setting (even locally) \texttt{voltage=european}.
+\subsubsection{European style} The default, with curved arrows. Use option \texttt{europeanvoltage} or style \verb![european voltages]!, or setting (even locally) \texttt{voltage=european}.
\begin{LTXexample}[varwidth=true]
\begin{circuitikz}[european voltages]
@@ -5704,49 +5756,71 @@ See introduction note at Currents and Voltages (chapter \ref{curr-and-volt}, pag
\end{circuitikz}
\end{LTXexample}
+The default direction for active elements can change, depending on the global \texttt{voltage dir} setting, so be careful.
+
\begin{LTXexample}[varwidth=true]
\begin{circuitikz}
- \draw (0,0) to[V=10V, i_=$i_1$] (2,0);
+ \draw (0,0) to[I=1A, v_=$u_1$] (2,0);
\end{circuitikz}
\end{LTXexample}
\begin{LTXexample}[varwidth=true]
\begin{circuitikz}
- \draw (0,0) to[V<=10V, i_=$i_1$] (2,0);
+ \draw (0,0) to[I<=1A, v_=$u_1$] (2,0);
\end{circuitikz}
\end{LTXexample}
\begin{LTXexample}[varwidth=true]
\begin{circuitikz}
- \draw (0,0) to[I=1A, v_=$u_1$] (2,0);
+ \draw (0,0) to[I=$~$,l=1A, v_=$u_1$] (2,0);
\end{circuitikz}
\end{LTXexample}
\begin{LTXexample}[varwidth=true]
\begin{circuitikz}
- \draw (0,0) to[I<=1A, v_=$u_1$] (2,0);
+ \draw (0,0) to[I,l=1A, v_=$u_1$] (2,0);
\end{circuitikz}
\end{LTXexample}
+Moreover, for historical reasons, voltage generators have differently looking arrows (they are straight even in curved European style).
\begin{LTXexample}[varwidth=true]
\begin{circuitikz}
- \draw (0,0) to[I=$~$,l=1A, v_=$u_1$] (2,0);
+ \draw (0,0) to[battery,l_=1V, v=$u_1$, i=$i_1$] (2,0);
\end{circuitikz}
\end{LTXexample}
\begin{LTXexample}[varwidth=true]
\begin{circuitikz}
- \draw (0,0) to[I,l=1A, v_=$u_1$] (2,0);
+ \draw (0,0) to[V=10V, i_=$i_1$] (2,0);
\end{circuitikz}
\end{LTXexample}
+You can change this last thing by forcing ``off'' the status of ``voltage generator'' of the component; but now the normal (passive) rule will apply, so, again, be careful.
+
\begin{LTXexample}[varwidth=true]
\begin{circuitikz}
- \draw (0,0) to[battery,l_=1V, v=$u_1$, i=$i_1$] (2,0);
+ \draw (0,0) to[battery, bipole/is voltage=false,
+ v>=$u_1$,] (2,0);
+\end{circuitikz}
+\end{LTXexample}
+
+As for the currents, the direct label of voltage sources is passed as a voltage:
+
+\begin{LTXexample}[varwidth=true]
+\begin{circuitikz}
+ \draw (0,0) to[cV=$k\cdot a_1$] (2,0);
\end{circuitikz}
\end{LTXexample}
-\subsubsection{Straight European style} Using straight arrows. Use option \texttt{straightvoltages} or style \verb![straight voltages]!, or setting (even locally) \texttt{voltage=straight}. Notice that this is an only lightly tested option, so use with care.
+The following results from using the option \texttt{americanvoltage} or the style \texttt{[american voltages]}.
+
+\begin{LTXexample}[varwidth=true]
+\begin{circuitikz}[american voltages]
+ \draw (0,0) to[V=$a_1$] (2,0);
+\end{circuitikz}
+\end{LTXexample}
+
+\subsubsection{Straight European style} Using straight arrows. Use option \texttt{straightvoltages} or style \verb![straight voltages]!, or setting (even locally) \texttt{voltage=straight}.
\begin{LTXexample}[varwidth=true]
\begin{circuitikz}[straight voltages]
@@ -5772,89 +5846,115 @@ See introduction note at Currents and Voltages (chapter \ref{curr-and-volt}, pag
\end{circuitikz}
\end{LTXexample}
+Again, voltage generators are treated differently:
+
\begin{LTXexample}[varwidth=true]
\begin{circuitikz}[straight voltages]
- \draw (0,0) to[V=10V, i_=$i_1$] (2,0);
+ \draw (0,0) to[V=10V, i_=$i_1$] (3,0);
\end{circuitikz}
\end{LTXexample}
\begin{LTXexample}[varwidth=true]
\begin{circuitikz}[straight voltages]
- \draw (0,0) to[V<=10V, i_=$i_1$] (2,0);
+ \draw (0,0) to[I, v=10V, i_=$i_1$] (3,0);
\end{circuitikz}
\end{LTXexample}
+And you can override that with \texttt{bipole/is voltage} keeping into account that the default direction will be the one of passive components:
+
\begin{LTXexample}[varwidth=true]
\begin{circuitikz}[straight voltages]
- \draw (0,0) to[I=1A, v_=$u_1$] (2,0);
+ \draw (0,0) to[V=10V, bipole/is voltage=false,
+ i_=$i_1$] (3,0);
\end{circuitikz}
\end{LTXexample}
+\subsubsection{American style}
+Use option \texttt{americanvoltage} or set \verb![american voltages]! or use the option \texttt{voltage=american}.
+
\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}[straight voltages]
- \draw (0,0) to[I<=1A, v_=$u_1$] (2,0);
+\begin{circuitikz}[american voltages]
+ \draw (0,0) to[R, v^>=$v_1$] (2,0);
\end{circuitikz}
\end{LTXexample}
\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}[straight voltages]
- \draw (0,0) to[I=$~$,l=1A, v_=$u_1$] (2,0);
+\begin{circuitikz}[american voltages]
+ \draw (0,0) to[R, v^<=$v_1$] (2,0);
\end{circuitikz}
\end{LTXexample}
\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}[straight voltages]
- \draw (0,0) to[I,l=1A, v_=$u_1$] (2,0);
+\begin{circuitikz}[american voltages]
+ \draw (0,0) to[R, v_>=$v_1$] (2,0);
\end{circuitikz}
\end{LTXexample}
\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}[straight voltages]
- \draw (0,0) to[battery,l_=1V, v=$u_1$, i=$i_1$] (2,0);
+\begin{circuitikz}[american voltages]
+ \draw (0,0) to[R, v_<=$v_1$] (2,0);
+\end{circuitikz}
+\end{LTXexample}
+
+\begin{LTXexample}[varwidth=true]
+\begin{circuitikz}[american]
+ \draw (0,0) to[I=1A, v_=$u_1$] (2,0);
\end{circuitikz}
\end{LTXexample}
+\begin{LTXexample}[varwidth=true]
+\begin{circuitikz}[american]
+ \draw (0,0) to[I<=1A, v_=$i_1$] (2,0);
+\end{circuitikz}
+\end{LTXexample}
-\subsubsection{American style}
-Use option \texttt{americanvoltage} or set \verb![american voltages]! or use the option \texttt{voltage=american}.
+
+\subsubsection{Raised American style}
+
+Since version \texttt{1.2.1}, ``raised'' American voltages are available; to use them, set the style \verb![raised voltages]! or use the option \texttt{voltage=raised}.
+This is a version of the American-style voltage where the signs are raised to the level of the label.
+The label is centered between the two signs, and the position of the signs is calculated supposing that the label itself will be pretty simple; if you have very big labels you will need to adjust the position with \texttt{voltage shift} and/or the \texttt{voltage/distance from node} properties (see section~\ref{sec:common-vif-pos}).
\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}[american voltages]
+\begin{circuitikz}[raised voltages]
\draw (0,0) to[R, v^>=$v_1$] (2,0);
\end{circuitikz}
\end{LTXexample}
\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}[american voltages]
+\begin{circuitikz}[raised voltages]
\draw (0,0) to[R, v^<=$v_1$] (2,0);
\end{circuitikz}
\end{LTXexample}
\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}[american voltages]
+\begin{circuitikz}[raised voltages]
\draw (0,0) to[R, v_>=$v_1$] (2,0);
\end{circuitikz}
\end{LTXexample}
\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}[american voltages]
+\begin{circuitikz}[raised voltages]
\draw (0,0) to[R, v_<=$v_1$] (2,0);
\end{circuitikz}
\end{LTXexample}
\begin{LTXexample}[varwidth=true]
\begin{circuitikz}[american]
+ \ctikzset{voltage=raised}
\draw (0,0) to[I=1A, v_=$u_1$] (2,0);
\end{circuitikz}
\end{LTXexample}
\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}[american]
+\begin{circuitikz}[raised voltages]
\draw (0,0) to[I<=1A, v_=$i_1$] (2,0);
\end{circuitikz}
\end{LTXexample}
-\subsubsection{Voltage position}\label{sec:sub-voltage-position} It is possible to move away the arrows and the plus or minus signs with the key \texttt{voltages shift} (default value is \texttt{0}, which gives the standard position):
+\subsubsection{Voltage position}\label{sec:sub-voltage-position}
+
+It is possible to move the arrows and the plus or minus signs away form the component with the key \texttt{voltages shift} (default value is \texttt{0}, which gives the standard position):
\begin{LTXexample}[varwidth=true]
\begin{circuitikz}[]
@@ -5862,7 +5962,7 @@ Use option \texttt{americanvoltage} or set \verb![american voltages]! or use the
\draw (0,-1) to[R, v=$v_1$, i=$i_1$,
voltage shift=0.5] (2,-1);
\draw (0,-2) to[R, v=$v_1$, i=$i_1$,
- voltage shift=1.0, ] (2,-2);
+ voltage shift=1.0] (2,-2);
\end{circuitikz}
\end{LTXexample}
@@ -5872,12 +5972,24 @@ Use option \texttt{americanvoltage} or set \verb![american voltages]! or use the
\end{circuitikz}
\end{LTXexample}
+Negative values do work as expected:
+
+\begin{LTXexample}[varwidth=true]
+\begin{circuitikz}[raised voltages]
+ \draw (0,1.5) to[R, v^=$v_1$, i=$i_1$] ++(2,0);
+ \draw (0,0) to[R, v^=$v_1$, i=$i_1$,
+ voltage shift=-1.0] ++(2,0);
+\end{circuitikz}
+\end{LTXexample}
+
You can fine-tune the position of the \texttt{+} and \texttt{-} symbols and the label in independent way using \texttt{voltage/shift} (default \texttt{0.0} for the former and \texttt{voltage/american label distance} (the distance of the label form the lines of the symbols, default \texttt{1.4}) for the latter.
\begin{LTXexample}[varwidth=true]
\begin{circuitikz}[american voltages]
- \ctikzset{voltage/american label distance=0.2, voltage/shift=2}
- \draw (0,0) to[R, v=$v_1$, i=$i_1$] (2,0);
+ \draw (0,1) to[R, v=$v_1$, i=$i_1$] ++(2,0);
+ % normally 1.4, make it tighter
+ \ctikzset{voltage/american label distance=0.5}
+ \draw (0,0) to[R, v=$v_1$, i=$i_1$] ++(2,0);
\end{circuitikz}
\end{LTXexample}
@@ -5949,32 +6061,6 @@ This could be especially useful if you define a style, to use like this:
\end{LTXexample}
-\subsection{Global properties of voltages and currents}
-
-\begin{LTXexample}[varwidth=true]
-\tikz \draw (0,0) to[R, v=1<\volt>] (2,0); \par
-\ctikzset{voltage/distance from node=.1}
-\tikz \draw (0,0) to[R, v=1<\volt>] (2,0);
-\end{LTXexample}
-
-\begin{LTXexample}[varwidth=true]
-\tikz \draw (0,0) to[C, i=$\imath$] (2,0); \par
-\ctikzset{current/distance = .2}
-\tikz \draw (0,0) to[C, i=$\imath$] (2,0);
-\end{LTXexample}
-
-However, you can override the properties \texttt{voltage/distance from node} (how distant from the initial and final points of the path the arrow starts and ends, default \texttt{0.5}) and \texttt{voltage/bump b} (how high the bump of the arrow is --- how curved it is, default \texttt{1.5}), and also \texttt{voltage/european label distance} (how distant from the ``bump'' the voltage label will be, default \texttt{1.4}) on a per-component basis, in order to fine-tune the voltages:
-
-
-\begin{LTXexample}[varwidth=true]
-\tikz \draw (0,0) to[R, v=1<\volt>] (1.5,0)
- to[C, v=2<\volt>] (3,0); \par
-\ctikzset{bipoles/capacitor/voltage/distance from node/.initial=.7}
-\tikz \draw (0,0) to[R, v=1<\volt>] (1.5,0)
- to[C, v=2<\volt>] (3,0); \par
-\end{LTXexample}
-
-Note the \texttt{.initial}; you have to create such key the first time you use it.
\subsection{Changing the style of labels and text ornaments}
@@ -5987,7 +6073,7 @@ For example, you can make all annotations small by using:
\ctikzset{bipole annotation style/.style={font=\small}}
\end{lstlisting}
-And the change (override) the setting in one specific bipole using:
+And/or change (override) the setting in one specific bipole using:
\begin{lstlisting}[numbers=none]
...to[bipole annotation style={color=red}, R, a={Red note}]...
@@ -6017,141 +6103,231 @@ The available styles and commands are \texttt{bipole label style}, \texttt{bipol
\end{circuitikz}
\end{LTXexample}
-\subsection{Labels in special components}
-
-For some components label, current and voltage behave as one would expect:
+\subsection{Accessing labels text nodes}
-\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}
- \draw (0,0) to[I=$a_1$] (2,0);
-\end{circuitikz}
-\end{LTXexample}
+Since 0.9.5, you can access all the labels nodes\footnote{The access to \texttt{label}s and \texttt{annotation}s was present before, but not documented.} using special node names. So, if you use \texttt{name} to give a name to the bipole node, you can access also the following nodes: \texttt{namelabel} (notice: no space nor any other symbol between \texttt{name} and \texttt{label}!), \texttt{nameannotation}, \texttt{namevoltage}, \texttt{namecurrent} and \texttt{nameflow}. Notice that the node names are available only if the bipole has an anchor or an annotation, of course.
-\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}
- \draw (0,0) to[I, i=$a_1$] (2,0);
+\begin{LTXexample}[varwidth=true,
+ pos=t, basicstyle=\small\ttfamily
+ ]
+\newcommand{\marknode}[2][45]{%
+ \node[circle, draw, red, inner sep=1pt,
+ pin={[red, font=\tiny]#1:#2}] at (#2.center) {};
+}
+\begin{circuitikz}[ american]
+ \draw (0,0) to [R=L1, a=A1, name=L1] ++(3,0)
+ to [R, l2_=L2 and 2L, a^=A2, name=L2] ++(3,0);
+ \marknode{L1} \marknode{L1label} \marknode[0]{L1annotation}
+ \marknode{L2} \marknode[0]{L2label} \marknode{L2annotation}
+ \draw[blue] (L2label.south west) rectangle (L2label.north east);
+ \draw (6.1,0) to [R=R1, v=V1, i=I1, f>^=F1, name=R1] ++(3,0)
+ to [R, v<=V2, i^=I2, f>^=F2, name=R2] ++(3,0);
+ \marknode[0]{R1voltage} \marknode[0]{R2voltage} \marknode[90]{R1current}
+ \marknode[90]{R2current} \marknode{R1flow} \marknode{R2flow}
\end{circuitikz}
\end{LTXexample}
+\subsection{Advanced voltages, currents and flows}\label{sec:vif-anchors}
-\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}
- \draw (0,0) to[cI=$k\cdot a_1$] (2,0);
-\end{circuitikz}
-\end{LTXexample}
+Since version \texttt{1.2.1}, it is possible to access the anchors of the ``ornaments'' --- voltage, current and flows, together with some additional information that makes it possible to personalize them.
+Normally, voltages and flow and currents are drawn into the path of the bipoles, so that it is not possible, for example, to change the line type or color of the arrows, or the type of arrows\footnote{in regular voltages, the arrows are not real \TikZ{} arrows, but the auxiliary arrow shapes of \Circuitikz{}}. Access to the anchors allows to do all this things, and more.
+For example, you can do something like this:
-\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}
- \draw (0,0) to[sI=$a_1$] (2,0);
+\begin{LTXexample}[varwidth=true, basicstyle=\small\ttfamily]
+\begin{circuitikz}[]
+ \draw (0,1) to[R, v=$v$] ++(3,0);
+ \draw (0,0) to[R, v, name=R, voltage/bump b=3] ++(3,0);
+ \draw [thin, red, -{Stealth[width=8pt]}, ]
+ (R-Vfrom) .. controls (R-Vcont1) and (R-Vcont2).. (R-Vto)
+ node [black, pos=0.5, fill=white]{v};
\end{circuitikz}
\end{LTXexample}
-\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}
- \draw (0,0) to[csI=$k\cdot a_1$] (2,0);
+Or, for example, to have a different voltage style; normally you would define a macro:
+
+\begin{LTXexample}[varwidth=true, basicstyle=\small\ttfamily]
+\begin{circuitikz}[voltage shift=0.5]
+ \def\eurVPM#1#2{% node, label
+ \draw [thin, -{Stealth[width=8pt]}, shorten >=5pt,
+ shorten <=5pt] (#1-Vfrom) node[font=\tiny]{$-$}
+ .. controls (#1-Vcont1) and (#1-Vcont2)..
+ (#1-Vto) node[font=\tiny]{$+$}
+ node[pos=0.5,anchor=\ctikzgetanchor{#1}{Vlab}]{#2};}
+ \draw (0,0) to[R=R1, name=R1, v, i=$i$] ++(3,0)
+ to[R, l_=R2, v^, name=R2] ++(0,-3);
+ \eurVPM{R1}{$v_1$} \eurVPM{R2}{$v_2$}
\end{circuitikz}
\end{LTXexample}
-The following results from using the option \texttt{americancurrent} or using the style \texttt{[american currents]}.
+\subsubsection{Activating the anchors}
-\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}[american currents]
- \draw (0,0) to[I=$a_1$] (2,0);
-\end{circuitikz}
-\end{LTXexample}
+You will have access to the anchors for voltages, currents and flows when, in the bipole, you have both a \texttt{v}, \texttt{i}, \texttt{f} specification (one or more of them) \textbf{and} a \texttt{name} key, to give the bipole a name. Otherwise, the anchors and the associated functions are not defined.
+To suppress the normal output of the \texttt{v}, \texttt{i}, \texttt{f} keys, you can use such keys without any argument, like in the previous example; notice that the \verb|_| and \verb|^| modifiers work as expected.
-\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}[american currents]
- \draw (0,0) to[I, i=$a_1$] (2,0);
-\end{circuitikz}
-\end{LTXexample}
+The following line of resistors has been drawn with the following commands; it is used to show the name of the available anchors.
+\begin{lstlisting}
+ \draw (0,0) to[R=R1, v=$v$, name=R1] ++(4,0)
+ to[R, l_=R2, i=$i$, name=R2] ++(4,0)
+ to[R=R3, f=$f$, name=R3] ++(4,0);
+\end{lstlisting}
-\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}[american currents]
- \draw (0,0) to[cI=$k\cdot a_1$] (2,0);
+\begin{circuitikz}[]
+ \draw (0,0) to[R=R1, v=$v$, name=R1] ++(4,0) to[R, l_=R2, i=$i$, name=R2] ++(4,0) to[R=R3, f=$f$, name=R3] ++(4,0);
+ \path
+ (R1-Vto) \showcoord(R1-Vto)<-135:0.2>
+ (R1-Vfrom) \showcoord(R1-Vfrom)<-45:0.2>
+ (R1-Vcont1) \showcoord(R1-Vcont1)<-45:0.2>
+ (R1-Vcont2) \showcoord(R1-Vcont2)<-135:0.2>
+ (R1-Vlab) \showcoord(R1-Vlab)<-90:0.5>
+ (R2-Ito) \showcoord(R2-Ito)<45:0.3>
+ (R2-Ifrom) \showcoord(R2-Ifrom)<135:0.3>
+ (R2-Ipos) \showcoord(R2-Ipos)<-90:0.3>
+ (R3-Fto) \showcoord(R3-Fto)<45:0.3>
+ (R3-Ffrom) \showcoord(R3-Ffrom)<135:0.3>
+ (R3-Fpos) \showcoord(R3-Fpos)<-90:0.4>
+ ;
\end{circuitikz}
-\end{LTXexample}
+The meaning of the anchors is the following:
+\begin{itemize}
+\item
+ \texttt{Vfrom} and \texttt{Vto} are the main points where the voltage information is given: start and end point of the arrow, or position of the $+$ or $-$ sign. This is the same for the \texttt{Ffrom} or \texttt{Fto} anchors for flows; for inline currents, the corresponding \texttt{Ifrom} and \texttt{Ito} mark the wire segment where the arrowhead is positioned (at the specified \texttt{current/distance} fraction. The direction of the arrow is available using the auxiliary macro \verb|\ctikzgetdirection| (see below).
+\item
+ \texttt{Vcont1} and \texttt{Vcont2} are the control points for the curved arrow (see the examples above); in the case of straight arrows or american-style voltages, they are set at the midpoint between \texttt{Vfrom} and \texttt{Vto}.
+\item
+ \texttt{Vlab} is where the text label for the voltage is normally positioned. The anchor used for such label is available using the auxiliary macro \verb|\ctikzgetanchor| (see below)
+\item
+ \texttt{Ipos} and \texttt{Fpos} are the position for the arrowhead or the small flow arrow (which is a \texttt{currarrow} or \texttt{flowarrow} node normally) is positioned, respectively. The label is then added to the correct side of it using the anchor available via \verb|\ctikzgetanchor|.\footnote{In this case, the exact position of the label is not available if you do not position the element, for this there is no \texttt{Flab} or \texttt{Ilab} coordinate; you have to use the \texttt{Fpos} and \texttt{Ipos} coordinate with the corresponding \texttt{Ilab} and \texttt{Flab} anchors.}
+\end{itemize}
-\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}[american currents]
- \draw (0,0) to[sI=$a_1$] (2,0);
-\end{circuitikz}
-\end{LTXexample}
+Changing the options of the elements, will change the anchors acoordingly:
-\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}[american currents]
- \draw (0,0) to[csI=$k\cdot a_1$] (2,0);
+\begin{lstlisting}
+ \ctikzset{current/distance=0.2}
+ \draw (0,0) to[R=R1, v>=$v$, name=R1] ++(4,0)
+ to[R, l_=R2, i<_=$i$, name=R2] ++(4,0)
+ to[R, l_=R3, f<_=$f$, name=R3] ++(4,0);
+\end{lstlisting}
+
+\begin{circuitikz}[]
+ \ctikzset{current/distance=0.2}
+ \draw (0,0) to[R=R1, v>=$v$, name=R1] ++(4,0) to[R, l_=R2, i<_=$i$, name=R2] ++(4,0) to[R, l_=R3, f<_=$f$, name=R3] ++(4,0);
+ \path
+ (R1-Vto) \showcoord(R1-Vto)<-45:0.2>
+ (R1-Vfrom) \showcoord(R1-Vfrom)<-135:0.2>
+ (R1-Vcont1) \showcoord(R1-Vcont1)<-135:0.2>
+ (R1-Vcont2) \showcoord(R1-Vcont2)<-45:0.2>
+ (R1-Vlab) \showcoord(R1-Vlab)<-90:0.5>
+ (R2-Ito) \showcoord(R2-Ito)<135:0.3>
+ (R2-Ifrom) \showcoord(R2-Ifrom)<45:0.3>
+ (R2-Ipos) \showcoord(R2-Ipos)<90:0.3>
+ (R3-Fto) \showcoord(R3-Fto)<90:0.4>
+ (R3-Ffrom) \showcoord(R3-Ffrom)<80:0.4>
+ (R3-Fpos) \showcoord(R3-Fpos)<-90:0.4>
+ ;
\end{circuitikz}
-\end{LTXexample}
-The same holds for voltage sources:
+Obviously, the anchors follow the voltage style you choose:
-\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}
- \draw (0,0) to[V=$a_1$] (2,0);
-\end{circuitikz}
-\end{LTXexample}
+\begin{lstlisting}
+ \draw (0,0) to[R=R1, v=$v$, name=R1, voltage=straight] ++(4,0)
+ to[R=R2, v=$v$, name=R2, voltage=american] ++(4,0)
+ to[R=R3, v=$v$, name=R3, voltage=raised] ++(4,0);
+\end{lstlisting}
-\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}
- \draw (0,0) to[V, v=$a_1$] (2,0);
+\begin{circuitikz}[]
+ \ctikzset{current/distance=0.2}
+ \draw (0,0) to[R=R1, v=$v$, name=R1, voltage=straight] ++(4,0)
+ to[R=R2, v=$v$, name=R2, voltage=american] ++(4,0)
+ to[R=R3, v=$v$, name=R3, voltage=raised] ++(4,0);
+ \foreach \i in {1, 2, 3} {
+ \path
+ (R\i-Vto) \showcoord(R\i-Vto)<-90:0.4>
+ (R\i-Vfrom) \showcoord(R\i-Vfrom)<-90:0.4>
+ (R\i-Vcont1) \showcoord(R\i-Vcont1)<135:0.6>
+ (R\i-Vcont2) \showcoord(R\i-Vcont2)<45:0.6>
+ (R\i-Vlab) \showcoord(R\i-Vlab)<-90:0.6>
+ ;
+ }
\end{circuitikz}
-\end{LTXexample}
+Notice the postion of the control points, as well as the fact that the anchor available with \verb|\ctikzgetanchor| is applied to \texttt{Vfrom} and \texttt{Vto} symbols, too.
-\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}
- \draw (0,0) to[cV=$k\cdot a_1$] (2,0);
-\end{circuitikz}
-\end{LTXexample}
+Finally, as ever, generators are treated differently, but you have all your anchors too.
+\begin{lstlisting}
+ \ctikzset{american}
+ \draw (0,0) to[V=$v$, name=G1, voltage=european] ++(4,0)
+ to[V=$v$, v=$v$, name=G2, voltage=american] ++(4,0)
+ to[battery2, v=$v$, name=G3, voltage=raised] ++(4,0);
+\end{lstlisting}
-\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}
- \draw (0,0) to[sV=$a_1$] (2,0);
+\begin{circuitikz}[]
+ \ctikzset{american}
+ \draw (0,0) to[V=$v$, name=G1, voltage=european] ++(4,0)
+ to[V=$v$, v=$v$, name=G2, voltage=american] ++(4,0)
+ to[battery2, v=$v$, name=G3, voltage=raised] ++(4,0);
+ \foreach \i in {1, 2, 3} {
+ \path
+ (G\i-Vto) \showcoord(G\i-Vto)<-60:0.1>
+ (G\i-Vfrom) \showcoord(G\i-Vfrom)<-120:0.1>
+ (G\i-Vlab) \showcoord(G\i-Vlab)<90:0.3>
+ ;
+ }
\end{circuitikz}
-\end{LTXexample}
-\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}
- \draw (0,0) to[csV=$k\cdot a_1$] (2,0);
-\end{circuitikz}
-\end{LTXexample}
+\subsubsection{Auxiliary information}
-The following results from using the option \texttt{americanvoltage} or the style \texttt{[american voltages]}.
+When the anchors are activated, there are additional macros that you can use:
+\begin{itemize}
+ \item \texttt{\textbackslash ctikzgetanchor\{\emph{<name>}\}\{\emph{<anchor>}\}}: \emph{name} is the name of the bipole, and \emph{anchor} can be \texttt{Vlab}, \texttt{Fpos} or \texttt{Ipos}. This macro expands to the normal anchor position (something like \texttt{north}, \texttt{south west}). Notice that if you have not activated the corresponding anchor, the content of this macro is not specified. It could be equivalent to \verb|\relax| (basically, empty) or contains the anchor of a bipole with the same name from another drawing --- it's a global macro like the coordinates.
+ \item \texttt{\textbackslash ctikzgetdirection\{\emph{<name>}\}}: a number which is the direction of the \emph{name}d bipole.
+\end{itemize}
-\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}[american voltages]
- \draw (0,0) to[V=$a_1$] (2,0);
-\end{circuitikz}
-\end{LTXexample}
+For example, you could like the voltage label oriented with the bipole:
-\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}[american voltages]
- \draw (0,0) to[V, v=$a_1$] (2,0);
+\begin{LTXexample}[varwidth=true, basicstyle=\small\ttfamily]
+\begin{circuitikz}[]
+ \def\myvv#1#2{%
+ \draw [thin, blue, ->,]
+ (#1-Vfrom) .. controls (#1-Vcont1) and (#1-Vcont2).. (#1-Vto)
+ node [pos=0.5, below,
+ rotate=\ctikzgetdirection{#1}] at (#1-Vlab) {#2}; }
+ \draw (0,0) to[R, v, name=A] ++(3,0);
+ \draw (0,0) to[R, v, name=B] ++(3,3);
+ \myvv{A}{$v_A$}\myvv{B}{$v_B$}
\end{circuitikz}
\end{LTXexample}
+Or you could use the anchor to substitute the flow with a fancy one and still position automatically the label; suppose you have the following definition in your preamble (see \TikZ{} manual, ``Path decorations''):
-\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}[american voltages]
- \draw (0,0) to[cV=$k v_e$] (2,0);
-\end{circuitikz}
-\end{LTXexample}
-
+\begin{lstlisting}
+% requires \usetikzlibrary{decorations, decorations.pathmorphing}
+\tikzset{%
+lray/.style={decorate, decoration={
+ snake, amplitude=2pt,pre length=1pt,post length=2pt, segment length=5pt,},
+ -Triangle,
+}}
+\end{lstlisting}
+\tikzset{%
+lray/.style={decorate, decoration={
+ snake, amplitude=2pt,pre length=1pt,post length=2pt, segment length=5pt, },
+ -Triangle,
+}}
-\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}[american voltages]
- \draw (0,0) to[sV=$a_1$] (2,0);
-\end{circuitikz}
-\end{LTXexample}
+You can then define a kind of ``power flow'' style:
-\begin{LTXexample}[varwidth=true]
-\begin{circuitikz}[american voltages]
- \draw (0,0) to[csV=$k v_e$] (2,0);
+\begin{LTXexample}[varwidth=true, basicstyle=\small\ttfamily]
+\begin{circuitikz}[]
+ \newcommand\myff[3][blue]{% [opt: color] node label
+ \draw [lray, #1, ] (#2-Ffrom) -- (#2-Fto)
+ node [anchor=\ctikzgetanchor{#2}{Flab}, inner sep=4pt]
+ at (#2-Fpos) {#3};}
+ \draw (0,1) to[R, f, name=A] ++(3,0);
+ \draw (0,0) to[R, f_<, name=B] ++(3,0);
+ \myff{A}{$P_A$}\myff[red]{B}{$P_B$}
\end{circuitikz}
\end{LTXexample}
@@ -6195,30 +6371,6 @@ If the option {\ttfamily siunitx} is active (and \emph{not} in \ConTeXt), then t
\end{circuitikz}
\end{LTXexample}
-\subsection{Accessing labels text nodes}
-
-Since 0.9.5, you can access all the labels nodes\footnote{The access to \texttt{label}s and \texttt{annotation}s was present before, but not documented.} using special node names. So, if you use \texttt{name} to give a name to the bipole node, you can access also the following nodes: \texttt{namelabel} (notice: no space nor any other symbol between \texttt{name} and \texttt{label}!), \texttt{nameannotation}, \texttt{namevoltage}, \texttt{namecurrent} and \texttt{nameflow}.
-
-\begin{LTXexample}[varwidth=true,
- pos=t, basicstyle=\small\ttfamily
- ]
-\newcommand{\marknode}[2][45]{%
- \node[circle, draw, red, inner sep=1pt,
- pin={[red, font=\tiny]#1:#2}] at (#2.center) {};
-}
-\begin{circuitikz}[ american]
- \draw (0,0) to [R=L1, a=A1, name=L1] ++(3,0)
- to [R, l2_=L2 and 2L, a^=A2, name=L2] ++(3,0);
- \marknode{L1} \marknode{L1label} \marknode[0]{L1annotation}
- \marknode{L2} \marknode[0]{L2label} \marknode{L2annotation}
- \draw[blue] (L2label.south west) rectangle (L2label.north east);
- \draw (6.1,0) to [R=R1, v=V1, i=I1, f>^=F1, name=R1] ++(3,0)
- to [R, v<=V2, i^=I2, f>^=F2, name=R2] ++(3,0);
- \marknode[0]{R1voltage} \marknode[0]{R2voltage} \marknode[90]{R1current}
- \marknode[90]{R2current} \marknode{R1flow} \marknode{R2flow}
-\end{circuitikz}
-\end{LTXexample}
-
\section{Using bipoles in circuits}
@@ -6354,7 +6506,7 @@ There are several predefined shorthand as the above; in the following pages you
\end{circuitikz}
\end{LTXexample}
-\subsubsection{Transparent poles}
+\subsubsection{Transparent poles}\label{sec:transparent-poles}
``Open-poles'' terminals (\texttt{ocirc}, \texttt{odiamondpole}, and \texttt{osquarepole}) are normally filled with the background color at full opacity. This is because, for simplicity of operation, the nodes are placed \emph{after} the wires are drawn and have to ``white-out'' the underlying lines.
@@ -6363,14 +6515,16 @@ Anyway, \emph{if you know what you are doing}, you can change it with the key \t
\begin{LTXexample}[pos=t, basicstyle=\small\ttfamily]
\begin{circuitikz}[scale=3, transform shape]
\fill[cyan] (0,0) rectangle (4.1,-0.6);
- \tikzset{halfwhite/.style={fill opacity=0.5, fill=white, open poles opacity=0.5}}
+ \tikzset{open poles opacity=0.5}
% automatic positioning when opacity is not 1.0 creates artifacts
- \draw[halfwhite] (0,0) to[generic, -o] ++(2,0) --++(0,-0.5);
+ % note that opacity must go on the draw command for path-style components
+ \draw[fill opacity=0.5] (0,0) to[generic, fill=white, -o] ++(2,0) --++(0,-0.5);
% you have to use manual positioning
- \draw[halfwhite] (2.2,0) -- ++(0.5,0) node[ocirc, anchor=180]{};
- \draw[halfwhite] (3,0) node[ocirc](B){} (B.0) --++(0.5,0) (B.-90) --++(0,-0.5);
+ \draw (2.2,0) -- ++(0.5,0) node[ocirc, anchor=180, fill opacity=0.5]{};
+ \draw (3,0) node[ocirc, fill opacity=0.5](B){} (B.0) --++(0.5,0) (B.-90) --++(0,-0.5);
% maybe really useful only for terminals going out of the circuit...
- \draw (3.6,0) -- ++(0.2,0) node[ocirc, halfwhite, anchor=180]{};
+ % notice that in node commands you can specify the opacity directly
+ \draw (3.6,0) -- ++(0.2,0) node[ocirc, fill=white, fill opacity=0.5, anchor=180]{};
\end{circuitikz}
\end{LTXexample}
@@ -6457,9 +6611,17 @@ To correct the line ending, there are support shapes to fill the missing rectang
\end{tikzpicture}
\end{LTXexample}
-
\section{Colors}
+Color support in \Circuitikz{} is quite limited. You will have no problem if:
+\begin{enumerate}
+ \item You stick to use styles (see~\ref{sec:styling-fillcolor}) for filling your components, or using a direct \texttt{fill=...} option directly;
+ \item when coloring whole circuits, use the option \texttt{color=...} in your global picture options or in the \verb|\draw| command (not just the color name as a shorthand);
+ \item forget about transparency.
+\end{enumerate}
+
+Nevertheless, if you really need to do strange things with colors you can read on; you can do almost everything but there are several glitches to take into account.
+
\subsection{Shape colors}
The color of the components is stored in the key \verb!\circuitikzbasekey/color!. Circui\TikZ\ tries to follow the color set in \TikZ, although sometimes it fails. If you change color in the picture, please do not use just the color name as a style, like \verb![red]!, but rather assign the style \verb![color=red]!.
@@ -6583,20 +6745,23 @@ A workaround is shown in port \texttt{3}:
;\end{circuitikz}
\end{LTXexample}
-Notice also that the connection point are always filled, although the color \emph{tries} to follow the color of the filling of the component:
+Notice also that the connection point are always filled, although the color \emph{tries} to follow the color of the filling of the component (but look at section~\ref{sec:transparent-poles}). Moreover, if you want to pass fill transparency down to path-style components, you \emph{have} to put it into the options of the \verb|\draw| command.
\begin{LTXexample}[varwidth=true, pos=t]
\begin{circuitikz}
\fill[cyan] (0,3.0) rectangle (7,7);
- \draw [fill=yellow, ] (4,4) to [D,o-o] ++(0,2) to[D*, fill=yellow] ++(2,0)
- to[D*] ++(0,-2) to[D, fill=red, o-o] ++(-2,0);
- \draw (1,4) node[ocirc]{} -- ++(1,0) node[ocirc]{};
- \draw (1,4.5) to[short, o-o] ++(1,0) to[short, -o] ++(1,0);
- \draw[fill=yellow] (1,5) to[short, o-o] ++(1,0) to[short, -o] ++(1,0);
+ \draw [fill opacity=0.5] (1,6.5) to[generic, fill=white,o-o] ++(2,0);
\draw (1,5.5) to[short, fill=red, o-o] ++(1,0) to[short, -o] ++(1,0);
+ \draw[fill=yellow] (1,5) to[short, o-o] ++(1,0) to[short, -o] ++(1,0);
+ \draw (1,4.5) to[short, o-o] ++(1,0) to[short, -o] ++(1,0);
+ \draw (1,4) node[ocirc]{} -- ++(1,0) node[ocirc]{};
+ \draw [thick, color=green!50!black] (4,4) to [D,o-o,fill=yellow] ++(0,2) to[D*, fill=yellow]
+ ++(2,0) to[D*,fill=yellow] ++(0,-2) to[D, fill=red, o-o] ++(-2,0);
\end{circuitikz}
\end{LTXexample}
+As you can see, the ``black'' components (as \texttt{D*}) follow the color of the line, not the fill.
+
\section{FAQ}
\noindent Q: When using \verb!\tikzexternalize! I get the following error:
@@ -7197,3 +7362,4 @@ Here a series of example, contributed by several people, is shown with their cod
\printindex
\end{document}
+% vim: set fdm=marker fmr=%<<<,%>>>:
diff --git a/graphics/pgf/contrib/circuitikz/doc/ctikzmanutils.sty b/graphics/pgf/contrib/circuitikz/doc/ctikzmanutils.sty
index 38bf7716fc..f402c9fa73 100644
--- a/graphics/pgf/contrib/circuitikz/doc/ctikzmanutils.sty
+++ b/graphics/pgf/contrib/circuitikz/doc/ctikzmanutils.sty
@@ -17,7 +17,7 @@
\RequirePackage{showexpl}
\RequirePackage{ragged2e}
% for some example we need them...
-\usetikzlibrary{calc,fit}
+\usetikzlibrary{calc,fit, decorations, decorations.pathmorphing}
\RequirePackage{upgreek}
%
% The following trick is used to silence showexpl a bit, so that the
@@ -135,6 +135,11 @@
[blue, inner sep=0.5pt, font=\small,
pin distance=#3\pgf@circ@Rlen, pin edge={blue, }%
]#2:#1}](#1){}}
+ \def\showcoordwc[#1](#2)<#3:#4>{%
+ node[circle, #1, draw, inner sep=1pt,pin={%
+ [#1, inner sep=0.5pt, font=\small,
+ pin distance=#4\pgf@circ@Rlen, pin edge={#1, }%
+ ]#3:#2}](#2){}}
\makeatother
% show anchors of a node component:
% optional: options of the circuitikz environment
diff --git a/graphics/pgf/contrib/circuitikz/tex/circuitikz.sty b/graphics/pgf/contrib/circuitikz/tex/circuitikz.sty
index 5f72a46277..c1e8d1808c 100644
--- a/graphics/pgf/contrib/circuitikz/tex/circuitikz.sty
+++ b/graphics/pgf/contrib/circuitikz/tex/circuitikz.sty
@@ -12,8 +12,8 @@
\NeedsTeXFormat{LaTeX2e}
-\def\pgfcircversion{1.2.0}
-\def\pgfcircversiondate{2020/06/21}
+\def\pgfcircversion{1.2.1}
+\def\pgfcircversiondate{2020/07/06}
\ProvidesPackage{circuitikz}%
[\pgfcircversiondate{} The CircuiTikz circuit drawing package version \pgfcircversion]
diff --git a/graphics/pgf/contrib/circuitikz/tex/pgfcirc.defines.tex b/graphics/pgf/contrib/circuitikz/tex/pgfcirc.defines.tex
index af70e82d75..e3686e4d94 100644
--- a/graphics/pgf/contrib/circuitikz/tex/pgfcirc.defines.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/pgfcirc.defines.tex
@@ -9,9 +9,10 @@
% 2. under the GNU Public License.
%
% See the files gpl-3.0_license.txt and lppl-1-3c_license.txt for more details.
-
%
-%% Key managements
+% This file has folding marks for vim (See last line).
+%
+%% Key managements%<<<1
\long\def\pgf@circ@comment#1{}
@@ -24,15 +25,17 @@
\def\ctikzvalof#1{\pgfkeysvalueof{\circuitikzbasekey/#1}}
\def\ctikzsetvalof#1#2{\pgfkeyssetvalue{\circuitikzbasekey/#1}{#2}}
-%% Temporary Counters
+\pgfkeys{\circuitikzbasekey/.search also={/tikz}}
+%%>>>
+%% Temporary Counters and dimensions%<<<1
+%% Temporary Counters
\newcount\pgf@circ@count@a
\newcount\pgf@circ@count@b
\newcount\pgf@circ@count@c
%%%%%%%%%%%%
%% Dimensions
-
-% coordinates
+% coordinate
\newdimen\pgf@circ@res@up
\newdimen\pgf@circ@res@down
\newdimen\pgf@circ@res@zero
@@ -41,10 +44,19 @@
\newdimen\pgf@circ@res@other
\newdimen\pgf@circ@res@step
\newdimen\pgf@circ@res@temp
+% Base len for all circuitikz
+\newdimen\pgf@circ@Rlen
+% scaled length for internal use in scalable shapes
+\newdimen\pgf@circ@scaled@Rlen
+\ctikzset{bipoles/length/.code={\pgf@circ@Rlen = #1\pgf@circ@scaled@Rlen=\pgf@circ@Rlen}}
+\pgf@circ@Rlen = 1.4cm
+% by default scale is 1.0
+\pgf@circ@scaled@Rlen=\pgf@circ@Rlen
% inital thickness
\newdimen \pgfstartlinewidth
+%%>>>
-% arrow tips, ported over old arrows library (deprecated)
+% arrow tips, ported over old arrows library (deprecated)%<<<1
% see https://tex.stackexchange.com/questions/234084/latex-arrow-tip-with-arrows-meta-library
% this was the original definition of latex' tips, renamed to avoid clashes
%
@@ -76,6 +88,9 @@
}
\pgfarrowsdeclarereversed{latexslim reversed}{latexslim reversed}{latexslim}{latexslim}
+%%>>>
+
+%% Macros to do things depending on the class%<<<1
\def\pgf@circ@setifdefinedfill#1#2{%
% if \ctikzclass is defined and \ctikzclass/fill is defined and is not none:
@@ -150,8 +165,9 @@
}
% use \pgf@circ@setlinewidth{none}{\pgflinewidth} if there is no legacy case
\ctikzset{none/thickness/.initial=1.0} % do not touch
+%%>>>
-%% font changes compatible with plain/LaTeX/ConTeXt
+%% font changes compatible with plain/LaTeX/ConTeXt%<<<1
%% thanks to Henri Menke https://github.com/circuitikz/circuitikz/issues/285#issuecomment-537224605
\ifpgfutil@format@is@latex
@@ -203,8 +219,10 @@
{{}}% #1 is \relax, so consider empty
{\expandafter{#1}}% otherwise, leave the key after one more expansion
}%
-%
-% text position (added with ieeestd logic ports. Maybe to be extended to other components,
+%>>>
+
+% text position in some component.%<<<1
+% (added with ieeestd logic ports. Maybe to be extended to other components,
% like amplifiers)
%
\newif\ifpgf@circ@center@text\pgf@circ@center@texttrue
@@ -215,8 +233,9 @@
\ctikzset{component text/center/.code={\pgf@circ@center@texttrue}}%
\ctikzset{component text/left/.code={\pgf@circ@center@textfalse}}%
\ctikzset{left text distance/.initial=0.3em}%
+%>>>
-% voltage options
+% voltage direction options%<<<1
\newif\ifpgf@circ@siunitx
\newif\ifpgf@circuit@compat
@@ -229,54 +248,109 @@
\ctikzset{voltage dir/noold/.code={\pgf@circ@oldvoltagedirectionfalse\pgf@circ@fixbatteriesfalse}}
\ctikzset{voltage dir/RP/.code={\pgf@circ@oldvoltagedirectiontrue\pgf@circ@fixbatteriestrue}}
\ctikzset{voltage dir/EF/.code={\pgf@circ@oldvoltagedirectionfalse\pgf@circ@fixbatteriestrue}}
-\tikzset{voltage dir/.style={circuitikz/voltage dir=#1}}
+\tikzset{voltage dir/.style={circuitikz/voltage dir=#1}}%
+%>>>
-% Option ">" for twoports
-\newif\ifpgf@circuit@inputarrow
-\ctikzset{>/.add code={}{\pgf@circuit@inputarrowtrue}}
-\ctikzset{inputarrow/.is choice}
-\ctikzset{inputarrow/true/.code={\pgf@circuit@inputarrowtrue}}
-\ctikzset{inputarrow/false/.code={\pgf@circuit@inputarrowfalse}}
+% bipole definitions for path component and text decorations%%<<<1
+%
+% Option "t=*" for nodes
+\pgfkeys{/tikz/t/.add code={}{\ctikzset{text=#1}}}
+%
+\ctikzset{bipole/.is family}
+\ctikzset{bipole/kind/.initial=}
+\ctikzset{bipole/name/.initial=}
+\newif\ifpgf@circuit@bipole@isvoltage
+\ctikzset{bipole/is voltage/.is if=pgf@circuit@bipole@isvoltage}
+\newif\ifpgf@circuit@bipole@voltageoutsideofsymbol
+\ctikzset{bipole/is voltageoutsideofsymbol/.is if=pgf@circuit@bipole@voltageoutsideofsymbol}
+\newif\ifpgf@circuit@bipole@strokedsymbol
+\ctikzset{bipole/is strokedsymbol/.is if=pgf@circuit@bipole@strokedsymbol}
+\newif\ifpgf@circuit@bipole@iscurrent
+\ctikzset{bipole/is current/.is if=pgf@circuit@bipole@iscurrent}
-% Option "boxed" for nodes and twoports
-\newif\ifpgf@circuit@boxed
-\pgfkeys{/tikz/boxed/.add code={}{\pgf@circuit@boxedtrue}}
-\ctikzset{boxed/.add code={}{\pgf@circuit@boxedtrue}}
-\pgfkeys{/tikz/box/.add code={}{\pgf@circuit@boxedtrue}}
-\ctikzset{box/.add code={}{\pgf@circuit@boxedtrue}}
+\ctikzset{bipole/voltage/.is family}
+\newif\ifpgf@circuit@bipole@voltage@backward
+\ctikzset{bipole/voltage/direction/.is choice}
+\ctikzset{bipole/voltage/direction/forward/.code={\pgf@circuit@bipole@voltage@backwardfalse}}
+\ctikzset{bipole/voltage/direction/backward/.code={\pgf@circuit@bipole@voltage@backwardtrue}}
+\newif\ifpgf@circuit@bipole@voltage@below
+\ctikzset{bipole/voltage/position/.is choice}
+\ctikzset{bipole/voltage/position/above/.code={\pgf@circuit@bipole@voltage@belowfalse}}
+\ctikzset{bipole/voltage/position/below/.code={\pgf@circuit@bipole@voltage@belowtrue}}
-% Option "dashed" for nodes and twoports
-\newif\ifpgf@circuit@dashed
-\pgfkeys{/tikz/dashed/.add code={}{\pgf@circuit@dashedtrue}}
-\ctikzset{dashed/.add code={}{\pgf@circuit@dashedtrue}}
+\ctikzset{bipole/voltage/label/unit/.initial=}
+\ctikzset{bipole/voltage/label/name/.initial=}
-% Option "t=*" for nodes
-\pgfkeys{/tikz/t/.add code={}{\ctikzset{text=#1}}}
+\ctikzset{bipole/current/.is family}
+\newif\ifpgf@circuit@bipole@current@backward
+\ctikzset{bipole/current/direction/.is choice}
+\ctikzset{bipole/current/direction/forward/.code={\pgf@circuit@bipole@current@backwardfalse}}
+\ctikzset{bipole/current/direction/backward/.code={\pgf@circuit@bipole@current@backwardtrue}}
+\newif\ifpgf@circuit@bipole@current@before
+\ctikzset{bipole/current/x position/.is choice}
+\ctikzset{bipole/current/x position/after/.code={\pgf@circuit@bipole@current@beforefalse}}
+\ctikzset{bipole/current/x position/before/.code={\pgf@circuit@bipole@current@beforetrue}}
+\newif\ifpgf@circuit@bipole@current@below
+\ctikzset{bipole/current/y position/.is choice}
+\ctikzset{bipole/current/y position/above/.code={\pgf@circuit@bipole@current@belowfalse}}
+\ctikzset{bipole/current/y position/below/.code={\pgf@circuit@bipole@current@belowtrue}}
+\ctikzset{bipole/current/label/unit/.initial=}
+\ctikzset{bipole/current/label/name/.initial=}
-\ctikzset{current arrow scale/.initial=16}
+\ctikzset{bipole/flow/.is family}
+\newif\ifpgf@circuit@bipole@flow@backward
+\ctikzset{bipole/flow/direction/.is choice}
+\ctikzset{bipole/flow/direction/forward/.code={\pgf@circuit@bipole@flow@backwardfalse}}
+\ctikzset{bipole/flow/direction/backward/.code={\pgf@circuit@bipole@flow@backwardtrue}}
+\newif\ifpgf@circuit@bipole@flow@before
+\ctikzset{bipole/flow/x position/.is choice}
+\ctikzset{bipole/flow/x position/after/.code={\pgf@circuit@bipole@flow@beforefalse}}
+\ctikzset{bipole/flow/x position/before/.code={\pgf@circuit@bipole@flow@beforetrue}}
+\newif\ifpgf@circuit@bipole@flow@below
+\ctikzset{bipole/flow/y position/.is choice}
+\ctikzset{bipole/flow/y position/above/.code={\pgf@circuit@bipole@flow@belowfalse}}
+\ctikzset{bipole/flow/y position/below/.code={\pgf@circuit@bipole@flow@belowtrue}}
+\ctikzset{bipole/flow/label/unit/.initial=}
+\ctikzset{bipole/flow/label/name/.initial=}
+\ctikzset{flow/distance/.initial = .5}
+\ctikzset{flow/offset/.initial = .2}%distance between flow-arrow and conductor
-\ctikzset{bipoles/.is family}
+\ctikzset{bipole/label/.is family}
+\ctikzset{bipole/label/position/.initial=90}
+\ctikzset{bipole/label/unit/.initial=}
+\ctikzset{bipole/label/name/.initial=}
+\ctikzset{bipole/annotation/.is family}
+\ctikzset{bipole/annotation/position/.initial=-90}
+\ctikzset{bipole/annotation/unit/.initial=}
+\ctikzset{bipole/annotation/name/.initial=}
+
+\newif\ifpgf@circ@siunitx
+\newif\ifpgf@circ@siunitx@res
+
+\ctikzset{label/align/.is choice}
+\ctikzset{label/align/straight/.code={\ctikzsetvalof{label/align}{straight}}}
+\ctikzset{label/align/rotate/.code={\ctikzsetvalof{label/align}{rotate}}}
+\ctikzset{label/align/smart/.code={\ctikzsetvalof{label/align}{smart}}}
+%%>>>
+
+% traditional styles %<<<1
+%
+\ctikzset{thickness/.initial=2}
+\ctikzset{color/.initial=black}
+\pgfkeys{/tikz/color/.add code={}{\ctikzset{color={#1}}}}
\ctikzset{bipoles/border margin/.initial=1.1}
\ctikzset{bipoles/thickness/.initial=2}
\ctikzset{tripoles/thickness/.initial=2}
\ctikzset{quadpoles/thickness/.initial=2}
\ctikzset{nodes width/.initial=.04}
+%%>>>
-% Base len for all circuitikz
-\newdimen\pgf@circ@Rlen
-% scaled length for internal use in scalable shapes
-\newdimen\pgf@circ@scaled@Rlen
-\ctikzset{bipoles/length/.code={\pgf@circ@Rlen = #1\pgf@circ@scaled@Rlen=\pgf@circ@Rlen}}
-\pgf@circ@Rlen = 1.4cm
-% by default scale is 1.0
-\pgf@circ@scaled@Rlen=\pgf@circ@Rlen
+% Styles definitions and macros%<<<1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% main style definitions
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-
% load a style file: search ctikzstyle-NAME.tex in path
\def\ctikzloadstyle#1{%
\pgfutil@InputIfFileExists{ctikzstyle-#1}{}{%
@@ -395,8 +469,15 @@
\ctikzset{displays/scale/.initial=1.0}
\ctikzset{displays/fill/.initial=none}
\ctikzset{displays/thickness/.initial=none}
+%
+% general styles
+%
+\tikzset{european/.style = {european currents, european voltages, european resistors, european inductors, european ports, european gas filled surge arrester set}}
+\tikzset{american/.style = {american currents, american voltages, american resistors, american inductors, american ports, american gas filled surge arrester set}}
+\tikzset{cute/.style = {european currents, european voltages, american resistors, cute inductors, american ports}}
+%%>>>
-% grounds and power supplies
+% grounds and power supplies%<<<1
\ctikzset{monopoles/.is family}
\ctikzset{monopoles/ground/width/.initial=.25}
@@ -423,24 +504,28 @@
\ctikzset{monopoles/bareantenna/width/.initial=.25}
\ctikzset{monopoles/bareantenna/label/xanchor/.initial=1}
\ctikzset{monopoles/bareantenna/label/yanchor/.initial=0.5}
-\ctikzset{monopoles/waves/width/.initial=0.5}
+\ctikzset{monopoles/waves/width/.initial=0.5}%
+%>>>
-% microstrips
+% microstrips %<<<1
\ctikzset{bipoles/mstline/height/.initial=0.3}
\ctikzset{bipoles/mstline/width/.initial=1.2}
\pgfkeys{/tikz/mstlinelen/.add code={}{\ctikzset{bipoles/mstline/width=#1}}}
\ctikzset{monopoles/msport/width/.initial=.5}
\ctikzset{monopoles/msrstub/height/.initial=1.0}
-\ctikzset{monopoles/msrstub/width/.initial=0.6}
+\ctikzset{monopoles/msrstub/width/.initial=0.6}%
+%>>>
-% microphone and loudspeaker
+% microphone and loudspeaker%<<<1
\ctikzset{bipoles/loudspeaker/height/.initial=.8}
\ctikzset{bipoles/loudspeaker/depth/.initial=.3}
\ctikzset{bipoles/loudspeaker/width/.initial=.8}
\ctikzset{bipoles/mic/height/.initial=1.2}
\ctikzset{bipoles/mic/depth/.initial=.1}
-\ctikzset{bipoles/mic/width/.initial=.8}
+\ctikzset{bipoles/mic/width/.initial=.8}%
+%>>>
+% resistors%<<<1
% Zig Zag resistors
\ctikzset{resistors/zigs/.initial=3}
\ctikzset{resistors/width/.code={%
@@ -501,8 +586,19 @@
\ctikzset{bipoles/tgeneric/height/.initial=.70}
\ctikzset{bipoles/tgeneric/width/.initial=.80}
\ctikzset{bipoles/ageneric/width/.initial=.80}
+\ctikzset{bipoles/memristor/height/.initial=.30}
+\ctikzset{bipoles/memristor/wave height/.initial=.5}
+\ctikzset{bipoles/memristor/width/.initial=.80}
-%% Capacitors
+\newif\ifpgf@circuit@europeanresistor
+\ctikzset{resistor/.is choice}
+\ctikzset{resistor/american/.code = \pgf@circuit@europeanresistorfalse }
+\ctikzset{resistor/european/.code = \pgf@circuit@europeanresistortrue }
+\tikzset{american resistors/.style = {\circuitikzbasekey/resistor = american}}
+\tikzset{european resistors/.style = {\circuitikzbasekey/resistor = european}}
+%%>>>
+
+%% Capacitors%<<<1
\ctikzset{bipoles/capacitor/height/.initial=.6}
\ctikzset{bipoles/capacitor/width/.initial=.2}
\ctikzset{bipoles/ecapacitor/height/.initial=.5}
@@ -519,9 +615,10 @@
\ctikzset{bipoles/vcapacitor/width/.initial=.5}
\ctikzset{bipoles/vcapacitor/capacitor width/.initial=.4}
\ctikzset{bipoles/piezoelectric/height/.initial=.7}
-\ctikzset{bipoles/piezoelectric/width/.initial=.5}
+\ctikzset{bipoles/piezoelectric/width/.initial=.5}%
+%>>>
-% Inductors
+% Inductors%<<<1
\ctikzset{inductors/coils/.code={%
\ctikzset{bipoles/cuteinductor/coils=#1}%
\ctikzset{bipoles/cutechoke/coils=#1}%
@@ -578,8 +675,20 @@
\ctikzset{bipoles/tfullgeneric/width/.initial=.80}
\ctikzset{bipoles/fullgeneric/height/.initial=.30}
\ctikzset{bipoles/fullgeneric/width/.initial=.80}
+\ctikzset{inductor/.is choice}
+\ctikzset{inductor/cute/.code={\ctikzsetvalof{inductor}{cute}}}
+\ctikzset{inductor/european/.code={\ctikzsetvalof{inductor}{european}}}
+\ctikzset{inductor/american/.code={\ctikzsetvalof{inductor}{american}}}
+
+\tikzset{american inductors/.style = {\circuitikzbasekey/inductor = american}}
+\tikzset{european inductors/.style = {\circuitikzbasekey/inductor = european}}
+\tikzset{cute inductors/.style = {\circuitikzbasekey/inductor = cute}}
+\tikzset{american ports/.style = {\circuitikzbasekey/logic ports = american}}
+\tikzset{european ports/.style = {\circuitikzbasekey/logic ports = european}}
-% Sources
+%%>>>
+
+% Sources%<<<1
\ctikzset{bipoles/esource/height/.initial=.60}
\ctikzset{bipoles/esource/width/.initial=.60}
@@ -632,7 +741,12 @@
\ctikzset{bipoles/battery1/width/.initial=.3}
\ctikzset{bipoles/battery2/height/.initial=.6}
\ctikzset{bipoles/battery2/width/.initial=.3}
+% noise sources
+\ctikzset{bipoles/noise sources/fillcolor/.initial=gray!50}
+%%>>>
+
+% "oo" style transformers and power grid diagrams%<<<1
% % % ootransformer
\ctikzset{bipoles/oosourcetrans/height/.initial=.6}
\ctikzset{bipoles/oosourcetrans/width/.initial=.6}
@@ -671,9 +785,10 @@
\pgfkeys{tikz/tert/.is choice}
\pgfkeys{tikz/tert/delta/.add code={}{\pgf@circ@tert@deltatrue}}
\pgfkeys{tikz/tert/wye/.add code={}{\pgf@circ@tert@wyetrue}}
-\pgfkeys{tikz/tert/zig/.add code={}{\pgf@circ@tert@zigtrue}}
+\pgfkeys{tikz/tert/zig/.add code={}{\pgf@circ@tert@zigtrue}}%
+%>>>
-% diodes
+% diodes%<<<1
\ctikzset{bipoles/diode/height/.initial=.50}
\ctikzset{bipoles/diode/width/.initial=.40}
@@ -683,8 +798,52 @@
\ctikzset{bipoles/bidirectionaldiode/diode width right/.initial=.3}
\ctikzset{bipoles/varcap/height/.initial=.50}
\ctikzset{bipoles/varcap/width/.initial=.45}
+\ctikzset{tripoles/thyristor/height/.initial=1.10}
+\ctikzset{tripoles/thyristor/height 2/.initial=.5}
+\ctikzset{tripoles/thyristor/width/.initial=1.0}
+\ctikzset{tripoles/thyristor/diode height/.initial=.5}
+\ctikzset{tripoles/thyristor/diode width left/.initial=.4}
+\ctikzset{tripoles/thyristor/diode width right/.initial=.3}
+
+\ctikzset{tripoles/triac/height/.initial=1.1}
+\ctikzset{tripoles/triac/width/.initial=1}
+\ctikzset{tripoles/triac/diode width left/.initial=.3}
+\ctikzset{tripoles/triac/diode width right/.initial=.3}
+%
+% Flipping arrows in LED and photodiodes
+%
+\newif\ifpgf@led@fliparrows
+\newif\ifpgf@pd@fliparrows
+\pgf@led@fliparrowsfalse
+\pgf@pd@fliparrowsfalse
+%
+% by default the arrows start (LED) and go (PD) to the anode.
+%
+\ctikzset{led arrows from anode/.code=\pgf@led@fliparrowsfalse}
+\ctikzset{pd arrows to anode/.code=\pgf@pd@fliparrowsfalse}
+%
+% but they can start form the cathode (LED) or go to it (PD)
+%
+\ctikzset{led arrows from cathode/.code=\pgf@led@fliparrowstrue}
+\ctikzset{pd arrows to cathode/.code=\pgf@pd@fliparrowstrue}
-% switches
+\newif\ifpgf@circuit@strokediode
+\newif\ifpgf@circuit@fulldiode
+\pgf@circuit@strokediodefalse
+\pgf@circuit@fulldiodefalse
+
+\ctikzset{diode/.is choice}
+\ctikzset{diode/empty/.code = \pgf@circuit@fulldiodefalse\pgf@circuit@strokediodefalse}%default
+\ctikzset{diode/full/.code = \pgf@circuit@fulldiodetrue }
+\ctikzset{diode/stroke/.code = \pgf@circuit@strokediodetrue}
+
+\tikzset{full diodes/.style = { \circuitikzbasekey/diode = full}}
+\tikzset{empty diodes/.style = { \circuitikzbasekey/diode = empty}}
+\tikzset{stroke diodes/.style = { \circuitikzbasekey/diode = stroke}}
+
+%%>>>
+
+% switches%<<<1
\ctikzset{bipoles/spst/height/.initial=.35}
\ctikzset{bipoles/spst/width/.initial=.35}
@@ -695,12 +854,30 @@
\ctikzset{bipoles/ncs/height/.initial=.35}
\ctikzset{bipoles/ncs/width/.initial=.35}
\ctikzset{bipoles/ncs/depth/.initial=.2}
+\ctikzset{bipoles/pushbutton/height/.initial=.5}
+\ctikzset{bipoles/pushbutton/height 2/.initial=.2}
+\ctikzset{bipoles/pushbutton/width/.initial=.50}
%%% reed switch
\ctikzset{bipoles/reed/height/.initial=.4}
\ctikzset{bipoles/reed/width/.initial=.8}% 0.35 in nos
\ctikzset{bipoles/reed/depth/.initial=.4}
+%% Cute switches
+\ctikzset{bipoles/cuteswitch/shape/.initial={ocirc}}
+\ctikzset{bipoles/cuteswitch/height/.initial=.6}
+\ctikzset{bipoles/cuteswitch/height 2/.initial=.2}
+\ctikzset{bipoles/cuteswitch/width/.initial=.50}
+\ctikzset{bipoles/cuteswitch/thickness/.initial=1}
-% misc
+\ctikzset{tripoles/spdt/width/.initial=.85}
+\ctikzset{tripoles/spdt/height/.initial=.45}
+\ctikzset{tripoles/spdt/margin/.initial=.45}
+
+\ctikzset{tripoles/toggleswitch/height/.initial=.8}
+\ctikzset{tripoles/toggleswitch/height 2/.initial=.0}
+\ctikzset{tripoles/toggleswitch/width/.initial=.80}
+%%>>>
+
+% arresters, fuses, lamps, etc%<<<1
\ctikzset{bipoles/european gas filled surge arrester/height/.initial=.30}
\ctikzset{bipoles/european gas filled surge arrester/width/.initial=.80}
@@ -715,9 +892,31 @@
\ctikzset{bipoles/fuse/width/.initial=.50}
\ctikzset{bipoles/afuse/height/.initial=.20}
\ctikzset{bipoles/afuse/width/.initial=.50}
-\ctikzset{bipoles/memristor/height/.initial=.30}
-\ctikzset{bipoles/memristor/wave height/.initial=.5}
-\ctikzset{bipoles/memristor/width/.initial=.80}
+\ctikzset{bipoles/lamp/height/.initial=.60}
+\ctikzset{bipoles/lamp/width/.initial=.60}
+\ctikzset{bipoles/bulb/height/.initial=.8}
+\ctikzset{bipoles/bulb/width/.initial=.8}
+\ctikzset{bipoles/tline/height/.initial=.3}
+\ctikzset{bipoles/tline/width/.initial=.8}
+\ctikzset{bipoles/squid/height/.initial=.60}
+\ctikzset{bipoles/squid/width/.initial=.60}
+\ctikzset{bipoles/barrier/height/.initial=.60}
+\ctikzset{bipoles/barrier/width/.initial=.60}
+\ctikzset{bipoles/openbarrier/gap/.initial=0.5}
+\ctikzset{bipoles/thermocouple/height/.initial=.250}
+\ctikzset{bipoles/thermocouple/height 2/.initial=.60}
+\ctikzset{bipoles/thermocouple/width/.initial=.140}
+\newif\ifpgf@circuit@europeangfsurgearrester
+\ctikzset{gas filled surge arrester choice/.is choice}
+\ctikzset{gas filled surge arrester choice/european/.code= {\pgf@circuit@europeangfsurgearrestertrue}}
+\ctikzset{gas filled surge arrester choice/american/.code= {\pgf@circuit@europeangfsurgearresterfalse}}
+
+\tikzset{american gas filled surge arrester set/.style = {\circuitikzbasekey/gas filled surge arrester choice=american}}
+\tikzset{european gas filled surge arrester set/.style = {\circuitikzbasekey/gas filled surge arrester choice=european}}
+%%>>>
+
+% wires (open, shorts, ...)%<<<1
+
\ctikzset{bipoles/open/height/.initial=.3} %necessary for curly voltages
\ctikzset{bipoles/open/width/.initial=.3} %necessary for curly voltages
\ctikzset{bipoles/open/voltage/straight label distance/.initial=0}
@@ -728,7 +927,11 @@
\ctikzset{bipoles/multiwire/height/.initial=0.4}
\ctikzset{bipoles/multiwire/width/.initial=0.2}
\ctikzset{bipoles/multiwire/spacing/.initial=0.05}
+% crossing wires
+\ctikzset{bipoles/crossing/size/.initial=.2}
+%%>>>
+% Instruments %<<<1
\ctikzset{bipoles/ammeter/height/.initial=.60}
\ctikzset{bipoles/ammeter/width/.initial=.60}
\ctikzset{bipoles/ohmmeter/height/.initial=.60}
@@ -759,30 +962,9 @@
\ctikzset{straight instruments/.add code={}{\pgf@circuit@straightinstrumentstrue}}
\pgfkeys{/tikz/rotated instruments/.add code={}{\pgf@circuit@straightinstrumentsfalse}}
\ctikzset{rotated instruments/.add code={}{\pgf@circuit@straightinstrumentsfalse}}
+%%>>>
-
-\ctikzset{bipoles/buffer/height/.initial=1}
-\ctikzset{bipoles/buffer/width/.initial=1}
-\ctikzset{bipoles/not port/width/.initial=1}
-\ctikzset{bipoles/not port/height/.initial=.8}
-\ctikzset{bipoles/not port/circle width/.initial=.15}
-\ctikzset{bipoles/lamp/height/.initial=.60}
-\ctikzset{bipoles/lamp/width/.initial=.60}
-\ctikzset{bipoles/bulb/height/.initial=.8}
-\ctikzset{bipoles/bulb/width/.initial=.8}
-\ctikzset{bipoles/tline/height/.initial=.3}
-\ctikzset{bipoles/tline/width/.initial=.8}
-\ctikzset{bipoles/squid/height/.initial=.60}
-\ctikzset{bipoles/squid/width/.initial=.60}
-\ctikzset{bipoles/barrier/height/.initial=.60}
-\ctikzset{bipoles/barrier/width/.initial=.60}
-\ctikzset{bipoles/openbarrier/gap/.initial=0.5}
-\ctikzset{bipoles/thermocouple/height/.initial=.250}
-\ctikzset{bipoles/thermocouple/height 2/.initial=.60}
-\ctikzset{bipoles/thermocouple/width/.initial=.140}
-\ctikzset{bipoles/pushbutton/height/.initial=.5}
-\ctikzset{bipoles/pushbutton/height 2/.initial=.2}
-\ctikzset{bipoles/pushbutton/width/.initial=.50}
+% blocks (twoports and so)%<<<1
\ctikzset{bipoles/twoport/width/.initial=.7}
\ctikzset{bipoles/twoport/height/.initial=.7}
@@ -805,11 +987,16 @@
\ctikzset{bipoles/phaseshifter/width/.initial=.7}
\ctikzset{bipoles/vphaseshifter/width/.initial=.7}
\ctikzset{bipoles/detector/width/.initial=.7}
+\ctikzset{tripoles/mixer/width/.initial=0.7}
+\ctikzset{tripoles/adder/width/.initial=0.7}
+\ctikzset{tripoles/circulator/width/.initial=.7}
+\ctikzset{tripoles/oscillator/width/.initial=.7}
-% crossing wires
-\ctikzset{bipoles/crossing/size/.initial=.2}
+\ctikzset{tripoles/wilkinson/height/.initial=1.3}
+\ctikzset{tripoles/wilkinson/width/.initial=1.3}
+%%>>>
-% Transistors starts here
+% Transistors %<<<1
\newif\ifpgf@circuit@trans@depletiontype
\pgf@circuit@trans@depletiontypefalse
@@ -1203,10 +1390,44 @@
\ctikzset{tripoles/bjt/pnp/curr direction/.initial=-1}
%% transistors stop here
+%%>>>
+
+% Electronic tubes: diodetube, triode, tetrode and pentode%<<<1
+\ctikzset{tubes/width/.initial=1} % relative width
+\ctikzset{tubes/height/.initial=1.4} % relative height
+\ctikzset{tubes/tube radius/.initial=0.40} % radius of tube circle
+\ctikzset{tubes/anode distance/.initial=0.40} % distance from center
+\ctikzset{tubes/anode width/.initial=0.40} % width of an anode/plate
+\ctikzset{tubes/grid protrusion/.initial=0.25} % distance from center
+\ctikzset{tubes/grid dashes/.initial=5} % number of grid dashes
+\ctikzset{tubes/grid separation/.initial=0.2} % separation between grids
+\ctikzset{tubes/grid shift/.initial=0.0} % y shift grids from center
+\ctikzset{tubes/cathode distance/.initial=0.40} % distance from grid
+\ctikzset{tubes/cathode width/.initial=0.40} % width of an cathode
+\ctikzset{tubes/cathode corners/.initial=0.06} % corners of the cathode wire
+\ctikzset{tubes/cathode right extend/.initial=0.075} % extension at the right side
+\ctikzset{tubes/filament distance/.initial=0.1} % distance from cathode
+\ctikzset{tubes/filament angle/.initial=15} % Angle from centerpoint
+
+\newif\ifpgf@circuit@tubes@filament\pgf@circuit@tubes@filamentfalse
+\pgfkeys{/tikz/filament/.add code={}{\pgf@circuit@tubes@filamenttrue}}
+\ctikzset{tubes/filament/.add code={}{\pgf@circuit@tubes@filamenttrue}}
+\newif\ifpgf@circuit@tubes@nocathode\pgf@circuit@tubes@nocathodefalse
+\pgfkeys{/tikz/nocathode/.add code={}{\pgf@circuit@tubes@nocathodetrue}}
+\ctikzset{tubes/nocathode/.add code={}{\pgf@circuit@tubes@nocathodetrue}}
+\newif\ifpgf@circuit@tubes@fullcathode\pgf@circuit@tubes@fullcathodefalse
+\pgfkeys{/tikz/fullcathode/.add code={}{\pgf@circuit@tubes@fullcathodetrue}}
+\ctikzset{tubes/fullcathode/.add code={}{\pgf@circuit@tubes@fullcathodetrue}}%
+%>>>
-%% Logic ports
+%% Logic ports%<<<1
%% beware that the third option is in IEEE ports in pgfcircmultipoles.tex
+% switches for logic gates
+%
+\pgfkeys{/tikz/number inputs/.initial=0}
+\pgfkeys{/tikz/number inputs/.default=0}
+
\newif\ifpgf@circuit@europeanlogicport
\ctikzset{logic ports/.is choice}
\ctikzset{logic ports/european/.code= {\pgf@circuit@europeanlogicporttrue
@@ -1296,6 +1517,12 @@
\tikzset{all leads/.code={\pgfcirc@draw@output@leadstrue\pgfcirc@draw@input@leadstrue}}
\tikzset{no leads/.code={\pgfcirc@draw@output@leadsfalse\pgfcirc@draw@input@leadsfalse}}
+% old, legacy keys that should be killed over
+\ctikzset{bipoles/buffer/height/.initial=1}
+\ctikzset{bipoles/buffer/width/.initial=1}
+\ctikzset{bipoles/not port/width/.initial=1}
+\ctikzset{bipoles/not port/height/.initial=.8}
+\ctikzset{bipoles/not port/circle width/.initial=.15}
\ctikzset{tripoles/american and port/width/.initial=1.1}
\ctikzset{tripoles/american and port/height/.initial=.8}
@@ -1429,10 +1656,9 @@
\ctikzset{tripoles/american xnor port/bbb/.initial=.4}
\ctikzset{tripoles/american xnor port/ccc/.initial=.5}
\ctikzset{tripoles/american xnor port/ddd/.initial=.0}
-% switches for logic gates
-%
-\pgfkeys{/tikz/number inputs/.initial=0}
-\pgfkeys{/tikz/number inputs/.default=0}
+%%>>>
+
+% flip flops and muxdemxes%<<<1
%% flip-flop specific keys (most others are the same as chips)
@@ -1455,7 +1681,10 @@
\ctikzset{multipoles/muxdemux/NR/.initial=1}
\ctikzset{multipoles/muxdemux/NB/.initial=3}
\ctikzset{multipoles/muxdemux/NT/.initial=0}
-\ctikzset{multipoles/muxdemux/square pins/.initial=0}
+\ctikzset{multipoles/muxdemux/square pins/.initial=0}%
+%>>>
+
+% Amplifiers%<<<1
%
% switches for op amps
% changing input polarity
@@ -1576,42 +1805,9 @@
\tikzset{amp minus/.code={\ctikzsetvalof{amplifiers/minus}{#1}}}
\def\pgf@circ@ampli@plus{\ctikzvalof{amplifiers/plus}}
\def\pgf@circ@ampli@minus{\ctikzvalof{amplifiers/minus}}
+%%>>>
-\ctikzset{tripoles/thyristor/height/.initial=1.10}
-\ctikzset{tripoles/thyristor/height 2/.initial=.5}
-\ctikzset{tripoles/thyristor/width/.initial=1.0}
-\ctikzset{tripoles/thyristor/diode height/.initial=.5}
-\ctikzset{tripoles/thyristor/diode width left/.initial=.4}
-\ctikzset{tripoles/thyristor/diode width right/.initial=.3}
-
-\ctikzset{tripoles/triac/height/.initial=1.1}
-\ctikzset{tripoles/triac/width/.initial=1}
-\ctikzset{tripoles/triac/diode width left/.initial=.3}
-\ctikzset{tripoles/triac/diode width right/.initial=.3}
-
-%% Cute switches
-\ctikzset{bipoles/cuteswitch/shape/.initial={ocirc}}
-\ctikzset{bipoles/cuteswitch/height/.initial=.6}
-\ctikzset{bipoles/cuteswitch/height 2/.initial=.2}
-\ctikzset{bipoles/cuteswitch/width/.initial=.50}
-\ctikzset{bipoles/cuteswitch/thickness/.initial=1}
-
-\ctikzset{tripoles/spdt/width/.initial=.85}
-\ctikzset{tripoles/spdt/height/.initial=.45}
-\ctikzset{tripoles/spdt/margin/.initial=.45}
-
-\ctikzset{tripoles/toggleswitch/height/.initial=.8}
-\ctikzset{tripoles/toggleswitch/height 2/.initial=.0}
-\ctikzset{tripoles/toggleswitch/width/.initial=.80}
-
-\ctikzset{tripoles/mixer/width/.initial=0.7}
-\ctikzset{tripoles/adder/width/.initial=0.7}
-\ctikzset{tripoles/circulator/width/.initial=.7}
-\ctikzset{tripoles/oscillator/width/.initial=.7}
-
-
-\ctikzset{tripoles/wilkinson/height/.initial=1.3}
-\ctikzset{tripoles/wilkinson/width/.initial=1.3}
+% Transformers%<<<1
\ctikzset{quadpoles/transformer/inner/.initial=0.4}
\ctikzset{quadpoles/transformer/width/.initial=1.5}
@@ -1654,9 +1850,105 @@
\ctikzset{quadpoles/gyrator/width=0.6}%
}%
}
+%%>>>
+
+% seven segment displays by RGtti%<<<1
+\newif\ifpgf@circ@sevenseg@dot
+\newif\ifpgf@circ@sevenseg@box
+\def\pgf@circ@sevenseg@dotstate{empty}
+\ctikzset{seven seg/.is family}
+\ctikzset{seven seg/dot/.is choice}
+% none means no dot, not space for it. Empty means no dot, but space
+\ctikzset{seven seg/dot/none/.code={\pgf@circ@sevenseg@dotfalse}}
+\ctikzset{seven seg/dot/empty/.code={\pgf@circ@sevenseg@dottrue\def\pgf@circ@sevenseg@dotstate{empty}}}
+\ctikzset{seven seg/dot/off/.code={\pgf@circ@sevenseg@dottrue\def\pgf@circ@sevenseg@dotstate{off}}}
+\ctikzset{seven seg/dot/on/.code={\pgf@circ@sevenseg@dottrue\def\pgf@circ@sevenseg@dotstate{on}}}
%
-% multipoles
+\ctikzset{seven seg/width/.initial=0.4}% relative to \pgf@circ@Rlen
+\ctikzset{seven seg/thickness/.initial=4pt}% segment thickness
+\ctikzset{seven seg/segment sep/.initial=0.2pt}% gap between segments
+\ctikzset{seven seg/box sep/.initial=1pt}% external box gap
+\ctikzset{seven seg/color on/.initial=red}% color for segment "on"
+\ctikzset{seven seg/color off/.initial=gray!20!white} % ...and "off"
+\ctikzset{seven seg/box/.is choice}
+\ctikzset{seven seg/box/off/.code={\pgf@circ@sevenseg@boxfalse}}
+\ctikzset{seven seg/box/on/.code={\pgf@circ@sevenseg@boxtrue}}
+
+\ctikzset{seven seg/bits/.initial=0000000}
+
+\ctikzset{seven seg/value/.code={%
+ \edef\@@tmp{#1}%
+ \edef\@@n{0} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1111110}\fi
+ \edef\@@n{1} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=0110000}\fi
+ \edef\@@n{2} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1101101}\fi
+ \edef\@@n{3} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1111001}\fi
+ \edef\@@n{4} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=0110011}\fi
+ \edef\@@n{5} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1011011}\fi
+ \edef\@@n{6} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1011111}\fi
+ \edef\@@n{7} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1110000}\fi
+ \edef\@@n{8} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1111111}\fi
+ \edef\@@n{9} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1111011}\fi
+ \edef\@@n{10}\ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1110111}\fi
+ \edef\@@n{11}\ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=0011111}\fi
+ \edef\@@n{12}\ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1001110}\fi
+ \edef\@@n{13}\ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=0111101}\fi
+ \edef\@@n{14}\ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1001111}\fi
+ \edef\@@n{15}\ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1000111}\fi
+ \edef\@@n{A} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1110111}\fi
+ \edef\@@n{B} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=0011111}\fi
+ \edef\@@n{C} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1001110}\fi
+ \edef\@@n{D} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=0111101}\fi
+ \edef\@@n{E} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1001111}\fi
+ \edef\@@n{F} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1000111}\fi
+ \edef\@@n{a} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1110111}\fi
+ \edef\@@n{b} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=0011111}\fi
+ \edef\@@n{c} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1001110}\fi
+ \edef\@@n{d} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=0111101}\fi
+ \edef\@@n{e} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1001111}\fi
+ \edef\@@n{f} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1000111}\fi
+ \edef\@@n{-} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=0000001}\fi
+}}
+
+\tikzset{%
+ seven segment val/.style args={#1dot#2box#3}{%
+ shape=bare7seg,
+ /tikz/circuitikz/seven seg/value=#1,
+ /tikz/circuitikz/seven seg/dot=#2,
+ /tikz/circuitikz/seven seg/box=#3,
+ },
+ seven segment bits/.style args={#1dot#2box#3}{%
+ shape=bare7seg,
+ /tikz/circuitikz/seven seg/bits=#1,
+ /tikz/circuitikz/seven seg/dot=#2,
+ /tikz/circuitikz/seven seg/box=#3,
+ },
+}
+%%>>>
+
+% Options for twoports and blocks%<<<1
+
+% Option ">" for twoports
+\newif\ifpgf@circuit@inputarrow
+\ctikzset{>/.add code={}{\pgf@circuit@inputarrowtrue}}
+\ctikzset{inputarrow/.is choice}
+\ctikzset{inputarrow/true/.code={\pgf@circuit@inputarrowtrue}}
+\ctikzset{inputarrow/false/.code={\pgf@circuit@inputarrowfalse}}
+
+% Option "boxed" for nodes and twoports
+\newif\ifpgf@circuit@boxed
+\pgfkeys{/tikz/boxed/.add code={}{\pgf@circuit@boxedtrue}}
+\ctikzset{boxed/.add code={}{\pgf@circuit@boxedtrue}}
+\pgfkeys{/tikz/box/.add code={}{\pgf@circuit@boxedtrue}}
+\ctikzset{box/.add code={}{\pgf@circuit@boxedtrue}}
+
+% Option "dashed" for nodes and twoports
+\newif\ifpgf@circuit@dashed
+\pgfkeys{/tikz/dashed/.add code={}{\pgf@circuit@dashedtrue}}
+\ctikzset{dashed/.add code={}{\pgf@circuit@dashedtrue}}%
+%>>>
+
+% Chips and Rotary switches (multipoles) %<<<1
%
\ctikzset{multipoles/thickness/.initial=2}
\ctikzset{multipoles/font/.initial=\pgf@circ@font@tiny}
@@ -1738,8 +2030,9 @@
rotary switch ->/.default={5 in 60 wiper 20},
rotary switch <->/.default={5 in 60 wiper 20},
}
+%%>>>
-% %Mechanical section
+% %Mechanical section%<<<1
\ctikzset{/tikz/circuitikz/tripoles/elmech/height/.initial=.8}
\ctikzset{/tikz/circuitikz/tripoles/elmech/width/.initial=.6}
\ctikzset{bipoles/spring/height/.initial=.5}
@@ -1753,142 +2046,56 @@
\ctikzset{bipoles/damper/height/.initial=.35}
\ctikzset{bipoles/damper/length/.initial=.3}
\ctikzset{bipoles/damper/width/.initial=.4}
+%%>>>
+% powerelectronic blocks%<<<1
+\ctikzset{bipoles/sacdc/width/.initial=.7}
+\ctikzset{bipoles/sdcac/width/.initial=.7}
+\ctikzset{bipoles/tacdc/width/.initial=.7}
+\ctikzset{bipoles/tdcac/width/.initial=.7}
+\ctikzset{quadpoles/gridnode/width/.initial=.7} %not sure if quadpole?
+%>>>
-\ctikzset{bipole/.is family}
-\ctikzset{bipole/kind/.initial=}
-\ctikzset{bipole/name/.initial=}
-\newif\ifpgf@circuit@bipole@isvoltage
-\ctikzset{bipole/is voltage/.is if=pgf@circuit@bipole@isvoltage}
-\newif\ifpgf@circuit@bipole@voltageoutsideofsymbol
-\ctikzset{bipole/is voltageoutsideofsymbol/.is if=pgf@circuit@bipole@voltageoutsideofsymbol}
-\newif\ifpgf@circuit@bipole@strokedsymbol
-\ctikzset{bipole/is strokedsymbol/.is if=pgf@circuit@bipole@strokedsymbol}
-\newif\ifpgf@circuit@bipole@iscurrent
-\ctikzset{bipole/is current/.is if=pgf@circuit@bipole@iscurrent}
-
-\ctikzset{bipole/voltage/.is family}
-\newif\ifpgf@circuit@bipole@voltage@backward
-\ctikzset{bipole/voltage/direction/.is choice}
-\ctikzset{bipole/voltage/direction/forward/.code={\pgf@circuit@bipole@voltage@backwardfalse}}
-\ctikzset{bipole/voltage/direction/backward/.code={\pgf@circuit@bipole@voltage@backwardtrue}}
-\newif\ifpgf@circuit@bipole@voltage@below
-\ctikzset{bipole/voltage/position/.is choice}
-\ctikzset{bipole/voltage/position/above/.code={\pgf@circuit@bipole@voltage@belowfalse}}
-\ctikzset{bipole/voltage/position/below/.code={\pgf@circuit@bipole@voltage@belowtrue}}
-
-\ctikzset{bipole/voltage/label/unit/.initial=}
-\ctikzset{bipole/voltage/label/name/.initial=}
-
-\ctikzset{bipole/current/.is family}
-\newif\ifpgf@circuit@bipole@current@backward
-\ctikzset{bipole/current/direction/.is choice}
-\ctikzset{bipole/current/direction/forward/.code={\pgf@circuit@bipole@current@backwardfalse}}
-\ctikzset{bipole/current/direction/backward/.code={\pgf@circuit@bipole@current@backwardtrue}}
-\newif\ifpgf@circuit@bipole@current@before
-\ctikzset{bipole/current/x position/.is choice}
-\ctikzset{bipole/current/x position/after/.code={\pgf@circuit@bipole@current@beforefalse}}
-\ctikzset{bipole/current/x position/before/.code={\pgf@circuit@bipole@current@beforetrue}}
-\newif\ifpgf@circuit@bipole@current@below
-\ctikzset{bipole/current/y position/.is choice}
-\ctikzset{bipole/current/y position/above/.code={\pgf@circuit@bipole@current@belowfalse}}
-\ctikzset{bipole/current/y position/below/.code={\pgf@circuit@bipole@current@belowtrue}}
-\ctikzset{bipole/current/label/unit/.initial=}
-\ctikzset{bipole/current/label/name/.initial=}
-
-\ctikzset{bipole/flow/.is family}
-\newif\ifpgf@circuit@bipole@flow@backward
-\ctikzset{bipole/flow/direction/.is choice}
-\ctikzset{bipole/flow/direction/forward/.code={\pgf@circuit@bipole@flow@backwardfalse}}
-\ctikzset{bipole/flow/direction/backward/.code={\pgf@circuit@bipole@flow@backwardtrue}}
-\newif\ifpgf@circuit@bipole@flow@before
-\ctikzset{bipole/flow/x position/.is choice}
-\ctikzset{bipole/flow/x position/after/.code={\pgf@circuit@bipole@flow@beforefalse}}
-\ctikzset{bipole/flow/x position/before/.code={\pgf@circuit@bipole@flow@beforetrue}}
-\newif\ifpgf@circuit@bipole@flow@below
-\ctikzset{bipole/flow/y position/.is choice}
-\ctikzset{bipole/flow/y position/above/.code={\pgf@circuit@bipole@flow@belowfalse}}
-\ctikzset{bipole/flow/y position/below/.code={\pgf@circuit@bipole@flow@belowtrue}}
-\ctikzset{bipole/flow/label/unit/.initial=}
-\ctikzset{bipole/flow/label/name/.initial=}
-\ctikzset{flow/distance/.initial = .5}
-\ctikzset{flow/offset/.initial = .2}%distance between flow-arrow and conductor
-
-\ctikzset{bipole/label/.is family}
-\ctikzset{bipole/label/position/.initial=90}
-\ctikzset{bipole/label/unit/.initial=}
-\ctikzset{bipole/label/name/.initial=}
-\ctikzset{bipole/annotation/.is family}
-\ctikzset{bipole/annotation/position/.initial=-90}
-\ctikzset{bipole/annotation/unit/.initial=}
-\ctikzset{bipole/annotation/name/.initial=}
-
-\newif\ifpgf@circuit@europeanresistor
-\ctikzset{resistor/.is choice}
-\ctikzset{resistor/american/.code = \pgf@circuit@europeanresistorfalse }
-\ctikzset{resistor/european/.code = \pgf@circuit@europeanresistortrue }
-
-\ctikzset{inductor/.is choice}
-\ctikzset{inductor/cute/.code={\ctikzsetvalof{inductor}{cute}}}
-\ctikzset{inductor/european/.code={\ctikzsetvalof{inductor}{european}}}
-\ctikzset{inductor/american/.code={\ctikzsetvalof{inductor}{american}}}
-
-%
-% Flipping arrows in LED and photodiodes
-%
-\newif\ifpgf@led@fliparrows
-\newif\ifpgf@pd@fliparrows
-\pgf@led@fliparrowsfalse
-\pgf@pd@fliparrowsfalse
-%
-% by default the arrows start (LED) and go (PD) to the anode.
-%
-\ctikzset{led arrows from anode/.code=\pgf@led@fliparrowsfalse}
-\ctikzset{pd arrows to anode/.code=\pgf@pd@fliparrowsfalse}
-%
-% but they can start form the cathode (LED) or go to it (PD)
-%
-\ctikzset{led arrows from cathode/.code=\pgf@led@fliparrowstrue}
-\ctikzset{pd arrows to cathode/.code=\pgf@pd@fliparrowstrue}
-
-\newif\ifpgf@circuit@strokediode
-\newif\ifpgf@circuit@fulldiode
-\pgf@circuit@strokediodefalse
-\pgf@circuit@fulldiodefalse
-
-\ctikzset{diode/.is choice}
-\ctikzset{diode/empty/.code = \pgf@circuit@fulldiodefalse\pgf@circuit@strokediodefalse}%default
-\ctikzset{diode/full/.code = \pgf@circuit@fulldiodetrue }
-\ctikzset{diode/stroke/.code = \pgf@circuit@strokediodetrue}
-
-\tikzset{full diodes/.style = { \circuitikzbasekey/diode = full}}
-\tikzset{empty diodes/.style = { \circuitikzbasekey/diode = empty}}
-\tikzset{stroke diodes/.style = { \circuitikzbasekey/diode = stroke}}
-
-\ctikzset{thickness/.initial=2}
-\ctikzset{color/.initial=black}
-\pgfkeys{/tikz/color/.add code={}{\ctikzset{color={#1}}}}
-
-\newif\ifpgf@circ@siunitx
-\newif\ifpgf@circ@siunitx@res
-
-%
-% voltage and current options
+% voltage and current options%<<<1
%
+\ctikzset{current arrow scale/.initial=16}
+\ctikzset{current/distance/.initial = .5}
\newif\ifpgf@circuit@europeancurrent
\newif\ifpgf@circuit@europeanvoltage
\newif\ifpgf@circuit@bipole@voltage@straight
+\newif\ifpgf@circuit@bipole@voltage@raised
\ctikzset{voltage/.is choice}
%
% straight is expected to be a subset of european, so disable it in american style
%
-\ctikzset{voltage/american/.code = {\pgf@circuit@europeanvoltagefalse\pgf@circuit@bipole@voltage@straightfalse}}
-\ctikzset{voltage/european/.code = {\pgf@circuit@europeanvoltagetrue\pgf@circuit@bipole@voltage@straightfalse}}
-\ctikzset{voltage/straight/.code = {\pgf@circuit@europeanvoltagetrue\pgf@circuit@bipole@voltage@straighttrue}}
-\ctikzset{voltage/curved/.code = {\pgf@circuit@europeanvoltagetrue\pgf@circuit@bipole@voltage@straightfalse}}
-
+\ctikzset{voltage/american/.code = {%
+ \pgf@circuit@europeanvoltagefalse
+ \pgf@circuit@bipole@voltage@straightfalse
+ \pgf@circuit@bipole@voltage@raisedfalse
+}}
+\ctikzset{voltage/raised/.code = {%
+ \pgf@circuit@europeanvoltagefalse
+ \pgf@circuit@bipole@voltage@straightfalse
+ \pgf@circuit@bipole@voltage@raisedtrue
+}}
+\ctikzset{voltage/european/.code = {%
+ \pgf@circuit@europeanvoltagetrue
+ \pgf@circuit@bipole@voltage@straightfalse
+ \pgf@circuit@bipole@voltage@raisedfalse
+}}
+\ctikzset{voltage/straight/.code = {%
+ \pgf@circuit@europeanvoltagetrue
+ \pgf@circuit@bipole@voltage@straighttrue
+ \pgf@circuit@bipole@voltage@raisedfalse
+}}
+\ctikzset{voltage/curved/.code = {%
+ \pgf@circuit@europeanvoltagetrue
+ \pgf@circuit@bipole@voltage@straightfalse
+ \pgf@circuit@bipole@voltage@raisedfalse
+}}
+% are these used?
\ctikzset{current/.is choice}
\ctikzset{current/american/.code = \pgf@circuit@europeancurrentfalse}
\ctikzset{current/european/.code = \pgf@circuit@europeancurrenttrue}
@@ -1903,9 +2110,17 @@
% above. I hope it is ok --- would be a mess otherwise
%
\ctikzset{voltage/shift/.initial=0.0} % shift form the cable of voltage symbols
-\ctikzset{voltage shift/.style={voltage/shift=#1}}
+\ctikzset{voltage shift/.style={\circuitikzbasekey/voltage/shift=#1}}
\tikzset{voltage shift/.style={\circuitikzbasekey/voltage/shift=#1}}
-
+%
+% keys for exporting voltage, current, flow anchors
+%
+\newif\ifpgfcirc@has@v\pgfcirc@has@vfalse
+\newif\ifpgfcirc@has@f\pgfcirc@has@ffalse
+\newif\ifpgfcirc@has@i\pgfcirc@has@ifalse
+\def\ctikzgetanchor#1#2{\csname pgfcirc@#1-#2-anchor\endcsname}
+\def\ctikzgetdirection#1{\csname pgfcirc@#1-direction\endcsname}
+%
% shaping the +/- sign, see pgfcircvoltage.tex
\ctikzset{voltage/american font/.initial={}}
\ctikzset{voltage/american plus/.initial={$+$}}
@@ -1938,13 +2153,29 @@
\ctikzset{voltage/european label distance/.initial=1.4}
\ctikzset{voltage/straight label distance/.initial=1.4}
\ctikzset{voltage/american label distance/.initial=1.4}
+% american open voltage adjusting
+%
+\newif\ifpgf@adjust@open@voltage\pgf@adjust@open@voltagetrue
+\ctikzset{american open voltage/.is choice}
+\ctikzset{american open voltage/center/.code={\pgf@adjust@open@voltagetrue}}
+\ctikzset{american open voltage/legacy/.code={\pgf@adjust@open@voltagefalse}}
+%
+% voltage and current styles
%
+\tikzset{american currents/.style = {\circuitikzbasekey/current = american}}
+\tikzset{european currents/.style = {\circuitikzbasekey/current = european}}
+\tikzset{american voltages/.style = {\circuitikzbasekey/voltage = american}}
+\tikzset{european voltages/.style = {\circuitikzbasekey/voltage = european}}
+\tikzset{straight voltages/.style = {\circuitikzbasekey/voltage = straight}}
+\tikzset{raised voltages/.style = {\circuitikzbasekey/voltage = raised}}
+%%>>>
+
+% special cases for voltage positions%<<<1
% the KIND is the node name without SHAPE
% See the definition above for meaning
% if bipoles/KIND/voltage/straight label distance is not defined, it uses the height
% if bipoles/KIND/voltage/additional shift is not defined, it is 0 (extra distance)
%
-% special cases for voltage positions
\ctikzset{bipoles/generic/voltage/distance from node/.initial=0.4}
\ctikzset{bipoles/generic/voltage/bump b/.initial=2}
%
@@ -1992,169 +2223,7 @@
\ctikzset{bipoles/battery/voltage/bump a/.initial=1.4}
\ctikzset{bipoles/vsourceAM/voltage/american label distance/.initial=1.2}
\ctikzset{bipoles/cvsourceAM/voltage/american label distance/.initial=1.2}
-%
-% american open voltage adjusting
-%
-\newif\ifpgf@adjust@open@voltage\pgf@adjust@open@voltagetrue
-\ctikzset{american open voltage/.is choice}
-\ctikzset{american open voltage/center/.code={\pgf@adjust@open@voltagetrue}}
-\ctikzset{american open voltage/legacy/.code={\pgf@adjust@open@voltagefalse}}
-%
-% currents
-%
-\ctikzset{current/distance/.initial = .5}
-
-%
-% voltage and current styles
-%
-
-\tikzset{american currents/.style = {\circuitikzbasekey/current = american}}
-\tikzset{european currents/.style = {\circuitikzbasekey/current = european}}
-\tikzset{american voltages/.style = {\circuitikzbasekey/voltage = american}}
-\tikzset{european voltages/.style = {\circuitikzbasekey/voltage = european}}
-\tikzset{straight voltages/.style = {\circuitikzbasekey/voltage = straight}}
-\tikzset{american resistors/.style = {\circuitikzbasekey/resistor = american}}
-\tikzset{european resistors/.style = {\circuitikzbasekey/resistor = european}}
-
-\newif\ifpgf@circuit@europeangfsurgearrester
-\ctikzset{gas filled surge arrester choice/.is choice}
-\ctikzset{gas filled surge arrester choice/european/.code= {\pgf@circuit@europeangfsurgearrestertrue}}
-\ctikzset{gas filled surge arrester choice/american/.code= {\pgf@circuit@europeangfsurgearresterfalse}}
-
-\tikzset{american gas filled surge arrester set/.style = {\circuitikzbasekey/gas filled surge arrester choice=american}}
-\tikzset{european gas filled surge arrester set/.style = {\circuitikzbasekey/gas filled surge arrester choice=european}}
-\tikzset{american inductors/.style = {\circuitikzbasekey/inductor = american}}
-\tikzset{european inductors/.style = {\circuitikzbasekey/inductor = european}}
-\tikzset{cute inductors/.style = {\circuitikzbasekey/inductor = cute}}
-\tikzset{american ports/.style = {\circuitikzbasekey/logic ports = american}}
-\tikzset{european ports/.style = {\circuitikzbasekey/logic ports = european}}
-
-%
-% general styles
-%
-
-\tikzset{european/.style = {european currents, european voltages, european resistors, european inductors, european ports, european gas filled surge arrester set}}
-\tikzset{american/.style = {american currents, american voltages, american resistors, american inductors, american ports, american gas filled surge arrester set}}
-\tikzset{cute/.style = {european currents, european voltages, american resistors, cute inductors, american ports}}
-
-
-% noise sources
-\ctikzset{bipoles/noise sources/fillcolor/.initial=gray!50}
-
-\ctikzset{label/align/.is choice}
-\ctikzset{label/align/straight/.code={\ctikzsetvalof{label/align}{straight}}}
-\ctikzset{label/align/rotate/.code={\ctikzsetvalof{label/align}{rotate}}}
-\ctikzset{label/align/smart/.code={\ctikzsetvalof{label/align}{smart}}}
-
-% seven segment displays by RGtti
-
-\newif\ifpgf@circ@sevenseg@dot
-\newif\ifpgf@circ@sevenseg@box
-\def\pgf@circ@sevenseg@dotstate{empty}
-\ctikzset{seven seg/.is family}
-\ctikzset{seven seg/dot/.is choice}
-% none means no dot, not space for it. Empty means no dot, but space
-\ctikzset{seven seg/dot/none/.code={\pgf@circ@sevenseg@dotfalse}}
-\ctikzset{seven seg/dot/empty/.code={\pgf@circ@sevenseg@dottrue\def\pgf@circ@sevenseg@dotstate{empty}}}
-\ctikzset{seven seg/dot/off/.code={\pgf@circ@sevenseg@dottrue\def\pgf@circ@sevenseg@dotstate{off}}}
-\ctikzset{seven seg/dot/on/.code={\pgf@circ@sevenseg@dottrue\def\pgf@circ@sevenseg@dotstate{on}}}
-%
-\ctikzset{seven seg/width/.initial=0.4}% relative to \pgf@circ@Rlen
-\ctikzset{seven seg/thickness/.initial=4pt}% segment thickness
-\ctikzset{seven seg/segment sep/.initial=0.2pt}% gap between segments
-\ctikzset{seven seg/box sep/.initial=1pt}% external box gap
-\ctikzset{seven seg/color on/.initial=red}% color for segment "on"
-\ctikzset{seven seg/color off/.initial=gray!20!white} % ...and "off"
-\ctikzset{seven seg/box/.is choice}
-\ctikzset{seven seg/box/off/.code={\pgf@circ@sevenseg@boxfalse}}
-\ctikzset{seven seg/box/on/.code={\pgf@circ@sevenseg@boxtrue}}
-
-\ctikzset{seven seg/bits/.initial=0000000}
-
-\ctikzset{seven seg/value/.code={%
- \edef\@@tmp{#1}%
- \edef\@@n{0} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1111110}\fi
- \edef\@@n{1} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=0110000}\fi
- \edef\@@n{2} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1101101}\fi
- \edef\@@n{3} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1111001}\fi
- \edef\@@n{4} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=0110011}\fi
- \edef\@@n{5} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1011011}\fi
- \edef\@@n{6} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1011111}\fi
- \edef\@@n{7} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1110000}\fi
- \edef\@@n{8} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1111111}\fi
- \edef\@@n{9} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1111011}\fi
- \edef\@@n{10}\ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1110111}\fi
- \edef\@@n{11}\ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=0011111}\fi
- \edef\@@n{12}\ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1001110}\fi
- \edef\@@n{13}\ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=0111101}\fi
- \edef\@@n{14}\ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1001111}\fi
- \edef\@@n{15}\ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1000111}\fi
- \edef\@@n{A} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1110111}\fi
- \edef\@@n{B} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=0011111}\fi
- \edef\@@n{C} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1001110}\fi
- \edef\@@n{D} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=0111101}\fi
- \edef\@@n{E} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1001111}\fi
- \edef\@@n{F} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1000111}\fi
- \edef\@@n{a} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1110111}\fi
- \edef\@@n{b} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=0011111}\fi
- \edef\@@n{c} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1001110}\fi
- \edef\@@n{d} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=0111101}\fi
- \edef\@@n{e} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1001111}\fi
- \edef\@@n{f} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=1000111}\fi
- \edef\@@n{-} \ifx\@@tmp\@@n\relax\ctikzset{seven seg/bits=0000001}\fi
-}}
-
-\tikzset{%
- seven segment val/.style args={#1dot#2box#3}{%
- shape=bare7seg,
- /tikz/circuitikz/seven seg/value=#1,
- /tikz/circuitikz/seven seg/dot=#2,
- /tikz/circuitikz/seven seg/box=#3,
- },
- seven segment bits/.style args={#1dot#2box#3}{%
- shape=bare7seg,
- /tikz/circuitikz/seven seg/bits=#1,
- /tikz/circuitikz/seven seg/dot=#2,
- /tikz/circuitikz/seven seg/box=#3,
- },
-}
-
-
-%%%%%%%%%% new
-\pgfkeys{\circuitikzbasekey/.search also={/tikz}}
-
-% Electronic tubes: diodetube, triode, tetrode and pentode
-\ctikzset{tubes/width/.initial=1} % relative width
-\ctikzset{tubes/height/.initial=1.4} % relative height
-\ctikzset{tubes/tube radius/.initial=0.40} % radius of tube circle
-\ctikzset{tubes/anode distance/.initial=0.40} % distance from center
-\ctikzset{tubes/anode width/.initial=0.40} % width of an anode/plate
-\ctikzset{tubes/grid protrusion/.initial=0.25} % distance from center
-\ctikzset{tubes/grid dashes/.initial=5} % number of grid dashes
-\ctikzset{tubes/grid separation/.initial=0.2} % separation between grids
-\ctikzset{tubes/grid shift/.initial=0.0} % y shift grids from center
-\ctikzset{tubes/cathode distance/.initial=0.40} % distance from grid
-\ctikzset{tubes/cathode width/.initial=0.40} % width of an cathode
-\ctikzset{tubes/cathode corners/.initial=0.06} % corners of the cathode wire
-\ctikzset{tubes/cathode right extend/.initial=0.075} % extension at the right side
-\ctikzset{tubes/filament distance/.initial=0.1} % distance from cathode
-\ctikzset{tubes/filament angle/.initial=15} % Angle from centerpoint
-
-\newif\ifpgf@circuit@tubes@filament\pgf@circuit@tubes@filamentfalse
-\pgfkeys{/tikz/filament/.add code={}{\pgf@circuit@tubes@filamenttrue}}
-\ctikzset{tubes/filament/.add code={}{\pgf@circuit@tubes@filamenttrue}}
-\newif\ifpgf@circuit@tubes@nocathode\pgf@circuit@tubes@nocathodefalse
-\pgfkeys{/tikz/nocathode/.add code={}{\pgf@circuit@tubes@nocathodetrue}}
-\ctikzset{tubes/nocathode/.add code={}{\pgf@circuit@tubes@nocathodetrue}}
-\newif\ifpgf@circuit@tubes@fullcathode\pgf@circuit@tubes@fullcathodefalse
-\pgfkeys{/tikz/fullcathode/.add code={}{\pgf@circuit@tubes@fullcathodetrue}}
-\ctikzset{tubes/fullcathode/.add code={}{\pgf@circuit@tubes@fullcathodetrue}}
-
-% powerelectronic blocks
-\ctikzset{bipoles/sacdc/width/.initial=.7}
-\ctikzset{bipoles/sdcac/width/.initial=.7}
-\ctikzset{bipoles/tacdc/width/.initial=.7}
-\ctikzset{bipoles/tdcac/width/.initial=.7}
-\ctikzset{quadpoles/gridnode/width/.initial=.7} %not sure if quadpole?
+%%>>>
\endinput
+% vim: set fdm=marker fmr=%<<<,%>>>:
diff --git a/graphics/pgf/contrib/circuitikz/tex/pgfcirccurrent.tex b/graphics/pgf/contrib/circuitikz/tex/pgfcirccurrent.tex
index b8cf055590..a6b0d039b7 100644
--- a/graphics/pgf/contrib/circuitikz/tex/pgfcirccurrent.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/pgfcirccurrent.tex
@@ -88,6 +88,7 @@
}
\ctikzset{i/.code = {
+ \pgfcirc@has@itrue
\pgfkeys{\circuitikzbasekey/bipole/current/direction = forward,
\circuitikzbasekey/bipole/current/x position = after,
\circuitikzbasekey/bipole/current/y position = above }
@@ -131,8 +132,8 @@
%% Output routine
\def\pgf@circ@drawcurrent{
\pgfextra{
- \edef\pgf@circ@ffffff{\pgf@circ@direction}
- \def\pgfcircmathresult{\expandafter\pgf@circ@stripdecimals\pgf@circ@ffffff\pgf@nil}
+ \edef\pgf@circ@rounded@dir{\pgf@circ@direction}
+ \def\pgfcircmathresult{\expandafter\pgf@circ@stripdecimals\pgf@circ@rounded@dir\pgf@nil}
\ifnum\pgfcircmathresult >4 \ifnum\pgfcircmathresult <86
\ifpgf@circuit@bipole@current@below
@@ -178,36 +179,50 @@
\ifpgf@circuit@bipole@current@below
\def\pgf@circ@dir{north}\else\def\pgf@circ@dir{south}
\fi
- \fi
+ \fi
+ % export anchor position (if not needed, is always the same macro)
+ \expandafter\xdef\csname pgfcirc@\pgfcirc@a@prefix-Ilab-anchor\endcsname{\pgf@circ@dir}
- \ifpgf@circuit@bipole@current@below
- \def\pgf@circ@bipole@current@label@where{-90}
- \else
- \def\pgf@circ@bipole@current@label@where{+90}
- \fi
+ \ifpgf@circuit@bipole@current@below
+ \def\pgf@circ@bipole@current@label@where{-90}
+ \else
+ \def\pgf@circ@bipole@current@label@where{+90}
+ \fi
}
+ %
\pgfextra{\def\pgf@temp{short}\edef\pgf@circ@temp{\ctikzvalof{bipole/kind}}}
\ifx\pgf@circ@temp\pgf@temp%draw current at a short at middle of the line
- (\tikztostart)--(\tikztotarget)
+ coordinate (\pgfcirc@a@prefix-Ifrom) at (\tikztostart)
+ coordinate (\pgfcirc@a@prefix-Ito) at (\tikztotarget)
\else% normal bipole or source
\ifpgf@circuit@bipole@current@before
- (\tikztostart)--(anchorstartnode)
+ coordinate (\pgfcirc@a@prefix-Ifrom) at (\tikztostart)
+ coordinate (\pgfcirc@a@prefix-Ito) at (anchorstartnode)
\else
- (anchorendnode)--(\tikztotarget)
+ coordinate (\pgfcirc@a@prefix-Ifrom) at (anchorendnode)
+ coordinate (\pgfcirc@a@prefix-Ito) at (\tikztotarget)
\fi
\fi
\ifpgf@circuit@bipole@current@backward
\pgfextra{
- \pgfmathsubtract{\pgf@circ@ffffff}{180}
- \edef\pgf@circ@ffffff{\expandafter\pgf@circ@stripdecimals\pgfmathresult\pgf@nil}
+ \pgfmathsubtract{\pgf@circ@rounded@dir}{180}
+ \edef\pgf@circ@rounded@dir{\expandafter\pgf@circ@stripdecimals\pgfmathresult\pgf@nil}
}
\fi
- coordinate[currarrow,pos=\ctikzvalof{current/distance},rotate=\pgf@circ@ffffff,
- anchor=center](Iarrow)
- (Iarrow.\pgf@circ@bipole@current@label@where)
+ coordinate (\pgfcirc@a@prefix-Ipos) at ($(\pgfcirc@a@prefix-Ifrom)! \ctikzvalof{current/distance} !(\pgfcirc@a@prefix-Ito)$)
+ % if the current label is not empty (in which case we have already all the anchors)
+ \pgf@circ@ifkeyempty{bipole/current/label/name}\else
+ % put the arrow node
+ node[currarrow, rotate=\pgf@circ@rounded@dir, anchor=center](Iarrow) at (\pgfcirc@a@prefix-Ipos) {}
+ % put the label
node[anchor=\pgf@circ@dir, \circuitikzbasekey/bipole current style]
- (\ctikzvalof{bipole/name}current){\pgf@circ@finallabels{current/label}}
+ (\ctikzvalof{bipole/name}current)
+ at (Iarrow.\pgf@circ@bipole@current@label@where){\pgf@circ@finallabels{current/label}}
+ \fi % end ifempty
+ \ifpgf@circuit@bipole@current@backward
+ \pgfcirc@swap@coordinates{\pgfcirc@a@prefix-Ifrom}{\pgfcirc@a@prefix-Ito}
+ \fi
}
\endinput
diff --git a/graphics/pgf/contrib/circuitikz/tex/pgfcircflow.tex b/graphics/pgf/contrib/circuitikz/tex/pgfcircflow.tex
index b7bb8b9767..f2adc0d8ef 100644
--- a/graphics/pgf/contrib/circuitikz/tex/pgfcircflow.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/pgfcircflow.tex
@@ -13,6 +13,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% flow handling
+
%% styles
\ctikzset{bipole flow style/.style={}}
\tikzset{bipole flow style/.code={
@@ -27,7 +28,7 @@
f = #1,
\circuitikzbasekey/bipole/flow/direction = forward,
\circuitikzbasekey/bipole/flow/x position = after,
- \circuitikzbasekey/bipole/curflowrent/y position = above
+ \circuitikzbasekey/bipole/flow/y position = above
}
}
@@ -93,6 +94,7 @@
\ctikzset{f^/.style = { f = #1, \circuitikzbasekey/bipole/flow/y position = above } }
\ctikzset{f/.code = {
+ \pgfcirc@has@ftrue
\pgfkeys{\circuitikzbasekey/bipole/flow/direction = forward,
\circuitikzbasekey/bipole/flow/x position = after,
\circuitikzbasekey/bipole/flow/y position = above }
@@ -113,10 +115,11 @@
}
%% Output routine
+
\def\pgf@circ@drawflow{
\pgfextra{
- \edef\pgf@circ@ffffff{\pgf@circ@direction}
- \def\pgfcircmathresult{\expandafter\pgf@circ@stripdecimals\pgf@circ@ffffff\pgf@nil}
+ \edef\pgf@circ@rounded@dir{\pgf@circ@direction}
+ \def\pgfcircmathresult{\expandafter\pgf@circ@stripdecimals\pgf@circ@rounded@dir\pgf@nil}
\ifnum\pgfcircmathresult >4 \ifnum\pgfcircmathresult <86
\ifpgf@circuit@bipole@flow@below
@@ -169,38 +172,62 @@
\else
\def\pgf@circ@bipole@flow@label@where{+90}
\fi
+ % export anchor position (if not needed, is always the same macro)
+ \expandafter\xdef\csname pgfcirc@\pgfcirc@a@prefix-Flab-anchor\endcsname{\pgf@circ@dir}
}
\pgfextra{\def\pgf@temp{short}\edef\pgf@circ@temp{\ctikzvalof{bipole/kind}}}
- \ifx\pgf@circ@temp\pgf@temp%draw flow at a short at middle of the line
- (\tikztostart)--(\tikztotarget)
+ \ifx\pgf@circ@temp\pgf@temp%draw current at a short at middle of the line
+ coordinate (pgfcirc@Ffrom@flat) at (\tikztostart)
+ coordinate (pgfcirc@Fto@flat) at (\tikztotarget)
\else% normal bipole or source
\ifpgf@circuit@bipole@flow@before
- (\tikztostart)--(anchorstartnode)
+ coordinate (pgfcirc@Ffrom@flat) at (\tikztostart)
+ coordinate (pgfcirc@Fto@flat) at (anchorstartnode)
\else
- (anchorendnode)--(\tikztotarget)
+ coordinate (pgfcirc@Ffrom@flat) at (anchorendnode)
+ coordinate (pgfcirc@Fto@flat) at (\tikztotarget)
\fi
\fi
\pgfextra{
+ \newdimen{\absfshift}
+ \def\flow@offset{\ctikzvalof{flow/offset}\pgf@circ@Rlen}
+ \absfshift=\flow@offset
\ifpgf@circuit@bipole@flow@backward
- \ifpgf@circuit@bipole@flow@below
- \def\flow@offset{\ctikzvalof{flow/offset}\pgf@circ@Rlen}
- \else
- \def\flow@offset{-\ctikzvalof{flow/offset}\pgf@circ@Rlen}
- \fi
- \pgfmathsubtract{\pgf@circ@ffffff}{180}
- \edef\pgf@circ@ffffff{\expandafter\pgf@circ@stripdecimals\pgfmathresult\pgf@nil}
- \else
- \ifpgf@circuit@bipole@flow@below
- \def\flow@offset{-\ctikzvalof{flow/offset}\pgf@circ@Rlen}
- \else
- \def\flow@offset{\ctikzvalof{flow/offset}\pgf@circ@Rlen}
- \fi
+ \pgfmathsubtract{\pgf@circ@rounded@dir}{180}
+ \edef\pgf@circ@rounded@dir{\expandafter\pgf@circ@stripdecimals\pgfmathresult\pgf@nil}
\fi
}
- coordinate[flowarrow,pos=\ctikzvalof{flow/distance},rotate=\pgf@circ@ffffff,yshift=\flow@offset, anchor=center](Farrowpos)
- (Farrowpos.\pgf@circ@bipole@flow@label@where) node[anchor=\pgf@circ@dir, \circuitikzbasekey/bipole flow style]
- (\ctikzvalof{bipole/name}flow){\pgf@circ@finallabels{flow/label}}
+ \ifpgf@circuit@bipole@flow@below
+ coordinate (pgfcirc@Ffrom@up) at ($(pgfcirc@Ffrom@flat) ! \absfshift !-90: (pgfcirc@Fto@flat)$)
+ coordinate (pgfcirc@Fto@up) at ($(pgfcirc@Fto@flat) ! \absfshift !90: (pgfcirc@Ffrom@flat)$)
+ \else
+ coordinate (pgfcirc@Ffrom@up) at ($(pgfcirc@Ffrom@flat) ! \absfshift !90: (pgfcirc@Fto@flat)$)
+ coordinate (pgfcirc@Fto@up) at ($(pgfcirc@Fto@flat) ! \absfshift !-90: (pgfcirc@Ffrom@flat)$)
+ \fi
+ coordinate (\pgfcirc@a@prefix-Fpos) at ($(pgfcirc@Ffrom@up) ! \ctikzvalof{flow/distance} !(pgfcirc@Fto@up)$)
+ \pgfextra{
+ \absfshift=0.25\pgf@circ@Rlen% This is half size of the "flowarrow" shape!
+ }
+ coordinate (\pgfcirc@a@prefix-Ffrom) at ($(\pgfcirc@a@prefix-Fpos)!\absfshift!(pgfcirc@Ffrom@up)$)
+ coordinate (\pgfcirc@a@prefix-Fto) at ($(\pgfcirc@a@prefix-Fpos)!\absfshift!(pgfcirc@Fto@up) $)
+ %
+ % coordinate (\pgfcirc@a@prefix-Fpos) at
+ % ([yshift=\flow@offset]$(\pgfcirc@a@prefix-Ffrom)! \ctikzvalof{flow/distance} !(\pgfcirc@a@prefix-Fto)$)
+ % if the flow label is not empty (in which case we have already all the anchors)
+ \pgf@circ@ifkeyempty{bipole/flow/label/name}\else
+ % the flow arrow is really a node "flowarrow", not a real arrow
+ node[flowarrow, rotate=\pgf@circ@rounded@dir, anchor=center](Farrowpos) at (\pgfcirc@a@prefix-Fpos) {}
+
+ node[anchor=\pgf@circ@dir, \circuitikzbasekey/bipole flow style]
+ (\ctikzvalof{bipole/name}flow) at (Farrowpos.\pgf@circ@bipole@flow@label@where) {\pgf@circ@finallabels{flow/label}}
+ \fi
+
+ % adjust from and to before exporting --- it's much more simple like this then rework the algorithm above
+ \ifpgf@circuit@bipole@flow@backward
+ \pgfcirc@swap@coordinates{\pgfcirc@a@prefix-Ffrom}{\pgfcirc@a@prefix-Fto}
+ \fi
+
}
\endinput
diff --git a/graphics/pgf/contrib/circuitikz/tex/pgfcircpath.tex b/graphics/pgf/contrib/circuitikz/tex/pgfcircpath.tex
index e6ba47b7ab..695deaea63 100644
--- a/graphics/pgf/contrib/circuitikz/tex/pgfcircpath.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/pgfcircpath.tex
@@ -13,6 +13,13 @@
\def\pgf@circ@direction{0.0}
+% swap two coordinates
+\def\pgfcirc@swap@coordinates#1#2{%
+ coordinate (tmp) at (#1)
+ coordinate (#1) at (#2)
+ coordinate (#2) at (tmp)
+}
+
% Names
\ctikzset{name/.style = { n=#1 } } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%@@@
\ctikzset{n/.code = {
@@ -52,22 +59,6 @@
}
}
-%% Helper function for path-function to ensure using anchors between nodes
-\def\set@explicit@center@anchor#1{
- \pgfutil@ifundefined{pgf@sh@ns@#1}
- {
- %This coordinate is no node(but a relative position or a coordinate), no further handling needed
- }{
- \pgfutil@in@.{#1}
- \ifpgfutil@in@
- % Anchor is used, do nothing!
- \else%
- \let\tikz@moveto@waiting=\relax
- \pgfpathmoveto{\tikz@last@position}%force movement, because tikz@moveto@waiting
- \edef#1{#1.center}%ensure using center anchor
- \fi
-}
-}
%% Generic bipole path
\def\pgf@circ@bipole@path#1#2{
@@ -111,80 +102,79 @@
% #4: this will be filled by the argument of the to-path
%
\pgfextra{
- \set@explicit@center@anchor{\tikztostart}
- \set@explicit@center@anchor{\tikztotarget}
- \pgfsyssoftpath@getcurrentpath{\myp@th}%% save current path to extend after calculation of correct start/end coordinates
\ctikzset{bipole/kind = #3}
\edef\pgf@temp{\ctikzvalof{bipole/name}}
\def\pgf@circ@temp{}
\ifx\pgf@temp\pgf@circ@temp % if it has not a name
\pgfmathrandominteger{\pgf@circ@rand}{1000}{9999}
\ctikzset{bipole/name = #3\pgf@circ@rand} % create it (re-usage should not create problem, but...)
+ \edef\pgfcirc@a@prefix{pgfcirc}% do not pollute the namespace for nothing
+ \else
+ \edef\pgfcirc@a@prefix{\ctikzvalof{bipole/name}}% for exporting v-i-f anchors
\fi
}
-
- (\tikztostart) coordinate (\ctikzvalof{bipole/name}start)%necessary to get correct coordinates in the case of relative start/end or constructions like ((node1)-|(node2))
- (\tikztotarget) coordinate (\ctikzvalof{bipole/name}end)
+ % save start and stop values
+ % notice that we DO NOT MOVE the path position at all!
+ coordinate (\ctikzvalof{bipole/name}start) at (\tikztostart)
+ coordinate (\ctikzvalof{bipole/name}end) at (\tikztotarget)
\pgfextra{
+ % find the direction (angle) of the path
\pgfmathanglebetweenpoints{\pgfpointanchor{\ctikzvalof{bipole/name}start}{center}}
- {\pgfpointanchor{\ctikzvalof{bipole/name}end}{center}}
- % DO NOT ROUND HERE! pgfcirclabel.tex will do that when needed
- % \pgfmathround{\pgfmathresult}
- \edef\pgf@circ@direction{\pgfmathresult}%Calculate direction(angle) of path
- % \typeout{DIRECTION:\pgf@circ@direction}
- \pgfsyssoftpath@setcurrentpath{\myp@th}
+ {\pgfpointanchor{\ctikzvalof{bipole/name}end}{center}}
+ \edef\pgf@circ@direction{\pgfmathresult}
+ \expandafter\xdef\csname pgfcirc@\pgfcirc@a@prefix-direction\endcsname{\pgf@circ@direction}
}
- \pgfextra{\def\pgf@temp{open}\def\pgf@circ@temp{#3}}
- \ifx\pgf@temp\pgf@circ@temp % if it is an open
+ % position the component in the middle of the path. We DO NOT MOVE the current position!
+ node[#3#1, rotate=\pgf@circ@direction, yscale=\ctikzvalof{mirror value},
+ xscale=\ctikzvalof{invert value}] (\ctikzvalof{bipole/name})
+ at ($(\tikztostart) ! .5 ! (\tikztotarget)$) {#2}
+ % set start and end labels
+ \ifpgf@circuit@bipole@inverted
+ \ifcsname pgf@anchor@#3#1@pathstart\endcsname%if special path-anchors are defined, use them!
+ coordinate (anchorstartnode) at (\ctikzvalof{bipole/name}.pathend)
+ coordinate (anchorendnode) at (\ctikzvalof{bipole/name}.pathstart)
\else
- --($(\ctikzvalof{bipole/name}start) ! .5\pgflinewidth ! (\ctikzvalof{bipole/name}end)$) %ugly workaround to get correct linejoins(node breaks path?)
- \fi
- ($(\tikztostart) ! .5 ! (\tikztotarget)$)%%positio of middle node
- node[#3#1, rotate=\pgf@circ@direction, yscale=\ctikzvalof{mirror value}, xscale=\ctikzvalof{invert value}]
- (\ctikzvalof{bipole/name}) {#2}
- \ifpgf@circuit@bipole@inverted
- \ifcsname pgf@anchor@#3#1@pathstart\endcsname%if special path-anchors are defined, use them!
- coordinate (anchorstartnode) at (\ctikzvalof{bipole/name}.pathend)
- coordinate (anchorendnode) at (\ctikzvalof{bipole/name}.pathstart)
- \else
- coordinate (anchorstartnode) at (\ctikzvalof{bipole/name}.right)
- coordinate (anchorendnode) at (\ctikzvalof{bipole/name}.left)
- \fi
- \else
- \ifcsname pgf@anchor@#3#1@pathstart\endcsname%if special path-anchors are defined, use them!
- coordinate (anchorstartnode) at (\ctikzvalof{bipole/name}.pathstart)
- coordinate (anchorendnode) at (\ctikzvalof{bipole/name}.pathend)
- \else
- coordinate (anchorstartnode) at (\ctikzvalof{bipole/name}.left)
- coordinate (anchorendnode) at (\ctikzvalof{bipole/name}.right)
- \fi
+ coordinate (anchorstartnode) at (\ctikzvalof{bipole/name}.right)
+ coordinate (anchorendnode) at (\ctikzvalof{bipole/name}.left)
\fi
- \pgfextra{\def\pgf@temp{open}\def\pgf@circ@temp{#3}}
- \ifx\pgf@temp\pgf@circ@temp % if it is an open
\else
- (\ctikzvalof{bipole/name}start.center) -- (anchorstartnode)
- (anchorendnode) -- (\ctikzvalof{bipole/name}end.center)
- \fi
-
- \drawpoles
- \pgf@circ@ifkeyempty{bipole/label/name}\else\pgf@circ@drawlabels{label}\fi
- \pgf@circ@ifkeyempty{bipole/annotation/name}\else\pgf@circ@drawlabels{annotation}\fi
- \pgf@circ@ifkeyempty{bipole/voltage/label/name}\else\pgf@circ@drawvoltage\fi
- \pgf@circ@ifkeyempty{bipole/current/label/name}\else\pgf@circ@drawcurrent\fi
- \pgf@circ@ifkeyempty{bipole/flow/label/name}\else\pgf@circ@drawflow\fi
- \pgfextra{\def\pgf@temp{open}\def\pgf@circ@temp{#3}}
- \ifx\pgf@temp\pgf@circ@temp % if it is an open
- (\ctikzvalof{bipole/name}end)%Move to end of path
+ \ifcsname pgf@anchor@#3#1@pathstart\endcsname%if special path-anchors are defined, use them!
+ coordinate (anchorstartnode) at (\ctikzvalof{bipole/name}.pathstart)
+ coordinate (anchorendnode) at (\ctikzvalof{bipole/name}.pathend)
\else
- ($(\ctikzvalof{bipole/name}end) ! .5\pgflinewidth ! (\ctikzvalof{bipole/name}start)$) -- (\ctikzvalof{bipole/name}end)%ugly workaround to get correct linejoins(node breaks path?)
- %tikztostart and tikztotarget could not be used, because it would break if target coordinate is something like (node1-|node2)
-
+ coordinate (anchorstartnode) at (\ctikzvalof{bipole/name}.left)
+ coordinate (anchorendnode) at (\ctikzvalof{bipole/name}.right)
\fi
- % reset
- \pgfextra{
- \pgfcircresetpath
- }
- \tikztonodes%draw pending nodes an path
+ \fi
+ % draw the leads unless it's an open circuit
+ % stop at the component
+ \pgfextra{\def\pgf@temp{open}\def\pgf@circ@temp{#3}}
+ \ifx\pgf@temp\pgf@circ@temp % if it is an open do nothing
+ \else
+ % it is important to start the path with -- to have correct line joins!
+ -- (\tikztostart) -- (anchorstartnode)
+ \fi
+ % Add all the "ornaments": labels, annotations, voltages, currents and flows
+ \drawpoles
+ \pgf@circ@ifkeyempty{bipole/label/name}\else\pgf@circ@drawlabels{label}\fi
+ \pgf@circ@ifkeyempty{bipole/annotation/name}\else\pgf@circ@drawlabels{annotation}\fi
+ \ifpgfcirc@has@v\pgf@circ@drawvoltage\fi
+ % \pgf@circ@ifkeyempty{bipole/current/label/name}\else\pgf@circ@drawcurrent\fi
+ \ifpgfcirc@has@i\pgf@circ@drawcurrent\fi
+ % \pgf@circ@ifkeyempty{bipole/flow/label/name}\else\pgf@circ@drawflow\fi
+ \ifpgfcirc@has@f\pgf@circ@drawflow\fi
+ % finish the path from the component to the final target
+ % you never know --- re-set \pgf@temp to detect open
+ \pgfextra{\def\pgf@temp{open}\def\pgf@circ@temp{#3}}
+ \ifx\pgf@temp\pgf@circ@temp % if it is an open do nothing
+ (\tikztotarget)
+ \else
+ (anchorendnode) -- (\tikztotarget)
+ \fi
+ % reset internal circuit keys
+ \pgfextra{\pgfcircresetpath}
+ %draw pending nodes an path
+ \tikztonodes
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/graphics/pgf/contrib/circuitikz/tex/pgfcircvoltage.tex b/graphics/pgf/contrib/circuitikz/tex/pgfcircvoltage.tex
index 00fa692b0f..032a66f29c 100644
--- a/graphics/pgf/contrib/circuitikz/tex/pgfcircvoltage.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/pgfcircvoltage.tex
@@ -58,6 +58,7 @@
% Default position varies whether the component is a voltage source
% or not
\ctikzset{v/.code = {
+ \pgfcirc@has@vtrue
\ifpgf@circuit@bipole@isvoltage
\pgfkeys{\circuitikzbasekey/bipole/voltage/position=above,
\circuitikzbasekey/bipole/voltage/direction=forward}
@@ -174,6 +175,10 @@
\def\pgf@circ@bipole@voltage@label@anchor{center}
\fi
\fi
+ \ifpgf@circuit@bipole@voltage@raised
+ \def\pgf@circ@bipole@voltage@label@anchor{center}
+ \pgfmathsetlength{\absvshift}{\absvshift+height{"Q"}} % with the current font.
+ \fi
}
% %\pgf@circ@Rlen/\ctikzvalof{current arrow scale} is equal to the length of the currarrow
%absolute move, minimum space is length of arrowhead
@@ -193,28 +198,33 @@
coordinate (pgfcirc@bottom) at (\ctikzvalof{bipole/name}.-90)
coordinate (pgfcirc@Vto1) at ($(pgfcirc@mid)+(pgfcirc@bottom)-(pgfcirc@Vfrom@flat)$)
coordinate (pgfcirc@Vfrom1) at ($(pgfcirc@mid)+(pgfcirc@bottom)-(pgfcirc@Vto@flat)$)
- coordinate (pgfcirc@Vto) at ($(pgfcirc@Vto1) ! \absvshift!90 : (pgfcirc@Vfrom1)$)
- coordinate (pgfcirc@Vfrom) at ($(pgfcirc@Vfrom1) ! \absvshift!-90 : (pgfcirc@Vto1)$)
- coordinate (pgfcirc@Vlab) at ($(pgfcirc@Vto)!0.5!(pgfcirc@Vfrom) $)
- coordinate (pgfcirc@Vdir) at (pgfcirc@Vto)
+ coordinate (\pgfcirc@a@prefix-Vto) at ($(pgfcirc@Vto1) ! \absvshift!90 : (pgfcirc@Vfrom1)$)
+ coordinate (\pgfcirc@a@prefix-Vfrom) at ($(pgfcirc@Vfrom1) ! \absvshift!-90 : (pgfcirc@Vto1)$)
+ coordinate (\pgfcirc@a@prefix-Vlab) at ($(\pgfcirc@a@prefix-Vto)!0.5!(\pgfcirc@a@prefix-Vfrom) $)
+ coordinate (pgfcirc@Vdir) at (\pgfcirc@a@prefix-Vto)
\else
- coordinate (pgfcirc@Vto) at ($(pgfcirc@Vto@flat) ! \absvshift!90 : (anchorendnode)$)
- coordinate (pgfcirc@Vfrom) at ($(pgfcirc@Vfrom@flat) ! \absvshift!-90 : (anchorstartnode)$)
+ coordinate (\pgfcirc@a@prefix-Vto) at ($(pgfcirc@Vto@flat) ! \absvshift!90 : (anchorendnode)$)
+ coordinate (\pgfcirc@a@prefix-Vfrom) at ($(pgfcirc@Vfrom@flat) ! \absvshift!-90 : (anchorstartnode)$)
coordinate (pgfcirc@Vcont1t) at ($(\ctikzvalof{bipole/name}.center) ! \bumpb ! (\ctikzvalof{bipole/name}.-110)$)
coordinate (pgfcirc@Vcont2t) at ($(\ctikzvalof{bipole/name}.center) ! \bumpb ! (\ctikzvalof{bipole/name}.-70)$)
- coordinate (pgfcirc@Vcont1) at ($(pgfcirc@Vcont1t) ! -\absvshift!90 : (pgfcirc@Vcont2t)$)
- coordinate (pgfcirc@Vcont2) at ($(pgfcirc@Vcont2t) ! -\absvshift!-90 : (pgfcirc@Vcont1t)$)
- coordinate (pgfcirc@Vlab) at ($(pgfcirc@Vcont2)!0.5!(pgfcirc@Vcont1)$)
- coordinate (pgfcirc@Vdir) at (pgfcirc@Vcont2)
+ coordinate (\pgfcirc@a@prefix-Vcont1) at ($(pgfcirc@Vcont1t) ! -\absvshift!90 : (pgfcirc@Vcont2t)$)
+ coordinate (\pgfcirc@a@prefix-Vcont2) at ($(pgfcirc@Vcont2t) ! -\absvshift!-90 : (pgfcirc@Vcont1t)$)
+ coordinate (\pgfcirc@a@prefix-Vlab) at ($(\pgfcirc@a@prefix-Vcont2)!0.5!(\pgfcirc@a@prefix-Vcont1)$)
+ coordinate (pgfcirc@Vdir) at (\pgfcirc@a@prefix-Vcont2)
\fi
- \else % we are here in case of american here
+ \else
% we are in case of american here
- coordinate (pgfcirc@Vto) at ($(pgfcirc@Vto@flat) ! \absvshift!90 : (anchorendnode)$)
- coordinate (pgfcirc@Vfrom) at ($(pgfcirc@Vfrom@flat) ! \absvshift!-90 : (anchorstartnode)$)
+ coordinate (\pgfcirc@a@prefix-Vto) at ($(pgfcirc@Vto@flat) ! \absvshift!90 : (anchorendnode)$)
+ coordinate (\pgfcirc@a@prefix-Vfrom) at ($(pgfcirc@Vfrom@flat) ! \absvshift!-90 : (anchorstartnode)$)
coordinate (pgfcirc@bottom) at (\ctikzvalof{bipole/name}.-90)
coordinate (pgfcirc@Vdir0) at ($(pgfcirc@mid)+(pgfcirc@bottom)-(pgfcirc@Vfrom@flat)$)
- coordinate (pgfcirc@Vlab) at ($(pgfcirc@bottom) ! \absvshift!-90 : (pgfcirc@Vdir0)$)
- coordinate (pgfcirc@Vdir) at ($(pgfcirc@mid)+(pgfcirc@Vlab)-(pgfcirc@Vfrom@flat)$)
+ coordinate (\pgfcirc@a@prefix-Vlab) at ($(pgfcirc@bottom) ! \absvshift!-90 : (pgfcirc@Vdir0)$)
+ coordinate (pgfcirc@Vdir) at ($(pgfcirc@mid)+(\pgfcirc@a@prefix-Vlab)-(pgfcirc@Vfrom@flat)$)
+ \ifpgf@circuit@bipole@voltage@raised
+ % move the from and to up to the level of Vlab
+ coordinate (\pgfcirc@a@prefix-Vto) at ($(\pgfcirc@a@prefix-Vlab)+(pgfcirc@Vto@flat)-(pgfcirc@mid)$)
+ coordinate (\pgfcirc@a@prefix-Vfrom) at ($(\pgfcirc@a@prefix-Vlab)+(pgfcirc@Vfrom@flat)-(pgfcirc@mid)$)
+ \fi
\fi
\else
\ifpgf@circuit@europeanvoltage
@@ -224,102 +234,113 @@
coordinate (pgfcirc@Vto1) at ($(pgfcirc@mid)+(pgfcirc@top)-(pgfcirc@Vfrom@flat)$)
coordinate (pgfcirc@Vfrom1) at ($(pgfcirc@mid)+(pgfcirc@top)-(pgfcirc@Vto@flat)$)
% add the extra distance
- coordinate (pgfcirc@Vto) at ($(pgfcirc@Vto1) ! \absvshift!-90 : (pgfcirc@Vfrom1)$)
- coordinate (pgfcirc@Vfrom) at ($(pgfcirc@Vfrom1) ! \absvshift!90 : (pgfcirc@Vto1)$)
- coordinate (pgfcirc@Vlab) at ($(pgfcirc@Vto)!0.5!(pgfcirc@Vfrom) $)
+ coordinate (\pgfcirc@a@prefix-Vto) at ($(pgfcirc@Vto1) ! \absvshift!-90 : (pgfcirc@Vfrom1)$)
+ coordinate (\pgfcirc@a@prefix-Vfrom) at ($(pgfcirc@Vfrom1) ! \absvshift!90 : (pgfcirc@Vto1)$)
+ coordinate (\pgfcirc@a@prefix-Vlab) at ($(\pgfcirc@a@prefix-Vto)!0.5!(\pgfcirc@a@prefix-Vfrom) $)
% direction line to shift the label later
- coordinate (pgfcirc@Vdir) at (pgfcirc@Vto)
+ coordinate (pgfcirc@Vdir) at (\pgfcirc@a@prefix-Vto)
\else
% european voltages here
- coordinate (pgfcirc@Vto) at ($(pgfcirc@Vto@flat) ! -\absvshift!90 : (anchorendnode)$)
- coordinate (pgfcirc@Vfrom) at ($(pgfcirc@Vfrom@flat) ! -\absvshift!-90 : (anchorstartnode)$)
+ coordinate (\pgfcirc@a@prefix-Vto) at ($(pgfcirc@Vto@flat) ! -\absvshift!90 : (anchorendnode)$)
+ coordinate (\pgfcirc@a@prefix-Vfrom) at ($(pgfcirc@Vfrom@flat) ! -\absvshift!-90 : (anchorstartnode)$)
% identify the two control points for the "arc" of the voltage
coordinate (pgfcirc@Vcont1t) at ($(\ctikzvalof{bipole/name}.center) ! \bumpb ! (\ctikzvalof{bipole/name}.110)$)
coordinate (pgfcirc@Vcont2t) at ($(\ctikzvalof{bipole/name}.center) ! \bumpb ! (\ctikzvalof{bipole/name}.70)$)
% and shift them a bit
- coordinate (pgfcirc@Vcont1) at ($(pgfcirc@Vcont1t) ! \absvshift!90 : (pgfcirc@Vcont2t)$)
- coordinate (pgfcirc@Vcont2) at ($(pgfcirc@Vcont2t) ! \absvshift!-90 : (pgfcirc@Vcont1t)$)
- coordinate (pgfcirc@Vlab) at ($(pgfcirc@Vcont2)!0.5!(pgfcirc@Vcont1)$)
+ coordinate (\pgfcirc@a@prefix-Vcont1) at ($(pgfcirc@Vcont1t) ! \absvshift!90 : (pgfcirc@Vcont2t)$)
+ coordinate (\pgfcirc@a@prefix-Vcont2) at ($(pgfcirc@Vcont2t) ! \absvshift!-90 : (pgfcirc@Vcont1t)$)
+ coordinate (\pgfcirc@a@prefix-Vlab) at ($(\pgfcirc@a@prefix-Vcont2)!0.5!(\pgfcirc@a@prefix-Vcont1)$)
% direction line to shift the label later
- coordinate (pgfcirc@Vdir) at (pgfcirc@Vcont2)
+ coordinate (pgfcirc@Vdir) at (\pgfcirc@a@prefix-Vcont2)
\fi
\else
% we are in case of american here
- coordinate (pgfcirc@Vto) at ($(pgfcirc@Vto@flat) ! \absvshift!-90 : (anchorendnode)$)
- coordinate (pgfcirc@Vfrom) at ($(pgfcirc@Vfrom@flat) ! \absvshift!90 : (anchorstartnode)$)
+ coordinate (\pgfcirc@a@prefix-Vto) at ($(pgfcirc@Vto@flat) ! \absvshift!-90 : (anchorendnode)$)
+ coordinate (\pgfcirc@a@prefix-Vfrom) at ($(pgfcirc@Vfrom@flat) ! \absvshift!90 : (anchorstartnode)$)
coordinate (pgfcirc@top) at (\ctikzvalof{bipole/name}.90)
% move parallel to the component line
coordinate (pgfcirc@Vdir0) at ($(pgfcirc@mid)+(pgfcirc@top)-(pgfcirc@Vfrom@flat)$)
% and add the extra distance
- coordinate (pgfcirc@Vlab) at ($(pgfcirc@top) ! \absvshift!90 : (pgfcirc@Vdir0)$)
- coordinate (pgfcirc@Vdir) at ($(pgfcirc@mid)+(pgfcirc@Vlab)-(pgfcirc@Vfrom@flat)$)
+ coordinate (\pgfcirc@a@prefix-Vlab) at ($(pgfcirc@top) ! \absvshift!90 : (pgfcirc@Vdir0)$)
+ coordinate (pgfcirc@Vdir) at ($(pgfcirc@mid)+(\pgfcirc@a@prefix-Vlab)-(pgfcirc@Vfrom@flat)$)
+ \ifpgf@circuit@bipole@voltage@raised
+ % move the from and to up to the level of Vlab
+ coordinate (\pgfcirc@a@prefix-Vto) at ($(\pgfcirc@a@prefix-Vlab)+(pgfcirc@Vto@flat)-(pgfcirc@mid)$)
+ coordinate (\pgfcirc@a@prefix-Vfrom) at ($(\pgfcirc@a@prefix-Vlab)+(pgfcirc@Vfrom@flat)-(pgfcirc@mid)$)
+ \fi
\fi
\fi
\ifx\@@kind\@@open
- coordinate (pgfcirc@Vto) at (pgfcirc@Vto@flat)
- coordinate (pgfcirc@Vfrom) at (pgfcirc@Vfrom@flat)
+ coordinate (\pgfcirc@a@prefix-Vto) at (pgfcirc@Vto@flat)
+ coordinate (\pgfcirc@a@prefix-Vfrom) at (pgfcirc@Vfrom@flat)
\fi
\ifpgf@circ@debugv
node [ocirc, fill=red] at (anchorstartnode) {}
node [ocirc, fill=blue] at (anchorendnode) {}
- node [ocirc, fill=green] at (pgfcirc@Vto) {}
- node [ocirc, fill=yellow] at (pgfcirc@Vfrom) {}
+ node [ocirc, fill=green] at (\pgfcirc@a@prefix-Vto) {}
+ node [ocirc, fill=yellow] at (\pgfcirc@a@prefix-Vfrom) {}
node [odiamondpole, fill=green!50!black] at (pgfcirc@Vto@flat) {}
node [odiamondpole, fill=orange] at (pgfcirc@Vfrom@flat) {}
\ifpgf@circuit@europeanvoltage
\ifpgf@circuit@bipole@voltage@straight
\else
- node [osquarepole, fill=red] at (pgfcirc@Vcont1) {}
- node [osquarepole, fill=blue] at (pgfcirc@Vcont2) {}
+ node [osquarepole, fill=red] at (\pgfcirc@a@prefix-Vcont1) {}
+ node [osquarepole, fill=blue] at (\pgfcirc@a@prefix-Vcont2) {}
\fi
\fi
\fi
+ %
+ % Now we draw the voltage things (only if not empty --- in which case we have been
+ % called just to set the anchors)
+ %
+ \pgf@circ@ifkeyempty{bipole/voltage/label/name}\else
\ifpgf@circuit@europeanvoltage
\ifpgf@circuit@bipole@voltage@straight
\ifpgf@circuit@bipole@voltage@backward
- (pgfcirc@Vto) --(pgfcirc@Vfrom) node[currarrow, sloped, allow upside down, pos=1,anchor=tip] {}
+ (\pgfcirc@a@prefix-Vto) --(\pgfcirc@a@prefix-Vfrom) node[currarrow, sloped, allow upside down, pos=1,anchor=tip] {}
\else
- (pgfcirc@Vfrom) --(pgfcirc@Vto) node[currarrow, sloped, allow upside down, pos=1,anchor=tip] {}
+ (\pgfcirc@a@prefix-Vfrom) --(\pgfcirc@a@prefix-Vto) node[currarrow, sloped, allow upside down, pos=1,anchor=tip] {}
\fi
\else
\ifpgf@circuit@bipole@voltage@backward
- (pgfcirc@Vto) .. controls (pgfcirc@Vcont2) and (pgfcirc@Vcont1) ..
+ (\pgfcirc@a@prefix-Vto) .. controls (\pgfcirc@a@prefix-Vcont2) and (\pgfcirc@a@prefix-Vcont1) ..
node[currarrow, sloped, allow upside down, pos=1, anchor=tip] {}
- (pgfcirc@Vfrom)
+ (\pgfcirc@a@prefix-Vfrom)
\else
- (pgfcirc@Vfrom) .. controls (pgfcirc@Vcont1) and (pgfcirc@Vcont2) ..
+ (\pgfcirc@a@prefix-Vfrom) .. controls (\pgfcirc@a@prefix-Vcont1) and (\pgfcirc@a@prefix-Vcont2) ..
node[currarrow, sloped, allow upside down, pos=1, anchor=tip] {}
- (pgfcirc@Vto)
+ (\pgfcirc@a@prefix-Vto)
\fi
\fi
\else % american
\ifpgf@circuit@bipole@voltage@backward
\ifpgf@circ@oldvoltagedirection
- (pgfcirc@Vfrom) node[inner sep=0, node font=\pgf@circ@avfont,
+ (\pgfcirc@a@prefix-Vfrom) node[inner sep=0, node font=\pgf@circ@avfont,
anchor=\pgf@circ@bipole@voltage@label@anchor]{\pgf@circ@avplus}
- (pgfcirc@Vto) node[inner sep=0, node font=\pgf@circ@avfont,
+ (\pgfcirc@a@prefix-Vto) node[inner sep=0, node font=\pgf@circ@avfont,
anchor=\pgf@circ@bipole@voltage@label@anchor]{\pgf@circ@avminus}
\else
- (pgfcirc@Vfrom) node[inner sep=0, node font=\pgf@circ@avfont,
+ (\pgfcirc@a@prefix-Vfrom) node[inner sep=0, node font=\pgf@circ@avfont,
anchor=\pgf@circ@bipole@voltage@label@anchor]{\pgf@circ@avminus}
- (pgfcirc@Vto) node[inner sep=0, node font=\pgf@circ@avfont,
+ (\pgfcirc@a@prefix-Vto) node[inner sep=0, node font=\pgf@circ@avfont,
anchor=\pgf@circ@bipole@voltage@label@anchor]{\pgf@circ@avplus}
\fi
\else
\ifpgf@circ@oldvoltagedirection
- (pgfcirc@Vfrom) node[inner sep=0, node font=\pgf@circ@avfont,
+ (\pgfcirc@a@prefix-Vfrom) node[inner sep=0, node font=\pgf@circ@avfont,
anchor=\pgf@circ@bipole@voltage@label@anchor]{\pgf@circ@avminus}
- (pgfcirc@Vto) node[inner sep=0, node font=\pgf@circ@avfont,
+ (\pgfcirc@a@prefix-Vto) node[inner sep=0, node font=\pgf@circ@avfont,
anchor=\pgf@circ@bipole@voltage@label@anchor]{\pgf@circ@avplus}
\else
- (pgfcirc@Vfrom) node[inner sep=0, node font=\pgf@circ@avfont,
+ (\pgfcirc@a@prefix-Vfrom) node[inner sep=0, node font=\pgf@circ@avfont,
anchor=\pgf@circ@bipole@voltage@label@anchor]{\pgf@circ@avplus}
- (pgfcirc@Vto) node[inner sep=0, node font=\pgf@circ@avfont,
+ (\pgfcirc@a@prefix-Vto) node[inner sep=0, node font=\pgf@circ@avfont,
anchor=\pgf@circ@bipole@voltage@label@anchor]{\pgf@circ@avminus}
\fi
\fi
\fi
+ \fi % Closing the ...ifempty
}
%% Output routine for voltage sources
@@ -351,21 +372,22 @@
\ifpgf@circuit@bipole@voltage@below
coordinate (pgfcirc@Vfrom0) at ($(\ctikzvalof{bipole/name}.center) ! \bumpaplus ! (\ctikzvalof{bipole/name}.-120)$)
coordinate (pgfcirc@Vto0) at ($(\ctikzvalof{bipole/name}.center) ! \bumpaplus ! (\ctikzvalof{bipole/name}.-60)$)
- coordinate (pgfcirc@Vfrom) at ($ (pgfcirc@Vfrom0) ! \addvshift! -90: (pgfcirc@Vto0) $)
- coordinate (pgfcirc@Vto) at ($ (pgfcirc@Vto0) ! \addvshift! 90: (pgfcirc@Vfrom0) $)
+ coordinate (\pgfcirc@a@prefix-Vfrom) at ($ (pgfcirc@Vfrom0) ! \addvshift! -90: (pgfcirc@Vto0) $)
+ coordinate (\pgfcirc@a@prefix-Vto) at ($ (pgfcirc@Vto0) ! \addvshift! 90: (pgfcirc@Vfrom0) $)
\else
coordinate (pgfcirc@Vfrom0) at ($ (\ctikzvalof{bipole/name}.center) ! \bumpaplus ! (\ctikzvalof{bipole/name}.120)$)
coordinate (pgfcirc@Vto0) at ($ (\ctikzvalof{bipole/name}.center) ! \bumpaplus ! (\ctikzvalof{bipole/name}.60)$)
- coordinate (pgfcirc@Vfrom) at ($ (pgfcirc@Vfrom0) ! \addvshift! 90: (pgfcirc@Vto0) $)
- coordinate (pgfcirc@Vto) at ($ (pgfcirc@Vto0) ! \addvshift! -90: (pgfcirc@Vfrom0) $)
+ coordinate (\pgfcirc@a@prefix-Vfrom) at ($ (pgfcirc@Vfrom0) ! \addvshift! 90: (pgfcirc@Vto0) $)
+ coordinate (\pgfcirc@a@prefix-Vto) at ($ (pgfcirc@Vto0) ! \addvshift! -90: (pgfcirc@Vfrom0) $)
\fi
- coordinate (pgfcirc@Vlab) at ($(pgfcirc@Vto)!0.5!(pgfcirc@Vfrom) $)
- coordinate (pgfcirc@Vdir) at (pgfcirc@Vto)
+ coordinate (\pgfcirc@a@prefix-Vlab) at ($(\pgfcirc@a@prefix-Vto)!0.5!(\pgfcirc@a@prefix-Vfrom) $)
+ coordinate (pgfcirc@Vdir) at (\pgfcirc@a@prefix-Vto)
+ \pgf@circ@ifkeyempty{bipole/voltage/label/name}\else
\ifpgf@circuit@europeanvoltage
\ifpgf@circuit@bipole@voltage@backward
- (pgfcirc@Vto) -- node[currarrow, sloped, allow upside down, pos=1, anchor=tip] {} (pgfcirc@Vfrom)
+ (\pgfcirc@a@prefix-Vto) -- node[currarrow, sloped, allow upside down, pos=1, anchor=tip] {} (\pgfcirc@a@prefix-Vfrom)
\else
- (pgfcirc@Vfrom) -- node[currarrow, sloped, allow upside down, pos=1, anchor=tip] {} (pgfcirc@Vto)
+ (\pgfcirc@a@prefix-Vfrom) -- node[currarrow, sloped, allow upside down, pos=1, anchor=tip] {} (\pgfcirc@a@prefix-Vto)
\fi
\else% american voltage
\ifpgf@circuit@bipole@voltageoutsideofsymbol
@@ -373,23 +395,24 @@
\ifpgf@circ@fixbatteries
\ifpgf@circuit@bipole@voltage@backward
- (pgfcirc@Vfrom) node[node font=\pgf@circ@avfont] {\pgf@circ@avplus}
- (pgfcirc@Vto) node[node font=\pgf@circ@avfont] {\pgf@circ@avminus}
+ (\pgfcirc@a@prefix-Vfrom) node[node font=\pgf@circ@avfont] {\pgf@circ@avplus}
+ (\pgfcirc@a@prefix-Vto) node[node font=\pgf@circ@avfont] {\pgf@circ@avminus}
\else
- (pgfcirc@Vfrom) node[node font=\pgf@circ@avfont] {\pgf@circ@avminus}
- (pgfcirc@Vto) node[node font=\pgf@circ@avfont] {\pgf@circ@avplus}
+ (\pgfcirc@a@prefix-Vfrom) node[node font=\pgf@circ@avfont] {\pgf@circ@avminus}
+ (\pgfcirc@a@prefix-Vto) node[node font=\pgf@circ@avfont] {\pgf@circ@avplus}
\fi
\else
\ifpgf@circuit@bipole@voltage@backward
- (pgfcirc@Vfrom) node[node font=\pgf@circ@avfont] {\pgf@circ@avminus}
- (pgfcirc@Vto) node[node font=\pgf@circ@avfont] {\pgf@circ@avplus}
+ (\pgfcirc@a@prefix-Vfrom) node[node font=\pgf@circ@avfont] {\pgf@circ@avminus}
+ (\pgfcirc@a@prefix-Vto) node[node font=\pgf@circ@avfont] {\pgf@circ@avplus}
\else
- (pgfcirc@Vfrom) node[node font=\pgf@circ@avfont] {\pgf@circ@avplus}
- (pgfcirc@Vto) node[node font=\pgf@circ@avfont] {\pgf@circ@avminus}
+ (\pgfcirc@a@prefix-Vfrom) node[node font=\pgf@circ@avfont] {\pgf@circ@avplus}
+ (\pgfcirc@a@prefix-Vto) node[node font=\pgf@circ@avfont] {\pgf@circ@avminus}
\fi
\fi
\fi
\fi
+ \fi % closes ...ifempty
}
%% Output routine
@@ -397,8 +420,21 @@
%%
%% locally used dimensions
\newdimen{\pgfcirc@labelshift}
+\newif\ifpgfcirc@v@curved % helper if --- true only if voltages are curved
\def\pgf@circ@drawvoltage{% node name
- \pgfextra{ %WARNING: indentation is probably wrong
+ \pgfextra{%
+ % set the helper if...curved
+ \ifpgf@circuit@europeanvoltage
+ \ifpgf@circuit@bipole@voltage@straight
+ \pgfcirc@v@curvedfalse
+ \else
+ \pgfcirc@v@curvedtrue
+ \fi
+ \else
+ \pgfcirc@v@curvedfalse
+ \fi
+ % \typeout{V routine called with prefix: \pgfcirc@a@prefix}
+ % Label anchors WARNING: indentation is probably wrong
\edef\pgfcircmathresult{\expandafter\pgf@circ@stripdecimals\pgf@circ@direction\pgf@nil}
\ifnum\pgfcircmathresult >4 \ifnum\pgfcircmathresult <86
\ifpgf@circuit@bipole@voltage@below
@@ -457,13 +493,15 @@
\fi
\fi\fi
+ % export anchor position (if not needed, is always the same macro)
+ \expandafter\xdef\csname pgfcirc@\pgfcirc@a@prefix-Vlab-anchor\endcsname{\pgf@circ@bipole@voltage@label@anchor}
% this must be set *before* changing for mirroring and inverting; in that case
% the xscale/yscale parameters take it into account
- \ifpgf@circuit@bipole@voltage@below
- \def\pgf@circ@bipole@voltage@label@where{-90}
- \else
- \def\pgf@circ@bipole@voltage@label@where{90}
- \fi
+ \ifpgf@circuit@bipole@voltage@below
+ \def\pgf@circ@bipole@voltage@label@where{-90}
+ \else
+ \def\pgf@circ@bipole@voltage@label@where{90}
+ \fi
% magic to counteract the scale and yscale effects (there should be a better way...)
\ifnum \ctikzvalof{mirror value}=-1
@@ -507,7 +545,12 @@
% check for american
\edef\pgf@temp{/tikz/circuitikz/bipoles/\ctikzvalof{bipole/kind}/voltage/american label distance}
\pgfkeysifdefined{\pgf@temp}{%
- \edef\labeldist{\ctikzvalof{bipoles/\ctikzvalof{bipole/kind}/voltage/american label distance}}%
+ \ifpgf@circuit@bipole@voltage@raised
+ % do not apply the shift if we are using raised american style
+ \edef\labeldist{1.4}% default value
+ \else
+ \edef\labeldist{\ctikzvalof{bipoles/\ctikzvalof{bipole/kind}/voltage/american label distance}}%
+ \fi
% \typeout{AL:ADJUSTED\space for\space \ctikzvalof{bipole/kind} \space at \space \aldist}
}{\edef\labeldist{\ctikzvalof{voltage/american label distance}}}
\ifpgf@circ@debugv\edef\whichtypeshift{AME}\fi
@@ -534,6 +577,9 @@
\ifpgf@circuit@bipole@isvoltage
\pgf@circ@drawvoltagegenerator
+ % add fake cont1 and cont2 anchors for export
+ coordinate (\pgfcirc@a@prefix-Vcont1) at ($(\pgfcirc@a@prefix-Vfrom) !0.5! (\pgfcirc@a@prefix-Vto)$)
+ coordinate (\pgfcirc@a@prefix-Vcont2) at ($(\pgfcirc@a@prefix-Vfrom) !0.5! (\pgfcirc@a@prefix-Vto)$)
\else
\pgf@circ@drawvoltagegeneric
\fi
@@ -544,26 +590,40 @@
% \pgf@circ@debugvtrue}
% move a bit if requested
- coordinate (pgfcirc@Vlab) at ($(pgfcirc@Vlab) ! \pgfcirc@labelshift ! \pgf@circ@bipole@voltage@label@where :(pgfcirc@Vdir)$)
+ coordinate (\pgfcirc@a@prefix-Vlab) at ($(\pgfcirc@a@prefix-Vlab) ! \pgfcirc@labelshift ! \pgf@circ@bipole@voltage@label@where :(pgfcirc@Vdir)$)
% check for the case of american AND open
\ifpgf@circuit@europeanvoltage
\else
\ifx\@@kind\@@open
% override pgfcirc@Vlab
- coordinate (pgfcirc@Vlab) at ($(pgfcirc@Vfrom@flat)!0.5!(pgfcirc@Vto@flat)$)\fi
+ coordinate (\pgfcirc@a@prefix-Vlab) at ($(pgfcirc@Vfrom@flat)!0.5!(pgfcirc@Vto@flat)$)\fi
\fi
\ifpgf@circ@debugv
- node [odiamondpole, color=blue] at (pgfcirc@Vlab) {}
+ node [odiamondpole, color=blue] at (\pgfcirc@a@prefix-Vlab) {}
node [odiamondpole, color=red] at (pgfcirc@Vdir) {}
node [overlay, red, font=\tiny, anchor=south east, align=right] at(pgfcirc@Vdir)
{\whichtypeshift:\the\pgfcirc@labelshift\\ DIR:\pgf@circ@bipole@voltage@label@where}
\fi
- node [anchor=\pgf@circ@bipole@voltage@label@anchor, inner sep=2pt,
- \circuitikzbasekey/bipole voltage style](\ctikzvalof{bipole/name}voltage)
- at (pgfcirc@Vlab) {\pgf@circ@finallabels{voltage/label}}
+ % put the node only if it's not empty
+ \pgf@circ@ifkeyempty{bipole/voltage/label/name}\else
+ node [anchor=\pgf@circ@bipole@voltage@label@anchor, inner sep=2pt,
+ \circuitikzbasekey/bipole voltage style](\ctikzvalof{bipole/name}voltage)
+ at (\pgfcirc@a@prefix-Vlab) {\pgf@circ@finallabels{voltage/label}}
+ \fi
+
+ \ifpgfcirc@v@curved\else
+ % fake Vcont1 and Vcont2 for when they are exported --- in the middle of Vto and Vfrom
+ coordinate (\pgfcirc@a@prefix-Vcont1) at ($(\pgfcirc@a@prefix-Vfrom) !0.5! (\pgfcirc@a@prefix-Vto)$)
+ coordinate (\pgfcirc@a@prefix-Vcont2) at ($(\pgfcirc@a@prefix-Vfrom) !0.5! (\pgfcirc@a@prefix-Vto)$)
+ \fi
+ % revert from and to (and c1 - c2) if needed (simpler than rework the positioning above...)
+ \ifpgf@circuit@bipole@voltage@backward
+ \pgfcirc@swap@coordinates{\pgfcirc@a@prefix-Vfrom}{\pgfcirc@a@prefix-Vto}
+ \pgfcirc@swap@coordinates{\pgfcirc@a@prefix-Vcont1}{\pgfcirc@a@prefix-Vcont2}
+ \fi
}%end drawvoltages
\endinput
diff --git a/graphics/pgf/contrib/circuitikz/tex/t-circuitikz.tex b/graphics/pgf/contrib/circuitikz/tex/t-circuitikz.tex
index 9d588ae13a..06210be341 100644
--- a/graphics/pgf/contrib/circuitikz/tex/t-circuitikz.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/t-circuitikz.tex
@@ -10,8 +10,8 @@
%
% See the files gpl-3.0_license.txt and lppl-1-3c_license.txt for more details.
-\def\pgfcircversion{1.2.0}
-\def\pgfcircversiondate{2020/06/21}
+\def\pgfcircversion{1.2.1}
+\def\pgfcircversiondate{2020/07/06}
\writestatus{loading}{\pgfcircversiondate{} The CircuiTikz circuit drawing package version \pgfcircversion}
\usemodule[tikz]
diff --git a/info/biblio/typeset.bib b/info/biblio/typeset.bib
index 2fb38dd9bd..9de034772a 100644
--- a/info/biblio/typeset.bib
+++ b/info/biblio/typeset.bib
@@ -2,9 +2,9 @@
%%% ====================================================================
%%% BibTeX-file{
%%% author = "Nelson H. F. Beebe",
-%%% version = "2.65",
-%%% date = "20 March 2020",
-%%% time = "12:31:01 MDT",
+%%% version = "2.66",
+%%% date = "06 July 2020",
+%%% time = "12:08:16 MDT",
%%% filename = "typeset.bib",
%%% address = "University of Utah
%%% Department of Mathematics, 110 LCB
@@ -14,7 +14,7 @@
%%% telephone = "+1 801 581 5254",
%%% FAX = "+1 801 581 4148",
%%% URL = "http://www.math.utah.edu/~beebe",
-%%% checksum = "22601 25494 122516 1146793",
+%%% checksum = "02889 25568 122916 1150222",
%%% email = "beebe at math.utah.edu, beebe at acm.org,
%%% beebe at computer.org (Internet)",
%%% codetable = "ISO/ASCII",
@@ -39,7 +39,7 @@
%%% and PDF (Portable Document Format), and
%%% sgml.bib covers SGML and HTML.
%%%
-%%% At version 2.65, the year coverage looked
+%%% At version 2.66, the year coverage looked
%%% like this:
%%%
%%% 1881 ( 1) 1928 ( 1) 1975 ( 14)
@@ -68,7 +68,7 @@
%%% 1904 ( 0) 1951 ( 0) 1998 ( 13)
%%% 1905 ( 0) 1952 ( 3) 1999 ( 11)
%%% 1906 ( 1) 1953 ( 0) 2000 ( 8)
-%%% 1907 ( 0) 1954 ( 3) 2001 ( 5)
+%%% 1907 ( 0) 1954 ( 4) 2001 ( 5)
%%% 1908 ( 0) 1955 ( 2) 2002 ( 13)
%%% 1909 ( 0) 1956 ( 0) 2003 ( 4)
%%% 1910 ( 0) 1957 ( 0) 2004 ( 2)
@@ -79,7 +79,7 @@
%%% 1915 ( 0) 1962 ( 3) 2009 ( 2)
%%% 1916 ( 1) 1963 ( 1) 2010 ( 2)
%%% 1917 ( 0) 1964 ( 4) 2011 ( 3)
-%%% 1918 ( 0) 1965 ( 8) 2012 ( 4)
+%%% 1918 ( 0) 1965 ( 9) 2012 ( 4)
%%% 1919 ( 1) 1966 ( 6) 2013 ( 3)
%%% 1920 ( 1) 1967 ( 8) 2014 ( 2)
%%% 1921 ( 1) 1968 ( 4) 2015 ( 4)
@@ -93,7 +93,7 @@
%%% 20xx ( 2)
%%%
%%% Article: 336
-%%% Book: 312
+%%% Book: 314
%%% InCollection: 5
%%% InProceedings: 54
%%% Manual: 42
@@ -104,7 +104,7 @@
%%% Proceedings: 33
%%% TechReport: 35
%%%
-%%% Total entries: 870
+%%% Total entries: 872
%%%
%%% This bibliography has been collected from
%%% bibliographies in the author's personal
@@ -1205,6 +1205,54 @@
Periodicals.",
}
+@Book{Chaundy:1954:PMA,
+ editor = "T. W. (Theodore William) Chaundy and P. R. Barrett and
+ Charles Batey",
+ booktitle = "The Printing of Mathematics: Aids for Authors and
+ Editors and Rules for Compositors and Readers at the
+ {University Press, Oxford}",
+ title = "The Printing of Mathematics: Aids for Authors and
+ Editors and Rules for Compositors and Readers at the
+ {University Press, Oxford}",
+ publisher = pub-OXFORD,
+ address = pub-OXFORD:adr,
+ pages = "vi + 105",
+ year = "1954",
+ LCCN = "Z250.6.M3 C5 1954",
+ bibdate = "Mon Jul 06 10:23:19 2020",
+ bibsource = "http://www.math.utah.edu/pub/tex/bib/typeset.bib",
+ URL = "https://www.gwern.net/docs/design/1954-chaundy-theprintingofmathematics.pdf",
+ acknowledgement = ack-nhfb,
+ annote = "First edition in 1954, republished with corrections in
+ 1957, and as second edition in 1965.",
+ tableofcontents = "List of Illustrations / ix \\
+ I. The Mechanics of Mathematical Printing / 1 \\
+ II. Recommendations To Mathematical Authors \\
+ 1, Introduction / 21 \\
+ 2. Fractions / 26 \\
+ 3. Surds / 29 \\
+ 4. Superiors and Inferiors / 30 \\
+ 5. Brackets / 32 \\
+ 6. Embellished Characters / 35 \\
+ 7. Displayed Formulae / 36 \\
+ 8. Notation (Miscellaneous)/ 40 \\
+ 9. Headings and Numbering / 44 \\
+ 10. Footnotes and References / 48 \\
+ 11, Varieties of Type / 51 \\
+ 12. Punctuation / 54 \\
+ 13. Wording / 59 \\
+ 14. Preparing Copy / 65 \\
+ 15. Correction of Proofs / 70 \\
+ 16. Final Queries and Offprints / 73 \\
+ III. Rules for the Composition of Mathematics at the
+ University Press, Oxford / 74 \\
+ Appendixes \\
+ A. Legible Handwriting / 90 \\
+ B. Type Specimens and List of Special Sorts / 91 \\
+ C. Abbreviations / 99 \\
+ Index / 102",
+}
+
@Book{WBP:1954:MT,
author = "{William Byrd Press}",
title = "Mathematics in Type",
@@ -1512,6 +1560,28 @@
keywords = "computerized typesetting",
}
+@Book{Chaundy:1965:PMA,
+ editor = "Theodore W. Chaundy and P. R. Barrett and Charles
+ Batey",
+ booktitle = "The Printing of Mathematics: Aids for Authors and
+ Editors and Rules for Compositors and Readers at the
+ {University Press, Oxford}",
+ title = "The Printing of Mathematics: Aids for Authors and
+ Editors and Rules for Compositors and Readers at the
+ {University Press, Oxford}",
+ publisher = pub-OXFORD,
+ address = pub-OXFORD:adr,
+ edition = "Second",
+ pages = "vi + 109",
+ year = "1965",
+ LCCN = "????",
+ bibdate = "Mon Jul 6 10:22:09 MDT 2020",
+ bibsource = "fsz3950.oclc.org:210/WorldCat;
+ http://www.math.utah.edu/pub/tex/bib/typeset.bib",
+ acknowledgement = ack-nhfb,
+ editor-dates = "Theodore William Chaundy (1889--1971)",
+}
+
@Article{Rich:1965:MHA,
author = "R. P. Rich and A. G. Stone",
title = "Method for Hyphenating at the End of a Printed Line",
@@ -11665,10 +11735,13 @@
}
@Book{Chaundy:1987:PMA,
- author = "T. W. (Theodore William) Chaundy and P. R. Barrett and
+ editor = "T. W. (Theodore William) Chaundy and P. R. Barrett and
Charles Batey",
- title = "The printing of mathematics: aids for authors and
- editors and rules for compositors and readers at the
+ booktitle = "The Printing of Mathematics: Aids for Authors and
+ Editors and Rules for Compositors and Readers at the
+ {University Press, Oxford}",
+ title = "The Printing of Mathematics: Aids for Authors and
+ Editors and Rules for Compositors and Readers at the
{University Press, Oxford}",
publisher = pub-OXFORD,
address = pub-OXFORD:adr,
@@ -11681,6 +11754,7 @@
acknowledgement = ack-nhfb,
annote = "First edition in 1954, republished with corrections in
1957, and as second edition in 1965.",
+ author-dates = "Theodore William Chaundy (1889--1971)",
}
@Book{Christian:1987:UTP,
diff --git a/info/biblio/typeset.ltx b/info/biblio/typeset.ltx
index 7244a82f93..fa17416115 100644
--- a/info/biblio/typeset.ltx
+++ b/info/biblio/typeset.ltx
@@ -2,9 +2,9 @@
%%% ====================================================================
%%% @LaTeX-file{
%%% author = "Nelson H. F. Beebe",
-%%% version = "2.65",
-%%% date = "20 March 2020",
-%%% time = "12:31:05 MDT",
+%%% version = "2.66",
+%%% date = "06 July 2020",
+%%% time = "12:08:21 MDT",
%%% filename = "typeset.ltx",
%%% address = "University of Utah
%%% Department of Mathematics, 110 LCB
@@ -14,7 +14,7 @@
%%% telephone = "+1 801 581 5254",
%%% FAX = "+1 801 581 4148",
%%% URL = "http://www.math.utah.edu/~beebe",
-%%% checksum = "28140 78 270 2846",
+%%% checksum = "35158 78 270 2844",
%%% email = "beebe@math.utah.edu, beebe@acm.org,
%%% beebe@computer.org (Internet)",
%%% codetable = "ISO/ASCII",
@@ -59,8 +59,8 @@
WWW URL: \protect\path=http://www.math.utah.edu/~beebe/=
}
-\date{20 March 2020 \\
-Version 2.65}
+\date{06 July 2020 \\
+Version 2.66}
\begin{document}
\maketitle
\nocite{*}
diff --git a/macros/latex/contrib/semantex/README.md b/macros/latex/contrib/semantex/README.md
index 31c5e7f563..9b7c6e4617 100644
--- a/macros/latex/contrib/semantex/README.md
+++ b/macros/latex/contrib/semantex/README.md
@@ -3,9 +3,8 @@ SemanTeX - object-oriented mathematics
The SemanTeX package for LaTeX delivers a more semantic, systematized way of writing mathematics compared to the ordinary math syntax. The system is
object-oriented and uses keyval syntax, and everything is highly
-customizable. At the same time, care has been taken to make it
-intuitive, natural, practical, and with an easy-to-use and lightweight
-syntax.
+customizable. At the same time, care has been taken to make it the syntax as
+intuitive, natural, practical, and lightweight as possible.
----------------------------------------------------------------
SemanTeX --- object-oriented mathematics
diff --git a/macros/latex/contrib/semantex/semantex.pdf b/macros/latex/contrib/semantex/semantex.pdf
index e8a02eae88..4f4e3b00c9 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 8e8361c8dc..3ed17fb64a 100644
--- a/macros/latex/contrib/semantex/semantex.sty
+++ b/macros/latex/contrib/semantex/semantex.sty
@@ -1,98 +1,118 @@
\RequirePackage{expl3,xparse}
-\ProvidesExplPackage{semantex}{2020/05/30}{0.1alpha}{}
-% IMPORTANT:
+\ProvidesExplPackage{semantex}{2020/07/06}{0.2alpha}{}
-% Because of the definition of \semantexnormalscaling, the package now requires amsmath
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% ERROR MESSAGES
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Think about changing “upper” etc. into “supper”, whereas what is now
-% “upper” could be called “uppernosep” or something similar.
-% Fix left sub- and superscripts, e.g. the right spacing
+\msg_new:nnnn { semantex } { valuekey_not_found } { Unknown~key~#2~passed~to~#1~on~line~\msg_line_number: } {}
-% Allow “.” (nothing) as delimiter, even in the case of normal or \big etc
+\msg_new:nnnn { semantex } { arg_valuekey_not_found } { Unknown~argument~key~#2~passed~to~#1~on~line~\msg_line_number: } {}
-% Instead of checking if you are equal to semantexvarible when doing
-% inheritance, check if you are your own parent. This allows multiple
-% “primitive” classes.
-% Also remove commands like \newsemantexvariable etc.
-% in order to force people to create their own classes
+\msg_new:nnnn { semantex } { data_tl_not_found } { Unknown~data~#2~requested~from~#1~on~line~\msg_line_number: } {}
-% Create 2valuekeys, 3valuekeys etc.
+\msg_new:nnnn { semantex } { data_int_not_found } { Unknown~integer~#2~requested~from~#1~on~line~\msg_line_number: } {}
-% Test if \exp_not:n can be removed in #1 (=\keyvalue) if
-% another \exp_not:n is added in the data manipulation commands.
+\msg_new:nnnn { semantex } { data_bool_not_found } { Unknown~boolean~#2~requested~from~#1~on~line~\msg_line_number: } {}
-% Build groups and \ext_args:NV around the definition of
-% \l_semantex_key_value_temp in order to only
-% define this command locally.
+\msg_new:nnnn { semantex } { data_cs_not_found } { Unknown~command~sequence~#2~requested~from~#1~on~line~\msg_line_number: } {}
-% Allow two keys, nopar and absolutelynopar. The difference is that
-% nopar becomes par if there is more than one argument
+\msg_new:nnnn { semantex } { data_prop_not_found } { Unknown~property~list~#2~requested~from~#1~on~line~\msg_line_number: } {}
-% Allow left arguments!
+\msg_new:nnnn { semantex } { key_value_not_found } { Unknown~value~#3~passed~to~key~#2~in~#1~on~line~\msg_line_number: } {}
+\msg_new:nnnn { semantex } { class_already_defined } { Class~#1~already~defined;~you~tried~defining~it~again~on~line~\msg_line_number: } {}
-% LIST OF BUGS:
+\msg_new:nnnn { semantex } { object_already_defined } { Object~#1~already~defined;~you~tried~defining~it~again~on~line~\msg_line_number: } {}
-%IM A change has been made in catlimits. It shows the existence of a
-%IM kind of bug in semantex
+\msg_new:nnnn { semantex } { class_not_found } { Unknown~class~#3~declared~as~#2~of~#1~on~line~\msg_line_number: } {}
-%IM Removed \!\!\!\! in catlimits
+\msg_new:nnnn { semantex } { object_not_found } { You~set~#1~as~#2~of~unknown~object~#3~on~line~\msg_line_number: } {}
+\msg_new:nnnn { semantex } { created_object_of_unknown_class } { Unknown~class~#1~declared~as~class~of~object~#2~on~line~\msg_line_number: } {}
-\msg_new:nnnn { semantex } { keyval_not_found } { Unknown~key~#1~passed~to~object~#2~on~input~line~\msg_line_number: } {}
+\msg_new:nnnn { semantex } { created_a_SemantexVariable } { Never~create~objects~of~class~\SemantexVariable;~create~a~new~class~yourself~instead.~You~created~the~object~#1~on~line~\msg_line_number: } {}
-\msg_new:nnnn { semantex } { arg_valuekey_not_found } { Unknown~argument~key~#1~passed~to~object~#2~on~input~line~\msg_line_number: } {}
+\cs_generate_variant:Nn \msg_error:nnnn { nnnx }
-\msg_new:nnnn { semantex } { tl_not_found } { Unknown~data~#1~passed~to~object~#2~on~input~line~\msg_line_number: } {}
-%IM should be changed so that this is passed to the actual object, not
-%IM the parent object, e.g., by having a third argument containing the
-%IM actual object in \g_semantex_data_tl_get:nn
+\tl_new:N\l__semantex_error_output_format_temp
+\cs_new:Npn\semantex_error_output_format:nN#1#2
+{
+ \tl_set:Nn \l__semantex_error_output_format_temp { #1 }
+ \tl_replace_all:Nnn \l__semantex_error_output_format_temp { object_ } { object~\cs:w }
+ \tl_replace_all:Nnn \l__semantex_error_output_format_temp { class_ } { class~\cs:w }
+ \tl_put_right:Nn \l__semantex_error_output_format_temp { \cs_end: }
+ \tl_trim_spaces:N \l__semantex_error_output_format_temp
+ \tl_set_eq:NN #2 \l__semantex_error_output_format_temp
+}
-\msg_new:nnnn { semantex } { parent_not_found } { Unknown~class~#1~set~as~parent~of~object~#2~on~input~line~\msg_line_number: } {}
+\cs_generate_variant:Nn \msg_error:nnnnn { nnxnn }
-\msg_new:nnnn { semantex } { data_tl_not_found } { Unknown~data~#1~passed~to~object~#2~on~input~line~\msg_line_number: } {}
+\cs_generate_variant:Nn \msg_error:nnnn { nnxn }
-% Extra cs variants we need:
+\cs_generate_variant:Nn \msg_error:nnn { nnx }
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% COMMANDS FOR BULLETS AND SLOTS
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\cs_generate_variant:Nn \keyval_parse:NNn { cco }
-\cs_generate_variant:Nn \tl_if_blank:nTF { vTF }
-\tl_set:Nn \semantexbullet {\raisebox{-0.25ex}{\scalebox{1.2}{$\cdot$}}}
-\tl_set:Nn \semantexdoublebullet {\semantexbullet\semantexbullet}
+\box_new:N \l__semantex_bullet_box
+\hbox_set:Nn \l__semantex_bullet_box { $\cdot$ }
+\box_scale:Nnn \l__semantex_bullet_box {1.2} {1.2}
+\tl_set:Nn\g_semantex_bullet
+{
+ \box_move_up:nn{-0.25ex}{\box_use:N \l__semantex_bullet_box}
+}
-\tl_set:Nn \semantexslot { \mathord{-} }
+\tl_set:Nn\g_semantex_double_bullet{\g_semantex_bullet \g_semantex_bullet}
+\tl_set_eq:NN\SemantexBullet \g_semantex_bullet
+\tl_set_eq:NN \SemantexDoubleBullet \g_semantex_double_bullet
+\tl_set:Nn \g_semantex_slot { \mathord{-} }
+\tl_set_eq:NN \SemantexSlot \g_semantex_slot
-\DeclareDocumentCommand\newbinaryclass{mO{}} % new binary-type class
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% USER COMMANDS FOR CREATING NEW CLASSES
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\DeclareDocumentCommand\semantex_new_simple_class:Nw{mO{}} % new simple-type class
{
% #1 = class name
% #2 = options
- \semantexnewclass { #1 } { #2 }
- \exp_args:Nc\DeclareDocumentCommand{#1}{mo}{
+ \semantex_new_class:Nn { #1 } { #2 }
+ \DeclareDocumentCommand{#1}{mo}{
% the actual \#1 command
\IfValueTF{##2}
{
- \semantexrenderclass { #1 } { ifoutput=true, symbol = { ##1 }, ##2 }
+ \semantex_render_class:Nn #1 { ifoutput=true, symbol = { ##1 }, ##2 }
}
{
- \semantexrenderclass { #1 } { symbol = { ##1 } }
+ \semantex_render_class:Nn #1 { symbol = { ##1 } }
}
}
- \exp_args:Nc\DeclareDocumentCommand{#1withoptions}{mmo}{
+ \exp_args:Nc\DeclareDocumentCommand{__semantex_make_object_of_class_\cs_to_str:N #1_with_options:nnw}{mmo}{
\IfValueTF{##3}
{
- \semantexrenderclass { #1 } { ifoutput=true, symbol = { ##2 }, ##1, ##3 }
+ \semantex_render_class:Nn #1 { ifoutput=true, symbol = { ##2 }, ##1, ##3 }
}
{
- \semantexrenderclass { #1 } { symbol = { ##2 }, ##1 }
+ \semantex_render_class:Nn #1 { symbol = { ##2 }, ##1 }
}
}
- \exp_args:Nc\DeclareDocumentCommand{new#1}{mgO{}}
+ \exp_args:Nc\DeclareDocumentCommand{__semantex_new_object_of_class_\cs_to_str:N #1:Nw}{mgO{}}
{
% the command for creating a new object of class #1
% ##1 = command name, with backslash
@@ -100,75 +120,77 @@
% ##3 = options
\IfValueTF{##2}
{
- \semantexnewobject { #1 } ##1 { parent = #1, symbol = { ##2 }, ##3 }
+ \semantex_new_object:NNn { #1 } ##1 { symbol = { ##2 }, ##3 }
}
{
- \semantexnewobject { #1 } ##1 { parent = #1, ##3 }
+ \semantex_new_object:NNn { #1 } ##1 { ##3 }
}
% create the object with name ##1
\DeclareDocumentCommand{##1}{o}{
% the actual \##1 command
\IfValueTF { ####1 }
{
- \semantexrenderobject { ##1 } { ifoutput=true,####1 }
+ \semantex_render_object:Nn ##1 { ifoutput=true,####1 }
}
{
- \semantexrenderobject { ##1 } { }
+ \semantex_render_object:Nn ##1 { }
}
}
}
}
+\tl_set_eq:NN\NewSimpleClass\semantex_new_simple_class:Nw
+
%IM Consider using \semantexIfNoValueOrDotTF on the argument
-\DeclareDocumentCommand\newvariableclass{mO{}} % new variable-type class
+\DeclareDocumentCommand\semantex_new_variable_class:Nw{mO{}} % new variable-type class
{
% #1 = class name
% #2 = options
- \semantexnewclass { #1 } { #2 }
- \exp_args:Nc\DeclareDocumentCommand{#1}{mog}{
+ \semantex_new_class:Nn { #1 } { #2 }
+ \DeclareDocumentCommand{#1}{mog}{
% the actual \#1 command
\IfValueTF { ##2 }
{
\IfValueTF { ##3 }
{
- \semantexrenderclass { #1 } { ifoutput=true,symbol={##1},##2,arg={##3} }
+ \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1},##2,arg={##3} }
}
{
- \semantexrenderclass { #1 } { ifoutput=true,symbol={##1},##2}
+ \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1},##2}
}
}
{
\IfValueTF { ##3 }
{
- \semantexrenderclass { #1 } { ifoutput=true,symbol={##1},arg={##3} }
+ \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1},arg={##3} }
}
{
- \semantexrenderclass { #1 } { symbol={##1} }
+ \semantex_render_class:Nn #1 { symbol={##1} }
}
}
}
- \exp_args:Nc\DeclareDocumentCommand{#1withoptions}{mmog}{
+ \exp_args:Nc\DeclareDocumentCommand{__semantex_make_object_of_class_\cs_to_str:N #1_with_options:nnw}{mmog}{
\IfValueTF { ##3 }
{
\IfValueTF { ##4 }{
- \semantexrenderclass { #1 } { ifoutput=true,symbol={##2}, ##1, ##3,arg={##4} }
+ \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1, ##3,arg={##4} }
}
{
- \semantexrenderclass { #1 } { ifoutput=true,symbol={##2}, ##1, ##3 }
+ \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1, ##3 }
}
}
{
\IfValueTF { ##4 }
{
- \semantexrenderclass { #1 } { ifoutput=true,symbol={##2}, ##1,arg={##4} }
+ \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1,arg={##4} }
}
{
- \semantexrenderclass { #1 } { symbol={##2}, ##1 }
+ \semantex_render_class:Nn #1 { symbol={##2}, ##1 }
}
}
}
- \exp_args:Nc\DeclareDocumentCommand{new#1}{mgO{}}
+ \exp_args:Nc\DeclareDocumentCommand{__semantex_new_object_of_class_\cs_to_str:N #1:Nw}{mgO{}}
{
% the command for creating a new object of class #1
% ##1 = command name, with backslash
@@ -176,10 +198,10 @@
% ##3 = options
\IfValueTF{##2}
{
- \semantexnewobject { #1 } ##1 { parent = #1, symbol = { ##2 }, ##3 }
+ \semantex_new_object:NNn { #1 } ##1 { symbol = { ##2 }, ##3 }
}
{
- \semantexnewobject { #1 } ##1 { parent = #1, ##3 }
+ \semantex_new_object:NNn { #1 } ##1 { ##3 }
}
% creates the object with name ##1
\DeclareDocumentCommand{##1}{og}{
@@ -187,66 +209,66 @@
\IfValueTF{####1}{
\IfValueTF{####2}
{
- \semantexrenderobject { ##1 } { ifoutput=true,####1, arg={####2} }
+ \semantex_render_object:Nn ##1 { ifoutput=true,####1, arg={####2} }
}
{
- \semantexrenderobject { ##1 } { ifoutput=true,####1}
+ \semantex_render_object:Nn ##1 { ifoutput=true,####1}
}
}
{
\IfValueTF{####2}
{
- \semantexrenderobject { ##1 } { ifoutput=true,arg={####2} }
+ \semantex_render_object:Nn ##1 { ifoutput=true,arg={####2} }
}
{
- \semantexrenderobject { ##1 } {}
+ \semantex_render_object:Nn ##1 {}
}
}
}
}
}
-\DeclareDocumentCommand\newcohomologyclass{mO{}} % new cohomology-type class
-% The intention is to phase this out; use variable type instead,
-%for the sake of consistency in notation.
+\cs_set_eq:NN\NewVariableClass\semantex_new_variable_class:Nw
+
+\DeclareDocumentCommand\semantex_new_cohomology_class:Nw{mO{}} % new cohomology-type class
{
% #1 = class name
% #2 = options
- \semantexnewclass { #1 } { #2 }
- \exp_args:Nc\DeclareDocumentCommand{#1}{mogg}{
+ \semantex_new_class:Nn { #1 } { #2 }
+ \DeclareDocumentCommand{#1}{mogg}{
% the actual \#1 command
\IfValueTF{##2}
{
\IfValueTF { ##3 }
{
- \semantexifeqTF { ##3 }{ * }
+ \tl_if_eq:nnTF { ##3 }{ * }
{
\IfValueTF { ##4 }
{
- \semantexrenderclass { #1 } { ifoutput=true,symbol={##1}, ##2, *, arg={##4} }
+ \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, ##2, *, arg={##4} }
}
{
- \semantexrenderclass { #1 } { ifoutput=true,symbol={##1}, ##2, * }
+ \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, ##2, * }
}
}
{
- \semantexifeqTF { ##3 }{ ** }
+ \tl_if_eq:nnTF { ##3 }{ ** }
{
\IfValueTF { ##4 }
{
- \semantexrenderclass { #1 } { ifoutput=true,symbol={##1}, ##2, **, arg={##4} }
+ \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, ##2, **, arg={##4} }
}
{
- \semantexrenderclass { #1 } { ifoutput=true,symbol={##1}, ##2, ** }
+ \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, ##2, ** }
}
}
{
\IfValueTF { ##4 }
{
- \semantexrenderclass { #1 } { ifoutput=true,symbol={##1}, ##2, degreedefault={##3}, arg={##4} }
+ \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, ##2, degreedefault={##3}, arg={##4} }
}
{
- \semantexrenderclass { #1 } { ifoutput=true,symbol={##1}, ##2, degreedefault={##3} }
+ \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, ##2, degreedefault={##3} }
}
}
}
@@ -254,44 +276,44 @@
{
\IfValueTF { ##4 }
{
- \semantexrenderclass { #1 } { ifoutput=true,symbol={##1}, ##2, arg={##4} }
+ \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, ##2, arg={##4} }
}
{
- \semantexrenderclass { #1 } { ifoutput=true,symbol={##1}, ##2 }
+ \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, ##2 }
}
}
}
{
\IfValueTF { ##3 }
{
- \semantexifeqTF { ##3 }{ * }
+ \tl_if_eq:nnTF { ##3 }{ * }
{
\IfValueTF { ##4 }
{
- \semantexrenderclass { #1 } { ifoutput=true, symbol={##1}, *, arg={##4} }
+ \semantex_render_class:Nn #1 { ifoutput=true, symbol={##1}, *, arg={##4} }
}
{
- \semantexrenderclass { #1 } { ifoutput=true, symbol={##1}, *}
+ \semantex_render_class:Nn #1 { ifoutput=true, symbol={##1}, *}
}
}
{
- \semantexifeqTF { ##3 }{ ** }
+ \tl_if_eq:nnTF { ##3 }{ ** }
{
\IfValueTF { ##4 }
{
- \semantexrenderclass { #1 } { ifoutput=true,symbol={##1}, **, arg={##4} }
+ \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, **, arg={##4} }
}
{
- \semantexrenderclass { #1 } { ifoutput=true,symbol={##1}, ** }
+ \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, ** }
}
}
{
\IfValueTF { ##4 }
{
- \semantexrenderclass { #1 } { ifoutput=true,symbol={##1}, degreedefault={##3}, arg={##4} }
+ \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, degreedefault={##3}, arg={##4} }
}
{
- \semantexrenderclass { #1 } { ifoutput=true,symbol={##1}, degreedefault={##3} }
+ \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, degreedefault={##3} }
}
}
}
@@ -299,47 +321,47 @@
{
\IfValueTF { ##4 }
{
- \semantexrenderclass { #1 } { ifoutput=true,symbol={##1}, arg={##4} }
+ \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, arg={##4} }
}
{
- \semantexrenderclass { #1 } { symbol={##1}, arg={##4} }
+ \semantex_render_class:Nn #1 { symbol={##1}, arg={##4} }
}
}
}
}
- \exp_args:Nc\DeclareDocumentCommand{#1withoptions}{mmogg}{
+ \exp_args:Nc\DeclareDocumentCommand{__semantex_make_object_of_class_\cs_to_str:N #1_with_options:nnw}{mmogg}{
\IfValueTF{##3}
{
\IfValueTF { ##4 }
{
- \semantexifeqTF { ##4 }{ * }
+ \tl_if_eq:nnTF { ##4 }{ * }
{
\IfValueTF { ##5 }
{
- \semantexrenderclass { #1 } { ifoutput=true,symbol={##2}, ##1, ##3, *, arg={##5} }
+ \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1, ##3, *, arg={##5} }
}
{
- \semantexrenderclass { #1 } { ifoutput=true,symbol={##2}, ##1, ##3, * }
+ \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1, ##3, * }
}
}
{
- \semantexifeqTF { ##4 }{ ** }
+ \tl_if_eq:nnTF { ##4 }{ ** }
{
\IfValueTF { ##5 }
{
- \semantexrenderclass { #1 } {ifoutput=true, symbol={##2}, ##1, ##3, **, arg={##5} }
+ \semantex_render_class:Nn #1 {ifoutput=true, symbol={##2}, ##1, ##3, **, arg={##5} }
}
{
- \semantexrenderclass { #1 } {ifoutput=true, symbol={##2}, ##1, ##3, ** }
+ \semantex_render_class:Nn #1 {ifoutput=true, symbol={##2}, ##1, ##3, ** }
}
}
{
\IfValueTF { ##5 }
{
- \semantexrenderclass { #1 } { ifoutput=true,symbol={##2}, ##1,##3, degreedefault={##4}, arg={##5} }
+ \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1,##3, degreedefault={##4}, arg={##5} }
}
{
- \semantexrenderclass { #1 } { ifoutput=true,symbol={##2}, ##1,##3, degreedefault={##4} }
+ \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1,##3, degreedefault={##4} }
}
}
}
@@ -347,44 +369,44 @@
{
\IfValueTF { ##5 }
{
- \semantexrenderclass { #1 } { ifoutput=true,symbol={##2}, ##1, ##3, arg={##5} }
+ \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1, ##3, arg={##5} }
}
{
- \semantexrenderclass { #1 } { ifoutput=true,symbol={##2}, ##1, ##3 }
+ \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1, ##3 }
}
}
}
{
\IfValueTF { ##4 }
{
- \semantexifeqTF { ##4 }{ * }
+ \tl_if_eq:nnTF { ##4 }{ * }
{
\IfValueTF { ##5 }
{
- \semantexrenderclass { #1 } { ifoutput=true, symbol={##2} ,##1, *, arg={##5} }
+ \semantex_render_class:Nn #1 { ifoutput=true, symbol={##2} ,##1, *, arg={##5} }
}
{
- \semantexrenderclass { #1 } { ifoutput=true, symbol={##2} ,##1, *}
+ \semantex_render_class:Nn #1 { ifoutput=true, symbol={##2} ,##1, *}
}
}
{
- \semantexifeqTF { ##4 }{ ** }
+ \tl_if_eq:nnTF { ##4 }{ ** }
{
\IfValueTF { ##5 }
{
- \semantexrenderclass { #1 } { ifoutput=true, symbol={##2} , ##1, **, arg={##5} }
+ \semantex_render_class:Nn #1 { ifoutput=true, symbol={##2} , ##1, **, arg={##5} }
}
{
- \semantexrenderclass { #1 } { ifoutput=true, symbol={##2} , ##1, ** }
+ \semantex_render_class:Nn #1 { ifoutput=true, symbol={##2} , ##1, ** }
}
}
{
\IfValueTF { ##5 }
{
- \semantexrenderclass { #1 } { ifoutput=true, symbol={##2}, ##1, degreedefault={##4}, arg={##5} }
+ \semantex_render_class:Nn #1 { ifoutput=true, symbol={##2}, ##1, degreedefault={##4}, arg={##5} }
}
{
- \semantexrenderclass { #1 } { ifoutput=true, symbol={##2}, ##1, degreedefault={##4} }
+ \semantex_render_class:Nn #1 { ifoutput=true, symbol={##2}, ##1, degreedefault={##4} }
}
}
}
@@ -392,15 +414,15 @@
{
\IfValueTF { ##5 }
{
- \semantexrenderclass { #1 } { ifoutput=true,symbol={##2}, ##1, arg={##5} }
+ \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1, arg={##5} }
}
{
- \semantexrenderclass { #1 } { symbol={##2}, ##1 }
+ \semantex_render_class:Nn #1 { symbol={##2}, ##1 }
}
}
}
}
- \exp_args:Nc\DeclareDocumentCommand{new#1}{mgO{}}
+ \exp_args:Nc\DeclareDocumentCommand{__semantex_new_object_of_class_\cs_to_str:N #1:Nw}{mgO{}}
{
% the command for creating a new object of class #1
% ##1 = command name, with backslash
@@ -408,10 +430,10 @@
% ##3 = options
\IfValueTF{##2}
{
- \semantexnewobject { #1 } { ##1 }{ parent = #1, symbol = { ##2 }, ##3 }
+ \semantex_new_object:NNn { #1 } { ##1 }{ symbol = { ##2 }, ##3 }
}
{
- \semantexnewobject { #1 } { ##1 }{ parent = #1, ##3 }
+ \semantex_new_object:NNn { #1 } { ##1 }{ ##3 }
}
% creates the object with name ##1
\DeclareDocumentCommand{##1}{ogg}{
@@ -420,34 +442,34 @@
{
\IfValueTF{####2}
{
- \semantexifeqTF { ####2 } { * }
+ \tl_if_eq:nnTF { ####2 } { * }
{
\IfValueTF{####3}
{
- \semantexrenderobject { ##1 } { ifoutput=true,####1, *, arg={ ####3 } }
+ \semantex_render_object:Nn ##1 { ifoutput=true,####1, *, arg={ ####3 } }
}
{
- \semantexrenderobject { ##1 } { ifoutput=true,####1, * }
+ \semantex_render_object:Nn ##1 { ifoutput=true,####1, * }
}
}
{
- \semantexifeqTF { ####2 } { ** }
+ \tl_if_eq:nnTF { ####2 } { ** }
{
\IfValueTF{####3}
{
- \semantexrenderobject { ##1 } { ifoutput=true, ####1, **, arg={ ####3 } }
+ \semantex_render_object:Nn ##1 { ifoutput=true, ####1, **, arg={ ####3 } }
}
{
- \semantexrenderobject { ##1 } { ifoutput=true, ####1, ** }
+ \semantex_render_object:Nn ##1 { ifoutput=true, ####1, ** }
}
}
{
\IfValueTF{####3}
{
- \semantexrenderobject { ##1 } { ifoutput=true,####1, degreedefault={ ####2 }, arg={ ####3 } }
+ \semantex_render_object:Nn ##1 { ifoutput=true,####1, degreedefault={ ####2 }, arg={ ####3 } }
}
{
- \semantexrenderobject { ##1 } { ifoutput=true,####1, degreedefault={ ####2 } }
+ \semantex_render_object:Nn ##1 { ifoutput=true,####1, degreedefault={ ####2 } }
}
}
}
@@ -455,44 +477,44 @@
{
\IfValueTF{####3}
{
- \semantexrenderobject { ##1 } { ifoutput=true,####1, arg={ ####3 } }
+ \semantex_render_object:Nn ##1 { ifoutput=true,####1, arg={ ####3 } }
}
{
- \semantexrenderobject { ##1 } { ifoutput=true,####1 }
+ \semantex_render_object:Nn ##1 { ifoutput=true,####1 }
}
}
}
{
\IfValueTF{####2}
{
- \semantexifeqTF { ####2 } { * }
+ \tl_if_eq:nnTF { ####2 } { * }
{
\IfValueTF{####3}
{
- \semantexrenderobject { ##1 } { ifoutput=true, *, arg={ ####3 } }
+ \semantex_render_object:Nn ##1 { ifoutput=true, *, arg={ ####3 } }
}
{
- \semantexrenderobject { ##1 } { ifoutput=true, * }
+ \semantex_render_object:Nn ##1 { ifoutput=true, * }
}
}
{
- \semantexifeqTF { ####2 } { ** }
+ \tl_if_eq:nnTF { ####2 } { ** }
{
\IfValueTF{####3}
{
- \semantexrenderobject { ##1 } { ifoutput=true,**, arg={ ####3 } }
+ \semantex_render_object:Nn ##1 { ifoutput=true,**, arg={ ####3 } }
}
{
- \semantexrenderobject { ##1 } { ifoutput=true,** }
+ \semantex_render_object:Nn ##1 { ifoutput=true,** }
}
}
{
\IfValueTF{####3}
{
- \semantexrenderobject { ##1 } { ifoutput=true,degreedefault={ ####2 }, arg={ ####3 } }
+ \semantex_render_object:Nn ##1 { ifoutput=true,degreedefault={ ####2 }, arg={ ####3 } }
}
{
- \semantexrenderobject { ##1 } { ifoutput=true,degreedefault={ ####2 } }
+ \semantex_render_object:Nn ##1 { ifoutput=true,degreedefault={ ####2 } }
}
}
}
@@ -500,10 +522,10 @@
{
\IfValueTF{####3}
{
- \semantexrenderobject { ##1 } { ifoutput=true, arg={ ####3 } }
+ \semantex_render_object:Nn ##1 { ifoutput=true, arg={ ####3 } }
}
{
- \semantexrenderobject { ##1 } { }
+ \semantex_render_object:Nn ##1 { }
}
}
}
@@ -511,153 +533,67 @@
}
}
+\cs_set_eq:NN\NewCohomologyClass\semantex_new_cohomology_class:Nw
-%\DeclareDocumentCommand\newtupleclass{mO{}} % new tuple-type class
-%{
-% % #1 = class name
-% % #2 = options
-% \semantexnewclass { #1 } { #2 }
-% \exp_args:Nc\DeclareDocumentCommand{#1}{mog}{
-% % the actual \#1 command
-% % (maybe this does not even make sense for tuples)
-% \IfValueTF { ##2 }
-% {
-% \IfValueTF { ##3 }
-% {
-% \semantexrenderclass { #1 }{ ifoutput=true,symbol = { ##1 },##2, arg = { ##3 } }
-% }
-% {
-% \semantexrenderclass { #1 }{ ifoutput=true,symbol = { ##1 },##2 }
-% }
-% }
-% {
-% \IfValueTF { ##3 }
-% {
-% \semantexrenderclass { #1 }{ ifoutput=true,symbol = { ##1 }, arg = { ##3 } }
-% }
-% {
-% \semantexrenderclass { #1 }{ symbol = { ##1 } }
-% }
-% }
-% }
-% \exp_args:Nc\DeclareDocumentCommand{#1withoptions}{mmog}{
-% \IfValueTF { ##3 }
-% {
-% \IfValueTF { ##4 }
-% {
-% \semantexrenderclass { #1 }{ ifoutput=true, symbol = { ##2 }, ##1, ##3, arg = { ##4 } }
-% }
-% {
-% \semantexrenderclass { #1 }{ ifoutput=true, symbol = { ##2 }, ##1, ##3 }
-% }
-% }
-% {
-% \IfValueTF { ##4 }
-% {
-% \semantexrenderclass { #1 }{ ifoutput=true, symbol = { ##2 }, ##1, arg = { ##4 } }
-% }
-% {
-% \semantexrenderclass { #1 }{ symbol = { ##2 }, ##1 }
-% }
-% }
-% }
-% \exp_args:Nc\DeclareDocumentCommand{new#1}{mmmmmO{}}
-% {
-% % the command for creating a new object of class #1
-% % ##1 = command name, with backslash
-% % ##2 = symbol
-% % ##3 = options
-% \semantexnewobject { #1 } { ##1 } % creates the object with name ##1
-% { parent = #1, leftpar = { ##2 }, argsep = { ##3 }, rightpar = { ##4 }, argdots = { ##5 }, ##6 }
-% \DeclareDocumentCommand{##1}{og}{
-% % the actual \##1 command
-% \IfValueTF{####1}
-% {
-% \IfValueTF { ####2 }
-% {
-% \semantexrenderobject { ##1 } { ifoutput=true,####1, arg = { ####2 } }
-% }
-% {
-% \semantexrenderobject { ##1 } { ifoutput=true,####1 }
-% }
-% }
-% {
-% \IfValueTF { ####2 }
-% {
-% \semantexrenderobject { ##1 } { ifoutput=true, arg = { ####2 } }
-% }
-% {
-% \semantexrenderobject { ##1 } { }
-% }
-% }
-% }
-% }
-%}
-
-\DeclareDocumentCommand\newdelimiterclass{mO{}} % new delimiter-type class
+\DeclareDocumentCommand\semantex_new_delimiter_class:Nw{mO{}} % new delimiter-type class
{
% #1 = class name
% #2 = options
- \semantexnewclass { #1 } {
-% valuekeys={
-% {arg}{argwithoutkeyval={\l_semantex_key_value_temp}},
-% %Currently, using no braces around \l_semantex_key_value_temp is necessary for \semantexdelimsize to work
-% % with par=auto
-% },
+ \semantex_new_class:Nn { #1 } {
#2
}
- \exp_args:Nc\DeclareDocumentCommand{#1}{mog} % maybe this does not even make sense for delimiters
+ \DeclareDocumentCommand{#1}{mog} % maybe this does not even make sense for delimiters
{
\IfValueTF { ##2 }
{
\IfValueTF { ##3 }
{
- \semantexrenderclass { #1 } { ifoutput=true, symbol = { ##1 }, ##2, arg = { ##3 } }
+ \semantex_render_class:Nn #1 { ifoutput=true, symbol = { ##1 }, ##2, arg = { ##3 } }
}
{
- \semantexrenderclass { #1 } { ifoutput=true, symbol = { ##1 }, ##2 }
+ \semantex_render_class:Nn #1 { ifoutput=true, symbol = { ##1 }, ##2 }
}
}
{
\IfValueTF { ##3 }
{
- \semantexrenderclass { #1 } { ifoutput=true, symbol = { ##1 }, arg = { ##3 } }
+ \semantex_render_class:Nn #1 { ifoutput=true, symbol = { ##1 }, arg = { ##3 } }
}
{
- \semantexrenderclass { #1 } { symbol = { ##1 } }
+ \semantex_render_class:Nn #1 { symbol = { ##1 } }
}
}
}
% the actual \#1 command
- \exp_args:Nc\DeclareDocumentCommand{#1withoptions}{mmog}
+ \exp_args:Nc\DeclareDocumentCommand{__semantex_make_object_of_class_\cs_to_str:N #1_with_options:nnw}{mmog}
{
\IfValueTF { ##3 }
{
\IfValueTF { ##4 }
{
- \semantexrenderclass { #1 } { ifoutput=true, symbol = { ##2 }, ##1, ##3, arg = { ##4 } }
+ \semantex_render_class:Nn #1 { ifoutput=true, symbol = { ##2 }, ##1, ##3, arg = { ##4 } }
}
{
- \semantexrenderclass { #1 } { ifoutput=true, symbol = { ##2 }, ##1, ##3 }
+ \semantex_render_class:Nn #1 { ifoutput=true, symbol = { ##2 }, ##1, ##3 }
}
}
{
\IfValueTF { ##4 }
{
- \semantexrenderclass { #1 } { ifoutput=true, symbol = { ##2 }, ##1, arg = { ##4 } }
+ \semantex_render_class:Nn #1 { ifoutput=true, symbol = { ##2 }, ##1, arg = { ##4 } }
}
{
- \semantexrenderclass { #1 } { symbol = { ##2 }, ##1 }
+ \semantex_render_class:Nn #1 { symbol = { ##2 }, ##1 }
}
}
}
- \exp_args:Nc\DeclareDocumentCommand{new#1}{mmmO{}}
+ \exp_args:Nc\DeclareDocumentCommand{__semantex_new_object_of_class_\cs_to_str:N #1:Nw}{mmmO{}}
{
% the command for creating a new object of class #1
% ##1 = command name, with backslash
% ##2 = symbol
% ##3 = options
- \semantexnewobject { #1 } { ##1 }{ parent = #1, leftpar = { ##2 }, rightpar = { ##3 }, ##4 }
+ \semantex_new_object:NNn { #1 } { ##1 }{ leftpar = { ##2 }, rightpar = { ##3 }, ##4 }
% creates the object with name ##1
\DeclareDocumentCommand{##1}{og}{
% the actual \##1 command
@@ -665,192 +601,196 @@
{
\IfValueTF { ####2 }
{
- \semantexrenderobject { ##1 } { ifoutput=true,####1, arg = { ####2 } }
+ \semantex_render_object:Nn ##1 { ifoutput=true,####1, arg = { ####2 } }
}
{
- \semantexrenderobject { ##1 } { ifoutput=true,####1 }
+ \semantex_render_object:Nn ##1 { ifoutput=true,####1 }
}
}
{
\IfValueTF { ####2 }
{
- \semantexrenderobject { ##1 } { ifoutput=true, arg = { ####2 } }
+ \semantex_render_object:Nn ##1 { ifoutput=true, arg = { ####2 } }
}
{
- \semantexrenderobject { ##1 } { }
+ \semantex_render_object:Nn ##1 { }
}
}
}
}
}
-\cs_generate_variant:Nn \tl_if_eq:nnTF { xnTF }
-
-\cs_generate_variant:Nn \tl_if_eq:nnF { xnF }
-
-\cs_generate_variant:Nn \tl_if_eq:nnT { xnT }
+\cs_set_eq:NN\NewDelimiterClass\semantex_new_delimiter_class:Nw
-\DeclareDocumentCommand{\semantexifblankordotTF}{mmm}
-{
- \tl_if_blank:nTF { #1 }
- { #2 }
- {
- \tl_if_eq:xnTF { \tl_trim_spaces:n { #1 } } { . } { #2 } { #3 }
- }
-}
-
-\DeclareDocumentCommand{\semantexifblankordotT}{mm}
-{
- \tl_if_blank:nTF { #1 }
- { #2 }
- {
- \tl_if_eq:xnT { \tl_trim_spaces:n { #1 } } { . } { #2 }
- }
-}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% COMMANDS FOR CREATING AND HANDLING CLASSES AND OJBECTS
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\DeclareDocumentCommand{\semantexifblankordotF}{mm}
+\cs_new:Npn\NewObject#1
{
- \tl_if_blank:nF { #1 }
+ \cs_if_exist_use:cF { __semantex_new_object_of_class_\cs_to_str:N#1:Nw }
{
- \tl_if_eq:xnF { \tl_trim_spaces:n { #1 } } { . } { #2 }
- }
-}
-
-\cs_set_eq:NN\semantexifeqTF\tl_if_eq:nnTF
-
-\cs_set_eq:NN\semantexifeqT\tl_if_eq:nnT
-
-\cs_set_eq:NN\semantexifeqF\tl_if_eq:nnF
-
-
-
-\cs_new:Npn \g_semantex_new_class:nn#1#2{
- % create a new class
- % #1 = name of class
- % #2 = standard keyval setup; the parent class by default is semantexvariable
- \g_semantex_new_object:nnn { semantexvariable } { #1 } { #2 }
+ \msg_error:nnnn { semantex } { created_object_of_unknown_class } { #1 }
+ }
}
-\cs_set_eq:NN\semantexnewclass\g_semantex_new_class:nn
-
-\seq_new:N \semantex_all_objects_seq
-\seq_put_right:Nn \semantex_all_objects_seq { semantexvariable }
+%\cs_new:Npn\MakeObject#1{ \use:c { __semantex_make_object_of_class_#1:nw } }
-
-\cs_new:Npn \g_semantex_new_object:nnn#1#2#3{
+\cs_new:Npn \__semantex_new_class_or_object:nn#1#2{
% create new object
- % #1 = class of command
- % #2 = name of command, without backslash
- % #3 = standard keyval setup
+ % #1 = name of command, without backslash
+ % #2 = standard keyval setup
- \g_semantex_data_tl_provide:nn { #2 } { parent }
+ \semantex_data_tl_provide:nn { #1 } { parent }
- \g_semantex_data_tl_set:nnn {#2 } { parent } { semantexvariable }
+ \semantex_data_tl_set:nnn { #1 } { parent } { class_SemantexVariable }
- \cs_set:cpn { g_semantex_data_cs_#2_valuekey:nn } ##1##2 % command controlling valuekeys
- { \g_semantex_valuekey:nnn { ##2 } { ##1 } { #2 } }
+ \cs_set:cpn { __semantex_data_cs_#1_valuekey:nn } ##1##2 % command controlling valuekeys
+ { \semantex_valuekey:nnn { ##2 } { ##1 } { #1 } }
- \cs_set:cpn { g_semantex_data_cs_#2_novaluekey:n } ##1 % command controlling novaluekeys
- { \g_semantex_novaluekey:nn { ##1 } { #2 } }
+ \cs_set:cpn { __semantex_data_cs_#1_singlekey:n } ##1 % command controlling singlekeys
+ { \semantex_singlekey:nn { ##1 } { #1 } }
% Now a similar collection of keyval commands for the *argument*
- \cs_set:cpn { g_semantex_data_cs_#2_arg_valuekey:nn } ##1##2
- { \g_semantex_arg_valuekey:nnn { ##2 } { ##1 }{ #2 } }
+ \cs_set:cpn { __semantex_data_cs_#1_arg_valuekey:nn } ##1##2
+ { \semantex_arg_valuekey:nnn { ##2 } { ##1 }{ #1 } }
- \cs_set:cpn { g_semantex_data_cs_#2_arg_novaluekey:n } ##1
- { \g_semantex_arg_novaluekey:nn { ##1 } { #2 } }
-
+ \cs_set:cpn { __semantex_data_cs_#1_arg_singlekey:n } ##1
+ { \semantex_arg_singlekey:nn { ##1 } { #1 } }
% initially sets up the keyval interface of the object
- \g_semantex_keys_set:nn { #2 } { parent=#1, #3 }
+ \semantex_keys_set:nn { #1 } { #2 }
- \seq_put_right:Nx \semantex_all_objects_seq { #2 }
+% \seq_put_right:Nx \g__semantex_all_objects_seq { #1 }
}
+\cs_generate_variant:Nn \__semantex_new_class_or_object:nn { xn }
+
+\cs_new:Npn \semantex_new_class:Nn#1#2{
+ % create a new class
+ % #1 = name of class
+ % #2 = standard keyval setup; the parent class by default is SemantexVariable
+ \semantex_class_if_exist:NTF { #1 }
+ {
+ \msg_error:nnn { semantex } { class_already_defined } { #1 }
+ }
+ {
+ \semantex_class_register:N { #1 }
+ \__semantex_new_class_or_object:xn { class_\cs_to_str:N #1 } { #2 }
+ }
+}
+
+\cs_set:Npn \semantex_new_object:NNn#1#2#3
+{
+ \semantex_object_if_exist:NTF { #2 }
+ {
+ \msg_error:nnn { semantex } { object_already_defined } { #2 }
+ }
+ {
+ \semantex_object_register:N { #2 }
+ \__semantex_new_class_or_object:xn { object_\cs_to_str:N #2 } { class=#1, #3 }
+ }
+}
-\cs_generate_variant:Nn \g_semantex_new_object:nnn { nxn }
+\seq_new:N \g__semantex_all_classes_seq % a register for all objects created
-\cs_set:Npn \semantexnewobject#1#2#3
-{ \g_semantex_new_object:nxn { #1 }{ \cs_to_str:N #2 } { #3 } }
+\cs_new:Npn\semantex_class_register:N#1
+{
+ \seq_put_right:Nx\g__semantex_all_classes_seq { class_\cs_to_str:N #1 }
+}
+\cs_new:Npn\semantex_class_if_exist:NTF#1#2#3
+{
+ \seq_if_in:NxTF\g__semantex_all_classes_seq { class_\cs_to_str:N#1 } { #2 } { #3 }
+}
+\seq_new:N \g__semantex_all_objects_seq % a register for all objects created
+\cs_new:Npn\semantex_object_register:N#1
+{
+ \seq_put_right:Nx\g__semantex_all_objects_seq { object_\cs_to_str:N #1 }
+}
-%-------------------------------
+\cs_new:Npn\semantex_object_if_exist:NTF#1#2#3
+{
+ \seq_if_in:NxTF\g__semantex_all_objects_seq { object_\cs_to_str:N#1 } { #2 } { #3 }
+}
-% Commands for rendering:
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% COMMANDS FOR RENDERING OBJECTS AND CLASSES
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\tl_new:N\l__semantex_symbol_temp
+\cs_generate_variant:Nn\tl_if_blank:nTF { xTF }
-\cs_new_protected:Npn \g_semantex_render:nn#1#2
+\cs_new_protected:Npn \__semantex_render:nn#1#2
{
- % the main command for rendering an object
+ % the main command for rendering a class/object
% #1 = name of object
% #2 = options
\group_begin:
- \g_semantex_data_tl_inherit:nn { #1 } { symbol }
- \g_semantex_keys_set:nn { #1 } { #2 }
- \g_semantex_primitive_valuekey_parse:nn { #1 } { } % not the right place to run this?
- \g_semantex_data_bool_get:nnTF { #1 } { output }
+ \semantex_data_tl_inherit:nn { #1 } { symbol } % Inherit the symbol from parent if not done already
+ \semantex_keys_set:nn { #1 } { #2 } % Setup the keys
+ \semantex_primitive_valuekey_parse:nn { #1 } { } % Run the "parse" routine, i.e. the collection of code that the user has added to the parse register
+ \semantex_data_bool_get:nnTF { #1 } { output } % Checks if the object/class is supposed to output
{
- \g_semantex_primitive_valuekey_innerreturn:nn { #1 }{}
- \g_semantex_data_bool_get:nnTF { #1 } { rightreturnbeforerender }
+ \semantex_primitive_valuekey_innerreturn:nn { #1 }{}
+ \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
{
- \g_semantex_primitive_valuekey_rightreturn:nn { #1 }{}
+ \semantex_data_bool_get:nnTF { #1 } { leftargument } % Checks if left or right argument
+ {
+ \semantex_primitive_valuekey_leftreturn:nn { #1 }{}
+ }
+ {
+ \semantex_primitive_valuekey_rightreturn:nn { #1 }{}
+ }
}
{
% do nothing
}
- \tl_set:Nx\l__semantex_render_symbol_temp { \g_semantex_data_tl_get:nn { #1 } { symbol } } %IM chang to "store" solution
- \g_semantex_data_tl_get_store:nnN { #1 } { upper_index } \l__semantex_render_upper_index_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { lower_index } \l__semantex_render_lower_index_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { upper_left_index } \l__semantex_render_upper_left_index_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { lower_left_index } \l__semantex_render_lower_left_index_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { preupper } \l__semantex_render_preupper_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { postupper } \l__semantex_render_postupper_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { prelower } \l__semantex_render_prelower_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { postlower } \l__semantex_render_postlower_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { preupperleft } \l__semantex_render_preupperleft_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { postupperleft } \l__semantex_render_postupperleft_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { prelowerleft } \l__semantex_render_prelowerleft_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { postlowerleft } \l__semantex_render_postlowerleft_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { texclass } \l__semantex_render_texclass_temp
+ \tl_set:Nx\l__semantex_render_symbol_temp { \semantex_data_tl_get:nn { #1 } { symbol } } % Stores the symbol in a temporary command
\tl_set:Nx \l__semantex_render_temp
{
\exp_not:c {
- \g_semantex_data_tl_get:nn { #1 } { output }withoptions
- }
+ __semantex_make_object_of_\semantex_data_tl_get:nn { #1 } { output }_with_options:nnw
+ } % This is for outputting -- the command \__semantex_make_object_of_class_???_with_options:nnw makes a one-time object of class ??? and allows us to immediately parse options to it
{
- upperaddleft={\exp_not:V\l__semantex_render_upper_index_temp},
- loweraddleft={\exp_not:V\l__semantex_render_lower_index_temp},
- upperleftaddright={\exp_not:V\l__semantex_render_upper_left_index_temp},
- lowerleftaddright={\exp_not:V\l__semantex_render_lower_left_index_temp},
- preupper={\exp_not:V\l__semantex_render_preupper_temp},
- postupper={\exp_not:V\l__semantex_render_postupper_temp},
- prelower={\exp_not:V\l__semantex_render_prelower_temp},
- postlower={\exp_not:V\l__semantex_render_postlower_temp},
- preupperleft={\exp_not:V\l__semantex_render_preupperleft_temp},
- postupperleft={\exp_not:V\l__semantex_render_postupperleft_temp},
- prelowerleft={\exp_not:V\l__semantex_render_prelowerleft_temp},
- postlowerleft={\exp_not:V\l__semantex_render_postlowerleft_temp},
- texclass={\l__semantex_render_texclass_temp},
- \g_semantex_data_tl_get_exp_not:nn { #1 } { output_options },
+ upperputleft={\semantex_data_tl_get_exp_not:nn { #1 } { upper }},
+ lowerputleft={\semantex_data_tl_get_exp_not:nn { #1 } { lower }},
+ upperleftputright={\semantex_data_tl_get_exp_not:nn { #1 } { upperleft }},
+ lowerleftputright={\semantex_data_tl_get_exp_not:nn { #1 } { lowerleft }},
+ preupper={\semantex_data_tl_get_exp_not:nn { #1 } { preupper }},
+ postupper={\semantex_data_tl_get_exp_not:nn { #1 } { postupper }},
+ prelower={\semantex_data_tl_get_exp_not:nn { #1 } { prelower }},
+ postlower={\semantex_data_tl_get_exp_not:nn { #1 } { postlower }},
+ preupperleft={\semantex_data_tl_get_exp_not:nn { #1 } { preupperleft }},
+ postupperleft={\semantex_data_tl_get_exp_not:nn { #1 } { postupperleft }},
+ prelowerleft={\semantex_data_tl_get_exp_not:nn { #1 } { prelowerleft }},
+ postlowerleft={\semantex_data_tl_get_exp_not:nn { #1 } { postlowerleft }},
+ texclass={\semantex_data_tl_get:nn { #1 } { texclass }},
+ \semantex_data_tl_get_exp_not:nn { #1 } { outputoptions },
+ % These are the options we parse to our object -- this is all
+ % information that we pass on to the output class so that it
+ % can eventually render it
}
{ \exp_not:V \l__semantex_render_symbol_temp }
}
}
{
- \g_semantex_primitive_valuekey_return:nn { #1 }{}
-% \tl_set:Nx \l__semantex_render_temp { \exp_not:V \l__semantex_symbol_temp }
-% \tl_set:Nx\l__semantex_render_temp { \g_semantex_data_tl_get:nn { #1 } { symbol } } % this is the ordinary solution that generally just works
- %\tl_set:Nx\l__semantex_render_temp { \exp_not:n{\exp_not:v { semantex_data_tl_#1_symbol } }}
-% \g_semantex_data_tl_get_store:nnN { #1 } { symbol } \l__semantex_render_symbol_temp
- \tl_if_blank:xTF { \g_semantex_data_tl_get:nn { #1 } { texclass } }{
- \tl_set:Nx\l__semantex_render_symbol_temp { \g_semantex_data_tl_get:nn { #1 } { symbol } }
+ \semantex_primitive_valuekey_return:nn { #1 }{} % Returns the object/class, i.e. adds all remaining indices and arguments to it
+ \tl_if_blank:xTF { \semantex_data_tl_get:nn { #1 } { texclass } }
+ % Checks whether the texclass register has been declared -- this is
+ % where you store \mathord, \mathbin, \mathrel, etc., if you want
+ % the object to be eventually wrapped in this.
+ {
+ \tl_set:Nx\l__semantex_render_symbol_temp { \semantex_data_tl_get:nn { #1 } { symbol } }
}
{
- \tl_set:Nx\l__semantex_render_symbol_temp { \g_semantex_data_tl_get:nn { #1 } { texclass } { \g_semantex_data_tl_get:nn { #1 } { symbol } } }
+ \tl_set:Nx\l__semantex_render_symbol_temp { \semantex_data_tl_get:nn { #1 } { texclass } { \semantex_data_tl_get:nn { #1 } { symbol } } }
}
\tl_set:Nx\l__semantex_render_temp {
\exp_not:V \l__semantex_render_symbol_temp
@@ -858,234 +798,423 @@
}
\exp_last_unbraced:NV
\group_end:
- \l__semantex_render_temp
+ \l__semantex_render_temp % This neat trick allows outputting to different classes to work as expected
}
-\cs_set_eq:NN\semantexrenderclass\g_semantex_render:nn % a front-end command
+\cs_generate_variant:Nn \__semantex_render:nn { xn }
-\cs_set:Npn\semantexrenderobject#1#2
+\cs_set:Npn\semantex_render_class:Nn#1#2 % a front-end command
{
- \g_semantex_render:nn { \cs_to_str:N #1 } { #2 }
+ \__semantex_render:xn { class_\cs_to_str:N #1 } { #2 }
}
+\cs_set:Npn\semantex_render_object:Nn#1#2
+{
+ \__semantex_render:xn { object_\cs_to_str:N #1 } { #2 } % Actually, it seems to all still work out fine with n-type instead of x-type, but better be sure
+}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% COMMANDS FOR HANDLING PARENTHESES
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\cs_generate_variant:Nn\tl_if_blank:nTF { xTF }
-\cs_new:Npn \g_semantex_right_indices:nnnnnn#1#2#3#4#5#6
+\tl_new:N\SemantexDelimiterSize
+
+%%So far, this is experimental:
+%%\makeatletter %this part requires amsmath
+%\tl_set:Nn\semantexnormalscaling{\bBigg@{0.8}}
+%\tl_set:Nn\semantexnormalscalingl{\mathopen\semantexnormalscaling}
+%\tl_set:Nn\semantexnormalscalingr{\mathclose\semantexnormalscaling}
+%\tl_set:Nn\semantexnormalscalingm{\mathrel\semantexnormalscaling}
+%%\makeatother
+
+\cs_new:Npn \__semantex_parentheses_normal:nnn#1#2#3
{
- \tl_if_blank:nF { #2 } { \sp{#1 #2 #3} }
- \tl_if_blank:nF { #5 } { \sb{#4 #5 #6} }
- % Using x here was the source of a very long
- % debugging; inputting underbrace in the index
- % caused problems
+ \group_begin:
+ %\semantexnormalscalingl#2 #4 #5 #6 \semantexnormalscalingr#3
+ \mathopen#1 #3 \mathclose#2
+ \group_end:
}
-\cs_new:Npn \g_semantex_left_indices:nnnnnn#1#2#3#4#5#6
+\cs_new:Npn \__semantex_parentheses_auto:nnn#1#2#3
{
- \tl_if_blank:nTF { #2 } {
- \tl_if_blank:nF { #5 } { {}\sb{#4 #5 #6} }
- }
- {
- {} \sp{#1 #2 #3}
- \tl_if_blank:nF { #5 } { \sb{#4 #5 #6} }
- }
+ \group_begin:
+ \tl_set:Nn\SemantexDelimiterSize{\middle}
+ %\tl_set_eq:NN\SemantexDelimiterSize\middle
+ \mathopen{}\mathclose\bgroup\left#1
+ #3
+ \aftergroup\egroup\right#2
+ \group_end:
}
+\cs_new:Npn \__semantex_parentheses_other:nnnn#1#2#3#4
+{
+ \group_begin:
+ \tl_set_eq:NN\SemantexDelimiterSize#4
+ %\tl_set:Nx\SemantexDelimiterSize{\exp_not:N#1}
+ \mathopen#4#1 #3 \mathclose#4#2
+ \group_end:
+}
-\tl_new:N\semantexdelimsize
-
-%So far, this is experimental:
-%\makeatletter %this part requires amsmath
-\newcommand{\semantexnormalscaling}{\bBigg@{0.8}}
-\newcommand{\semantexnormalscalingl}{\mathopen\semantexnormalscaling}
-\newcommand{\semantexnormalscalingr}{\mathclose\semantexnormalscaling}
-\newcommand{\semantexnormalscalingm}{\mathrel\semantexnormalscaling}
-%\makeatother
+\cs_generate_variant:Nn \str_case:nnF { xnF }
-\cs_new:Npn \g_semantex_parentheses:nnnnnn#1#2#3#4#5#6
+\cs_new:Npn \__semantex_parentheses_store:nnnnN#1#2#3#4#5
+% The central command handling the rendering of argument parentheses
{
- \tl_if_blank:nF { #5 }
+ \tl_set:Nx#5
{
- \str_case:nnF { #1 }
- {
- { normal } {
- \group_begin:
- %\semantexnormalscalingl#2 #4 #5 #6 \semantexnormalscalingr#3
- \mathopen#2 #4 #5 #6 \mathclose#3
- \group_end:
+ { #2 }
+ { #3 }
+ { #4 }
+ }
+ \str_case:xnF { #1 } % This is where \big,\Big, etc. go. To my surprise, an x-type expansion did not cause any issues with this
+ {
+ { normal } {
+ \tl_put_left:Nn#5
+ {
+ \exp_not:N
+ \__semantex_parentheses_normal:nnn
}
- { auto } {
- \group_begin:
- \tl_set:Nn\semantexdelimsize{\middle}
- %\tl_set_eq:NN\semantexdelimsize\middle
- \mathopen{}\mathclose\bgroup\left#2
- #4 #5 #6
- \aftergroup\egroup\right#3
- \group_end:
+ }
+ { auto } {
+ \tl_put_left:Nn#5
+ {
+ \exp_not:N
+ \__semantex_parentheses_auto:nnn
}
- { * } {
- \group_begin:
- \tl_set:Nn\semantexdelimsize{\middle}
- %\tl_set_eq:NN\semantexdelimsize\middle
- \mathopen{}\mathclose\bgroup\left#2
- #4 #5 #6
- \aftergroup\egroup\right#3
- \group_end:
+ }
+ { * } {
+ \tl_put_left:Nn#5
+ {
+ \exp_not:N
+ \__semantex_parentheses_auto:nnn
}
-% { \big } {
-% \group_begin:
-% \tl_set_eq:NN\semantexdelimsize\big
-% \mathopen\big#2 #4 \mathclose\big#3
-% \group_end:
-% }
-% { \Big } {
-% \group_begin:
-% \tl_set_eq:NN\semantexdelimsize\Big
-% \mathopen\Big#2 #4 \mathclose\Big#3
-% \group_end:
-% }
-% { \bigg } {
-% \group_begin:
-% \tl_set_eq:NN\semantexdelimsize\bigg
-% \mathopen\bigg#2 #4 \mathclose\bigg#3
-% \group_end:
-% }
-% { \Bigg } {
-% \group_begin:
-% \tl_set_eq:NN\semantexdelimsize\Bigg
-% \mathopen\Bigg#2 #4 \mathclose\Bigg#3
-% \group_end:
-% }
}
+ }
+ {
+ \tl_put_right:Nx#5
+ {
+ { \exp_not:V #1 }
+ }
+ \tl_put_left:Nn#5
{
- \group_begin:
- \tl_set_eq:NN\semantexdelimsize#1
- %\tl_set:Nx\semantexdelimsize{\exp_not:N#1}
- \mathopen#1#2 #4 #5 #6 \mathclose#1#3
- \group_end:
+ \exp_not:N
+ \__semantex_parentheses_other:nnnn
}
}
}
-\cs_new:Npn \g_semantex_no_parentheses:nnn#1#2#3
+\cs_new:Npn \__semantex_no_parentheses:n#1
{
- \tl_if_blank:nF { #2 }
- {
\group_begin:
- \tl_clear:N\semantexdelimsize
- #1 #2 #3
+ \tl_clear:N\SemantexDelimiterSize
+ #1
\group_end:
+}
+
+\cs_new:Npn \__semantex_no_parentheses_store:nN#1#2
+% The central command for handling the rendering of arguments with no parentheses around
+{
+ \tl_set:Nx#2
+ {
+ { #1 }
}
+ \tl_put_left:Nn#2
+ {
+ \exp_not:N
+ \__semantex_no_parentheses:n
+ }
+}
+
+\cs_new:Npn \__semantex_symbol_parentheses_normal:nnn#1#2#3
+{
+ \mathopen#1 #3 \mathclose#2
}
-\cs_new:Npn \g_semantex_symbol_parentheses:nnnn#1#2#3#4
+\cs_new:Npn \__semantex_symbol_parentheses_auto:nnn#1#2#3
{
- \tl_if_blank:nF { #4 }
+ \mathopen{}\mathclose\bgroup\left#1
+ #3
+ \aftergroup\egroup\right#2
+}
+
+
+\cs_new:Npn \__semantex_symbol_parentheses_other:nnnn#1#2#3#4
+{
+ \mathopen#4#1 #3 \mathclose#4#2
+}
+
+
+\cs_new:Npn \__semantex_symbol_parentheses_store:nnnnN#1#2#3#4#5
+% The central command handling the rendering of symbol parentheses
+{
+ \tl_set:Nx#5
+ {
+ { #2 }
+ { #3 }
+ { #4 }
+ }
+ \str_case:xnF { #1 } % This is where \big,\Big, etc. go. To my surprise, an x-type expansion did not cause any issues with this
{
- \str_case:nnF { #1 }
+ { normal } {
+ \tl_put_left:Nn#5
+ {
+ \exp_not:N
+ \__semantex_symbol_parentheses_normal:nnn
+ }
+ }
+ { auto } {
+ \tl_put_left:Nn#5
+ {
+ \exp_not:N
+ \__semantex_symbol_parentheses_auto:nnn
+ }
+ }
+ { * } {
+ \tl_put_left:Nn#5
+ {
+ \exp_not:N
+ \__semantex_symbol_parentheses_auto:nnn
+ }
+ }
+ }
+ {
+ \tl_put_right:Nx#5
{
- { normal } { \mathopen#2 #4 \mathclose#3 }
- { auto } { \mathopen{}\mathclose\bgroup\left#2 #4 \aftergroup\egroup\right#3 }
- { * } { \mathopen{}\mathclose\bgroup\left#2 #4 \aftergroup\egroup\right#3 }
+ { \exp_not:V #1 }
+ }
+ \tl_put_left:Nn#5
+ {
+ \exp_not:N
+ \__semantex_symbol_parentheses_other:nnnn
}
- { \mathopen#1#2 #4 \mathclose#1#3 }
}
}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% COMMANDS FOR MODIFYING AND OBTAINING DATA
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
%--------------------------------------------
% Commands to modify and obtain data
-\cs_generate_variant:Nn \str_if_eq:nnTF { fnTF , onTF }
-
-%\cs_new:Npn \g_semantex_data_tl_get_proto:nnn#1#2#3
+%\cs_new:Npn \semantex_data_tl_get_proto:nnn#1#2#3
%{
% % #1 = name of object
% % #2 = the data to get
% % #3 = also the name of object, but being stored
% % when passing to the parent, in order to make
% % error messages meaningful
-% \tl_if_exist:cTF { semantex_data_tl_#1_#2 }
+% \tl_if_exist:cTF { g__semantex_data_tl_#1_#2 }
% {
-% \use:c { semantex_data_tl_#1_#2 }
+% \use:c { g__semantex_data_tl_#1_#2 }
% }
% {
-% \tl_if_eq:nnTF { #1 } { semantexvariable }
+% \tl_if_eq:nnTF { #1 } { SemantexVariable }
% {
% \msg_error:nnnn { semantex } { data_tl_not_found } { #2 } { #3 }
% }
% {
-% \g_semantex_data_tl_get_proto:nnn { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 } { #1 }
+% \semantex_data_tl_get_proto:nnn { \semantex_data_tl_get:nn { #1 } { parent } } { #2 } { #1 }
% }
% }
%}
%
-%\cs_new:Npn \g_semantex_data_tl_get:nn#1#2
+%\cs_new:Npn \semantex_data_tl_get:nn#1#2
%{
-% \g_semantex_data_tl_get_proto:nnn { #1 } { #2 } { #1 }
+% \semantex_data_tl_get_proto:nnn { #1 } { #2 } { #1 }
%}
-\cs_new:Npn \g_semantex_data_tl_get:nn#1#2
+
+
+% COMMANDS FOR HANDLING THE PARENT OF A CLASS/OBJECT:
+
+\cs_new:Npn \semantex_data_parent_get:n#1
+{
+ % #1 = object
+ % A command to get the parent of an object
+ \use:c { g__semantex_data_tl_#1_parent }
+}
+
+\cs_new:Npn \semantex_data_parent_set:nn#1#2
+{
+ \semantex_class_if_exist:NTF { #2 }
+ {
+ \tl_set:cx { g__semantex_data_tl_#1_parent } { class_\cs_to_str:N#2 }
+ }
+ {
+ \semantex_error_output_format:nN { #1 } \l__semantex_data_parent_set_temp
+ \msg_error:nnxnn { semantex } { class_not_found } { \l__semantex_data_parent_set_temp } { parent } { #2 }
+ }
+}
+
+\cs_new:Npn \semantex_data_class_set:nn#1#2
+{
+ \semantex_class_if_exist:NTF { #2 }
+ {
+ \tl_set:cx { g__semantex_data_tl_#1_parent } { class_\cs_to_str:N#2 }
+ }
+ {
+ \semantex_error_output_format:nN { #1 } \l__semantex_data_class_set_temp
+ \msg_error:nnxnn { semantex } { class_not_found } { \l__semantex_data_class_set_temp } { class } { #2 }
+ }
+}
+
+\cs_new:Npn \semantex_data_copy_object:nn#1#2
+{
+ \semantex_object_if_exist:NTF { #2 }
+ {
+ \tl_set:cx { g__semantex_data_tl_#1_parent } { object_\cs_to_str:N#2 }
+ }
+ {
+ \semantex_error_output_format:nN { #1 } \l__semantex_data_copy_object_temp
+ \msg_error:nnxnn { semantex } { object_not_found } { \l__semantex_data_copy_object_temp } { copy } { #2 }
+ }
+}
+
+\cs_new:Npn \semantex_data_clone_object:nn#1#2
+{
+ \semantex_object_if_exist:NTF { #2 }
+ {
+ \tl_set:cx { g__semantex_data_tl_#1_parent } { object_\cs_to_str:N#2 }
+ }
+ {
+ \semantex_error_output_format:nN { #1 } \l__semantex_data_clone_object_temp
+ \msg_error:nnxnn { semantex } { object_not_found } { \l__semantex_data_clone_object_temp } { clone } { #2 }
+ }
+}
+
+% COMMANDS FOR HANDLING DATA CONSISTING OF TOKEN LISTS
+
+\cs_new:Npn \semantex_data_tl_get:nn#1#2
{
% #1 = name of object
% #2 = the data to get
- % #3 = also the name of object, but being stored
- % when passing to the parent, in order to make
- % error messages meaningful
- \tl_if_exist:cTF { semantex_data_tl_#1_#2 }
+ \__semantex_data_tl_get_auxiliary:nnn { #1 } { #2 } { #1 }
+}
+
+\cs_generate_variant:Nn \str_if_eq:nnTF { fnTF }
+
+\cs_generate_variant:Nn \tl_if_eq:nnTF { fnTF }
+
+\cs_new:Npn \__semantex_data_tl_get_auxiliary:nnn#1#2#3
+{
+ % #1 = name of class/object
+ % #2 = the data to get
+ % #3 = the original class/object, used for error messaging
+ \tl_if_exist:cTF { g__semantex_data_tl_#1_#2 }
{
- \use:c { semantex_data_tl_#1_#2 }
+ \use:c { g__semantex_data_tl_#1_#2 }
}
{
- \g_semantex_data_tl_get:nn { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 }
+ \str_if_eq:nnTF { #1 } { class_SemantexVariable } % Apparently, f-type expansion seemed to work here for once
+ {
+ \semantex_error_output_format:nN { #3 } \__semantex_data_tl_get_auxiliary_temp
+ \msg_error:nnxn { semantex } { data_tl_not_found } { \__semantex_data_tl_get_auxiliary_temp } { #2 }
+ }
+ {
+ \__semantex_data_tl_get_auxiliary:fnn { \semantex_data_parent_get:n { #1 } } { #2 } { #3 }
+ }
}
}
-\cs_new:Npn \g_semantex_data_tl_get_exp_not:nn#1#2
+\cs_generate_variant:Nn \__semantex_data_tl_get_auxiliary:nnn { fnn }
+
+%\cs_new:Npn \semantex_data_tl_get_exp_not:nn#1#2
+%{
+% % #1 = name of object
+% % #2 = the data to get
+% \tl_if_exist:cTF { g__semantex_data_tl_#1_#2 }
+% {
+% \exp_not:v { g__semantex_data_tl_#1_#2 }
+% }
+% {
+% \semantex_data_tl_get:nn { \semantex_data_parent_get:n { #1 } } { #2 }
+% }
+%}
+
+\cs_new:Npn \semantex_data_tl_get_exp_not:nn#1#2
{
% #1 = name of object
% #2 = the data to get
- \tl_if_exist:cTF { semantex_data_tl_#1_#2 }
+ \__semantex_data_tl_get_exp_not_auxiliary:nnn { #1 } { #2 } { #1 }
+}
+
+\cs_new:Npn \__semantex_data_tl_get_exp_not_auxiliary:nnn#1#2#3
+{
+ % #1 = name of class/object
+ % #2 = the data to get
+ % #3 = the original class/object, used for error messaging
+ \tl_if_exist:cTF { g__semantex_data_tl_#1_#2 }
{
- \exp_not:v { semantex_data_tl_#1_#2 }
+ \exp_not:v { g__semantex_data_tl_#1_#2 }
}
{
- \g_semantex_data_tl_get:nn { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 }
+ \str_if_eq:nnTF { #1 } { class_SemantexVariable } % Apparently, f-type expansion seemed to work here for once
+ {
+ \semantex_error_output_format:nN { #3 } \l__semantex_data_tl_get_exp_not_auxiliary_temp
+ \msg_error:nnxn { semantex } { data_tl_not_found } { \l__semantex_data_tl_get_exp_not_auxiliary_temp } { #2 }
+ }
+ {
+ \__semantex_data_tl_get_exp_not_auxiliary:fnn { \semantex_data_parent_get:n { #1 } } { #2 } { #3 }
+ }
}
}
-%\cs_generate_variant:Nn \g_semantex_data_tl_get:nn { cn }
+\cs_generate_variant:Nn \__semantex_data_tl_get_exp_not_auxiliary:nnn { fnn }
+
+
+\cs_new:Npn \semantex_data_tl_get_store:nnN#1#2#3% maybe should be PROTECTED??
+{
+ % #1 = name of object
+ % #2 = the data to get
+ % #3 = where to store it
+ \__semantex_data_tl_get_store_auxiliary:nnNn { #1 } { #2 } #3 { #1 }
+}
-\cs_new:Npn \g_semantex_data_tl_get_store:nnN#1#2#3% maybe should be PROTECTED??
+\cs_new:Npn \__semantex_data_tl_get_store_auxiliary:nnNn#1#2#3#4% maybe should be PROTECTED??
{
% #1 = name of object
% #2 = the data to get
% #3 = where to store it
- \tl_if_exist:cTF { semantex_data_tl_#1_#2 }
+ \tl_if_exist:cTF { g__semantex_data_tl_#1_#2 }
{
- \tl_set_eq:Nc #3 { semantex_data_tl_#1_#2 }
+ \tl_set_eq:Nc #3 { g__semantex_data_tl_#1_#2 }
}
{
- \g_semantex_data_tl_get_store:nnN { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 } #3
+ \str_if_eq:nnTF { #1 } { class_SemantexVariable }
+ {
+ \semantex_error_output_format:nN { #4 } \l__semantex_data_tl_get_store_auxiliary_temp
+ \msg_error:nnxn { semantex } { data_tl_not_found } { \l__semantex_data_tl_get_store_auxiliary_temp } { #2 }
+ }
+ {
+ \__semantex_data_tl_get_store_auxiliary:fnNn { \semantex_data_parent_get:n { #1 } } { #2 } #3 { #4 }
+ }
}
}
-\cs_generate_variant:Nn \g_semantex_data_tl_get_store:nnN { nnc }
+\cs_generate_variant:Nn \__semantex_data_tl_get_store_auxiliary:nnNn { fnNn }
-\cs_new:Npn\g_semantex_data_tl_provide:nn#1#2
+\cs_generate_variant:Nn \semantex_data_tl_get_store:nnN { nnc }
+
+\cs_new:Npn\semantex_data_tl_provide:nn#1#2
{
- \tl_if_exist:cF { semantex_data_tl_#1_#2 }
+ \tl_if_exist:cF { g__semantex_data_tl_#1_#2 }
{
- \tl_set:cn { semantex_data_tl_#1_#2 } {}
+ \tl_set:cn { g__semantex_data_tl_#1_#2 } {}
}
}
-\cs_new:Npn\g_semantex_data_tl_inherit:nn#1#2
+\cs_new:Npn\semantex_data_tl_inherit:nn#1#2
{
% #1 = object
% #2 = piece of token list data
@@ -1093,1756 +1222,3531 @@
% to the object #1. After this, no more inheritance is taking place
% from the parent, and the data can be changed locally on the level
% of #1.
- \tl_if_exist:cF { semantex_data_tl_#1_#2 }
- {
- \g_semantex_data_tl_get_store:nnc { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 } { semantex_data_tl_#1_#2 }
- }
+ \tl_if_exist:cF { g__semantex_data_tl_#1_#2 }
{
- \g_semantex_data_tl_get_store:nnc { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 } { semantex_data_tl_#1_#2 }
- %IM could be replaced by simply { #1 } { #2 } once the check is made
- %IM based on "if_provided"
+ \semantex_data_tl_get_store:nnc { \semantex_data_parent_get:n { #1 } } { #2 } { g__semantex_data_tl_#1_#2 }
}
}
-\cs_new:Npn\g_semantex_data_tl_inherit_x:nn#1#2
-{
+\cs_set_eq:NN\semantex_data_tl_inherit_x:nn\semantex_data_tl_inherit:nn
% The same as inherit; historically, this one did an x type
% expansion first, but after changes in other places, this
% no longer appeard to be necessary. I decided to keep up the
% separation of the two, just in case.
- \tl_if_exist:cF { semantex_data_tl_#1_#2 }
+
+
+\cs_new:Npn \semantex_data_tl_set:nnn#1#2#3
+{
+ \tl_set:cn { g__semantex_data_tl_#1_#2 } { #3 }
+}
+
+\cs_generate_variant:Nn \semantex_data_tl_set:nnn { nnx }
+
+\cs_new:Npn \semantex_data_tl_put_right:nnn#1#2#3
+{
+ \semantex_data_tl_inherit:nn { #1 } { #2 }
+ \tl_put_right:cn { g__semantex_data_tl_#1_#2 } { #3 }
+}
+
+\cs_generate_variant:Nn \semantex_data_tl_put_right:nnn { nnx }
+
+\cs_new:Npn \semantex_data_tl_put_left:nnn#1#2#3
+{
+ \semantex_data_tl_inherit:nn { #1 } { #2 }
+ \tl_put_left:cn { g__semantex_data_tl_#1_#2 } { #3 }
+}
+
+\cs_generate_variant:Nn \semantex_data_tl_put_left:nnn { nnx }
+
+\cs_new:Npn \semantex_data_tl_clear:nn#1#2
+{
+ \semantex_data_tl_provide:nn { #1 } { #2 }
+ \tl_clear:c { g__semantex_data_tl_#1_#2 }
+}
+
+% DATA OF TYPE INTEGER:
+
+\cs_new:Npn\semantex_data_int_provide:nn#1#2
+{
+ \bool_if_exist:cTF { g__semantex_data_int_#1_#2_bool_if_provided }
{
- \g_semantex_data_tl_get_store:nnc { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 } { semantex_data_tl_#1_#2 }
+ \bool_if:cF { g__semantex_data_int_#1_#2_bool_if_provided }
+ {
+ \bool_set_true:c { g__semantex_data_int_#1_#2_bool_if_provided }
+ }
}
{
- \g_semantex_data_tl_get_store:nnc { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 } { semantex_data_tl_#1_#2 }
- %IM could be replaced by simply { #1 } { #2 } once the check is made
- %IM based on "if_provided"
+ \bool_new:c { g__semantex_data_int_#1_#2_bool_if_provided }
+ \bool_set_true:c { g__semantex_data_int_#1_#2_bool_if_provided }
+ \int_new:c { g__semantex_data_int_#1_#2 }
}
}
-\cs_new:Npn \g_semantex_data_tl_set:nnn#1#2#3
+\cs_new:Npn\semantex_data_int_inherit:nn#1#2
{
- %\g_semantex_data_tl_provide:nn { #1 } { #2 }
- \tl_set:cn { semantex_data_tl_#1_#2 } { #3 }
+ \bool_if_exist:cTF { g__semantex_data_int_#1_#2_bool_if_provided }
+ {
+ \bool_if:cF { g__semantex_data_int_#1_#2_bool_if_provided }
+ {
+ \semantex_data_int_get_store:nnc { \semantex_data_parent_get:n { #1 } } { #2 } { g__semantex_data_int_#1_#2 }
+ \bool_set_true:c { g__semantex_data_int_#1_#2_bool_if_provided }
+ }
+ }
+ {
+ \bool_new:c { g__semantex_data_int_#1_#2_bool_if_provided }
+ \bool_set_true:c { g__semantex_data_int_#1_#2_bool_if_provided }
+ \int_new:c { g__semantex_data_int_#1_#2 }
+ \semantex_data_int_get_store:nnc { \semantex_data_parent_get:n { #1 } } { #2 } { g__semantex_data_int_#1_#2 }
+ }
}
-\cs_generate_variant:Nn \g_semantex_data_tl_set:nnn { nnx }
+\cs_new:Npn \semantex_data_int_get:nn#1#2{% maybe should be PROTECTED??
+ % #1 = name of object
+ % #2 = the intuence to get
+ % #3 = the command to store it in
+ \__semantex_data_int_get_auxiliary:nnn { #1 } { #2 } { #1 }
+}
-\cs_new:Npn \g_semantex_data_tl_put_right:nnn#1#2#3
+\cs_new:Npn \__semantex_data_int_get_auxiliary:nnn#1#2#3{% maybe should be PROTECTED??
+ % #1 = name of object
+ % #2 = the intuence to get
+ % #3 = the command to store it in
+ \bool_if_exist:cTF { g__semantex_data_int_#1_#2_bool_if_provided }
+ {
+ \bool_if:cTF { g__semantex_data_int_#1_#2_bool_if_provided }
+ {
+ \int_use:c { g__semantex_data_int_#1_#2 }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexVariable }
+ {
+ \semantex_error_output_format:nN { #3 } \__semantex_data_int_get_auxiliary_temp
+ \msg_error:nnxn { semantex } { data_int_not_found } { \__semantex_data_int_get_auxiliary_temp } { #2 }
+ }
+ {
+ \__semantex_data_int_get_auxiliary:fnn { \semantex_data_parent_get:n { #1 } } { #2 } { #3 }
+ }
+ }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexVariable }
+ {
+ \semantex_error_output_format:nN { #3 } \__semantex_data_int_get_auxiliary_temp
+ \msg_error:nnxn { semantex } { data_int_not_found } { \__semantex_data_int_get_auxiliary_temp } { #2 }
+ }
+ {
+ \__semantex_data_int_get_auxiliary:fnn { \semantex_data_parent_get:n { #1 } } { #2 } { #3 }
+ }
+ }
+}
+
+\cs_generate_variant:Nn \__semantex_data_int_get_auxiliary:nnn { fnn }
+
+
+\cs_new:Npn \semantex_data_int_get_store:nnN#1#2#3{% maybe should be PROTECTED??
+ % #1 = name of object
+ % #2 = the intuence to get
+ % #3 = the command to store it in
+ \__semantex_data_int_get_store_auxiliary:nnNn { #1 } { #2 } #3 { #1 }
+}
+
+\cs_new:Npn\__semantex_data_int_get_store_auxiliary:nnNn#1#2#3#4{% maybe should be PROTECTED??
+ % #1 = name of object
+ % #2 = the intuence to get
+ % #3 = the command to store it in
+ \bool_if_exist:cTF { g__semantex_data_int_#1_#2_bool_if_provided }
+ {
+ \bool_if:cTF { g__semantex_data_int_#1_#2_bool_if_provided }
+ {
+ \int_set_eq:Nc#3 { g__semantex_data_int_#1_#2 }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexVariable }
+ {
+ \semantex_error_output_format:nN { #4 } \l__semantex_data_int_get_store_auxiliary_temp
+ \msg_error:nnxn { semantex } { data_int_not_found } { \l__semantex_data_int_get_store_auxiliary_temp } { #2 }
+ }
+ {
+ \__semantex_data_int_get_store_auxiliary:fnNn { \semantex_data_parent_get:n { #1 } } { #2 } #3 { #4 }
+ }
+ }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexVariable }
+ {
+ \semantex_error_output_format:nN { #4 } \l__semantex_data_int_get_store_auxiliary_temp
+ \msg_error:nnxn { semantex } { data_int_not_found } { \l__semantex_data_int_get_store_auxiliary_temp } { #2 }
+ }
+ {
+ \__semantex_data_int_get_store_auxiliary:fnNn { \semantex_data_parent_get:n { #1 } } { #2 } #3 { #4 }
+ }
+ }
+}
+
+\cs_generate_variant:Nn \__semantex_data_int_get_store_auxiliary:nnNn { fnNn }
+
+\cs_generate_variant:Nn \semantex_data_int_get_store:nnN { nnc }
+
+\cs_new:Npn\semantex_data_int_incr:nn#1#2
{
- \g_semantex_data_tl_inherit:nn { #1 } { #2 }
- \tl_put_right:cn { semantex_data_tl_#1_#2 } { #3 }
+ \semantex_data_int_inherit:nn { #1 } { #2 }
+ \int_incr:c { g__semantex_data_int_#1_#2 }
}
-\cs_generate_variant:Nn \g_semantex_data_tl_put_right:nnn { nnx }
+\cs_new:Npn\semantex_data_int_set:nnn#1#2#3
+{
+ \semantex_data_int_provide:nn { #1 } { #2 }
+ \int_set:cn { g__semantex_data_int_#1_#2 } { #3 }
+}
-\cs_new:Npn \g_semantex_data_tl_put_left:nnn#1#2#3
+\cs_new:Npn\semantex_data_int_if_positive:nnTF#1#2#3#4
{
- \g_semantex_data_tl_inherit:nn { #1 } { #2 }
- \tl_put_left:cn { semantex_data_tl_#1_#2 } { #3 }
+% \semantex_data_int_inherit:nn { #1 } { #2 } % This should not be necessary, ubt is, for unkonwn reasons
+ \int_compare:nNnTF { \semantex_data_int_get:nn { #1 } { #2 } } > { 0 } { #3 } { #4 }
}
-\cs_generate_variant:Nn \g_semantex_data_tl_put_left:nnn { nnx }
+\cs_generate_variant:Nn\semantex_data_int_if_positive:nnTF { nnT }
-\cs_new:Npn \g_semantex_data_tl_clear:nn#1#2
+\cs_new:Npn\semantex_data_int_if_positive:nnF#1#2#3
{
- \g_semantex_data_tl_provide:nn { #1 } { #2 }
- \tl_clear:c { semantex_data_tl_#1_#2 }
+ \semantex_data_int_if_positive:nnTF { #1 } { #2 } { } { #3 }
}
-\cs_new:Npn \g_semantex_data_seq_get_store:nnN#1#2#3{% maybe should be PROTECTED??
+\cs_new:Npn\semantex_data_int_if_greater_than_one:nnTF#1#2#3#4
+{
+ \int_compare:nNnTF { \semantex_data_int_get:nn { #1 } { #2 } } > { 1 } { #3 } { #4 }
+}
+
+\cs_generate_variant:Nn\semantex_data_int_if_greater_than_one:nnTF { nnT }
+
+\cs_new:Npn\semantex_data_int_if_greater_than_one:nnF#1#2#3
+{
+ \semantex_data_int_if_greater_than_one:nnTF { #1 } { #2 } { } { #3 }
+}
+
+\cs_new:Npn\semantex_data_int_clear:nn#1#2
+{
+ \semantex_data_int_provide:nn { #1 } { #2 }
+ \int_zero:c { g__semantex_data_int_#1_#2 }
+}
+
+% COMMANDS FOR HANDLING DATA OF SEQUENCE TYPE
+
+\cs_new:Npn \semantex_data_seq_get_store:nnN#1#2#3{% maybe should be PROTECTED??
% #1 = name of object
% #2 = the sequence to get
% #3 = the command to store it in
- \bool_if_exist:cTF { semantex_data_seq_#1_#2_bool_if_provided }
+ \bool_if_exist:cTF { g__semantex_data_seq_#1_#2_bool_if_provided }
{
- \bool_if:cTF { semantex_data_seq_#1_#2_bool_if_provided }
- { \seq_set_eq:Nc#3 { semantex_data_seq_#1_#2 } }
- { \g_semantex_data_seq_get_store:vnN{ semantex_data_tl_#1_parent }{#2}#3 }
+ \bool_if:cTF { g__semantex_data_seq_#1_#2_bool_if_provided }
+ {
+ \seq_set_eq:Nc#3 { g__semantex_data_seq_#1_#2 }
+ }
+ {
+ \semantex_data_seq_get_store:nnN{ \semantex_data_parent_get:n { #1 } }{#2}#3
+ }
}
{
- \g_semantex_data_seq_get_store:nnN{ \g_semantex_data_tl_get:nn { #1 } { parent } }{#2}#3%
+ \semantex_data_seq_get_store:nnN{ \semantex_data_parent_get:n { #1 } }{#2}#3%
}
}
-\cs_generate_variant:Nn \g_semantex_data_seq_get_store:nnN { vnN, nnc, vnc }
+\cs_generate_variant:Nn \semantex_data_seq_get_store:nnN { vnN, nnc, vnc } % Remove these later
-\cs_new:Npn\g_semantex_data_seq_provide:nn#1#2
+\cs_new:Npn\semantex_data_seq_provide:nn#1#2
{
- \bool_if_exist:cTF { semantex_data_seq_#1_#2_bool_if_provided }
+ \bool_if_exist:cTF { g__semantex_data_seq_#1_#2_bool_if_provided }
{
- \bool_if:cF { semantex_data_seq_#1_#2_bool_if_provided }
+ \bool_if:cF { g__semantex_data_seq_#1_#2_bool_if_provided }
{
- \seq_new:c { semantex_data_seq_#1_#2 }
- \bool_set_true:c { semantex_data_seq_#1_#2_bool_if_provided }
+ \bool_set_true:c { g__semantex_data_seq_#1_#2_bool_if_provided }
}
}
{
- \bool_new:c { semantex_data_seq_#1_#2_bool_if_provided }
- \bool_set_true:c { semantex_data_seq_#1_#2_bool_if_provided }
- \seq_if_exist:cF { semantex_data_seq_#1_#2 } {
- \seq_new:c { semantex_data_seq_#1_#2 }
- }
+ \seq_new:c { g__semantex_data_seq_#1_#2 }
+ \bool_new:c { g__semantex_data_seq_#1_#2_bool_if_provided }
+ \bool_set_true:c { g__semantex_data_seq_#1_#2_bool_if_provided }
}
}
-\cs_new:Npn\g_semantex_data_seq_inherit:nn#1#2
+\cs_new:Npn\semantex_data_seq_inherit:nn#1#2
{
- \bool_if_exist:cTF { semantex_data_seq_#1_#2_bool_if_provided }
+ \bool_if_exist:cTF { g__semantex_data_seq_#1_#2_bool_if_provided }
{
- \bool_if:cF { semantex_data_seq_#1_#2_bool_if_provided }
+ \bool_if:cF { g__semantex_data_seq_#1_#2_bool_if_provided }
{
- \g_semantex_data_seq_get_store:vnc { semantex_data_tl_#1_parent } { #2 } { semantex_data_seq_#1_#2 }
- \bool_set_true:c { semantex_data_seq_#1_#2_bool_if_provided }
+ \semantex_data_seq_get_store:nnc { \semantex_data_parent_get:n { #1 } } { #2 } { g__semantex_data_seq_#1_#2 }
+ \bool_set_true:c { g__semantex_data_seq_#1_#2_bool_if_provided }
}
}
{
- \bool_new:c { semantex_data_seq_#1_#2_bool_if_provided }
- \bool_set_true:c { semantex_data_seq_#1_#2_bool_if_provided }
- \seq_if_exist:cF { semantex_data_seq_#1_#2 } { \seq_new:c { semantex_data_seq_#1_#2 } }
- \g_semantex_data_seq_get_store:vnc { semantex_data_tl_#1_parent } { #2 } { semantex_data_seq_#1_#2 }
+ \semantex_data_seq_get_store:nnc { \semantex_data_parent_get:n { #1 } } { #2 } { g__semantex_data_seq_#1_#2 }
+ \bool_new:c { g__semantex_data_seq_#1_#2_bool_if_provided }
+ \bool_set_true:c { g__semantex_data_seq_#1_#2_bool_if_provided }
+ \seq_if_exist:cF { g__semantex_data_seq_#1_#2 } { \seq_new:c { g__semantex_data_seq_#1_#2 } }
}
}
-\cs_new:Npn\g_semantex_data_seq_put_right:nnn#1#2#3
+\cs_new:Npn\semantex_data_seq_put_right:nnn#1#2#3
+{
+ \semantex_data_seq_inherit:nn { #1 } { #2 }
+ \seq_put_right:cn { g__semantex_data_seq_#1_#2 } { #3 }
+}
+
+\cs_new:Npn\semantex_data_seq_clear:nn#1#2
{
- \g_semantex_data_seq_inherit:nn { #1 } { #2 }
- \seq_put_right:cn { semantex_data_seq_#1_#2 } { #3 }
+ \semantex_data_seq_provide:nn { #1 } { #2 }
+ \seq_clear:c { g__semantex_data_seq_#1_#2 }
}
-\cs_new:Npn \g_semantex_data_prop_provide:nn#1#2
+% COMMANDS FOR HANDLING DATA OF TYPE PROPERTY LIST:
+
+\cs_new:Npn \semantex_data_prop_provide:nn#1#2
{
% #1 = name of the object
% #2 = name of the prop
- \prop_if_exist:cF { semantex_data_prop_#1_#2 } { \prop_new:c { semantex_data_prop_#1_#2 } }
+ \prop_if_exist:cF { g__semantex_data_prop_#1_#2 } { \prop_new:c { g__semantex_data_prop_#1_#2 } }
}
-\cs_new:Npn \g_semantex_data_prop_put:nnnn#1#2#3#4
+\cs_new:Npn \semantex_data_prop_put:nnnn#1#2#3#4
{
- \prop_put:cnn { semantex_data_prop_#1_#2 } { #3 } { #4 }
+ \semantex_data_prop_provide:nn { #1 } { #2 } % important that we do not inherit! This is crucial for getting the right inheritance for key interfaces
+ \prop_put:cnn { g__semantex_data_prop_#1_#2 } { #3 } { #4 }
+}
+
+\cs_new:Npn\semantex_data_prop_remove:nnn#1#2#3
+{
+ \prop_if_exist:cT { g__semantex_data_prop_#1_#2 }
+ {
+ \prop_remove:cn { g__semantex_data_prop_#1_#2 } { #3 }
+ }
}
-\cs_new:Npn \g_semantex_valuekey_get:nnNTF#1#2#3#4#5{%
+\cs_new:Npn \semantex_valuekey_get:nnNTF#1#2#3#4#5{%
% #1 = name of the object
% #2 = keyval data to get
% #3 = command to store possible data in
% #4 = if true (not to be used)
% #5 = if false
- \prop_get:cnNTF { semantex_data_prop_#1_custom_valuekeys } { #2 }#3%\l_semantex_valuekey_get_temp
- { #4 }
+ \prop_get:cnNTF { g__semantex_data_prop_#1_custom_valuekeys } { #2 } #3
{
- \tl_if_eq:nnTF { #1 } { semantexvariable }
- { #5 }
+ #4
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexVariable }
+ {
+ #5
+ }
{
- \g_semantex_valuekey_get:xnNTF { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 } #3 { #4 } { #5 }
+ \semantex_valuekey_get:fnNTF { \semantex_data_parent_get:n { #1 } } { #2 } #3 { #4 } { #5 }
}
}
}
-\cs_generate_variant:Nn \g_semantex_valuekey_get:nnNTF { vnNTF, xnNTF }
+\cs_new:Npn\semantex_valuekey_remove:nn#1#2
+{
+ \semantex_data_prop_remove:nnn { #1 } { custom_valuekeys } { #2 }
+}
-\cs_new:Npn \g_semantex_novaluekey_get:nnNTF#1#2#3#4#5{%
+\cs_generate_variant:Nn \semantex_valuekey_get:nnNTF { fnNTF, vnNTF, xnNTF }
+
+\cs_new:Npn \semantex_singlekey_get:nnNTF#1#2#3#4#5{%
% #1 = name of the object
% #2 = singlekey data to get
% #3 = command to store possible data in
% #4 = if true (not to be used)
% #5 = if false
- \prop_get:cnNTF { semantex_data_prop_#1_custom_novaluekeys } { #2 } #3
- { #4 }
+ \prop_get:cnNTF { g__semantex_data_prop_#1_custom_singlekeys } { #2 } #3
+ {
+ #4
+ }
{
- \tl_if_eq:nnTF { #1 } { semantexvariable }
- { #5 }
+ \str_if_eq:nnTF { #1 } { class_SemantexVariable }
+ {
+ #5
+ }
{
- \g_semantex_novaluekey_get:xnNTF { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 } #3 { #4 } { #5 }
+ \semantex_singlekey_get:fnNTF { \semantex_data_parent_get:n { #1 } } { #2 } #3 { #4 } { #5 }
}
}
}
-\cs_generate_variant:Nn \g_semantex_novaluekey_get:nnNTF { vnNTF, xnNTF }
+\cs_new:Npn\semantex_singlekey_remove:nn#1#2
+{
+ \semantex_data_prop_remove:nnn { #1 } { custom_singlekeys } { #2 }
+}
-%\cs_new:N\l_semantex_arg_valuekey_get_parent_temp
+\cs_generate_variant:Nn \semantex_singlekey_get:nnNTF { fnNTF, vnNTF, xnNTF }
-\cs_new:Npn \g_semantex_arg_valuekey_get:nnNTF#1#2#3#4#5{%
+\cs_new:Npn \semantex_arg_valuekey_get:nnNTF#1#2#3#4#5{%
% #1 = name of the object
% #2 = keyval data to get
% #3 = command to store possible data in
% #4 = if true (not to be used)
% #5 = if false
- \prop_get:cnNTF { semantex_data_prop_#1_custom_arg_valuekeys } { #2 }#3%\l_semantex_valuekey_get_temp
- { #4 }
+ \prop_get:cnNTF { g__semantex_data_prop_#1_custom_arg_valuekeys } { #2 }#3%\l_semantex_valuekey_get_temp
+ {
+ #4
+ }
{
- \tl_if_eq:nnTF { #1 } { semantexvariable }
- { #5 }
+ \str_if_eq:nnTF { #1 } { class_SemantexVariable }
+ {
+ #5
+ }
{
- \g_semantex_arg_valuekey_get:xnNTF { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 } #3 { #4 } { #5 }
+ \semantex_arg_valuekey_get:fnNTF { \semantex_data_parent_get:n { #1 } } { #2 } #3 { #4 } { #5 }
}
}
}
-\cs_generate_variant:Nn \g_semantex_arg_valuekey_get:nnNTF { vnNTF, xnNTF }
+\cs_generate_variant:Nn \semantex_arg_valuekey_get:nnNTF { fnNTF, vnNTF, xnNTF }
+
+\cs_new:Npn\semantex_arg_valuekey_remove:nn#1#2
+{
+ \semantex_data_prop_remove:nnn { #1 } { custom_arg_valuekeys } { #2 }
+}
-\prop_new:N\l_semantex_arg_valuekey_get_temp
-\cs_new:Npn \g_semantex_arg_novaluekey_get:nnNTF#1#2#3#4#5{%
+\cs_new:Npn \semantex_arg_singlekey_get:nnNTF#1#2#3#4#5{%
% #1 = name of the object
% #2 = singlekey data to get
% #3 = command to store possible data in
% #4 = if true (not to be used)
% #5 = if false
- \prop_get:cnNTF { semantex_data_prop_#1_custom_arg_novaluekeys } { #2 } #3
- { #4 }
+ \prop_get:cnNTF { g__semantex_data_prop_#1_custom_arg_singlekeys } { #2 } #3
{
- \tl_if_eq:nnTF { #1 } { semantexvariable }
- { #5 } { \g_semantex_arg_novaluekey_get:xnNTF { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 } #3 { #4 } { #5 } }
+ #4
}
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexVariable }
+ {
+ #5
+ }
+ {
+ \semantex_arg_singlekey_get:fnNTF { \semantex_data_parent_get:n { #1 } } { #2 } #3 { #4 } { #5 }
+ }
+ }
+}
+
+\cs_generate_variant:Nn \semantex_arg_singlekey_get:nnNTF { fnNTF, vnNTF, xnNTF }
+
+\cs_new:Npn\semantex_arg_singlekey_remove:nn#1#2
+{
+ \semantex_data_prop_remove:nnn { #1 } { custom_arg_singlekeys } { #2 }
}
-\cs_generate_variant:Nn \g_semantex_arg_novaluekey_get:nnNTF { vnNTF, xnNTF }
+% COMMANDS FOR HANDLING DATA OF TYPE BOOLEAN:
-\cs_new:Npn\g_semantex_data_bool_get:nnTF#1#2#3#4
+\cs_new:Npn\semantex_data_bool_get:nnTF#1#2#3#4
{
% #1 = name of the object
% #2 = boolean to get
% #3 = if true
% #4 = if false
- \bool_if_exist:cTF { semantex_data_bool_#1_if_#2_bool_if_provided }
+ \bool_if_exist:cTF { g__semantex_data_bool_#1_if_#2_bool_if_provided }
{
- \bool_if:cTF { semantex_data_bool_#1_if_#2_bool_if_provided }
+ \bool_if:cTF { g__semantex_data_bool_#1_if_#2_bool_if_provided }
{
- \bool_if:cTF { semantex_data_bool_#1_if_#2 } { #3 } { #4 }
+ \bool_if:cTF { g__semantex_data_bool_#1_if_#2 } { #3 } { #4 }
}
{
- \tl_if_eq:nnTF { #1 } { semantexvariable }
- { #4 } { \g_semantex_data_bool_get:xnTF { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 } { #3 } { #4 } }
+ \str_if_eq:nnTF { #1 } { class_SemantexVariable }
+ {
+ #4
+ }
+ {
+ \semantex_data_bool_get:fnTF { \semantex_data_parent_get:n { #1 } } { #2 } { #3 } { #4 }
+ }
}
}
{
- \tl_if_eq:nnTF { #1 } { semantexvariable }
- { #4 } { \g_semantex_data_bool_get:xnTF { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 } { #3 } { #4 } }
+ \str_if_eq:nnTF { #1 } { class_SemantexVariable }
+ {
+ #4
+ }
+ {
+ \semantex_data_bool_get:fnTF { \semantex_data_parent_get:n { #1 } } { #2 } { #3 } { #4 }
+ }
}
}
-\cs_generate_variant:Nn \g_semantex_data_bool_get:nnTF { xnTF, vnTF }
+\cs_generate_variant:Nn \semantex_data_bool_get:nnTF { onTF, fnTF, xnTF, vnTF, nnT }
-\cs_new:Npn\g_semantex_data_bool_provide:nn#1#2
+\cs_new:Npn\semantex_data_bool_get:nnF#1#2#3
+{
+ \semantex_data_bool_get:nnTF { #1 } { #2 } { } { #3 }
+}
+
+\cs_new:Npn\semantex_data_bool_provide:nn#1#2
{
% #1 = name of the object
% #2 = boolean to provide
- \bool_if_exist:cTF { semantex_data_bool_#1_if_#2_bool_if_provided }
+ \bool_if_exist:cTF { g__semantex_data_bool_#1_if_#2_bool_if_provided }
{
- \bool_if:cF { semantex_data_bool_#1_if_#2_bool_if_provided }
- { \bool_set_true:c { semantex_data_bool_#1_if_#2_bool_if_provided } }
+ \bool_if:cF { g__semantex_data_bool_#1_if_#2_bool_if_provided }
+ {
+ \bool_set_true:c { g__semantex_data_bool_#1_if_#2_bool_if_provided }
+ }
}
{
- \bool_new:c { semantex_data_bool_#1_if_#2 }
- \bool_new:c { semantex_data_bool_#1_if_#2_bool_if_provided }
- \bool_set_true:c { semantex_data_bool_#1_if_#2_bool_if_provided }
+ \bool_new:c { g__semantex_data_bool_#1_if_#2 }
+ \bool_new:c { g__semantex_data_bool_#1_if_#2_bool_if_provided }
+ \bool_set_true:c { g__semantex_data_bool_#1_if_#2_bool_if_provided }
}
}
-\cs_new:Npn\g_semantex_data_bool_set_true:nn#1#2
+\cs_new:Npn\semantex_data_bool_set_true:nn#1#2
{
% #1 = name of the object
% #2 = boolean to provide
- \g_semantex_data_bool_provide:nn { #1 } { #2 }
- \bool_set_true:c { semantex_data_bool_#1_if_#2 }
+ \semantex_data_bool_provide:nn { #1 } { #2 }
+ \bool_set_true:c { g__semantex_data_bool_#1_if_#2 }
}
-\cs_new:Npn\g_semantex_data_bool_set_false:nn#1#2
+\cs_new:Npn\semantex_data_bool_set_false:nn#1#2
{
% #1 = name of the object
% #2 = boolean to provide
- \g_semantex_data_bool_provide:nn { #1 } { #2 }
- \bool_set_false:c { semantex_data_bool_#1_if_#2 }
+ \semantex_data_bool_provide:nn { #1 } { #2 }
+ \bool_set_false:c { g__semantex_data_bool_#1_if_#2 }
}
-\cs_new:Npn\g_semantex_data_cs_get:nnn#1#2#3
+% COMMANDS FOR HANDLING COMMAND SEQUENCE DATA AND KEYVAL SYNTAX:
+
+\cs_new:Npn\semantex_data_cs_get:nnn#1#2#3
{
% #1 = name of the object
% #2 = command sequence to get
% #3 = what to apply said command sequence to
- \cs_if_exist:cTF { g_semantex_data_cs_#1_#2:n }
- { \use:c { g_semantex_data_cs_#1_#2:n } { #3 } }
+ \cs_if_exist:cTF { __semantex_data_cs_#1_#2:n }
+ {
+ \use:c { __semantex_data_cs_#1_#2:n } { #3 }
+ }
{
- \tl_if_eq:nnTF { #1 } { semantexvariable }
+ \str_if_eq:nnTF { #1 } { class_SemantexVariable }
{
% should probably throw an error by now, but later!
}
{
- \g_semantex_data_cs_get:xnn { \g_semantex_data_tl_get:nn{#1}{parent} } { #2 } { #3 }
+ \semantex_data_cs_get:xnn { \semantex_data_parent_get:n {#1} } { #2 } { #3 }
}
}
}
-\cs_generate_variant:Nn \g_semantex_data_cs_get:nnn { xnn }
+\cs_generate_variant:Nn \semantex_data_cs_get:nnn { xnn }
+
+\cs_generate_variant:Nn \keyval_parse:NNn { cco }
-\cs_new:Npn \g_semantex_keys_set:nn#1#2
+\cs_new:Npn \semantex_keys_set:nn#1#2
{
+ % The central command for doing keyval setup
% #1 = object
% #2 = keys
- \keyval_parse:cco %IM think about wthether o-type is really necessary.
- { g_semantex_data_cs_#1_novaluekey:n }
- { g_semantex_data_cs_#1_valuekey:nn }
+ \keyval_parse:cco % Could be nice to get rid of o-type expansion, but so far has not been possible
+ { __semantex_data_cs_#1_singlekey:n }
+ { __semantex_data_cs_#1_valuekey:nn }
{ #2 }
}
-\cs_new:Npn \g_semantex_arg_keys_set:nn#1#2
+\cs_new:Npn \semantex_arg_keys_set:nn#1#2
{
+ % The central command for doing keyval setup for the argument
% #1 = object
% #2 = keys
- \keyval_parse:cco %IM -||-
- { g_semantex_data_cs_#1_arg_novaluekey:n }
- { g_semantex_data_cs_#1_arg_valuekey:nn }
+ \keyval_parse:cco % See last command
+ { __semantex_data_cs_#1_arg_singlekey:n }
+ { __semantex_data_cs_#1_arg_valuekey:nn }
{ #2 }
}
\cs_generate_variant:Nn \clist_map_function:nN { nc }
-\cs_new:Npn \g_semantex_arg_novaluekeys_set:nn#1#2
+\cs_new:Npn \semantex_arg_singlekeys_set:nn#1#2
{
- \clist_map_function:nc {#2} { g_semantex_data_cs_#1_arg_novaluekey:n }
+ % This command is necessary because you sometimes want to only allow singlekeys
+ % and not valuekeys in arguments (for instance, if you allow valuekeys, anything
+ % containing an equality sign will die horribly in the argument of any object
+ \clist_map_function:nc {#2} { __semantex_data_cs_#1_arg_singlekey:n }
}
-\DeclareDocumentCommand\setupclass{mm}{ % a user-level command for setting up the object
+\cs_generate_variant:Nn \semantex_keys_set:nn { xn }
+
+\DeclareDocumentCommand\SetupClass{mm}{ % a user-level command for setting up the object
% #1 = class
% #2 = setup
- %\exp_args:Nx
- \g_semantex_keys_set:nn { #1 }{ #2 }
+ \semantex_keys_set:xn { class_\cs_to_str:N #1 }{ #2 }
}
-\DeclareDocumentCommand\setupobject{mm}{%
+\DeclareDocumentCommand\SetupObject{mm}{%
% #1 = object
% #2 = setup
- \g_semantex_keys_set:nn { \cs_to_str:N #1 } { #2 }
+ \semantex_keys_set:xn { object_\cs_to_str:N #1 } { #2 }
}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% THE PRIMITIVE VALUEKEYS
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Now for the commands that are the basis of the keyval interface.
+% This basis consists of a collection of so-called "primitive"
+% valuekeys, which all use the syntax
+% \semantex_primitive_<nameOfValuekey>:nn
+% These are like primitive TeX commands -- they are not defined in
+% terms of other keys, and all other keys have to defined in terms
+% of these, one way or another.
+
+% For all of them, #1 = name of the class/object, and #2 = value of
+% the key. To keep the system as simple as possible, I chose only to
+% make primitive valuekeys, so there is no such thing as a primitive
+% singlekey. Therefore, for instance, the singlekey "return" is
+% defined as "return=", where return is a primitive valuekey that
+% does not use the value of the key for anything.
+
+% First, some very simple keys that we shall need over and over again:
+
+\cs_new:Npn\semantex_grab_first_argument_of_two:nn#1#2{#1}
+\cs_new:Npn\semantex_grab_second_argument_of_two:nn#1#2{#2}
+
+\cs_new:Npn\semantex_grab_first_argument_of_three:nnn#1#2#3{#1}
+\cs_new:Npn\semantex_grab_second_argument_of_three:nnn#1#2#3{#2}
+\cs_new:Npn\semantex_grab_third_argument_of_three:nnn#1#2#3{#3}
+
+\cs_new:Npn\semantex_grab_first_argument_of_four:nnnn#1#2#3#4{#1}
+\cs_new:Npn\semantex_grab_second_argument_of_four:nnnn#1#2#3#4{#2}
+\cs_new:Npn\semantex_grab_third_argument_of_four:nnnn#1#2#3#4{#3}
+\cs_new:Npn\semantex_grab_fourth_argument_of_four:nnnn#1#2#3#4{#4}
+
+\cs_new:Npn\semantex_grab_first_argument_of_five:nnnnn#1#2#3#4#5{#1}
+\cs_new:Npn\semantex_grab_second_argument_of_five:nnnnn#1#2#3#4#5{#2}
+\cs_new:Npn\semantex_grab_third_argument_of_five:nnnnn#1#2#3#4#5{#3}
+\cs_new:Npn\semantex_grab_fourth_argument_of_five:nnnnn#1#2#3#4#5{#4}
+\cs_new:Npn\semantex_grab_fifth_argument_of_five:nnnnn#1#2#3#4#5{#5}
+
+\cs_new:Npn\semantex_grab_first_argument_of_six:nnnnnn#1#2#3#4#5#6{#1}
+\cs_new:Npn\semantex_grab_second_argument_of_six:nnnnnn#1#2#3#4#5#6{#2}
+\cs_new:Npn\semantex_grab_third_argument_of_six:nnnnnn#1#2#3#4#5#6{#3}
+\cs_new:Npn\semantex_grab_fourth_argument_of_six:nnnnnn#1#2#3#4#5#6{#4}
+\cs_new:Npn\semantex_grab_fifth_argument_of_six:nnnnnn#1#2#3#4#5#6{#5}
+\cs_new:Npn\semantex_grab_sixth_argument_of_six:nnnnnn#1#2#3#4#5#6{#6}
+
+\cs_new:Npn\semantex_grab_first_argument_of_seven:nnnnnnn#1#2#3#4#5#6#7{#1}
+\cs_new:Npn\semantex_grab_second_argument_of_seven:nnnnnnn#1#2#3#4#5#6#7{#2}
+\cs_new:Npn\semantex_grab_third_argument_of_seven:nnnnnnn#1#2#3#4#5#6#7{#3}
+\cs_new:Npn\semantex_grab_fourth_argument_of_seven:nnnnnnn#1#2#3#4#5#6#7{#4}
+\cs_new:Npn\semantex_grab_fifth_argument_of_seven:nnnnnnn#1#2#3#4#5#6#7{#5}
+\cs_new:Npn\semantex_grab_sixth_argument_of_seven:nnnnnnn#1#2#3#4#5#6#7{#6}
+\cs_new:Npn\semantex_grab_seventh_argument_of_seven:nnnnnnn#1#2#3#4#5#6#7{#7}
+
+\cs_new:Npn\semantex_grab_first_argument_of_eight:nnnnnnnn#1#2#3#4#5#6#7#8{#1}
+\cs_new:Npn\semantex_grab_second_argument_of_eight:nnnnnnnn#1#2#3#4#5#6#7#8{#2}
+\cs_new:Npn\semantex_grab_third_argument_of_eight:nnnnnnnn#1#2#3#4#5#6#7#8{#3}
+\cs_new:Npn\semantex_grab_fourth_argument_of_eight:nnnnnnnn#1#2#3#4#5#6#7#8{#4}
+\cs_new:Npn\semantex_grab_fifth_argument_of_eight:nnnnnnnn#1#2#3#4#5#6#7#8{#5}
+\cs_new:Npn\semantex_grab_sixth_argument_of_eight:nnnnnnnn#1#2#3#4#5#6#7#8{#6}
+\cs_new:Npn\semantex_grab_seventh_argument_of_eight:nnnnnnnn#1#2#3#4#5#6#7#8{#7}
+\cs_new:Npn\semantex_grab_eighth_argument_of_eight:nnnnnnnn#1#2#3#4#5#6#7#8{#8}
+
+\cs_new:Npn\semantex_grab_first_argument_of_nine:nnnnnnnnn#1#2#3#4#5#6#7#8#9{#1}
+\cs_new:Npn\semantex_grab_second_argument_of_nine:nnnnnnnnn#1#2#3#4#5#6#7#8#9{#2}
+\cs_new:Npn\semantex_grab_third_argument_of_nine:nnnnnnnnn#1#2#3#4#5#6#7#8#9{#3}
+\cs_new:Npn\semantex_grab_fourth_argument_of_nine:nnnnnnnnn#1#2#3#4#5#6#7#8#9{#4}
+\cs_new:Npn\semantex_grab_fifth_argument_of_nine:nnnnnnnnn#1#2#3#4#5#6#7#8#9{#5}
+\cs_new:Npn\semantex_grab_sixth_argument_of_nine:nnnnnnnnn#1#2#3#4#5#6#7#8#9{#6}
+\cs_new:Npn\semantex_grab_seventh_argument_of_nine:nnnnnnnnn#1#2#3#4#5#6#7#8#9{#7}
+\cs_new:Npn\semantex_grab_eighth_argument_of_nine:nnnnnnnnn#1#2#3#4#5#6#7#8#9{#8}
+\cs_new:Npn\semantex_grab_ninth_argument_of_nine:nnnnnnnnn#1#2#3#4#5#6#7#8#9{#9}
+\cs_generate_variant:Nn\str_if_eq:nnTF {xxTF,ooTF}
+\cs_generate_variant:Nn\str_if_eq:nnT {xxT, ooT}
-% Now for the commands that implement the keyval interface.
-% These commands are used by the command \g_semantex_data_cs_#1_keys_set, see
-% above.
-% There is a fixed collection of primitive commands.
-% Furthermore, the user has the option to create a collection
-% of new commands, which are all stored in the property list
-% called \semantex_data_prop_#1_custom_valuekeys
-% These valuekeys contain code that must be executable by other keys
-% (e.g., primitive ones)
-% The key value is accessible to the user via the temporary command
-% \l_semantex_key_value_temp
-
-\providecommand\semantexdataprovide{}
-\providecommand\semantexdataset{}
-\providecommand\semantexdatasetx{}
-\providecommand\semantexdataputright{}
-\providecommand\semantexdataputrightx{}
-\providecommand\semantexdataputleft{}
-\providecommand\semantexdataputleftx{}
-\providecommand\semantexdataget{}
-\providecommand\semantexdatagetexpnot{}
-\providecommand\semantexdataclear{}
-\providecommand\semantexsetkeys{}
-\providecommand\semantexsetkeysx{}
-\providecommand\semantexstrifeq{}
-\providecommand\semantexboolprovide{}
-\providecommand\semantexboolsettrue{}
-\providecommand\semantexboolsetfalse{}
-\providecommand\semantexboolif{}
-
-% CHANGE TO CAMEL CASE!
+\cs_generate_variant:Nn\str_if_eq:nnF {xxF, ooF}
+\cs_generate_variant:Nn\tl_if_blank:nTF { xTF, xT }
-\cs_generate_variant:Nn\str_if_eq:nnTF {xxTF,ooTF}
+\cs_generate_variant:Nn \tl_if_blank:nF { xF }
-\cs_new:Npn\g_semantex_primitive_valuekey_execute:nn#1#2
-{
- \renewcommand\semantexdataprovide[1]{\g_semantex_data_tl_provide:nn{#1}{##1}}
- \renewcommand\semantexdataset[2]{\g_semantex_data_tl_set:nnn{#1}{##1}{##2}}
- \renewcommand\semantexdatasetx[2]{\g_semantex_data_tl_set:nnx{#1}{##1}{##2}}
- \renewcommand\semantexdataputright[2]{\g_semantex_data_tl_put_right:nnn{#1}{##1}{##2}}
- \renewcommand\semantexdataputrightx[2]{\g_semantex_data_tl_put_right:nnx{#1}{##1}{##2}}
- \renewcommand\semantexdataputleft[2]{\g_semantex_data_tl_put_left:nnn{#1}{##1}{##2}}
- \renewcommand\semantexdataputleftx[2]{\g_semantex_data_tl_put_left:nnx{#1}{##1}{##2}}
- \renewcommand\semantexdataget[1]{\g_semantex_data_tl_get:nn{#1}{##1}}
- \renewcommand\semantexdatagetexpnot[1]{\g_semantex_data_tl_get_exp_not:nn{#1}{##1}}
- \renewcommand\semantexdataclear[1]{\g_semantex_data_tl_clear:nn{#1}{##1}}
- \renewcommand\semantexsetkeys[1]{\g_semantex_keys_set:nn{#1}{##1}}
- \renewcommand\semantexsetkeysx[1]{\g_semantex_keys_set:nx{#1}{##1}}
- \renewcommand\semantexstrifeq[4]{\str_if_eq:xxTF{##1}{##2}{##3}{##4}}
- \renewcommand\semantexboolprovide[1]{\g_semantex_data_bool_provide:nn{#1}{##1}}
- \renewcommand\semantexboolsettrue[1]{\g_semantex_data_bool_set_true:nn{#1}{##1}}
- \renewcommand\semantexboolsetfalse[1]{\g_semantex_data_bool_set_false:nn{#1}{##1}}
- \renewcommand\semantexboolif[3]{\g_semantex_data_bool_get:nnTF{#1}{##1}{##2}{##3}}
+\cs_new:Npn\semantex_primitive_valuekey_execute:nn#1#2
+{
+ % This keys just executes whatever data you plug into it.
+ % Possibly, going forward, it might make more sense to define all
+ % of these commands in the keyval handling command
+ % so that the get commands are accessible from all keys.
+ \cs_set:Npn\SemantexDataProvide##1{\semantex_data_tl_provide:nn{#1}{##1}}
+ \cs_set:Npn\SemantexDataSet##1##2{\semantex_data_tl_set:nnn{#1}{##1}{##2}}
+ \cs_set:Npn\SemantexDataSetx##1##2{\semantex_data_tl_set:nnx{#1}{##1}{##2}}
+ \cs_set:Npn\SemantexDataPutRight##1##2{\semantex_data_tl_put_right:nnn{#1}{##1}{##2}}
+ \cs_set:Npn\SemantexDataPutRightx##1##2{\semantex_data_tl_put_right:nnx{#1}{##1}{##2}}
+ \cs_set:Npn\SemantexDataPutLeft##1##2{\semantex_data_tl_put_left:nnn{#1}{##1}{##2}}
+ \cs_set:Npn\SemantexDataPutLeftx##1##2{\semantex_data_tl_put_left:nnx{#1}{##1}{##2}}
+ \cs_set:Npn\SemantexDataGet##1{\semantex_data_tl_get:nn{#1}{##1}}
+ \cs_set:Npn\SemantexDataGetExpNot##1{\semantex_data_tl_get_exp_not:nn{#1}{##1}}
+ \cs_set:Npn\SemantexDataClear##1{\semantex_data_tl_clear:nn{#1}{##1}}
+ \cs_set:Npn\SemantexKeysSet##1{\semantex_keys_set:nn{#1}{##1}}
+ \cs_set:Npn\SemantexKeysSetx##1{\semantex_keys_set:nx{#1}{##1}}
+ \cs_set:Npn\SemantexStrIfEqTF##1##2##3##4{\str_if_eq:xxTF{##1}{##2}{##3}{##4}}
+ \cs_set:Npn\SemantexStrIfEqT##1##2##3{\str_if_eq:xxT{##1}{##2}{##3}}
+ \cs_set:Npn\SemantexStrIfEqF##1##2##3{\str_if_eq:xxF{##1}{##2}{##3}}
+ \cs_set:Npn\SemantexIfBlankTF##1##2##3{\tl_if_blank:xTF{##1}{##2}{##3}}
+ \cs_set:Npn\SemantexIfBlankT##1##2{\tl_if_blank:xT{##1}{##2}}
+ \cs_set:Npn\SemantexIfBlankF##1##2{\tl_if_blank:xF{##1}{##2}}
+ \cs_set:Npn\SemantexBoolProvide##1{\semantex_data_bool_provide:nn{#1}{##1}}
+ \cs_set:Npn\SemantexBoolSetTrue##1{\semantex_data_bool_set_true:nn{#1}{##1}}
+ \cs_set:Npn\SemantexBoolSetFalse##1{\semantex_data_bool_set_false:nn{#1}{##1}}
+ \cs_set:Npn\SemantexBoolIfTF##1##2##3{\semantex_data_bool_get:nnTF{#1}{##1}{##2}{##3}}
+ \cs_set:Npn\SemantexBoolIfT##1##2{\semantex_data_bool_get:nnTF{#1}{##1}{##2}{}}
+ \cs_set:Npn\SemantexBoolIfF##1##2{\semantex_data_bool_get:nnTF{#1}{##1}{}{##2}}
+ \cs_set:Npn\SemantexIntProvide##1{\semantex_data_int_provide:nn{#1}{##1}}
+ \cs_set:Npn\SemantexIntGet##1{\semantex_data_int_get:nn{#1}{##1}}
+ \cs_set:Npn\SemantexIntClear##1{\semantex_data_int_clear:nn{#1}{##1}}
+ \cs_set:Npn\SemantexIntIncr##1{\semantex_data_int_incr:nn{#1}{##1}}
+ \cs_set:Npn\SemantexIntSet##1##2{\semantex_data_int_set:nnn{#1}{##1}{##2}}
+ \cs_set:Npn\SemantexIntIfPositiveTF##1##2##3{\semantex_data_int_if_positive:nnTF{#1}{##1}{##2}{##3}}
+ \cs_set:Npn\SemantexIntIfPositiveT##1##2{\semantex_data_int_if_positive:nnT{#1}{##1}{##2}}
+ \cs_set:Npn\SemantexIntIfPositiveF##1##2{\semantex_data_int_if_positive:nnF{#1}{##1}{##2}}
+ \cs_set:Npn\SemantexIntIfGreaterThanOneTF##1##2##3{\semantex_data_int_if_greater_than_one:nnTF{#1}{##1}{##2}{##3}}
+ \cs_set:Npn\SemantexIntIfGreaterThanOneT##1##2{\semantex_data_int_if_greater_than_one:nnT{#1}{##1}{##2}}
+ \cs_set:Npn\SemantexIntIfGreaterThanOneF##1##2{\semantex_data_int_if_greater_than_one:nnF{#1}{##1}{##2}}
+ \cs_set:Npn\SemantexExpNot##1{\exp_not:n{##1}}
%\exp_not:n{#2}
- % how about erase and forget?
+ % how about forget?
#2
}
-\cs_new:Npn\g_semantex_primitive_valuekey_parse:nn#1#2
+\cs_new:Npn\semantex_primitive_valuekey_parse:nn#1#2
{
- \g_semantex_data_tl_inherit:nn { #1 } { parseoptions }
- % But we need to also reset this, plus all data variables that
- % it used; nope, not necessary
- \g_semantex_keys_set:nx { #1 } {
- \g_semantex_data_tl_get_exp_not:nn { #1 } { parseoptions }
+ % This command runs all the keys that the user may have
+ % stored via the parseoptions key
+ %\semantex_data_tl_inherit:nn { #1 } { parseoptions }
+ \semantex_keys_set:nx { #1 } {
+ \semantex_data_tl_get_exp_not:nn { #1 } { parseoptions }
}
+ \semantex_data_tl_clear:nn { #1 } { parseoptions } % this is probably necessary
}
-\cs_new:Npn\g_semantex_primitive_valuekey_parseoptions:nn#1#2
+\cs_new:Npn\semantex_primitive_valuekey_parseoptions:nn#1#2
{
- \g_semantex_data_tl_put_right:nnn { #1 } { parseoptions } { #2 }
+ % This adds keys to the parseoptions token list
+ \semantex_data_tl_put_right:nnn { #1 } { parseoptions } { #2 }
}
-\cs_new:Npn\g_semantex_primitive_valuekey_return:nn#1#2
+\cs_new:Npn\semantex_primitive_valuekey_return:nn#1#2
{
- \g_semantex_primitive_valuekey_innerreturn:nn { #1 }{}
- \g_semantex_primitive_valuekey_rightreturn:nn { #1 }{}
- \g_semantex_primitive_valuekey_leftreturn:nn { #1 }{}
+ % This is an umbrella key that runs all of the three
+ % return routines, innerreturn, rightreturn, and leftreturn
+ \semantex_primitive_valuekey_innerreturn:nn { #1 }{}
+ \semantex_primitive_valuekey_rightreturn:nn { #1 }{}
+ \semantex_primitive_valuekey_leftreturn:nn { #1 }{}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_innerreturn:nn#1#2
+\cs_new:Npn\semantex_primitive_valuekey_innerreturn:nn#1#2
{
- \g_semantex_data_tl_inherit:nn { #1 } { symbol }
- \g_semantex_data_seq_inherit:nn { #1 } { commands_sequence }
- \g_semantex_data_seq_get_store:nnN { #1 } { commands_sequence } \l__semantex_data_seq_commands_sequence_temp
- %\seq_map_inline:cn { semantex_data_seq_#1_commands_sequence }
+ % This adds all of the commands added via the command key
+ % to the symbol
+ \semantex_data_tl_inherit:nn { #1 } { symbol }
+ \semantex_data_seq_inherit:nn { #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
{
- \g_semantex_data_tl_set:nnx { #1 } { symbol }
+ \semantex_data_tl_set:nnx { #1 } { symbol }
{
\exp_not:n {\exp_not:N ##1} {
- \g_semantex_data_tl_get_exp_not:nn { #1 } { symbol }
+ \semantex_data_tl_get_exp_not:nn { #1 } { symbol }
}
% This was the solution that happened to solve
% the expansion issues best
}
}
- \seq_clear:c { semantex_data_seq_#1_commands_sequence }
-}
-
-\tl_new:N\l__semantex_rightreturn_par_temp
-
-\tl_new:N\l__semantex_rightreturn_nopar_temp
-
-\cs_generate_variant:Nn \g_semantex_keys_set:nn { nx , no }
-
-\cs_new:Npn\g_semantex_primitive_valuekey_rightreturn:nn#1#2
-{
- \g_semantex_data_tl_inherit_x:nn { #1 } { upper_index }
- \g_semantex_data_tl_inherit_x:nn { #1 } { lower_index }
- \g_semantex_data_tl_inherit_x:nn { #1 } { preupper }
- \g_semantex_data_tl_inherit_x:nn { #1 } { postupper }
- \g_semantex_data_tl_inherit_x:nn { #1 } { prelower }
- \g_semantex_data_tl_inherit_x:nn { #1 } { postlower }
- \g_semantex_data_tl_inherit_x:nn { #1 } { arg }
- \g_semantex_data_tl_get_store:nnN { #1 } { upper_index } \l__semantex_rightreturn_upper_index_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { lower_index } \l__semantex_rightreturn_lower_index_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { symbol } \l__semantex_rightreturn_symbol_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { preupper }
- \l__semantex_rightreturn_preupper_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { postupper }
- \l__semantex_rightreturn_postupper_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { prelower }
- \l__semantex_rightreturn_prelower_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { postlower }
- \l__semantex_rightreturn_postlower_temp
- \g_semantex_data_tl_set:nnx { #1 } { symbol }
- {
- \exp_not:V \l__semantex_rightreturn_symbol_temp
- % Setup indices:
- \exp_not:N\g_semantex_right_indices:nnnnnn
- { \exp_not:V \l__semantex_rightreturn_preupper_temp }
- { \exp_not:V \l__semantex_rightreturn_upper_index_temp }
- { \exp_not:V \l__semantex_rightreturn_postupper_temp }
- { \exp_not:V \l__semantex_rightreturn_prelower_temp }
- { \exp_not:V \l__semantex_rightreturn_lower_index_temp }
- { \exp_not:V \l__semantex_rightreturn_postlower_temp }
- }
- \g_semantex_data_bool_get:nnTF { #1 } { par }
- {
- \g_semantex_data_tl_get_store:nnN { #1 } { par_size }
- \l__semantex_rightreturn_par_size_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { par_open } \l__semantex_rightreturn_par_open_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { par_close } \l__semantex_rightreturn_par_close_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { arg } \l__semantex_rightreturn_arg_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { prearg } \l_semantex_rightreturn_prearg_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { postarg } \l_semantex_rightreturn_postarg_temp
- \tl_set:Nx\l__semantex_rightreturn_par_temp
- {
- { \exp_not:V \l__semantex_rightreturn_par_size_temp }
- { \exp_not:V \l__semantex_rightreturn_par_open_temp }
- { \exp_not:V \l__semantex_rightreturn_par_close_temp }
- { \exp_not:V \l_semantex_rightreturn_prearg_temp }
- { \exp_not:V \l__semantex_rightreturn_arg_temp }
- { \exp_not:V \l_semantex_rightreturn_postarg_temp }
- }
- \tl_put_left:Nn\l__semantex_rightreturn_par_temp
+ \semantex_data_seq_clear:nn { #1 } { commands_sequence }
+}
+
+\cs_generate_variant:Nn \semantex_keys_set:nn { nx , no }
+
+\cs_new:Npn\semantex_primitive_valuekey_rightreturn:nn#1#2
+{
+ \semantex_right_indices_return_store:nN { #1 } \l_semantex_rightreturn_right_indices_temp
+ \semantex_data_tl_put_right:nnx { #1 } { symbol }
+ {
+ \exp_not:V\l_semantex_rightreturn_right_indices_temp
+ }
+ \semantex_data_bool_get:nnTF { #1 } { leftargument }
+ {
+ % do nothing
+ }
+ {
+ \semantex_arg_return_store:nN { #1 } \l_semantex_rightreturn_arg_temp
+ \semantex_data_tl_put_right:nnx { #1 } { symbol }
{
- \exp_not:N
- \g_semantex_parentheses:nnnnnn
+ \exp_not:V\l_semantex_rightreturn_arg_temp
}
- \g_semantex_data_tl_put_right:nnx { #1 } { symbol }
+ }
+}
+
+
+\cs_new:Npn\semantex_primitive_valuekey_leftreturn:nn#1#2
+{
+ \semantex_left_indices_return_store:nN { #1 } \l_semantex_leftreturn_left_indices_temp
+ \semantex_data_tl_put_left:nnx { #1 } { symbol }
+ {
+ \exp_not:V\l_semantex_leftreturn_left_indices_temp
+ }
+ \semantex_data_bool_get:nnTF { #1 } { leftargument }
+ {
+ \semantex_arg_return_store:nN { #1 } \l_semantex_leftreturn_arg_temp
+ \semantex_data_tl_put_left:nnx { #1 } { symbol }
{
- \exp_not:V\l__semantex_rightreturn_par_temp
+ \exp_not:V\l_semantex_leftreturn_arg_temp
}
}
{
- \tl_set:Nx\l__semantex_rightreturn_nopar_temp
+ % do nothing
+ }
+}
+
+\cs_new:Npn \semantex_left_indices_return_store:nN#1#2
+{
+ \semantex_data_tl_inherit_x:nn { #1 } { upperleft }
+ \semantex_data_tl_inherit_x:nn { #1 } { lowerleft }
+ \semantex_data_tl_inherit_x:nn { #1 } { preupperleft }
+ \semantex_data_tl_inherit_x:nn { #1 } { postupperleft }
+ \semantex_data_tl_inherit_x:nn { #1 } { prelowerleft }
+ \semantex_data_tl_inherit_x:nn { #1 } { postlowerleft }
+ \tl_set:Nn#2{}
+ \semantex_data_int_if_positive:nnTF { #1 } { numberofupperleftindices }
+ {
+ \semantex_data_int_if_positive:nnTF { #1 } { numberoflowerleftindices }
{
- { \g_semantex_data_tl_get_exp_not:nn { #1 } { prearg } }
- { \g_semantex_data_tl_get_exp_not:nn { #1 } { arg } }
- { \g_semantex_data_tl_get_exp_not:nn { #1 } { postarg } }
+ \tl_put_right:Nx#2
+ {
+ {}\sp{
+ \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 }
+ }
+ \sb{
+ \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 }
+ }
+ }
}
- \tl_put_left:Nn\l__semantex_rightreturn_nopar_temp
{
- \exp_not:N
- \g_semantex_no_parentheses:nnn
+ \tl_put_right:Nx#2
+ {
+ {}\sp{
+ \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_int_if_positive:nnTF { #1 } { numberoflowerleftindices }
+ {
+ \tl_put_right:Nx#2
+ {
+ {}\sb{
+ \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 }
+ }
+ }
}
- \g_semantex_data_tl_put_right:nnx { #1 } { symbol }
{
- \exp_not:V\l__semantex_rightreturn_nopar_temp
+ % do nothing
}
}
- \g_semantex_data_tl_clear:nn { #1 } { upper_index }
- \g_semantex_data_bool_provide:nn { #1 } { first_upper }
- \g_semantex_data_bool_set_true:nn { #1 } { first_upper }
- \g_semantex_data_tl_clear:nn { #1 } { lower_index }
- \g_semantex_data_bool_provide:nn { #1 } { first_lower }
- \g_semantex_data_bool_set_true:nn { #1 } { first_lower }
- \g_semantex_data_tl_clear:nn { #1 } { arg }
- \g_semantex_data_bool_provide:nn { #1 } { first_arg }
- \g_semantex_data_bool_set_true:nn { #1 } { first_arg }
- \g_semantex_data_tl_clear:nn { #1 } { preupper }
- \g_semantex_data_tl_clear:nn { #1 } { postupper }
- \g_semantex_data_tl_clear:nn { #1 } { prelower }
- \g_semantex_data_tl_clear:nn { #1 } { postlower }
- %IM maybe one should enclose the new symbol in another group
- %IM Maybe should also reset stuff like par size
- %IM reset leftpar, rightpar, parsize etc. also
+ \semantex_data_tl_clear:nn { #1 } { upperleft }
+ \semantex_data_bool_provide:nn { #1 } { nextupperleftwithsep } % is it necessary to provide it before declaring it false?
+ \semantex_data_bool_set_false:nn { #1 } { nextupperleftwithsep }
+ \semantex_data_tl_clear:nn { #1 } { lowerleft }
+ \semantex_data_bool_provide:nn { #1 } { nextlowerleftwithsep } % is it necessary to provide it before declaring it false?
+ \semantex_data_bool_set_false:nn { #1 } { nextlowerleftwithsep }
+ \semantex_data_tl_clear:nn { #1 } { preupperleft }
+ \semantex_data_tl_clear:nn { #1 } { postupperleft }
+ \semantex_data_tl_clear:nn { #1 } { prelowerleft }
+ \semantex_data_tl_clear:nn { #1 } { postlowerleft }
+ \semantex_data_int_clear:nn { #1 } { numberofupperleftindices }
+ \semantex_data_int_clear:nn { #1 } { numberoflowerleftindices }
}
-\cs_new:Npn\g_semantex_primitive_valuekey_leftreturn:nn#1#2
+\cs_new:Npn \semantex_arg_return_store:nN#1#2
{
- \g_semantex_data_tl_inherit_x:nn { #1 } { upper_left_index }
- \g_semantex_data_tl_inherit_x:nn { #1 } { lower_left_index }
- \g_semantex_data_tl_inherit_x:nn { #1 } { preupperleft }
- \g_semantex_data_tl_inherit_x:nn { #1 } { postupperleft }
- \g_semantex_data_tl_inherit_x:nn { #1 } { prelowerleft }
- \g_semantex_data_tl_inherit_x:nn { #1 } { postlowerleft }
- %IMPLEMENT THIS!!!
- % Clean up the following names
- \g_semantex_data_tl_get_store:nnN { #1 } { upper_left_index } \l__semantex_leftreturn_upper_left_index_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { lower_left_index } \l__semantex_leftreturn_lower_left_index_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { symbol } \l__semantex_leftreturn_symbol_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { preupperleft } \l__semantex_leftreturn_preupperleft_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { postupperleft } \l__semantex_leftreturn_postupperleft_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { prelowerleft } \l__semantex_leftreturn_prelowerleft_temp
- \g_semantex_data_tl_get_store:nnN { #1 } { postlowerleft } \l__semantex_leftreturn_postlowerleft_temp
- \g_semantex_data_tl_set:nnx { #1 } { symbol }
+ \semantex_data_tl_inherit_x:nn { #1 } { arg }
+ \semantex_data_int_inherit:nn { #1 } { numberofarguments }
+ %\semantex_data_tl_inherit:nn { #1 } { parsize } % This was necessary for unkonwn reasons -- otherwise it will fail when doing inheritance
+ \semantex_data_tl_get_store:nnN { #1 } { parsize } \l__semantex_primitive_valuekey_rightreturn_parsize_temp
+ \semantex_data_bool_get:nnTF { #1 } { par }
{
- % Setup indices:
- \exp_not:N\g_semantex_left_indices:nnnnnn
+ \semantex_data_int_if_positive:nnTF { #1 } { numberofarguments }
{
- \exp_not:V \l__semantex_leftreturn_preupperleft_temp
+ \__semantex_parentheses_store:nnnnN
+ { \l__semantex_primitive_valuekey_rightreturn_parsize_temp }
+ { \semantex_data_tl_get_exp_not:nn { #1 } { leftpar } }
+ { \semantex_data_tl_get_exp_not:nn { #1 } { rightpar } }
+ {
+ \semantex_data_tl_get_exp_not:nn { #1 } { prearg }
+ \semantex_data_tl_get_exp_not:nn { #1 } { arg }
+ \semantex_data_tl_get_exp_not:nn { #1 } { postarg }
+ }
+ #2
}
{
- \exp_not:V \l__semantex_leftreturn_upper_left_index_temp
+ \tl_set:Nn#2{}
}
+ }
+ {
+ \semantex_data_bool_get:nnTF { #1 } { flexpar }
{
- \exp_not:V \l__semantex_leftreturn_postupperleft_temp
+ \semantex_data_int_if_greater_than_one:nnTF { #1 } { numberofarguments }
+ {
+ \__semantex_parentheses_store:nnnnN
+ { \l__semantex_primitive_valuekey_rightreturn_parsize_temp }
+ { \semantex_data_tl_get_exp_not:nn { #1 } { leftpar } }
+ { \semantex_data_tl_get_exp_not:nn { #1 } { rightpar } }
+ {
+ \semantex_data_tl_get_exp_not:nn { #1 } { prearg }
+ \semantex_data_tl_get_exp_not:nn { #1 } { arg }
+ \semantex_data_tl_get_exp_not:nn { #1 } { postarg }
+ }
+ #2
+ }
+ {
+ \semantex_data_int_if_positive:nnTF { #1 } { numberofarguments }
+ {
+ \__semantex_no_parentheses_store:nN
+ {
+ \semantex_data_tl_get_exp_not:nn { #1 } { prearg }
+ \semantex_data_tl_get_exp_not:nn { #1 } { arg }
+ \semantex_data_tl_get_exp_not:nn { #1 } { postarg }
+ }
+ #2
+ }
+ {
+ \tl_set:Nn#2{}
+ }
+ }
}
{
- \exp_not:V \l__semantex_leftreturn_prelowerleft_temp
+ \semantex_data_int_if_positive:nnTF { #1 } { numberofarguments }
+ {
+ \__semantex_no_parentheses_store:nN
+ {
+ \semantex_data_tl_get_exp_not:nn { #1 } { prearg }
+ \semantex_data_tl_get_exp_not:nn { #1 } { arg }
+ \semantex_data_tl_get_exp_not:nn { #1 } { postarg }
+ }
+ #2
+ }
+ {
+ \tl_set:Nn#2{}
+ }
}
+ }
+ \semantex_data_tl_clear:nn { #1 } { arg }
+ \semantex_data_tl_clear:nn { #1 } { prearg } % Is it right to clear these?
+ \semantex_data_tl_clear:nn { #1 } { postarg }
+ \semantex_data_int_clear:nn { #1 } { numberofarguments }
+ \semantex_data_bool_provide:nn { #1 } { nextargwithsep } % is it necessary to provide it before declaring it false?
+ \semantex_data_bool_set_false:nn { #1 } { nextargwithsep }
+}
+
+\cs_new:Npn \semantex_right_indices_return_store:nN#1#2
+{
+ \semantex_data_tl_inherit_x:nn { #1 } { upper }
+ \semantex_data_tl_inherit_x:nn { #1 } { lower }
+ \semantex_data_tl_inherit_x:nn { #1 } { preupper }
+ \semantex_data_tl_inherit_x:nn { #1 } { postupper }
+ \semantex_data_tl_inherit_x:nn { #1 } { prelower }
+ \semantex_data_tl_inherit_x:nn { #1 } { postlower }
+ \tl_set:Nn#2{}
+ \semantex_data_int_if_positive:nnTF { #1 } { numberofupperindices }
+ {
+ \tl_put_right:Nx#2
{
- \exp_not:V \l__semantex_leftreturn_lower_left_index_temp
+ \sp{
+ \semantex_data_tl_get_exp_not:nn { #1 } { preupper }
+ \semantex_data_tl_get_exp_not:nn { #1 } { upper }
+ \semantex_data_tl_get_exp_not:nn { #1 } { postupper }
+ }
}
+ }
+ {
+ % do nothing
+ }
+ \semantex_data_int_if_positive:nnTF { #1 } { numberoflowerindices }
+ {
+ \tl_put_right:Nx#2
{
- \exp_not:V \l__semantex_leftreturn_postlowerleft_temp
+ \sb{
+ \semantex_data_tl_get_exp_not:nn { #1 } { prelower }
+ \semantex_data_tl_get_exp_not:nn { #1 } { lower }
+ \semantex_data_tl_get_exp_not:nn { #1 } { postlower }
+ }
}
- \exp_not:V \l__semantex_leftreturn_symbol_temp
}
- \g_semantex_data_tl_clear:nn { #1 } { upper_left_index }
- \g_semantex_data_bool_provide:nn { #1 } { first_upper_left }
- \g_semantex_data_bool_set_true:nn { #1 } { first_upper_left }
- \g_semantex_data_tl_clear:nn { #1 } { lower_left_index }
- \g_semantex_data_bool_provide:nn { #1 } { first_lower_left }
- \g_semantex_data_bool_set_true:nn { #1 } { first_lower_left }
- \g_semantex_data_tl_clear:nn { #1 } { preupperleft }
- \g_semantex_data_tl_clear:nn { #1 } { postupperleft }
- \g_semantex_data_tl_clear:nn { #1 } { prelowerleft }
- \g_semantex_data_tl_clear:nn { #1 } { postlowerleft }
+ {
+ % do nothing
+ }
+ \semantex_data_tl_clear:nn { #1 } { upper }
+ \semantex_data_bool_provide:nn { #1 } { nextupperwithsep } % is it necessary to provide it before declaring it false?
+ \semantex_data_bool_set_false:nn { #1 } { nextupperwithsep }
+ \semantex_data_tl_clear:nn { #1 } { lower }
+ \semantex_data_bool_provide:nn { #1 } { nextlowerwithsep } % is it necessary to provide it before declaring it false?
+ \semantex_data_bool_set_false:nn { #1 } { nextlowerwithsep }
+ \semantex_data_tl_clear:nn { #1 } { preupper }
+ \semantex_data_tl_clear:nn { #1 } { postupper }
+ \semantex_data_tl_clear:nn { #1 } { prelower }
+ \semantex_data_tl_clear:nn { #1 } { postlower }
+ \semantex_data_int_clear:nn { #1 } { numberofupperindices }
+ \semantex_data_int_clear:nn { #1 } { numberoflowerindices }
}
-\cs_new:Npn\g_semantex_primitive_valuekey_parent:nn#1#2{
+
+\cs_new:Npn\semantex_primitive_valuekey_parent:nn#1#2{
% Must inherit everything from the parent class
- %\tl_clear_new:c { semantex_data_tl_#1_parent }
- %\g_semantex_data_tl_provide:nn { #1 } { parent }
- %IM This should always be declared, so no need for if_provided checks
- %IM This does not work, for unknown reasons:
-% \seq_if_in:NxTF \semantex_all_objects_seq { #2 }
-% { \tl_set:cn { semantex_data_tl_#1_parent } { #2 } }
-% { \msg_error:nnnn { semantex } { parent_not_found } { #2 } { #1 } }
- %IM control if exists!
- %\tl_set:cn { semantex_data_tl_#1_parent } { #2 }
- \g_semantex_data_tl_set:nnn { #1 } { parent } { #2 }
+ \semantex_data_parent_set:nn { #1 } { #2 }
}
-\cs_set_eq:NN\g_semantex_primitive_valuekey_class:nn\g_semantex_primitive_valuekey_parent:nn
+\cs_new:Npn\semantex_primitive_valuekey_class:nn#1#2{
+ % Must inherit everything from the parent class
+ \semantex_data_class_set:nn { #1 } { #2 }
+}
+\cs_new:Npn\semantex_primitive_valuekey_copy:nn#1#2{
+ % Similarly to parent and class, but inherits from other objects rather than classes
+ \semantex_data_copy_object:nn { #1 } { #2 }
+}
+\cs_new:Npn\semantex_primitive_valuekey_clone:nn#1#2{
+ % Similarly to parent and class, but inherits from other objects rather than classes
+ \semantex_data_clone_object:nn { #1 } { #2 }
+}
-\cs_new:Npn\g_semantex_primitive_valuekey_copy:nn#1#2{
- % Must inherit everything from the parent class
- \g_semantex_primitive_valuekey_parent:nn{#1}{ \cs_to_str:N #2 }
+\cs_new:Npn\semantex_primitive_valuekey_valuekeys:nn#1#2{
+ % Add new valuekeys
+ \semantex_data_prop_provide:nn { #1 } { custom_valuekeys }
+ \clist_map_inline:nn { #2 }{
+ \__semantex_valuekey_equality_format_auxiliary:nnn{#1}##1
+ }
}
-\cs_new:Npn\g_semantex_primitive_valuekey_valuekeys:nn#1#2{
- % Add new valuekeys via the interface
- % valuekeys={
- % {key1}{do something with \l_semantex_key_value_temp},
- % {key2}{g=\l_semantex_key_value_temp,i=\l_semantex_key_value_temp},
- % }
- \g_semantex_data_prop_provide:nn { #1 } { custom_valuekeys }
+\cs_generate_variant:Nn\semantex_data_prop_put:nnnn {nnno}
+
+\cs_new:Npn\__semantex_valuekey_equality_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_valuekey_equality_format_auxiliary_temp:n##1{#3}
+ \semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2}
+ {
+ \l__semantex_valuekey_equality_format_auxiliary_temp:n
+ {
+ \l__semantex_key_value_temp
+ }
+ }
+ %IM Remove spaces in #2
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_removevaluekey:nn#1#2
+{
+ \semantex_valuekey_remove:nn { #1 } { #2 }
+}
+
+\cs_set_eq:cN { semantex_primitive_valuekey_1valuekeys:nn } \semantex_primitive_valuekey_valuekeys:nn
+
+\cs_new:cpn { semantex_primitive_valuekey_2valuekeys:nn }#1#2{
+ % Add new valuekeys
+ \semantex_data_prop_provide:nn { #1 } { custom_valuekeys }
\clist_map_inline:nn { #2 }{
- \g_semantex_valuekey_equality_format:nnn{#1}##1
+ \__semantex_two_valuekey_equality_format_auxiliary:nnn{#1}##1
}
}
-\cs_generate_variant:Nn\g_semantex_data_prop_put:nnnn {nnno}
+\cs_new:Npn\__semantex_two_valuekey_equality_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_two_valuekey_equality_format_auxiliary_temp:nn##1##2{#3}
+ \semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2}
+ {
+ \l__semantex_two_valuekey_equality_format_auxiliary_temp:nn
+ {
+ \exp_not:N\semantex_grab_first_argument_of_two:nn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_second_argument_of_two:nn\l__semantex_key_value_temp
+ }
+ }
+ %IM Remove spaces in #2
+}
-\cs_new:Npn \g_semantex_valuekey_equality_format:nnn#1#2#3
+\cs_new:cpn { semantex_primitive_valuekey_3valuekeys:nn }#1#2{
+ % Add new valuekeys
+ \semantex_data_prop_provide:nn { #1 } { custom_valuekeys }
+ \clist_map_inline:nn { #2 }{
+ \__semantex_three_valuekey_equality_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new:Npn\__semantex_three_valuekey_equality_format_auxiliary:nnn#1#2#3
{
- \cs_set:Npn\l__semantex_valuekey_equality_format_temp:n##1{#3}
- \g_semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2} {\l__semantex_valuekey_equality_format_temp:n{\l_semantex_key_value_temp}}
+ \cs_set:Npn\l__semantex_three_valuekey_equality_format_auxiliary_temp:nnn##1##2##3{#3}
+ \semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2}
+ {
+ \l__semantex_three_valuekey_equality_format_auxiliary_temp:nnn
+ {
+ \exp_not:N\semantex_grab_first_argument_of_three:nnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_second_argument_of_three:nnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_third_argument_of_three:nnn\l__semantex_key_value_temp
+ }
+ }
%IM Remove spaces in #2
}
-\cs_new:Npn\g_semantex_primitive_valuekey_novaluekeys:nn#1#2{
- % Add sinple keys, taking no values, via the
- % interface
- % novaluekeys={
- % {key1}{print something},
- % {key2}{d=42,i=42},
- % }
- \g_semantex_data_prop_provide:nn { #1 } { custom_novaluekeys }
+\cs_new:cpn { semantex_primitive_valuekey_4valuekeys:nn }#1#2{
+ % Add new valuekeys
+ \semantex_data_prop_provide:nn { #1 } { custom_valuekeys }
\clist_map_inline:nn { #2 }{
- \g_semantex_valuekey_noequality_format:nnn{#1}##1
+ \__semantex_four_valuekey_equality_format_auxiliary:nnn{#1}##1
}
}
-\cs_new:Npn \g_semantex_valuekey_noequality_format:nnn#1#2#3{
- %\prop_put:cnn { semantex_data_prop_#1_custom_novaluekeys }{#2}{#3}
- \g_semantex_data_prop_put:nnnn {#1} {custom_novaluekeys} {#2} {#3}
+\cs_new:Npn\__semantex_four_valuekey_equality_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_four_valuekey_equality_format_auxiliary_temp:nnnn##1##2##3##4{#3}
+ \semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2}
+ {
+ \l__semantex_four_valuekey_equality_format_auxiliary_temp:nnnn
+ {
+ \exp_not:N\semantex_grab_first_argument_of_four:nnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_second_argument_of_four:nnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_third_argument_of_four:nnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_fourth_argument_of_four:nnnn\l__semantex_key_value_temp
+ }
+ }
+ %IM Remove spaces in #2
}
-\cs_new:Npn\g_semantex_primitive_valuekey_argvaluekeys:nn#1#2{
- % Add new valuekeys via the interface
- % valuekeys={
- % {key1}{do something with \l_semantex_key_value_temp},
- % {key2}{g=\l_semantex_key_value_temp,i=\l_semantex_key_value_temp},
- % }
- \g_semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys }
+\cs_new:cpn { semantex_primitive_valuekey_5valuekeys:nn }#1#2{
+ % Add new valuekeys
+ \semantex_data_prop_provide:nn { #1 } { custom_valuekeys }
\clist_map_inline:nn { #2 }{
- \g_semantex_arg_valuekey_equality_format:nnn{#1}##1
+ \__semantex_five_valuekey_equality_format_auxiliary:nnn{#1}##1
}
}
-\cs_new:Npn \g_semantex_arg_valuekey_equality_format:nnn#1#2#3{
- %\prop_put:cnn { semantex_data_prop_#1_custom_arg_valuekeys }{#2}{#3}
- \cs_set:Npn\l__semantex_arg_valuekey_equality_format_temp:n##1{#3}
- \g_semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2} {\l__semantex_arg_valuekey_equality_format_temp:n{\l_semantex_arg_key_value_temp}}
+\cs_new:Npn\__semantex_five_valuekey_equality_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_five_valuekey_equality_format_auxiliary_temp:nnnnn##1##2##3##4##5{#3}
+ \semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2}
+ {
+ \l__semantex_five_valuekey_equality_format_auxiliary_temp:nnnnn
+ {
+ \exp_not:N\semantex_grab_first_argument_of_five:nnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_second_argument_of_five:nnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_third_argument_of_five:nnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_fourth_argument_of_five:nnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_fifth_argument_of_five:nnnnn\l__semantex_key_value_temp
+ }
+ }
+ %IM Remove spaces in #2
}
-\cs_new:Npn\g_semantex_primitive_valuekey_argnovaluekeys:nn#1#2{
- % Add sinple keys, taking no values, via the
- % interface
- % novaluekeys={
- % {key1}{print something},
- % {key2}{g=42,i=42},
- % }
- \g_semantex_data_prop_provide:nn { #1 } { custom_arg_novaluekeys }
+\cs_new:cpn { semantex_primitive_valuekey_6valuekeys:nn }#1#2{
+ % Add new valuekeys
+ \semantex_data_prop_provide:nn { #1 } { custom_valuekeys }
\clist_map_inline:nn { #2 }{
- \g_semantex_arg_valuekey_noequality_format:nnn{#1}##1
+ \__semantex_six_valuekey_equality_format_auxiliary:nnn{#1}##1
}
}
-\cs_new:Npn \g_semantex_arg_valuekey_noequality_format:nnn#1#2#3{
- \g_semantex_data_prop_put:nnnn {#1} {custom_arg_novaluekeys} {#2} {#3}
+\cs_new:Npn\__semantex_six_valuekey_equality_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_six_valuekey_equality_format_auxiliary_temp:nnnnnn##1##2##3##4##5##6{#3}
+ \semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2}
+ {
+ \l__semantex_six_valuekey_equality_format_auxiliary_temp:nnnnnn
+ {
+ \exp_not:N\semantex_grab_first_argument_of_six:nnnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_second_argument_of_six:nnnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_third_argument_of_six:nnnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_fourth_argument_of_six:nnnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_fifth_argument_of_six:nnnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_sixth_argument_of_six:nnnnnn\l__semantex_key_value_temp
+ }
+ }
+ %IM Remove spaces in #2
}
-\cs_new:Npn\g_semantex_primitive_valuekey_symbol:nn#1#2{
- % Sets the value of the symbol
- \g_semantex_data_tl_set:nnn { #1 } { symbol } { \exp_not:n { #2 } }
+\cs_new:cpn { semantex_primitive_valuekey_7valuekeys:nn }#1#2{
+ % Add new valuekeys
+ \semantex_data_prop_provide:nn { #1 } { custom_valuekeys }
+ \clist_map_inline:nn { #2 }{
+ \__semantex_seven_valuekey_equality_format_auxiliary:nnn{#1}##1
+ }
}
-\cs_new:Npn\g_semantex_primitive_valuekey_texclass:nn#1#2{
- % Sets the value of the symbol
- \g_semantex_data_tl_set:nnn { #1 } { texclass } { \exp_not:n { #2 } }
+\cs_new:Npn\__semantex_seven_valuekey_equality_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_seven_valuekey_equality_format_auxiliary_temp:nnnnnnn##1##2##3##4##5##6##7{#3}
+ \semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2}
+ {
+ \l__semantex_seven_valuekey_equality_format_auxiliary_temp:nnnnnnn
+ {
+ \exp_not:N\semantex_grab_first_argument_of_seven:nnnnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_second_argument_of_seven:nnnnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_third_argument_of_seven:nnnnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_fourth_argument_of_seven:nnnnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_fifth_argument_of_seven:nnnnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_sixth_argument_of_seven:nnnnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_seventh_argument_of_seven:nnnnnnn\l__semantex_key_value_temp
+ }
+ }
+ %IM Remove spaces in #2
+}
+
+\cs_new:cpn { semantex_primitive_valuekey_8valuekeys:nn }#1#2{
+ % Add new valuekeys
+ \semantex_data_prop_provide:nn { #1 } { custom_valuekeys }
+ \clist_map_inline:nn { #2 }{
+ \__semantex_eight_valuekey_equality_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new:Npn\__semantex_eight_valuekey_equality_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_eight_valuekey_equality_format_auxiliary_temp:nnnnnnnn##1##2##3##4##5##6##7##8{#3}
+ \semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2}
+ {
+ \l__semantex_eight_valuekey_equality_format_auxiliary_temp:nnnnnnnn
+ {
+ \exp_not:N\semantex_grab_first_argument_of_eight:nnnnnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_second_argument_of_eight:nnnnnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_third_argument_of_eight:nnnnnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_fourth_argument_of_eight:nnnnnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_fifth_argument_of_eight:nnnnnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_sixth_argument_of_eight:nnnnnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_seventh_argument_of_eight:nnnnnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_eighth_argument_of_eight:nnnnnnnn\l__semantex_key_value_temp
+ }
+ }
+ %IM Remove spaces in #2
+}
+
+\cs_new:cpn { semantex_primitive_valuekey_9valuekeys:nn }#1#2{
+ % Add new valuekeys
+ \semantex_data_prop_provide:nn { #1 } { custom_valuekeys }
+ \clist_map_inline:nn { #2 }{
+ \__semantex_nine_valuekey_equality_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new:Npn\__semantex_nine_valuekey_equality_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_nine_valuekey_equality_format_auxiliary_temp:nnnnnnnnn##1##2##3##4##5##6##7##8##9{#3}
+ \semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2}
+ {
+ \l__semantex_nine_valuekey_equality_format_auxiliary_temp:nnnnnnnnn
+ {
+ \exp_not:N\semantex_grab_first_argument_of_nine:nnnnnnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_second_argument_of_nine:nnnnnnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_third_argument_of_nine:nnnnnnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_fourth_argument_of_nine:nnnnnnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_fifth_argument_of_nine:nnnnnnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_sixth_argument_of_nine:nnnnnnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_seventh_argument_of_nine:nnnnnnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_eighth_argument_of_nine:nnnnnnnnn\l__semantex_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_ninth_argument_of_nine:nnnnnnnnn\l__semantex_key_value_temp
+ }
+ }
+ %IM Remove spaces in #2
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_singlekeys:nn#1#2{
+ % Add keys taking no values
+ \semantex_data_prop_provide:nn { #1 } { custom_singlekeys }
+ \clist_map_inline:nn { #2 }{
+ \__semantex_singlekeys_noequality_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new:Npn \__semantex_singlekeys_noequality_format_auxiliary:nnn#1#2#3{
+ \semantex_data_prop_put:nnnn {#1} {custom_singlekeys} {#2} {#3}
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_novaluekeys:nn\semantex_primitive_valuekey_singlekeys:nn % Previously, "singlekeys" was called "novaluekeys", so I am keeping this alias for backwards compatibility
+
+\cs_set_eq:cN { semantex_primitive_valuekey_0valuekeys:nn } \semantex_primitive_valuekey_singlekeys:nn
+
+\cs_new:Npn\semantex_primitive_valuekey_removesinglekey:nn#1#2
+{
+ \semantex_singlekey_remove:nn { #1 } { #2 }
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_removenovaluekey:nn\semantex_primitive_valuekey_removesinglekey:nn % Previously, "singlekeys" was called "novaluekeys", so I am keeping this alias for backwards compatibility
+
+\cs_set_eq:cN { semantex_primitive_valuekey_remove0valuekey:nn } \semantex_primitive_valuekey_removesinglekey:nn
+
+% KEYS FOR SETTING UP THE ARGUMENT KEYVAL INTERFACE:
+
+\cs_new:Npn\semantex_primitive_valuekey_argvaluekeys:nn#1#2{
+ % Add argument valuekeys
+ \semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys }
+ \clist_map_inline:nn { #2 }{
+ \__semantex_arg_valuekey_equality_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new:Npn \__semantex_arg_valuekey_equality_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_arg_valuekey_equality_format_auxiliary_temp:n##1{#3}
+ \semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2}
+ {
+ \l__semantex_arg_valuekey_equality_format_auxiliary_temp:n{
+ \l__semantex_arg_key_value_temp
+ }
+ }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_removeargvaluekey:nn#1#2
+{
+ \semantex_arg_valuekey_remove:nn { #1 } { #2 }
+}
+
+\cs_set_eq:cN { semantex_primitive_valuekey_arg1valuekeys:nn } \semantex_primitive_arg_valuekey_arg_valuekeys:nn
+
+\cs_new:cpn { semantex_primitive_valuekey_arg2valuekeys:nn }#1#2{
+ % Add new valuekeys
+ \semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys }
+ \clist_map_inline:nn { #2 }{
+ \__semantex_two_arg_valuekey_equality_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new:Npn\__semantex_two_arg_valuekey_equality_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_two_arg_valuekey_equality_format_auxiliary_temp:nn##1##2{#3}
+ \semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2}
+ {
+ \l__semantex_two_arg_valuekey_equality_format_auxiliary_temp:nn
+ {
+ \exp_not:N\semantex_grab_first_argument_of_two:nn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_second_argument_of_two:nn\l__semantex_arg_key_value_temp
+ }
+ }
+ %IM Remove spaces in #2
+}
+
+\cs_new:cpn { semantex_primitive_valuekey_arg3valuekeys:nn }#1#2{
+ % Add new valuekeys
+ \semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys }
+ \clist_map_inline:nn { #2 }{
+ \__semantex_three_arg_valuekey_equality_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new:Npn\__semantex_three_arg_valuekey_equality_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_three_arg_valuekey_equality_format_auxiliary_temp:nnn##1##2##3{#3}
+ \semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2}
+ {
+ \l__semantex_three_arg_valuekey_equality_format_auxiliary_temp:nnn
+ {
+ \exp_not:N\semantex_grab_first_argument_of_three:nnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_second_argument_of_three:nnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_third_argument_of_three:nnn\l__semantex_arg_key_value_temp
+ }
+ }
+ %IM Remove spaces in #2
+}
+
+\cs_new:cpn { semantex_primitive_valuekey_arg4valuekeys:nn }#1#2{
+ % Add new valuekeys
+ \semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys }
+ \clist_map_inline:nn { #2 }{
+ \__semantex_four_arg_valuekey_equality_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new:Npn\__semantex_four_arg_valuekey_equality_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_four_arg_valuekey_equality_format_auxiliary_temp:nnnn##1##2##3##4{#3}
+ \semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2}
+ {
+ \l__semantex_four_arg_valuekey_equality_format_auxiliary_temp:nnnn
+ {
+ \exp_not:N\semantex_grab_first_argument_of_four:nnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_second_argument_of_four:nnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_third_argument_of_four:nnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_fourth_argument_of_four:nnnn\l__semantex_arg_key_value_temp
+ }
+ }
+ %IM Remove spaces in #2
+}
+
+\cs_new:cpn { semantex_primitive_valuekey_arg5valuekeys:nn }#1#2{
+ % Add new valuekeys
+ \semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys }
+ \clist_map_inline:nn { #2 }{
+ \__semantex_five_arg_valuekey_equality_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new:Npn\__semantex_five_arg_valuekey_equality_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_five_arg_valuekey_equality_format_auxiliary_temp:nnnnn##1##2##3##4##5{#3}
+ \semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2}
+ {
+ \l__semantex_five_arg_valuekey_equality_format_auxiliary_temp:nnnnn
+ {
+ \exp_not:N\semantex_grab_first_argument_of_five:nnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_second_argument_of_five:nnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_third_argument_of_five:nnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_fourth_argument_of_five:nnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_fifth_argument_of_five:nnnnn\l__semantex_arg_key_value_temp
+ }
+ }
+ %IM Remove spaces in #2
+}
+
+\cs_new:cpn { semantex_primitive_valuekey_arg6valuekeys:nn }#1#2{
+ % Add new valuekeys
+ \semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys }
+ \clist_map_inline:nn { #2 }{
+ \__semantex_six_arg_valuekey_equality_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new:Npn\__semantex_six_arg_valuekey_equality_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_six_arg_valuekey_equality_format_auxiliary_temp:nnnnnn##1##2##3##4##5##6{#3}
+ \semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2}
+ {
+ \l__semantex_six_arg_valuekey_equality_format_auxiliary_temp:nnnnnn
+ {
+ \exp_not:N\semantex_grab_first_argument_of_six:nnnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_second_argument_of_six:nnnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_third_argument_of_six:nnnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_fourth_argument_of_six:nnnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_fifth_argument_of_six:nnnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_sixth_argument_of_six:nnnnnn\l__semantex_arg_key_value_temp
+ }
+ }
+ %IM Remove spaces in #2
+}
+
+\cs_new:cpn { semantex_primitive_valuekey_arg7valuekeys:nn }#1#2{
+ % Add new valuekeys
+ \semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys }
+ \clist_map_inline:nn { #2 }{
+ \__semantex_seven_arg_valuekey_equality_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new:Npn\__semantex_seven_arg_valuekey_equality_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_seven_arg_valuekey_equality_format_auxiliary_temp:nnnnnnn##1##2##3##4##5##6##7{#3}
+ \semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2}
+ {
+ \l__semantex_seven_arg_valuekey_equality_format_auxiliary_temp:nnnnnnn
+ {
+ \exp_not:N\semantex_grab_first_argument_of_seven:nnnnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_second_argument_of_seven:nnnnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_third_argument_of_seven:nnnnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_fourth_argument_of_seven:nnnnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_fifth_argument_of_seven:nnnnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_sixth_argument_of_seven:nnnnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_seventh_argument_of_seven:nnnnnnn\l__semantex_arg_key_value_temp
+ }
+ }
+ %IM Remove spaces in #2
+}
+
+\cs_new:cpn { semantex_primitive_valuekey_arg8valuekeys:nn }#1#2{
+ % Add new valuekeys
+ \semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys }
+ \clist_map_inline:nn { #2 }{
+ \__semantex_eight_arg_valuekey_equality_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new:Npn\__semantex_eight_arg_valuekey_equality_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_eight_arg_valuekey_equality_format_auxiliary_temp:nnnnnnnn##1##2##3##4##5##6##7##8{#3}
+ \semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2}
+ {
+ \l__semantex_eight_arg_valuekey_equality_format_auxiliary_temp:nnnnnnnn
+ {
+ \exp_not:N\semantex_grab_first_argument_of_eight:nnnnnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_second_argument_of_eight:nnnnnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_third_argument_of_eight:nnnnnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_fourth_argument_of_eight:nnnnnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_fifth_argument_of_eight:nnnnnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_sixth_argument_of_eight:nnnnnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_seventh_argument_of_eight:nnnnnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_eighth_argument_of_eight:nnnnnnnn\l__semantex_arg_key_value_temp
+ }
+ }
+ %IM Remove spaces in #2
+}
+
+\cs_new:cpn { semantex_primitive_valuekey_arg9valuekeys:nn }#1#2{
+ % Add new valuekeys
+ \semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys }
+ \clist_map_inline:nn { #2 }{
+ \__semantex_nine_arg_valuekey_equality_format_auxiliary:nnn{#1}##1
+ }
}
-\cs_new:Npn\g_semantex_primitive_valuekey_slot:nn#1#2{
+\cs_new:Npn\__semantex_nine_arg_valuekey_equality_format_auxiliary:nnn#1#2#3
+{
+ \cs_set:Npn\l__semantex_nine_arg_valuekey_equality_format_auxiliary_temp:nnnnnnnnn##1##2##3##4##5##6##7##8##9{#3}
+ \semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2}
+ {
+ \l__semantex_nine_arg_valuekey_equality_format_auxiliary_temp:nnnnnnnnn
+ {
+ \exp_not:N\semantex_grab_first_argument_of_nine:nnnnnnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_second_argument_of_nine:nnnnnnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_third_argument_of_nine:nnnnnnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_fourth_argument_of_nine:nnnnnnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_fifth_argument_of_nine:nnnnnnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_sixth_argument_of_nine:nnnnnnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_seventh_argument_of_nine:nnnnnnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_eighth_argument_of_nine:nnnnnnnnn\l__semantex_arg_key_value_temp
+ }
+ {
+ \exp_not:N\semantex_grab_ninth_argument_of_nine:nnnnnnnnn\l__semantex_arg_key_value_temp
+ }
+ }
+ %IM Remove spaces in #2
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_argsinglekeys:nn#1#2{
+ % Add argument keys taking no values
+ \semantex_data_prop_provide:nn { #1 } { custom_arg_singlekeys }
+ \clist_map_inline:nn { #2 }{
+ \__semantex_arg_singlekeys_noequality_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new:Npn \__semantex_arg_singlekeys_noequality_format_auxiliary:nnn#1#2#3{
+ \semantex_data_prop_put:nnnn {#1} {custom_arg_singlekeys} {#2} {#3}
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_argnovaluekeys:nn\semantex_primitive_valuekey_argsinglekeys:nn % Previously, "singlekeys" was called "novaluekeys", so I am keeping this alias for backwards compatibility
+
+\cs_new:Npn\semantex_primitive_valuekey_removeargsinglekey:nn#1#2
+{
+ \semantex_arg_singlekey_remove:nn { #1 } { #2 }
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_removeargnovaluekey:nn\semantex_primitive_valuekey_removeargsinglekey:nn % Previously, "singlekeys" was called "novaluekeys", so I am keeping this alias for backwards compatibility
+
+\cs_set_eq:cN { semantex_primitive_valuekey_removearg0valuekey:nn } \semantex_primitive_valuekey_removeargsinglekey:nn
+
+% THESE ARE REALLY THE COMMANDS MANIPULATING DATA:
+
+\cs_new:Npn\semantex_primitive_valuekey_symbol:nn#1#2{
% Sets the value of the symbol
- \g_semantex_data_tl_set:nnn { #1 } { slot } { \exp_not:n { #2 } }
+ \semantex_data_tl_set:nnn { #1 } { symbol } { \exp_not:n { #2 } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_texclass:nn#1#2{
+ % Sets the TeX class of the output, e.g. \mathord, \mathbin, \mathop etc.
+ \semantex_data_tl_set:nnn { #1 } { texclass } { \exp_not:n { #2 } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_setslot:nn#1#2{
+ % Sets the argument slot, i.e. the - in f(-,x)
+ \semantex_data_tl_set:nnn { #1 } { argslot } { \exp_not:n { #2 } }
}
-\cs_new:Npn\g_semantex_primitive_valuekey_symbolputright:nn#1#2{
- \g_semantex_data_tl_put_right:nnn { #1 } { symbol } { \exp_not:n { #2 } }
+\cs_new:Npn\semantex_primitive_valuekey_symbolputright:nn#1#2{
+ % Add something to the right of the symbol
+ \semantex_data_tl_put_right:nnn { #1 } { symbol } { \exp_not:n { #2 } }
}
-\cs_new:Npn\g_semantex_primitive_valuekey_symbolputleft:nn#1#2{
- \g_semantex_data_tl_put_left:nnn { #1 } { symbol } { \exp_not:n { #2 } }
+\cs_new:Npn\semantex_primitive_valuekey_symbolputleft:nn#1#2{
+ % Add something to the left of the symbol
+ \semantex_data_tl_put_left:nnn { #1 } { symbol } { \exp_not:n { #2 } }
}
-\cs_new:Npn\g_semantex_primitive_valuekey_command:nn#1#2{
+\cs_new:Npn\semantex_primitive_valuekey_command:nn#1#2{
% Adds one entry on the left of the command
% sequence to be applied to the symbol
- \g_semantex_data_seq_put_right:nnn { #1 } { commands_sequence } { #2 } %IM maybe \exp_not:n { #2 }?
+ \semantex_data_seq_put_right:nnn { #1 } { commands_sequence } { #2 } %IM maybe \exp_not:n { #2 }?
}
-\cs_new:Npn\g_semantex_primitive_valuekey_argwithkeyval:nn#1#2{
- % Sets the argument (printed in parentheses
- % after the symbol)
- \g_semantex_arg_keys_set:nn { #1 } {{{ #2 }}}
- %IM for unknown reasons, one needs these extra braces.
- %IM This should be moved to the arg valuekeys themselves
- %IM where ifoutput=true is also declared
+\cs_new:Npn\semantex_primitive_valuekey_clearcommand:nn#1#2{
+ % Adds one entry on the left of the command
+ % sequence to be applied to the symbol
+ \semantex_data_seq_clear:nn { #1 } { commands_sequence }
}
-\cs_new:Npn\g_semantex_primitive_valuekey_argwithnovaluekeys:nn#1#2{
- % Sets the argument (printed in parentheses
- % after the symbol)
- \g_semantex_arg_novaluekeys_set:nn { #1 } { #2 }
+\cs_new:Npn\semantex_primitive_valuekey_argwithkeyval:nn#1#2{
+ % Sets the argument (allows keyval interface)
+ \semantex_arg_keys_set:nn { #1 } { #2 }
+ %IMPORTANT: Previously, we needed three braces around #2, but suddenly
+ % this changed, even though I did not really change anything related
+ % to this (except I added _auxiliary_ in the command names related
+ % to arg keyvals)
}
-\cs_new:Npn\g_semantex_primitive_valuekey_argwithonenovaluekey:nn#1#2{
- % Sets the argument (printed in parentheses
- % after the symbol)
- \use:c { g_semantex_data_cs_#1_arg_novaluekey:n } {{{{ #2 }}}}
+\cs_new:Npn\semantex_primitive_valuekey_argwithsinglekeys:nn#1#2{
+ % Sets the argument (only allows singlekeys)
+ \semantex_arg_singlekeys_set:nn { #1 } { #2 }
}
-\cs_new:Npn\g_semantex_primitive_valuekey_argwithoutkeyval:nn#1#2{
- \g_semantex_data_tl_put_right:nnn { #1 } { arg } { \exp_not:n { #2 } }
- \g_semantex_primitive_valuekey_ifrightreturnbeforerender:nn{#1}{true}
+\cs_new:Npn\semantex_primitive_valuekey_argwithonesinglekey:nn#1#2{
+ % Sets the argument (only allows one singlekey)
+ \use:c { __semantex_data_cs_#1_arg_singlekey:n } {{{{ #2 }}}}
}
+\cs_new:Npn\semantex_primitive_valuekey_argwithoutkeyval:nn#1#2{
+ % Sets the argument (no keyval interface allowed)
+ \semantex_data_tl_put_right:nnn { #1 } { arg } { \exp_not:n { #2 } }
+ \semantex_data_int_incr:nn { #1 } { numberofarguments } % Check if this has been added elsewhere
+ \semantex_data_bool_set_true:nn { #1 } { nextargwithsep }
+}
-%\cs_new:Npn\g_semantex_primitive_valuekey_useargwithkeyval:nn#1#2
-%{
-%% \g_semantex_primitive_valuekey_valuekeys:nn { #1 }
-%% {
-%% {arg} { argwithkeyval={ \l_semantex_key_value_temp } },
-%% }
-% \g_semantex_keys_set:nn { #1 }{
-% \exp_not:n{valuekeys={
-% {arg}{ argwithkeyval={\l_semantex_key_value_temp} },
-% },}
-% }
-%}
+\cs_new:Npn\semantex_primitive_valuekey_setargsep:nn#1#2
+{
+ % Sets the argument separator
+ \semantex_data_tl_set:nnn { #1 } { argsep } { \exp_not:n { #2 } }
+}
-\cs_new:Npn\g_semantex_primitive_valuekey_argsep:nn#1#2
+\cs_new:Npn\semantex_primitive_valuekey_setargdots:nn#1#2
{
- %\g_semantex_data_tl_provide:nn { #1 } { argsep }
- \g_semantex_data_tl_set:nnn { #1 } { argsep } { \exp_not:n { #2 } }
+ % Sets the argument dot command
+ \semantex_data_tl_set:nnn { #1 } { argdots } { \exp_not:n { #2 } }
}
-\cs_new:Npn\g_semantex_primitive_valuekey_argdots:nn#1#2
+\cs_new:Npn\semantex_primitive_valuekey_setargslot:nn#1#2
{
-% \g_semantex_data_tl_provide:nn { #1 } { argdots }
- \g_semantex_data_tl_set:nnn { #1 } { argdots } { \exp_not:n { #2 } }
+ % Sets the argument dot command
+ \semantex_data_tl_set:nnn { #1 } { argslot } { \exp_not:n { #2 } }
}
-\cs_new:Npn\g_semantex_primitive_valuekey_prearg:nn#1#2{
+\cs_new:Npn\semantex_primitive_valuekey_prearg:nn#1#2{
+ % Sets something to write before the argument
\tl_if_blank:nF{#2}
{
- \g_semantex_data_tl_put_left:nnn { #1 } { prearg } { \exp_not:n { #2 } }
+ \semantex_data_tl_put_left:nnn { #1 } { prearg } { \exp_not:n { #2 } }
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_postarg:nn#1#2{
+\cs_new:Npn\semantex_primitive_valuekey_clearprearg:nn#1#2
+{
+ \semantex_data_tl_clear:nn { #1 } { prearg }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_postarg:nn#1#2{
+ % Sets something to write after the argument
\tl_if_blank:nF{#2}
{
- \g_semantex_data_tl_put_right:nnn { #1 } { postarg } { \exp_not:n{ #2 } }
+ \semantex_data_tl_put_right:nnn { #1 } { postarg } { \exp_not:n{ #2 } }
}
}
+\cs_new:Npn\semantex_primitive_valuekey_clearpostarg:nn#1#2
+{
+ \semantex_data_tl_clear:nn { #1 } { postarg }
+}
-\cs_new:Npn\g_semantex_primitive_valuekey_output:nn#1#2
+\cs_new:Npn\semantex_primitive_valuekey_output:nn#1#2
{
- \g_semantex_data_tl_set:nnn { #1 } { output } { #2 }
+ % Tells what class the object is supposed to output
+ \semantex_class_if_exist:NTF { #2 }
+ {
+ \semantex_data_tl_set:nnx { #1 } { output } { class_\cs_to_str:N #2 }
+ }
+ {
+ \semantex_error_output_format:nN { #1 } \__semantex_primitive_valuekey_output_temp
+ \msg_error:nnxnn { semantex } { class_not_found } { \__semantex_primitive_valuekey_output_temp } { output } { #2 }
+ }
% Maybe allow output=self
}
-\cs_new:Npn\g_semantex_primitive_valuekey_outputoptions:nn#1#2{
- \g_semantex_data_tl_put_right:nnn { #1 } { output_options } { #2, }
+\cs_new:Npn\semantex_primitive_valuekey_outputoptions:nn#1#2{
+ % Sets possible options to pass to the output class
+ \semantex_data_tl_put_right:nnn { #1 } { outputoptions } { ,#2, }
}
-\cs_new:Npn\g_semantex_primitive_valuekey_ifrightreturnbeforerender:nn#1#2{
- % tells whether to use the output class or not
+\cs_new:Npn\semantex_primitive_valuekey_ifleftargument:nn#1#2{
+ % Tells whether to rightreturn before rendering the output.
\str_if_eq:nnTF { #2 } { true }
{
- \g_semantex_data_bool_set_true:nn { #1 } { rightreturnbeforerender }
+ \semantex_data_bool_set_true:nn { #1 } { leftargument }
}
{
\str_if_eq:nnTF { #2 } { false }
{
- \g_semantex_data_bool_set_false:nn { #1 } { rightreturnbeforerender }
+ \semantex_data_bool_set_false:nn { #1 } { leftargument }
}
{
- %IM do nothing right now, but should
- %IM probably throw an error
+ \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifleftargumen_temp
+ \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifleftargumen_temp } { ifleftargument } { #2 }
}
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_ifoutput:nn#1#2{ %IMPLEMENT THIS
- % tells whether to output or not
+\cs_new:Npn\semantex_primitive_valuekey_ifoutput:nn#1#2{ %IMPLEMENT THIS
+ % Tells whether to output or not
\str_if_eq:nnTF { #2 } { true }
{
- \g_semantex_data_bool_set_true:nn { #1 } { output }
+ \semantex_data_bool_set_true:nn { #1 } { output }
}
{
\str_if_eq:nnTF { #2 } { false }
{
- \g_semantex_data_bool_set_false:nn { #1 } { output }
+ \semantex_data_bool_set_false:nn { #1 } { output }
}
{
- %IM do nothing right now, but should
- %IM probably throw an error
+ \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifoutput_temp
+ \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifoutput_temp } { ifoutput } { #2 }
}
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_gradingpos:nn#1#2{
- % tells whether to use upper or lower indices
- \g_semantex_data_bool_provide:nn { #1 } { upper_grading }
- \str_case:nnTF { #2 }
+\cs_new:Npn\semantex_primitive_valuekey_gradingposition:nn#1#2{
+ % Tells whether to use upper or lower indices
+ \semantex_data_bool_provide:nn { #1 } { uppergrading }
+ \str_if_eq:nnTF { #2 } { upper }
{
- { upper }
+ \semantex_data_bool_set_true:nn { #1 } { uppergrading }
+ }
+ {
+ \str_if_eq:nnTF { #2 } { lower }
{
- \g_semantex_data_bool_set_true:nn { #1 } { upper_grading }
+ \semantex_data_bool_set_false:nn { #1 } { uppergrading }
}
- { lower }
{
- \g_semantex_data_bool_set_false:nn { #1 } { upper_grading }
+ \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_gradingposition_temp
+ \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_gradingposition_temp } { gradingposition } { #2 }
}
}
- {
- % do nohting
- }
- {
- % do nothing at the moment, but should probably throw an error
- }
}
-\cs_set_eq:NN \g_semantex_primitive_valuekey_gradingposition:nn \g_semantex_primitive_valuekey_gradingpos:nn
+\cs_set_eq:NN \semantex_primitive_valuekey_gradingpos:nn \semantex_primitive_valuekey_gradingposition:nn
% Upper and lower right indices:
-\cs_new:Npn\g_semantex_primitive_valuekey_upper:nn#1#2{
+\cs_new:Npn\semantex_primitive_valuekey_upper:nn#1#2{
% adds to the upper index
\tl_if_blank:nF{#2}{
- \g_semantex_data_tl_put_right:nnn { #1 } { upper_index } { \exp_not:n{ #2 } }
- % For a long time, when using x type expansions when checking
- % if indices were empty, two \exp_not:n's were necessary here.
- % Thankfully, I can now happily remove them again, it seems.
- %\g_semantex_data_bool_provide:nn { #1 } { first_upper }
- \g_semantex_data_bool_set_false:nn { #1 } { first_upper }
+ \semantex_data_tl_put_right:nnn { #1 } { upper } { \exp_not:n{ #2 } }
+ \semantex_data_bool_set_true:nn { #1 } { nextupperwithsep }
+ \semantex_data_int_incr:nn { #1 } { numberofupperindices }
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_supper:nn#1#2{
- % adds to the upper index, with a separator
+\cs_new:Npn\semantex_primitive_valuekey_supper:nn#1#2{
+ % Adds to the upper index, with a separator
\tl_if_blank:nF{#2}
{
- \g_semantex_data_bool_get:nnTF { #1 } { first_upper }
+ \semantex_data_bool_get:nnTF { #1 } { nextupperwithsep }
{
- \g_semantex_data_tl_put_right:nnn { #1 } { upper_index } { \exp_not:n { #2 } }
+ \semantex_data_tl_put_right:nnx { #1 } { upper }
+ { \exp_not:n { \semantex_data_tl_get:nn { #1 } { uppersep } } }
+ \semantex_data_tl_put_right:nnn { #1 } { upper } { \exp_not:n { #2 } }
}
{
- \g_semantex_data_tl_put_right:nnx { #1 } { upper_index }
- { \exp_not:n { \g_semantex_data_tl_get:nn { #1 } { uppersep } } }
- \g_semantex_data_tl_put_right:nnn { #1 } { upper_index } { \exp_not:n { #2 } }
+ \semantex_data_tl_put_right:nnn { #1 } { upper } { \exp_not:n { #2 } }
}
- \g_semantex_data_bool_set_false:nn { #1 } { first_upper }
+ \semantex_data_bool_set_true:nn { #1 } { nextupperwithsep }
+ \semantex_data_int_incr:nn { #1 } { numberofupperindices }
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_upperaddleft:nn#1#2{
- % adds to the upper index
+\cs_new:Npn\semantex_primitive_valuekey_upperputleft:nn#1#2{
+ % Adds to the left of the upper index
\tl_if_blank:nF{#2}{
- \g_semantex_data_tl_put_left:nnn { #1 } { upper_index } { \exp_not:n{ #2 } }
- \g_semantex_data_bool_set_false:nn { #1 } { first_upper }
+ \semantex_data_tl_put_left:nnn { #1 } { upper } { \exp_not:n{ #2 } }
+ \semantex_data_bool_set_true:nn { #1 } { nextupperwithsep }
+ \semantex_data_int_incr:nn { #1 } { numberofupperindices }
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_preupper:nn#1#2{
+\cs_new:Npn\semantex_primitive_valuekey_preupper:nn#1#2{
+ % Sets what to write before upper
\tl_if_blank:nF{#2}
{
- \g_semantex_data_tl_put_left:cn { #1 } { preupper } { \exp_not:n{ #2 } }
+ \semantex_data_tl_put_left:cn { #1 } { preupper } { \exp_not:n{ #2 } }
}
}
-
-\cs_new:Npn\g_semantex_primitive_valuekey_postupper:nn#1#2{
+\cs_new:Npn\semantex_primitive_valuekey_postupper:nn#1#2{
+ % Sets what to write after upper
\tl_if_blank:nF{#2}
{
- \g_semantex_data_tl_put_right:nnn { #1 } { postupper } { \exp_not:n{ #2 } }
+ \semantex_data_tl_put_right:nnn { #1 } { postupper } { \exp_not:n{ #2 } }
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_lower:nn#1#2{
- % adds to the lower index
+\cs_new:Npn\semantex_primitive_valuekey_clearupper:nn#1#2{
+ \semantex_data_tl_clear:nn { #1 } { upper }
+ \semantex_data_bool_set_false:nn { #1 } { nextupperwithsep }
+ \semantex_data_int_clear:nn { #1 } { numberofupperindices }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_clearpreupper:nn#1#2{
+ \semantex_data_tl_clear:nn { #1 } { preupper }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_clearpostupper:nn#1#2{
+ \semantex_data_tl_clear:nn { #1 } { postupper }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_setupperdots:nn#1#2
+{
+ \semantex_data_tl_set:nnn { #1 } { upperdots } { \exp_not:n { #2 } }
+}
+
+\cs_generate_variant:Nn\semantex_primitive_valuekey_upper:nn { nx }
+
+\cs_new:Npn\semantex_primitive_valuekey_upperdots:nn#1#2
+{
+ \semantex_primitive_valuekey_upper:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperdots } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_setupperslot:nn#1#2
+{
+ \semantex_data_tl_set:nnn { #1 } { upperslot } { \exp_not:n { #2 } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_upperslot:nn#1#2
+{
+ \semantex_primitive_valuekey_upper:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperslot } }
+}
+
+\cs_generate_variant:Nn \semantex_primitive_valuekey_supper:nn { nx }
+
+\cs_new:Npn\semantex_primitive_valuekey_supperdots:nn#1#2
+{
+ \semantex_primitive_valuekey_supper:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperdots } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_supperslot:nn#1#2
+{
+ \semantex_primitive_valuekey_supper:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperslot } }
+}
+
+\cs_generate_variant:Nn \semantex_primitive_valuekey_cupper:nn { nx }
+
+\cs_new:Npn\semantex_primitive_valuekey_cupperdots:nn#1#2
+{
+ \semantex_primitive_valuekey_cupper:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperdots } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_cupperslot:nn#1#2
+{
+ \semantex_primitive_valuekey_cupper:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperslot } }
+}
+
+\cs_generate_variant:Nn \semantex_primitive_valuekey_upperwithothersep:nn { nx }
+
+\cs_new:Npn\semantex_primitive_valuekey_upperdotswithothersep:nn#1#2
+{
+ \semantex_primitive_valuekey_upperwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { upperdots } } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_upperslotwithothersep:nn#1#2
+{
+ \semantex_primitive_valuekey_upperwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { upperslot } } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_lower:nn#1#2{
+ % Adds to the lower index
\tl_if_blank:nF{#2}
{
- \g_semantex_data_tl_put_right:nnn { #1 } { lower_index } { \exp_not:n { #2 } }
- \g_semantex_data_bool_set_false:nn { #1 } { first_lower }
+ \semantex_data_tl_put_right:nnn { #1 } { lower } { \exp_not:n { #2 } }
+ \semantex_data_bool_set_true:nn { #1 } { nextlowerwithsep }
+ \semantex_data_int_incr:nn { #1 } { numberoflowerindices }
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_slower:nn#1#2{
- % adds to the lower index, with a separator
+\cs_new:Npn\semantex_primitive_valuekey_slower:nn#1#2{
+ % Adds to the lower index, with a separator
\tl_if_blank:nF{#2}
{
- \g_semantex_data_bool_get:nnTF { #1 } { first_lower }
+ \semantex_data_bool_get:nnTF { #1 } { nextlowerwithsep }
{
- \g_semantex_data_tl_put_right:nnn { #1 } { lower_index } { \exp_not:n { #2 } }
+ \semantex_data_tl_put_right:nnx { #1 } { lower }
+ { \exp_not:n { \semantex_data_tl_get:nn { #1 } { lowersep } } }
+ \semantex_data_tl_put_right:nnn { #1 } { lower } { \exp_not:n { #2 } }
}
{
- \g_semantex_data_tl_put_right:nnx { #1 } { lower_index }
- { \exp_not:n { \g_semantex_data_tl_get:nn { #1 } { lowersep } } }
- \g_semantex_data_tl_put_right:nnn { #1 } { lower_index } { \exp_not:n { #2 } }
+ \semantex_data_tl_put_right:nnn { #1 } { lower } { \exp_not:n { #2 } }
}
- \g_semantex_data_bool_set_false:nn { #1 } { first_lower }
+ \semantex_data_bool_set_true:nn { #1 } { nextlowerwithsep }
+ \semantex_data_int_incr:nn { #1 } { numberoflowerindices }
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_loweraddleft:nn#1#2{
- % adds to the lower index
+\cs_new:Npn\semantex_primitive_valuekey_lowerputleft:nn#1#2{
+ % Adds to the lower index
\tl_if_blank:nF{#2}
{
- \g_semantex_data_tl_put_left:nnn { #1 } { lower_index } { \exp_not:n { #2 } }
- \g_semantex_data_bool_set_false:nn { #1 } { first_lower }
+ \semantex_data_tl_put_left:nnn { #1 } { lower } { \exp_not:n { #2 } }
+ \semantex_data_bool_set_true:nn { #1 } { nextlowerwithsep }
+ \semantex_data_int_incr:nn { #1 } { numberoflowerindices }
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_prelower:nn#1#2{
- % adds to the lower index
+\cs_new:Npn\semantex_primitive_valuekey_prelower:nn#1#2{
+ % Sets what to write before the lower index
\tl_if_blank:nF{#2}
{
- \g_semantex_data_tl_put_left:nnn { #1 } { prelower } { \exp_not:n { #2 } }
+ \semantex_data_tl_put_left:nnn { #1 } { prelower } { \exp_not:n { #2 } }
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_postlower:nn#1#2{
- % adds to the lower index
+\cs_new:Npn\semantex_primitive_valuekey_postlower:nn#1#2{
+ % Sets what to write after the lower index
\tl_if_blank:nF{#2}
{
- \g_semantex_data_tl_put_right:nnn { #1 } { postlower } { \exp_not:n{ #2 } }
+ \semantex_data_tl_put_right:nnn { #1 } { postlower } { \exp_not:n{ #2 } }
}
}
-\cs_generate_variant:Nn \tl_if_blank:nTF { vTF }
+\cs_new:Npn\semantex_primitive_valuekey_clearlower:nn#1#2{
+ \semantex_data_tl_clear:nn { #1 } { lower }
+ \semantex_data_bool_set_false:nn { #1 } { nextlowerwithsep }
+ \semantex_data_int_clear:nn { #1 } { numberoflowerindices }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_clearprelower:nn#1#2{
+ \semantex_data_tl_clear:nn { #1 } { prelower }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_clearpostlower:nn#1#2{
+ \semantex_data_tl_clear:nn { #1 } { postlower }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_setlowerdots:nn#1#2
+{
+ \semantex_data_tl_set:nnn { #1 } { lowerdots } { \exp_not:n { #2 } }
+}
+
+\cs_generate_variant:Nn \semantex_primitive_valuekey_lower:nn { nx }
+
+\cs_new:Npn\semantex_primitive_valuekey_lowerdots:nn#1#2
+{
+ \semantex_primitive_valuekey_lower:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerdots } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_setlowerslot:nn#1#2
+{
+ \semantex_data_tl_set:nnn { #1 } { lowerslot } { \exp_not:n { #2 } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_lowerslot:nn#1#2
+{
+ \semantex_primitive_valuekey_lower:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerslot } }
+}
+
+\cs_generate_variant:Nn \semantex_primitive_valuekey_slower:nn { nx }
+
+\cs_new:Npn\semantex_primitive_valuekey_slowerdots:nn#1#2
+{
+ \semantex_primitive_valuekey_slower:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerdots } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_slowerslot:nn#1#2
+{
+ \semantex_primitive_valuekey_slower:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerslot } }
+}
+
+\cs_generate_variant:Nn \semantex_primitive_valuekey_clower:nn { nx }
+
+\cs_new:Npn\semantex_primitive_valuekey_clowerdots:nn#1#2
+{
+ \semantex_primitive_valuekey_clower:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerdots } }
+}
-\cs_new:Npn \g_semantex_primitive_upper_lower_auxiliary_first_arg:nn#1#2 { #1 }
+\cs_new:Npn\semantex_primitive_valuekey_clowerslot:nn#1#2
+{
+ \semantex_primitive_valuekey_clower:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerslot } }
+}
-\cs_new:Npn \g_semantex_primitive_upper_lower_auxiliary_second_arg:nn#1#2 { #2 }
+\cs_generate_variant:Nn \semantex_primitive_valuekey_lowerwithothersep:nn { nx }
-\cs_new:Npn\g_semantex_primitive_valuekey_uppersep:nn#1#2{
- % uppersep={separator}{contents} adds contents to the upper index
+\cs_new:Npn\semantex_primitive_valuekey_lowerdotswithothersep:nn#1#2
+{
+ \semantex_primitive_valuekey_lowerwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { lowerdots } } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_lowerslotwithothersep:nn#1#2
+{
+ \semantex_primitive_valuekey_lowerwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { lowerslot } } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_upperwithothersep:nn#1#2{
+ % upperwithsep={separator}{contents} adds contents to the upper index
% with the appropriate index separator
- \g_semantex_data_bool_inherit:nn { #1 } { first_upper }
- \g_semantex_data_bool_get:nnTF { #1 } { first_upper }
+ \semantex_data_bool_get:nnTF { #1 } { nextupperwithsep }
{
- \g_semantex_data_tl_put_right:nnn { #1 } { upper_index } {
+ \semantex_data_tl_put_right:nnn { #1 } { upper } {
\exp_not:n {
- \g_semantex_primitive_upper_lower_auxiliary_second_arg:nn #2
+ \semantex_grab_first_argument_of_two:nn #2
+ \semantex_grab_second_argument_of_two:nn #2
}
}
}
{
- \g_semantex_data_tl_put_right:nnn { #1 } { upper_index } {
+ \semantex_data_tl_put_right:nnn { #1 } { upper } {
\exp_not:n {
- \g_semantex_primitive_upper_lower_auxiliary_first_arg:nn #2
- \g_semantex_primitive_upper_lower_auxiliary_second_arg:nn #2
+ \semantex_grab_second_argument_of_two:nn #2
}
}
}
- \g_semantex_data_bool_set_false:nn { #1 } { first_upper }
+ \semantex_data_bool_set_true:nn { #1 } { nextupperwithsep }
+ \semantex_data_int_incr:nn { #1 } { numberofupperindices }
}
-\cs_new:Npn\g_semantex_primitive_valuekey_lowersep:nn#1#2{
- % lowersep={separator}{contents} adds contents to the lower index
+\cs_new:Npn\semantex_primitive_valuekey_lowerwithothersep:nn#1#2{
+ % lowerwithsep={separator}{contents} adds contents to the lower index
% with the appropriate index separator
- \g_semantex_data_bool_get:nnTF { #1 } { first_lower }
+ \semantex_data_bool_get:nnTF { #1 } { nextlowerwithsep }
{
- \g_semantex_data_tl_put_right:nnn { #1 } { lower_index } {
+ \semantex_data_tl_put_right:nnn { #1 } { lower } {
\exp_not:n {
- \g_semantex_primitive_upper_lower_auxiliary_second_arg:nn #2
+ \semantex_grab_first_argument_of_two:nn #2
+ \semantex_grab_second_argument_of_two:nn #2
}
}
}
{
- \g_semantex_data_tl_put_right:nnn { #1 } { lower_index } {
- \exp_not:n { \g_semantex_primitive_upper_lower_auxiliary_first_arg:nn #2 \g_semantex_primitive_upper_lower_auxiliary_second_arg:nn #2
+ \semantex_data_tl_put_right:nnn { #1 } { lower } {
+ \exp_not:n {
+ \semantex_grab_second_argument_of_two:nn #2
}
}
}
- \g_semantex_data_bool_set_false:nn { #1 } { first_lower }
+ \semantex_data_bool_set_true:nn { #1 } { nextlowerwithsep }
+ \semantex_data_int_incr:nn { #1 } { numberofupperindices }
}
-\cs_new:Npn\g_semantex_primitive_valuekey_cupper:nn#1#2{
- % adds to the upper index, with a comma as separator
+\cs_new:Npn\semantex_primitive_valuekey_cupper:nn#1#2{
+ % Adds to the upper index, with a comma as separator
\tl_if_blank:nF{#2}
{
- \g_semantex_data_bool_get:nnTF { #1 } { first_upper }
+ \semantex_data_bool_get:nnTF { #1 } { nextupperwithsep }
{
- \g_semantex_data_tl_put_right:nnn { #1 } { upper_index } { \exp_not:n { #2 } }
+ \semantex_data_tl_put_right:nnn { #1 } { upper } { , \exp_not:n { #2 } }
}
{
- \g_semantex_data_tl_put_right:nnn { #1 } { upper_index } { , \exp_not:n { #2 } }
+ \semantex_data_tl_put_right:nnn { #1 } { upper } { \exp_not:n { #2 } }
}
- \g_semantex_data_bool_set_false:nn { #1 } { first_upper }
+ \semantex_data_bool_set_true:nn { #1 } { nextupperwithsep }
+ \semantex_data_int_incr:nn { #1 } { numberofupperindices }
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_clower:nn#1#2{
- % adds to the lower index, with a comma as separator
+\cs_new:Npn\semantex_primitive_valuekey_clower:nn#1#2{
+ % Adds to the lower index, with a comma as separator
\tl_if_blank:nF{#2}
{
- \g_semantex_data_bool_get:nnTF { #1 } { first_lower }
+ \semantex_data_bool_get:nnTF { #1 } { nextlowerwithsep }
{
- \g_semantex_data_tl_put_right:nnn { #1 } { lower_index } { \exp_not:n { #2 } }
+ \semantex_data_tl_put_right:nnn { #1 } { lower } { , \exp_not:n { #2 } }
}
{
- \g_semantex_data_tl_put_right:nnn { #1 } { lower_index } { , \exp_not:n { #2 } }
+ \semantex_data_tl_put_right:nnn { #1 } { lower } { \exp_not:n { #2 } }
}
- \g_semantex_data_bool_set_false:nn { #1 } { first_lower }
+ \semantex_data_bool_set_true:nn { #1 } { nextlowerwithsep }
+ \semantex_data_int_incr:nn { #1 } { numberoflowerindices }
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_iffirstupper:nn#1#2
+\cs_new:Npn\semantex_primitive_valuekey_ifnextupperwithsep:nn#1#2
{
- \tl_if_eq:nnTF { #2 } { true }
+ % Tells whether the upper index is the first one
+ \tl_if_eq:nnTF { #2 } { false }
{
- \g_semantex_data_bool_set_true:nn { #1 } { first_upper }
+ \semantex_data_bool_set_false:nn { #1 } { nextupperwithsep }
}
{
- \tl_if_eq:nnTF { #2 } { false }
+ \tl_if_eq:nnTF { #2 } { true }
{
- \g_semantex_data_bool_set_false:nn { #1 } { first_upper }
+ \semantex_data_bool_set_true:nn { #1 } { nextupperwithsep }
}
{
- %IM Throw error later
+ \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifnextupperwithsep_temp
+ \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifnextupperwithsep_temp } { ifnextupperwithsep } { #2 }
}
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_iffirstlower:nn#1#2
+\cs_new:Npn\semantex_primitive_valuekey_ifnextlowerwithsep:nn#1#2 % should be removed later
{
- \tl_if_eq:nnTF { #2 } { true }
+ % Tells whether the lower index is the first one
+ \tl_if_eq:nnTF { #2 } { false }
{
- \g_semantex_data_bool_set_true:nn { #1 } { first_lower }
+ \semantex_data_bool_set_false:nn { #1 } { nextlowerwithsep }
}
{
- \tl_if_eq:nnTF { #2 } { false }
+ \tl_if_eq:nnTF { #2 } { true }
{
- \g_semantex_data_bool_set_false:nn { #1 } { first_lower }
+ \semantex_data_bool_set_true:nn { #1 } { nextlowerwithsep }
}
{
- %IM Throw error later
+ \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifnextlowerwithsep_temp
+ \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifnextlowerwithsep_temp } { ifnextlowerwithsep } { #2 }
}
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_setuppersep:nn#1#2
+\cs_new:Npn\semantex_primitive_valuekey_setuppersep:nn#1#2
{
- \g_semantex_data_tl_set:nnn { #1 } { uppersep } { \exp_not:n { #2 }}
+ % Sets the separator for the upper index
+ \semantex_data_tl_set:nnn { #1 } { uppersep } { \exp_not:n { #2 }}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_setlowersep:nn#1#2
+\cs_new:Npn\semantex_primitive_valuekey_setlowersep:nn#1#2
{
- \g_semantex_data_tl_set:nnn { #1 } { lowersep } { \exp_not:n { #2 }}
+ % Sets the separator for the lower index
+ \semantex_data_tl_set:nnn { #1 } { lowersep } { \exp_not:n { #2 }}
}
-%--------------- Left indices:
+%--------------- Left indices: (I don't repeat all of the documentation)
-\cs_new:Npn\g_semantex_primitive_valuekey_upperleft:nn#1#2{
+\cs_new:Npn\semantex_primitive_valuekey_upperleft:nn#1#2{
% adds to the upper left index
\tl_if_blank:nF{#2}{
- \g_semantex_data_tl_put_left:nnn { #1 } { upper_left_index } { \exp_not:n{ #2 } }
- \g_semantex_data_bool_set_false:nn { #1 } { first_upper_left }
+ \semantex_data_tl_put_left:nnn { #1 } { upperleft } { \exp_not:n{ #2 } }
+ \semantex_data_bool_set_true:nn { #1 } { nextupperleftwithsep }
+ \semantex_data_int_incr:nn { #1 } { numberofupperleftindices }
}
}
-
-
-\cs_new:Npn\g_semantex_primitive_valuekey_supperleft:nn#1#2{
+\cs_new:Npn\semantex_primitive_valuekey_supperleft:nn#1#2{
\tl_if_blank:nF{#2}
{
- \g_semantex_data_bool_get:nnTF { #1 } { first_upper_left }
+ \semantex_data_bool_get:nnTF { #1 } { nextupperwithsep }
{
- \g_semantex_data_tl_put_left:nnn { #1 } { upper_left_index } { \exp_not:n { #2 } }
+ \semantex_data_tl_put_left:nnx { #1 } { upperleft }
+ { \exp_not:n { \semantex_data_tl_get:nn { #1 } { uppersep } } }
+ \semantex_data_tl_put_left:nnn { #1 } { upperleft } { \exp_not:n { #2 } }
}
{
- \g_semantex_data_tl_put_left:nnn { #1 } { upper_left_index } { \exp_not:n { #2 } }
- \g_semantex_data_tl_put_left:nnx { #1 } { upper_left_index }
- { \exp_not:n { \g_semantex_data_tl_get:nn { #1 } { uppersep } } }
+ \semantex_data_tl_put_left:nnn { #1 } { upperleft } { \exp_not:n { #2 } }
}
- \g_semantex_data_bool_set_false:nn { #1 } { first_upper_left }
+ \semantex_data_bool_set_true:nn { #1 } { nextupperleftwithsep }
+ \semantex_data_int_incr:nn { #1 } { numberofupperleftindices }
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_upperleftaddright:nn#1#2{
- % adds to the upper index
+\cs_new:Npn\semantex_primitive_valuekey_upperleftputright:nn#1#2{
\tl_if_blank:nF{#2}{
- \g_semantex_data_tl_put_right:nnn { #1 } { upper_left_index } { \exp_not:n{ #2 } }
- \g_semantex_data_bool_set_false:nn { #1 } { first_upper_left }
+ \semantex_data_tl_put_right:nnn { #1 } { upperleft } { \exp_not:n{ #2 } }
+ \semantex_data_bool_set_true:nn { #1 } { nextupperleftwithsep }
+ \semantex_data_int_incr:nn { #1 } { numberofupperleftindices }
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_preupperleft:nn#1#2{
- % adds to the lower index
+\cs_new:Npn\semantex_primitive_valuekey_preupperleft:nn#1#2{
\tl_if_blank:nF{#2}
{
- \g_semantex_data_tl_put_left:nnn { #1 } { preupperleft } { \exp_not:n{ #2 } }
+ \semantex_data_tl_put_left:nnn { #1 } { preupperleft } { \exp_not:n{ #2 } }
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_postupperleft:nn#1#2{
+\cs_new:Npn\semantex_primitive_valuekey_postupperleft:nn#1#2{
% adds to the lower index
\tl_if_blank:nF{#2}
{
- \g_semantex_data_tl_put_right:nnn { #1 } { postupperleft } { \exp_not:n{ #2 } }
+ \semantex_data_tl_put_right:nnn { #1 } { postupperleft } { \exp_not:n{ #2 } }
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_lowerleft:nn#1#2{
- % adds to the lower left index
+\cs_new:Npn\semantex_primitive_valuekey_clearupperleft:nn#1#2{
+ \semantex_data_tl_clear:nn { #1 } { upperleft }
+ \semantex_data_bool_set_false:nn { #1 } { nextupperleftwithsep }
+ \semantex_data_int_clear:nn { #1 } { numberofupperleftindices }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_clearpreupperleft:nn#1#2{
+ \semantex_data_tl_clear:nn { #1 } { preupperleft }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_clearpostupperleft:nn#1#2{
+ \semantex_data_tl_clear:nn { #1 } { preupperleft }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_setupperleftdots:nn#1#2
+{
+ \semantex_data_tl_set:nnn { #1 } { upperleftdots } { \exp_not:n { #2 } }
+}
+
+\cs_generate_variant:Nn \semantex_primitive_valuekey_upperleft:nn { nx }
+
+\cs_new:Npn\semantex_primitive_valuekey_upperleftdots:nn#1#2
+{
+ \semantex_primitive_valuekey_upperleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperleftdots } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_setupperleftslot:nn#1#2
+{
+ \semantex_data_tl_set:nnn { #1 } { upperleftslot } { \exp_not:n { #2 } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_upperleftslot:nn#1#2
+{
+ \semantex_primitive_valuekey_upperleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperleftslot } }
+}
+
+\cs_generate_variant:Nn \semantex_primitive_valuekey_supperleft:nn { nx }
+
+\cs_new:Npn\semantex_primitive_valuekey_supperleftdots:nn#1#2
+{
+ \semantex_primitive_valuekey_supperleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperleftdots } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_supperleftslot:nn#1#2
+{
+ \semantex_primitive_valuekey_supperleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperleftslot } }
+}
+
+\cs_generate_variant:Nn \semantex_primitive_valuekey_cupperleft:nn { nx }
+
+\cs_new:Npn\semantex_primitive_valuekey_cupperleftdots:nn#1#2
+{
+ \semantex_primitive_valuekey_cupperleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperleftdots } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_cupperleftslot:nn#1#2
+{
+ \semantex_primitive_valuekey_cupperleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperleftslot } }
+}
+
+\cs_generate_variant:Nn \semantex_primitive_valuekey_upperleftwithothersep:nn { nx }
+
+\cs_new:Npn\semantex_primitive_valuekey_upperleftdotswithothersep:nn#1#2
+{
+ \semantex_primitive_valuekey_upperleftwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { upperleftdots } } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_upperleftslotwithothersep:nn#1#2
+{
+ \semantex_primitive_valuekey_upperleftwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { upperleftslot } } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_lowerleft:nn#1#2{
\tl_if_blank:nF{#2}
{
- \g_semantex_data_tl_put_left:nnn { #1 } { lower_left_index } { \exp_not:n{ #2 } }
- \g_semantex_data_bool_set_false:nn { #1 } { first_lower_left }
+ \semantex_data_tl_put_left:nnn { #1 } { lowerleft } { \exp_not:n{ #2 } }
+ \semantex_data_bool_set_true:nn { #1 } { nextlowerleftwithsep }
+ \semantex_data_int_incr:nn { #1 } { numberoflowerleftindices }
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_slowerleft:nn#1#2{
- % adds to the lower index
+\cs_new:Npn\semantex_primitive_valuekey_slowerleft:nn#1#2{
\tl_if_blank:nF{#2}
{
- \g_semantex_data_bool_get:nnTF { #1 } { first_lower_left }
+ \semantex_data_bool_get:nnTF { #1 } { nextlowerleftwithsep }
{
- \g_semantex_data_tl_put_left:nnn { #1 } { lower_left_index } { \exp_not:n { #2 } }
+ \semantex_data_tl_put_left:nnx { #1 } { lowerleft }
+ { \exp_not:n { \semantex_data_tl_get:nn { #1 } { lowerleftsep } } }
+ \semantex_data_tl_put_left:nnn { #1 } { lowerleft } { \exp_not:n { #2 } }
}
{
- \g_semantex_data_tl_put_left:nnn { #1 } { lower_left_index } { \exp_not:n { #2 } }
- \g_semantex_data_tl_put_left:nnx { #1 } { lower_left_index }
- { \exp_not:n { \g_semantex_data_tl_get:nn { #1 } { lowerleftsep } } }
+ \semantex_data_tl_put_left:nnn { #1 } { lowerleft } { \exp_not:n { #2 } }
}
- \g_semantex_data_bool_set_false:nn { #1 } { first_lower_left }
+ \semantex_data_bool_set_true:nn { #1 } { nextlowerleftwithsep }
+ \semantex_data_int_incr:nn { #1 } { numberoflowerleftindices }
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_lowerleftaddright:nn#1#2{
- % adds to the lower index
+\cs_new:Npn\semantex_primitive_valuekey_lowerleftputright:nn#1#2{
\tl_if_blank:nF{#2} %This test really shouldn’t be made.
{
- \g_semantex_data_tl_put_right:nnn { #1 } { lower_left_index } { \exp_not:n{ #2 } }
- \g_semantex_data_bool_set_false:nn { #1 } { first_lower_left }
+ \semantex_data_tl_put_right:nnn { #1 } { lowerleft } { \exp_not:n{ #2 } }
+ \semantex_data_bool_set_true:nn { #1 } { nextlowerleftwithsep }
+ \semantex_data_int_incr:nn { #1 } { numberoflowerleftindices }
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_prelowerleft:nn#1#2{
- % adds to the lower index
+\cs_new:Npn\semantex_primitive_valuekey_prelowerleft:nn#1#2{
\tl_if_blank:nF{#2}
{
- \g_semantex_data_tl_put_left:nnn { #1 } { prelowerleft } { \exp_not:n{ #2 } }
+ \semantex_data_tl_put_left:nnn { #1 } { prelowerleft } { \exp_not:n{ #2 } }
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_postlowerleft:nn#1#2{
- % adds to the lower index
+\cs_new:Npn\semantex_primitive_valuekey_postlowerleft:nn#1#2{
\tl_if_blank:nF{#2}
{
- \g_semantex_data_tl_put_right:nnn { #1 } { postlowerleft } { \exp_not:n{ #2 } }
+ \semantex_data_tl_put_right:nnn { #1 } { postlowerleft } { \exp_not:n{ #2 } }
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_upperleftsep:nn#1#2{
- % adds to the upper index
- \g_semantex_data_bool_get:nnTF { #1 } { first_left_upper }
+\cs_new:Npn\semantex_primitive_valuekey_upperleftwithothersep:nn#1#2{
+ \semantex_data_bool_get:nnTF { #1 } { nextupperleftwithsep }
{
- \g_semantex_data_tl_put_left:nnn { #1 } { upper_left_index } {
- \exp_not:n { \g_semantex_primitive_upper_lower_auxiliary_second_arg:nn #2 }
+ \semantex_data_tl_put_left:nnn { #1 } { upperleft } {
+ \exp_not:n { \semantex_grab_second_argument_of_two:nn #2 \semantex_grab_first_argument_of_two:nn #2 }
}
}
{
- \g_semantex_data_tl_put_left:nnn { #1 } { upper_left_index } {
- \exp_not:n { \g_semantex_primitive_upper_lower_auxiliary_second_arg:nn #2 \g_semantex_primitive_upper_lower_auxiliary_first_arg:nn #2 }
+ \semantex_data_tl_put_left:nnn { #1 } { upperleft } {
+ \exp_not:n { \semantex_grab_second_argument_of_two:nn #2 }
}
}
- \g_semantex_data_bool_set_false:nn { #1 } { first_left_upper }
+ \semantex_data_bool_set_true:nn { #1 } { nextupperleftwithsep }
+ \semantex_data_int_incr:nn { #1 } { numberofupperleftindices }
}
-\cs_new:Npn\g_semantex_primitive_valuekey_lowerleftsep:nn#1#2{
- % adds to the lower index
- \g_semantex_data_bool_get:nnTF { #1 } { first_lower_left }
+\cs_new:Npn\semantex_primitive_valuekey_lowerleftwithothersep:nn#1#2{
+ \semantex_data_bool_get:nnTF { #1 } { nextlowerleftwithsep }
{
- \g_semantex_data_tl_put_left:nnn { #1 } { lower_left_index } {
- \exp_not:n { \g_semantex_primitive_upper_lower_auxiliary_second_arg:nn #2 }
+ \semantex_data_tl_put_left:nnn { #1 } { lowerleft } {
+ \exp_not:n { \semantex_grab_second_argument_of_two:nn #2 \semantex_grab_first_argument_of_two:nn #2 }
}
}
{
- \g_semantex_data_tl_put_left:nnn { #1 } { lower_left_index } {
- \exp_not:n { \g_semantex_primitive_upper_lower_auxiliary_second_arg:nn #2 \g_semantex_primitive_upper_lower_auxiliary_first_arg:nn #2 }
+ \semantex_data_tl_put_left:nnn { #1 } { lowerleft } {
+ \exp_not:n { \semantex_grab_second_argument_of_two:nn #2 }
}
}
- \g_semantex_data_bool_set_false:nn { #1 } { first_lower_left }
+ \semantex_data_bool_set_true:nn { #1 } { nextlowerleftwithsep }
+ \semantex_data_int_incr:nn { #1 } { numberoflowerleftindices }
}
-\cs_new:Npn\g_semantex_primitive_valuekey_cupperleft:nn#1#2{
- % adds to the upper index
+\cs_new:Npn\semantex_primitive_valuekey_clearlowerleft:nn#1#2{
+ \semantex_data_tl_clear:nn { #1 } { lowerleft }
+ \semantex_data_bool_set_false:nn { #1 } { nextlowerleftwithsep }
+ \semantex_data_int_clear:nn { #1 } { numberoflowerleftindices }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_clearprelowerleft:nn#1#2{
+ \semantex_data_tl_clear:nn { #1 } { prelowerleft }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_clearpostlowerleft:nn#1#2{
+ \semantex_data_tl_clear:nn { #1 } { prelowerleft }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_setlowerleftdots:nn#1#2
+{
+ \semantex_data_tl_set:nnn { #1 } { lowerleftdots } { \exp_not:n { #2 } }
+}
+
+\cs_generate_variant:Nn \semantex_primitive_valuekey_lowerleft:nn { nx }
+
+\cs_new:Npn\semantex_primitive_valuekey_lowerleftdots:nn#1#2
+{
+ \semantex_primitive_valuekey_lowerleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerleftdots } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_setlowerleftslot:nn#1#2
+{
+ \semantex_data_tl_set:nnn { #1 } { lowerleftslot } { \exp_not:n { #2 } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_lowerleftslot:nn#1#2
+{
+ \semantex_primitive_valuekey_lowerleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerleftslot } }
+}
+
+\cs_generate_variant:Nn \semantex_primitive_valuekey_slowerleft:nn { nx }
+
+\cs_new:Npn\semantex_primitive_valuekey_slowerleftdots:nn#1#2
+{
+ \semantex_primitive_valuekey_slowerleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerleftdots } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_slowerleftslot:nn#1#2
+{
+ \semantex_primitive_valuekey_slowerleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerleftslot } }
+}
+
+\cs_generate_variant:Nn \semantex_primitive_valuekey_clowerleft:nn { nx }
+
+\cs_new:Npn\semantex_primitive_valuekey_clowerleftdots:nn#1#2
+{
+ \semantex_primitive_valuekey_clowerleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerleftdots } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_clowerleftslot:nn#1#2
+{
+ \semantex_primitive_valuekey_clowerleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerleftslot } }
+}
+
+\cs_generate_variant:Nn \semantex_primitive_valuekey_lowerleftwithothersep:nn { nx }
+
+\cs_new:Npn\semantex_primitive_valuekey_lowerleftdotswithothersep:nn#1#2
+{
+ \semantex_primitive_valuekey_lowerleftwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { lowerleftdots } } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_lowerleftslotwithothersep:nn#1#2
+{
+ \semantex_primitive_valuekey_lowerleftwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { lowerleftslot } } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_cupperleft:nn#1#2{
\tl_if_blank:nF{#2}
{
- \g_semantex_data_bool_get:nnTF { #1 } { first_upper_left }
+ \semantex_data_bool_get:nnTF { #1 } { nextupperleftwithsep }
{
- \g_semantex_data_tl_put_left:nnn { #1 } { upper_left_index } { \exp_not:n { #2 } }
+ \semantex_data_tl_put_left:nnn { #1 } { upperleft } { \exp_not:n { #2 } , }
}
{
- \g_semantex_data_tl_put_left:nnn { #1 } { upper_left_index } { \exp_not:n { #2 } , }
+ \semantex_data_tl_put_left:nnn { #1 } { upperleft } { \exp_not:n { #2 } }
}
- \g_semantex_data_bool_set_false:nn { #1 } { first_upper_left }
+ \semantex_data_bool_set_true:nn { #1 } { nextupperleftwithsep }
+ \semantex_data_int_incr:nn { #1 } { numberofupperleftindices }
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_clowerleft:nn#1#2{
- % adds to the lower index
+\cs_new:Npn\semantex_primitive_valuekey_clowerleft:nn#1#2{
\tl_if_blank:nF{#2}
{
- \g_semantex_data_bool_get:nnTF { #1 } { first_lower_left }
+ \semantex_data_bool_get:nnTF { #1 } { nextlowerleftwithsep }
{
- \g_semantex_data_tl_put_left:nnn { #1 } { lower_left_index } { \exp_not:n { #2 } }
+ \semantex_data_tl_put_left:nnn { #1 } { lowerleft } { \exp_not:n { #2 } , }
}
{
- \g_semantex_data_tl_put_left:nnn { #1 } { lower_left_index } { \exp_not:n { #2 } , }
+ \semantex_data_tl_put_left:nnn { #1 } { lowerleft } { \exp_not:n { #2 } }
}
- \g_semantex_data_bool_set_false:nn { #1 } { first_lower_left }
+ \semantex_data_bool_set_true:nn { #1 } { nextlowerleftwithsep }
+ \semantex_data_int_incr:nn { #1 } { numberoflowerleftindices }
}
}
-
-\cs_new:Npn\g_semantex_primitive_valuekey_iffirstupperleft:nn#1#2
+\cs_new:Npn\semantex_primitive_valuekey_ifnextupperleftwithsep:nn#1#2
{
- \tl_if_eq:nnTF { #2 } { true }
+ \tl_if_eq:nnTF { #2 } { false }
{
- \g_semantex_data_bool_set_true:nn { #1 } { first_upper_left }
+ \semantex_data_bool_set_false:nn { #1 } { nextupperleftwithsep }
}
{
- \tl_if_eq:nnTF { #2 } { false }
+ \tl_if_eq:nnTF { #2 } { true }
{
- \g_semantex_data_bool_set_false:nn { #1 } { first_upper_left }
+ \semantex_data_bool_set_true:nn { #1 } { nextupperleftwithsep }
}
{
- %IM Throw error later
+ \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifnextupperleftwithsep_temp
+ \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifnextupperleftwithsep_temp } { ifnextupperleftwithsep } { #2 }
}
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_iffirstlowerleft:nn#1#2
+
+\cs_new:Npn\semantex_primitive_valuekey_ifnextlowerleftwithsep:nn#1#2
{
- \tl_if_eq:nnTF { #2 } { true }
+ \tl_if_eq:nnTF { #2 } { false }
{
- \g_semantex_data_bool_set_true:nn { #1 } { first_lower_left }
+ \semantex_data_bool_set_false:nn { #1 } { nextlowerleftwithsep }
}
{
- \tl_if_eq:nnTF { #2 } { false }
+ \tl_if_eq:nnTF { #2 } { true }
{
- \g_semantex_data_bool_set_false:nn { #1 } { first_lower_left }
+ \semantex_data_bool_set_true:nn { #1 } { nextlowerleftwithsep }
}
{
- %IM Throw error later
+ semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifnextlowerleftwithsep_temp
+ \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifnextlowerleftwithsep_temp } { ifnextlowerleftwithsep } { #2 }
}
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_setupperleftsep:nn#1#2
+\cs_new:Npn\semantex_primitive_valuekey_setupperleftsep:nn#1#2
{
- \g_semantex_data_tl_set:nnn { #1 } { upperleftsep } { \exp_not:n { #2 } }
+ \semantex_data_tl_set:nnn { #1 } { upperleftsep } { \exp_not:n { #2 } }
}
-\cs_new:Npn\g_semantex_primitive_valuekey_setlowerleftsep:nn#1#2
+\cs_new:Npn\semantex_primitive_valuekey_setlowerleftsep:nn#1#2
{
- \g_semantex_data_tl_set:nnn { #1 } { lowerleftsep } { \exp_not:n { #2 } }
+ \semantex_data_tl_set:nnn { #1 } { lowerleftsep } { \exp_not:n { #2 } }
}
-%---------------
-
% Contrary to what you might think, the following commands ARE
% sometimes needed.
-\cs_new:Npn\g_semantex_primitive_valuekey_iffirstd:nn#1#2
+\cs_new:Npn\semantex_primitive_valuekey_ifnextdwithsep:nn#1#2 % should be removed later
{
- \g_semantex_data_bool_get:nnTF { #1 } { upper_grading }
- { \g_semantex_primitive_valuekey_iffirstupper:nn { #1 } { #2 } }
- { \g_semantex_primitive_valuekey_iffirstlower:nn { #1 } { #2 } }
+ % Tells whether the d (degree) is empty or not
+ \str_if_eq:nnTF { #2 } { true }
+ {
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ { \semantex_primitive_valuekey_ifnextupperwithsep:nn { #1 } { #2 } }
+ { \semantex_primitive_valuekey_ifnextlowerwithsep:nn { #1 } { #2 } }
+ }
+ {
+ \str_if_eq:nnTF { #2 } { false }
+ {
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ { \semantex_primitive_valuekey_ifnextupperwithsep:nn { #1 } { #2 } }
+ { \semantex_primitive_valuekey_ifnextlowerwithsep:nn { #1 } { #2 } }
+ }
+ {
+ \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifnextdwithsep_temp
+ \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifnextdwithsep_temp } { ifnextdwithsep } { #2 }
+ }
+ }
}
-\cs_set_eq:NN\g_semantex_primitive_valuekey_iffirstdeg:nn\g_semantex_primitive_valuekey_iffirstd:nn
+\cs_set_eq:NN\semantex_primitive_valuekey_ifnextdegwithsep:nn\semantex_primitive_valuekey_ifnextdwithsep
-\cs_set_eq:NN\g_semantex_primitive_valuekey_iffirstdegree:nn\g_semantex_primitive_valuekey_iffirstd:nn
+\cs_set_eq:NN\semantex_primitive_valuekey_ifnextdegreewithsep:nn\semantex_primitive_valuekey_ifnextdwithsep
-\cs_new:Npn\g_semantex_primitive_valuekey_iffirsti:nn#1#2
+\cs_new:Npn\semantex_primitive_valuekey_ifnextiwithsep:nn#1#2
{
- \g_semantex_data_bool_get:nnTF { #1 } { upper_grading }
- { \g_semantex_primitive_valuekey_iffirstlower:nn { #1 } { #2 } }
- { \g_semantex_primitive_valuekey_iffirstupper:nn { #1 } { #2 } }
+ % Tells whether the i (index) is empty or not
+ \str_if_eq:nnTF { #2 } { true }
+ {
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ { \semantex_primitive_valuekey_ifnextlowerwithsep:nn { #1 } { #2 } }
+ { \semantex_primitive_valuekey_ifnextupperwithsep:nn { #1 } { #2 } }
+ }
+ {
+ \str_if_eq:nnTF { #2 } { false }
+ {
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ { \semantex_primitive_valuekey_ifnextlowerwithsep:nn { #1 } { #2 } }
+ { \semantex_primitive_valuekey_ifnextupperwithsep:nn { #1 } { #2 } }
+ }
+ {
+ \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifnextiwithsep_temp
+ \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifnextiwithsep_temp } { ifnextiwithsep } { #2 }
+ }
+ }
}
-\cs_set_eq:NN\g_semantex_primitive_valuekey_iffirstindex:nn\g_semantex_primitive_valuekey_iffirsti:nn
+\cs_set_eq:NN\semantex_primitive_valuekey_ifnextindexwithsep:nn\semantex_primitive_valuekey_ifnextiwithsep:nn
-\cs_new:Npn\g_semantex_primitive_valuekey_d:nn#1#2
+\cs_new:Npn\semantex_primitive_valuekey_d:nn#1#2
{
% adds to the d-index (upper by default)
- % I added an \exp_not:n here and in similar commands to
- % take care of \underbrace expansion issues. However,
- % I am puzzled as to why it was necessary.
- %\bool_if:cTF { semantex_data_bool_#1_if_upper_grading }
- \g_semantex_data_bool_get:nnTF { #1 } { upper_grading }
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \g_semantex_primitive_valuekey_upper:nn { #1 } { #2 }
+ \semantex_primitive_valuekey_upper:nn { #1 } { #2 }
}
{
- \g_semantex_primitive_valuekey_lower:nn { #1 } { #2 }
+ \semantex_primitive_valuekey_lower:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\g_semantex_primitive_valuekey_deg:nn\g_semantex_primitive_valuekey_d:nn
+\cs_set_eq:NN\semantex_primitive_valuekey_deg:nn\semantex_primitive_valuekey_d:nn
-\cs_set_eq:NN\g_semantex_primitive_valuekey_degree:nn\g_semantex_primitive_valuekey_d:nn
+\cs_set_eq:NN\semantex_primitive_valuekey_degree:nn\semantex_primitive_valuekey_d:nn
-\cs_new:Npn\g_semantex_primitive_valuekey_sd:nn#1#2
+\cs_new:Npn\semantex_primitive_valuekey_sd:nn#1#2
{
% adds to the d-index (upper by default)
- \g_semantex_data_bool_get:nnTF { #1 } { upper_grading }
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \g_semantex_primitive_valuekey_supper:nn { #1 } { #2 }
+ \semantex_primitive_valuekey_supper:nn { #1 } { #2 }
}
{
- \g_semantex_primitive_valuekey_slower:nn { #1 } { #2 }
+ \semantex_primitive_valuekey_slower:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\g_semantex_primitive_valuekey_sdeg:nn\g_semantex_primitive_valuekey_sd:nn
+\cs_set_eq:NN\semantex_primitive_valuekey_sdeg:nn\semantex_primitive_valuekey_sd:nn
-\cs_set_eq:NN\g_semantex_primitive_valuekey_sdegree:nn\g_semantex_primitive_valuekey_sd:nn
+\cs_set_eq:NN\semantex_primitive_valuekey_sdegree:nn\semantex_primitive_valuekey_sd:nn
-\cs_new:Npn\g_semantex_primitive_valuekey_cd:nn#1#2{ %IM Maybe remove this.
+\cs_new:Npn\semantex_primitive_valuekey_cd:nn#1#2{ %IM Maybe remove this.
% adds to the d-index (upper by default)
- \g_semantex_data_bool_get:nnTF { #1 } { upper_grading }
- {
- \g_semantex_primitive_valuekey_cupper:nn { #1 } { #2 }
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_cupper:nn { #1 } { #2 }
}
{
- \g_semantex_primitive_valuekey_clower:nn { #1 } { #2 }
+ \semantex_primitive_valuekey_clower:nn { #1 } { #2 }
}
}
+\cs_set_eq:NN\semantex_primitive_valuekey_sdeg:nn\semantex_primitive_valuekey_cd:nn
+\cs_set_eq:NN\semantex_primitive_valuekey_sdegree:nn\semantex_primitive_valuekey_cd:nn
-\cs_set_eq:NN\g_semantex_primitive_valuekey_cdeg:nn\g_semantex_primitive_valuekey_cd:nn
-
-\cs_set_eq:NN\g_semantex_primitive_valuekey_cdegree:nn\g_semantex_primitive_valuekey_cd:nn
+\cs_new:Npn\semantex_primitive_valuekey_i:nn#1#2{
+ % adds to the i-index (lower by default)
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_lower:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_upper:nn { #1 } { #2 }
+ }
+}
+\cs_set_eq:NN\semantex_primitive_valuekey_index:nn\semantex_primitive_valuekey_i:nn
-\cs_new:Npn\g_semantex_primitive_valuekey_i:nn#1#2{
+\cs_new:Npn\semantex_primitive_valuekey_si:nn#1#2{
% adds to the i-index (lower by default)
- %\bool_if:cTF { semantex_data_bool_#1_if_upper_grading }
- \g_semantex_data_bool_get:nnTF { #1 } { upper_grading }
- {
- \g_semantex_primitive_valuekey_lower:nn { #1 } { #2 }
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_slower:nn { #1 } { #2 }
}
{
- \g_semantex_primitive_valuekey_upper:nn { #1 } { #2 }
+ \semantex_primitive_valuekey_supper:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\g_semantex_primitive_valuekey_index:nn\g_semantex_primitive_valuekey_i:nn
+\cs_set_eq:NN\semantex_primitive_valuekey_sindex:nn\semantex_primitive_valuekey_si:nn
-\cs_new:Npn\g_semantex_primitive_valuekey_si:nn#1#2{
+\cs_new:Npn\semantex_primitive_valuekey_ci:nn#1#2{
% adds to the i-index (lower by default)
- \g_semantex_data_bool_get:nnTF { #1 } { upper_grading }
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \g_semantex_primitive_valuekey_slower:nn { #1 } { #2 }
+ \semantex_primitive_valuekey_clower:nn { #1 } { #2 }
}
{
- \g_semantex_primitive_valuekey_supper:nn { #1 } { #2 }
+ \semantex_primitive_valuekey_cupper:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\g_semantex_primitive_valuekey_sindex:nn\g_semantex_primitive_valuekey_si:nn
+\cs_set_eq:NN\semantex_primitive_valuekey_cindex:nn\semantex_primitive_valuekey_ci:nn
+
-\cs_new:Npn\g_semantex_primitive_valuekey_ci:nn#1#2{
+
+\cs_new:Npn\semantex_primitive_valuekey_dwithothersep:nn#1#2
+{
+ % adds to the d-index (upper by default)
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_upperwithothersep:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_lowerwithothersep:nn { #1 } { #2 }
+ }
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_degwithothersep:nn\semantex_primitive_valuekey_dwithothersep:nn
+
+\cs_set_eq:NN\semantex_primitive_valuekey_degreewithothersep:nn\semantex_primitive_valuekey_dwithothersep:nn
+
+
+\cs_new:Npn\semantex_primitive_valuekey_iwithothersep:nn#1#2{
% adds to the i-index (lower by default)
- %\bool_if:cTF { semantex_data_bool_#1_if_upper_grading }
- \g_semantex_data_bool_get:nnTF { #1 } { upper_grading }
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \g_semantex_primitive_valuekey_clower:nn { #1 } { #2 }
+ \semantex_primitive_valuekey_lowerwithothersep:nn { #1 } { #2 }
}
{
- \g_semantex_primitive_valuekey_cupper:nn { #1 } { #2 }
+ \semantex_primitive_valuekey_upperwithothersep:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\g_semantex_primitive_valuekey_cindex:nn\g_semantex_primitive_valuekey_ci:nn
+\cs_set_eq:NN\semantex_primitive_valuekey_indexwithothersep:nn\semantex_primitive_valuekey_iwithothersep:nn
+
+\cs_new:Npn\semantex_primitive_valuekey_setdsep:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_setuppersep:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_setlowersep:nn { #1 } { #2 }
+ }
+}
+\cs_set_eq:NN\semantex_primitive_valuekey_setdegsep:nn\semantex_primitive_valuekey_setdsep:nn
-\cs_new:Npn\g_semantex_primitive_valuekey_par:nn#1#2{
- % sets the size of the parentheses
- \g_semantex_data_tl_set:nnn { #1 } { par_size }{ \exp_not:n { #2 } }
- \g_semantex_primitive_valuekey_ifpar:nn { #1 } { true }
+\cs_set_eq:NN\semantex_primitive_valuekey_setdegreesep:nn\semantex_primitive_valuekey_setdsep:nn
+
+\cs_new:Npn\semantex_primitive_valuekey_setisep:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_setlowersep:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_setuppersep:nn { #1 } { #2 }
+ }
}
+\cs_set_eq:NN\semantex_primitive_valuekey_setindexsep:nn\semantex_primitive_valuekey_setisep:nn
-\cs_new:Npn\g_semantex_primitive_valuekey_parsize:nn#1#2{
- % sets the size of the parentheses
- \g_semantex_data_tl_set:nnn { #1 } { par_size }{ \exp_not:n { #2 } }
+\cs_new:Npn\semantex_primitive_valuekey_pred:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_preupper:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_prelower:nn { #1 } { #2 }
+ }
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_predeg:nn\semantex_primitive_valuekey_pred:nn
+
+\cs_set_eq:NN\semantex_primitive_valuekey_predegree:nn\semantex_primitive_valuekey_pred:nn
+
+\cs_new:Npn\semantex_primitive_valuekey_postd:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_postupper:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_postlower:nn { #1 } { #2 }
+ }
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_postdeg:nn\semantex_primitive_valuekey_postd:nn
+
+\cs_set_eq:NN\semantex_primitive_valuekey_postdegree:nn\semantex_primitive_valuekey_postd:nn
+
+
+\cs_set:Npn\semantex_primitive_valuekey_cleard:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_clearupper:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_clearlower:nn { #1 } { #2 }
+ }
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_cleardeg:nn\semantex_primitive_valuekey_cleard:nn
+
+\cs_set_eq:NN\semantex_primitive_valuekey_cleardegree:nn\semantex_primitive_valuekey_cleard:nn
+
+
+\cs_set:Npn\semantex_primitive_valuekey_clearpred:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_clearpreupper:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_clearprelower:nn { #1 } { #2 }
+ }
}
+\cs_set_eq:NN\semantex_primitive_valuekey_clearpredeg:nn\semantex_primitive_valuekey_clearpred:nn
+\cs_set_eq:NN\semantex_primitive_valuekey_clearpredegree:nn\semantex_primitive_valuekey_clearpred:nn
-\cs_new:Npn\g_semantex_primitive_valuekey_leftpar:nn#1#2{
-% \g_semantex_data_tl_set:nnn { #1 } { par_open }{ \exp_not:n { #2 } }
- \tl_set:cn { semantex_data_tl_#1_par_open }{ \exp_not:n { #2 } }
+\cs_set:Npn\semantex_primitive_valuekey_clearpostd:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_clearpostupper:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_clearpostlower:nn { #1 } { #2 }
+ }
}
+\cs_set_eq:NN\semantex_primitive_valuekey_clearpostdeg:nn\semantex_primitive_valuekey_clearpostd:nn
+
+\cs_set_eq:NN\semantex_primitive_valuekey_clearpostdegree:nn\semantex_primitive_valuekey_clearpostd:nn
+
+
+\cs_new:Npn\semantex_primitive_valuekey_prei:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_prelower:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_preupper:nn { #1 } { #2 }
+ }
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_preindex:nn\semantex_primitive_valuekey_prei:nn
+
+\cs_new:Npn\semantex_primitive_valuekey_posti:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_postlower:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_postupper:nn { #1 } { #2 }
+ }
+}
+\cs_set_eq:NN\semantex_primitive_valuekey_postindex:nn\semantex_primitive_valuekey_posti:nn
+\cs_set:Npn\semantex_primitive_valuekey_cleari:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_clearlower:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_clearupper:nn { #1 } { #2 }
+ }
+}
+\cs_set_eq:NN\semantex_primitive_valuekey_clearindex:nn\semantex_primitive_valuekey_cleari:nn
-\cs_new:Npn\g_semantex_primitive_valuekey_rightpar:nn#1#2{
- \g_semantex_data_tl_set:nnn { #1 } { par_close }{ \exp_not:n { #2 } }
+\cs_set:Npn\semantex_primitive_valuekey_clearprei:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_clearprelower:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_clearpreupper:nn { #1 } { #2 }
+ }
}
+\cs_set_eq:NN\semantex_primitive_valuekey_clearpreindex:nn\semantex_primitive_valuekey_clearprei:nn
-\cs_new:Npn\g_semantex_primitive_valuekey_ifpar:nn#1#2{ %IMPLEMENT THIS
+\cs_set:Npn\semantex_primitive_valuekey_clearposti:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_clearpostlower:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_clearpostupper:nn { #1 } { #2 }
+ }
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_clearpostindex:nn\semantex_primitive_valuekey_clearposti:nn
+
+
+\cs_new:Npn\semantex_primitive_valuekey_setddots:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_data_tl_set:nnn { #1 } { upperdots } { \exp_not:n s{ #2 } }
+ }
+ {
+ \semantex_data_tl_set:nnn { #1 } { lowerdots } { \exp_not:n { #2 } }
+ }
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_setdegdots:nn\semantex_primitive_valuekey_setddots:nn
+
+\cs_set_eq:NN\semantex_primitive_valuekey_setdegreedots:nn\semantex_primitive_valuekey_setddots:nn
+
+\cs_new:Npn\semantex_primitive_valuekey_ddots:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_upperdots:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_lowerdots:nn { #1 } { #2 }
+ }
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_degdots:nn\semantex_primitive_valuekey_ddots:nn
+
+\cs_set_eq:NN\semantex_primitive_valuekey_degreedots:nn\semantex_primitive_valuekey_ddots:nn
+
+\cs_new:Npn\semantex_primitive_valuekey_setdslot:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_setupperslot:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_setlowerslot:nn { #1 } { #2 }
+ }
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_setdegslot:nn\semantex_primitive_valuekey_setdslot:nn
+
+\cs_set_eq:NN\semantex_primitive_valuekey_setdegreeslot:nn\semantex_primitive_valuekey_setdslot:nn
+
+\cs_new:Npn\semantex_primitive_valuekey_dslot:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_upperslot:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_lowerslot:nn { #1 } { #2 }
+ }
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_degslot:nn\semantex_primitive_valuekey_dslot:nn
+
+\cs_set_eq:NN\semantex_primitive_valuekey_degreeslot:nn\semantex_primitive_valuekey_dslot:nn
+
+\cs_new:Npn\semantex_primitive_valuekey_sddots:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_supperdots:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_slowerdots:nn { #1 } { #2 }
+ }
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_sdegdots:nn\semantex_primitive_valuekey_sddots:nn
+
+\cs_set_eq:NN\semantex_primitive_valuekey_sdegreedots:nn\semantex_primitive_valuekey_sddots:nn
+
+
+\cs_new:Npn\semantex_primitive_valuekey_sdslot:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_supperslot:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_slowerslot:nn { #1 } { #2 }
+ }
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_sdegslot:nn\semantex_primitive_valuekey_sdslot:nn
+
+\cs_set_eq:NN\semantex_primitive_valuekey_sdegreeslot:nn\semantex_primitive_valuekey_sdslot:nn
+
+\cs_new:Npn\semantex_primitive_valuekey_cddots:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_cupperdots:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_clowerdots:nn { #1 } { #2 }
+ }
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_cdegdots:nn\semantex_primitive_valuekey_cddots:nn
+
+\cs_set_eq:NN\semantex_primitive_valuekey_cdegreedots:nn\semantex_primitive_valuekey_cddots:nn
+
+\cs_new:Npn\semantex_primitive_valuekey_cdslot:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_cupperslot:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_clowerslot:nn { #1 } { #2 }
+ }
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_cdegslot:nn\semantex_primitive_valuekey_cdslot:nn
+
+\cs_set_eq:NN\semantex_primitive_valuekey_cdegreeslot:nn\semantex_primitive_valuekey_cdslot:nn
+
+\cs_new:Npn\semantex_primitive_valuekey_ddotswithothersep:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_upperdotswithothersep:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_lowerdotswithothersep:nn { #1 } { #2 }
+ }
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_degdotswithothersep:nn\semantex_primitive_valuekey_ddotswithothersep:nn
+
+\cs_set_eq:NN\semantex_primitive_valuekey_degreedotswithothersep:nn\semantex_primitive_valuekey_ddotswithothersep:nn
+
+\cs_new:Npn\semantex_primitive_valuekey_dslotwithothersep:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_upperslotwithothersep:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_lowerslotwithothersep:nn { #1 } { #2 }
+ }
+}
+
+
+
+%----------------------------------------------------------
+
+\cs_new:Npn\semantex_primitive_valuekey_setidots:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_data_tl_set:nnn { #1 } { lowerdots } { \exp_not:n { #2 } }
+ }
+ {
+ \semantex_data_tl_set:nnn { #1 } { upperdots } { \exp_not:n { #2 } }
+ }
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_setindexdots:nn\semantex_primitive_valuekey_setidots:nn
+
+\cs_set_eq:NN\semantex_primitive_valuekey_setdegreedots:nn\semantex_primitive_valuekey_setidots:nn
+
+\cs_new:Npn\semantex_primitive_valuekey_idots:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_lowerdots:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_upperdots:nn { #1 } { #2 }
+ }
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_indexdots:nn\semantex_primitive_valuekey_idots:nn
+
+\cs_set_eq:NN\semantex_primitive_valuekey_degreedots:nn\semantex_primitive_valuekey_idots:nn
+
+\cs_new:Npn\semantex_primitive_valuekey_setislot:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_setlowerslot:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_setupperslot:nn { #1 } { #2 }
+ }
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_setindexslot:nn\semantex_primitive_valuekey_setislot:nn
+
+\cs_set_eq:NN\semantex_primitive_valuekey_setdegreeslot:nn\semantex_primitive_valuekey_setislot:nn
+
+\cs_new:Npn\semantex_primitive_valuekey_islot:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_lowerslot:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_upperslot:nn { #1 } { #2 }
+ }
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_indexslot:nn\semantex_primitive_valuekey_islot:nn
+
+\cs_set_eq:NN\semantex_primitive_valuekey_degreeslot:nn\semantex_primitive_valuekey_islot:nn
+
+\cs_new:Npn\semantex_primitive_valuekey_sidots:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_slowerdots:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_supperdots:nn { #1 } { #2 }
+ }
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_sindexdots:nn\semantex_primitive_valuekey_sidots:nn
+
+\cs_set_eq:NN\semantex_primitive_valuekey_sdegreedots:nn\semantex_primitive_valuekey_sidots:nn
+
+
+\cs_new:Npn\semantex_primitive_valuekey_sislot:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_slowerslot:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_supperslot:nn { #1 } { #2 }
+ }
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_sindexslot:nn\semantex_primitive_valuekey_sislot:nn
+
+\cs_set_eq:NN\semantex_primitive_valuekey_sdegreeslot:nn\semantex_primitive_valuekey_sislot:nn
+
+\cs_new:Npn\semantex_primitive_valuekey_cidots:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_clowerdots:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_cupperdots:nn { #1 } { #2 }
+ }
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_cindexdots:nn\semantex_primitive_valuekey_cidots:nn
+
+\cs_set_eq:NN\semantex_primitive_valuekey_cdegreedots:nn\semantex_primitive_valuekey_cidots:nn
+
+\cs_new:Npn\semantex_primitive_valuekey_cislot:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_clowerslot:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_cupperslot:nn { #1 } { #2 }
+ }
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_cindexslot:nn\semantex_primitive_valuekey_cislot:nn
+
+\cs_set_eq:NN\semantex_primitive_valuekey_cdegreeslot:nn\semantex_primitive_valuekey_cislot:nn
+
+\cs_new:Npn\semantex_primitive_valuekey_idotswithothersep:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_lowerdotswithothersep:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_upperdotswithothersep:nn { #1 } { #2 }
+ }
+}
+
+\cs_set_eq:NN\semantex_primitive_valuekey_indexdotswithothersep:nn\semantex_primitive_valuekey_idotswithothersep:nn
+
+\cs_set_eq:NN\semantex_primitive_valuekey_degreedotswithothersep:nn\semantex_primitive_valuekey_idotswithothersep:nn
+
+\cs_new:Npn\semantex_primitive_valuekey_islotwithothersep:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 } { uppergrading }
+ {
+ \semantex_primitive_valuekey_lowerslotwithothersep:nn { #1 } { #2 }
+ }
+ {
+ \semantex_primitive_valuekey_upperslotwithothersep:nn { #1 } { #2 }
+ }
+}
+
+%----------------------------------------------------------
+
+\cs_set_eq:NN\semantex_primitive_valuekey_degslotwithothersep:nn\semantex_primitive_valuekey_dslotwithothersep:nn
+
+\cs_set_eq:NN\semantex_primitive_valuekey_degreeslotwithothersep:nn\semantex_primitive_valuekey_dslotwithothersep:nn
+
+\cs_new:Npn\semantex_primitive_valuekey_par:nn#1#2{
+ % Turns parentheses on, and sets their size
+ \semantex_data_tl_set:nnn { #1 } { parsize }{ \exp_not:n { #2 } }
+ \semantex_primitive_valuekey_ifpar:nn { #1 } { true }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_parsize:nn#1#2{
+ % Sets the size of the parentheses
+ \semantex_data_tl_set:nnn { #1 } { parsize }{ \exp_not:n { #2 } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_leftpar:nn#1#2{
+ \semantex_data_tl_set:nnn { #1 } { leftpar }{ \exp_not:n { #2 } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_rightpar:nn#1#2{
+ \semantex_data_tl_set:nnn { #1 } { rightpar }{ \exp_not:n { #2 } }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_ifpar:nn#1#2{ %IMPLEMENT THIS
% tells whether to use the output class or not
- \g_semantex_data_bool_provide:nn { #1 } { par }
+ \semantex_data_bool_provide:nn { #1 } { par }
\str_if_eq:nnTF { #2 } { true }
{
- \g_semantex_data_bool_set_true:nn { #1 } { par }
+ \semantex_data_bool_set_true:nn { #1 } { par }
+ \semantex_data_bool_set_false:nn { #1 } { flexpar }
}
{
- \str_if_eq:nnTF { #2 } { false }
+ \str_if_eq:nnTF { #2 } { never }
{
- \g_semantex_data_bool_set_false:nn { #1 } { par }
+ \semantex_data_bool_set_false:nn { #1 } { par }
+ \semantex_data_bool_set_false:nn { #1 } { flexpar }
}
{
- %IM do nothing right now, but should
- %IM probably throw an error
+ \str_if_eq:nnTF { #2 } { false }
+ {
+ \semantex_data_bool_set_false:nn { #1 } { par }
+ \semantex_data_bool_set_true:nn { #1 } { flexpar }
+ }
+ {
+ \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifpar_temp
+ \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifpar_temp } { ifpar } { #2 }
+ }
}
}
}
-
-
-\cs_new:Npn\g_semantex_primitive_valuekey_spar:nn#1#2
+\cs_new:Npn\semantex_primitive_valuekey_spar:nn#1#2
{
+ % Abbreviation for "symbol parentheses"
+ % Adds parentheses around the current symbol
+ \semantex_primitive_valuekey_return:nn { #1 }{}
+ \semantex_data_tl_inherit:nn { #1 } { symbol } % Check if really necessary
\tl_if_blank:nTF { #2 }
{
- \g_semantex_primitive_valuekey_return:nn { #1 }{}
- \g_semantex_data_tl_set:nnx { #1 } { symbol }
+ \semantex_data_tl_get_store:nnN { #1 } { sparsize } \l__semantex_primitive_valuekey_spar_sparsize_temp
+ \__semantex_symbol_parentheses_store:nnnnN
+ { \l__semantex_primitive_valuekey_spar_sparsize_temp }
+ { \semantex_data_tl_get:nn { #1 } { leftspar } }
+ { \semantex_data_tl_get:nn { #1 } { rightspar } }
+ { \semantex_data_tl_get_exp_not:nn { #1 } { symbol } }
+ \l__semantex_primitive_valuekey_spar_temp
+ \semantex_data_tl_set:nnx { #1 } { symbol }
{
- { \g_semantex_data_tl_get_exp_not:nn { #1 } { spar_size } }
- %IM like in _return
- { \g_semantex_data_tl_get:nn { #1 } { spar_open } }
- { \g_semantex_data_tl_get:nn { #1 } { spar_close } }
- { \g_semantex_data_tl_get_exp_not:nn { #1 } { symbol } }
-% { \l__semantex_spar_symbol_temp }
- }
- \g_semantex_data_tl_put_left:nnn { #1 } { symbol }
- {
- \exp_not:N
- \g_semantex_symbol_parentheses:nnnn
+ \exp_not:V\l__semantex_primitive_valuekey_spar_temp
}
}
{
- \g_semantex_data_tl_inherit:nn { #1 } { symbol }
- \g_semantex_primitive_valuekey_return:nn { #1 }{}
- \g_semantex_data_tl_set:nnx { #1 } { symbol }
+ \tl_set:Nn \l__semantex_primitive_valuekey_spar_sparsize_temp { \exp_not:n { #2 } }
+ \__semantex_symbol_parentheses_store:nnnnN
+ { \l__semantex_primitive_valuekey_spar_sparsize_temp }
+ { \semantex_data_tl_get:nn { #1 } { leftspar } }
+ { \semantex_data_tl_get:nn { #1 } { rightspar } }
+ { \semantex_data_tl_get_exp_not:nn { #1 } { symbol } }
+ \l__semantex_primitive_valuekey_spar_temp
+ \semantex_data_tl_set:nnx { #1 } { symbol }
{
- { \exp_not:n { \exp_not:n { #2 } } }
- { \g_semantex_data_tl_get:nn { #1 } { spar_open } }
- { \g_semantex_data_tl_get:nn { #1 } { spar_close } }
- { \g_semantex_data_tl_get_exp_not:nn { #1 } { symbol } }
- }
- \g_semantex_data_tl_put_left:nnn { #1 } { symbol }
- {
- \exp_not:N
- \g_semantex_symbol_parentheses:nnnn
+ \exp_not:V\l__semantex_primitive_valuekey_spar_temp
}
}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_iffirstarg:nn#1#2
+\cs_new:Npn\semantex_primitive_valuekey_ifnextargwithsep:nn#1#2
{
+ % Tells whether it is the first argument or not
\tl_if_eq:nnTF { #2 } { true }
{
- \g_semantex_data_bool_set_true:nn { #1 } { first_arg }
+ \semantex_data_bool_set_true:nn { #1 } { nextargwithsep }
}
{
\tl_if_eq:nnTF { #2 } { false }
{
- \g_semantex_data_bool_set_false:nn { #1 } { first_arg }
+ \semantex_data_bool_set_false:nn { #1 } { nextargwithsep }
}
{
- %IM Throw error later
+ \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifnextargwithsep_temp
+ \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifnextargwithsep_temp } { ifnextargwithsep } { #2 }
}
}
}
-\cs_new:Npn\g_semantex_auxiliary_first_arg:nn#1#2 { #1 }
-\cs_new:Npn\g_semantex_auxiliary_second_arg:nn#1#2 { #2 }
-
-%\cs_new:Npn\g_semantex_primitive_valuekey_otherspar:nn#1#2
-%{
-% \g_semantex_data_tl_inherit:nn { #1 } { spar_size }
-% \g_semantex_data_tl_inherit:nn { #1 } { symbol }
-% \g_semantex_primitive_novaluekey_return:n { #1 }
-%% \tl_set:Nn\l__semantex_spar_temp
-%% {
-%% \exp_not:N
-%% \g_semantex_symbol_parentheses:nnnn
-%% }
-%% \tl_put_right:Nx\l__semantex_spar_temp
-%% {
-%% { \exp_not:v { semantex_data_tl_#1_spar_size } }
-%% { \g_semantex_auxiliary_first_arg:nn#2 }
-%% { \g_semantex_auxiliary_second_arg:nn#2 }
-%% { \exp_not:v { semantex_data_tl_#1_symbol } }
-%% }
-%% \tl_set:cx { semantex_data_tl_#1_symbol } { \exp_not:V\l__semantex_spar_temp }
-% \tl_set:cx { semantex_data_tl_#1_symbol }
-% {
-% %{ \exp_not:c { semantex_data_tl_#1_spar_size } }
-% { \exp_not:n { \use:c { semantex_data_tl_#1_spar_size } } }
-% { \g_semantex_auxiliary_first_arg:nn #2 }
-% { \g_semantex_auxiliary_second_arg:nn #2 }
-% { \exp_not:v { semantex_data_tl_#1_symbol } }
-% }
-% \tl_put_left:cn { semantex_data_tl_#1_symbol }
-% {
-% \exp_not:N
-% \g_semantex_symbol_parentheses:nnnn
-% }
-%}
-
-\cs_new:Npn\g_semantex_primitive_valuekey_otherspar:nn#1#2
+\cs_new:Npn\semantex_primitive_valuekey_otherspar:nn#1#2
{
- \g_semantex_primitive_valuekey_otherspar_auxiliary:nnn { #1 } #2
+ % Uses the syntax otherspar={leftpar}{rightpar}
+ % Adds a new spar, but with these as parentheses
+ \__semantex_primitive_valuekey_otherspar_auxiliary:nnn { #1 } #2
}
-\cs_new:Npn\g_semantex_primitive_valuekey_otherspar_auxiliary:nnn#1#2#3
+\cs_new:Npn\__semantex_primitive_valuekey_otherspar_auxiliary:nnn#1#2#3
{
- %IM DOES NOT WORK!!!!!
- \g_semantex_data_tl_inherit:nn { #1 } { spar_size }
- \g_semantex_data_tl_get_store:nnN { #1 } { spar_size } \l__semantex_otherspar_spar_size_temp
- \g_semantex_data_tl_inherit:nn { #1 } { symbol }
- \g_semantex_primitive_valuekey_return:nn { #1 }{}
-% \tl_set:Nn\l__semantex_spar_temp
-% {
-% \exp_not:N
-% \g_semantex_symbol_parentheses:nnnn
-% }
-% \tl_put_right:Nx\l__semantex_spar_temp
-% {
-% { \exp_not:v { semantex_data_tl_#1_spar_size } }
-% { \g_semantex_auxiliary_first_arg:nn#2 }
-% { \g_semantex_auxiliary_second_arg:nn#2 }
-% { \exp_not:v { semantex_data_tl_#1_symbol } }
-% }
-% \tl_set:cx { semantex_data_tl_#1_symbol } { \exp_not:V\l__semantex_spar_temp }
- \g_semantex_data_tl_set:nnx { #1 } { symbol }
+ \semantex_data_tl_inherit:nn { #1 } { sparsize } % This is necessary for unknown reasons -- otherwise, it will crash when inheriting sparsize
+ \semantex_data_tl_inherit:nn { #1 } { symbol }
+ \semantex_primitive_valuekey_return:nn { #1 }{}
+ \semantex_data_tl_get_store:nnN { #1 } { sparsize } \l__semantex_primitive_valuekey_otherspar_sparsize_temp
+ \__semantex_symbol_parentheses_store:nnnnN
+ { \l__semantex_primitive_valuekey_otherspar_sparsize_temp }
+ { \exp_not:n { \exp_not:n { #2 } } }
+ { \exp_not:n { \exp_not:n { #3 } } }
+ { \semantex_data_tl_get_exp_not:nn { #1 } { symbol } }
+ \l__semantex_primitive_valuekey_otherspar_temp
+ \semantex_data_tl_set:nnx { #1 } { symbol }
{
- %{ \exp_not:c { semantex_data_tl_#1_spar_size } }
- %{ \exp_not:n { \use:c { semantex_data_tl_#1_spar_size } } }
- %{ normal }
- %{ \exp_not:n { \exp_not:v { semantex_data_tl_#1_spar_size } } }
- { \exp_not:V \l__semantex_otherspar_spar_size_temp }
- { \exp_not:n { \exp_not:n { #2 } } }
- { \exp_not:n { \exp_not:n { #3 } } }
- { \g_semantex_data_tl_get_exp_not:nn { #1 } { symbol } }
+ \exp_not:V\l__semantex_primitive_valuekey_otherspar_temp
}
- \g_semantex_data_tl_put_left:nnn { #1 } { symbol }
+}
+
+\cs_new:Npn\semantex_primitive_valuekey_Otherspar:nn#1#2
+{
+ % Uses the syntax otherspar={leftpar}{rightpar}{size}
+ % Adds a new spar, but with these as parentheses and size
+ \__semantex_primitive_valuekey_Otherspar_auxiliary:nnnn { #1 } #2
+}
+
+\cs_new:Npn\__semantex_primitive_valuekey_Otherspar_auxiliary:nnnn#1#2#3#4
+{
+ \tl_set:Nn\l__semantex_primitive_valuekey_Otherspar_sparsize_temp
+ { \exp_not:n { #4 } }
+ \__semantex_symbol_parentheses_store:nnnnN
+ { \l__semantex_primitive_valuekey_Otherspar_sparsize_temp }
+ { \exp_not:n { \exp_not:n { #2 } } }
+ { \exp_not:n { \exp_not:n { #3 } } }
+ { \semantex_data_tl_get_exp_not:nn { #1 } { symbol } }
+ \l__semantex_primitive_valuekey_Otherspar_temp
+ \semantex_data_tl_set:nnx { #1 } { symbol }
{
- \exp_not:N
- \g_semantex_symbol_parentheses:nnnn
+ \exp_not:V\l__semantex_primitive_valuekey_Otherspar_temp
}
-% \tl_put_left:cx { g_auomath_#1_symbol }
-% {
-% \exp_not:N
-% \g_semantex_symbol_parentheses:nnnn
-% }
- %\tl_put_left:cn { semantex_data_tl_#1_symbol }
- %{
- % \exp_not:N
- % \g_semantex_symbol_parentheses:nnnn
- %}
}
-\cs_new:Npn\g_semantex_primitive_valuekey_sparsize:nn#1#2{
+\cs_new:Npn\semantex_primitive_valuekey_sparsize:nn#1#2{
% sets the size of the parentheses
- \g_semantex_data_tl_set:nnn { #1 } { spar_size }{ \exp_not:n { #2 } }
+ \semantex_data_tl_set:nnn { #1 } { sparsize }{ \exp_not:n { #2 } }
}
-\cs_new:Npn\g_semantex_primitive_valuekey_leftspar:nn#1#2{
- \g_semantex_data_tl_set:nnn { #1 } { spar_open }{ \exp_not:n { \exp_not:n { #2 } } }
+\cs_new:Npn\semantex_primitive_valuekey_leftspar:nn#1#2{
+ \semantex_data_tl_set:nnn { #1 } { leftspar }{ \exp_not:n { \exp_not:n { #2 } } }
%IM Two \exp_not necessary for unknown reasons
%IM Doing the same at leftpar yields an error.
}
-\cs_new:Npn\g_semantex_primitive_valuekey_rightspar:nn#1#2{
- \g_semantex_data_tl_set:nnn { #1 } { spar_close }{ \exp_not:n { \exp_not:n { #2 } } }
+\cs_new:Npn\semantex_primitive_valuekey_rightspar:nn#1#2{
+ \semantex_data_tl_set:nnn { #1 } { rightspar }{ \exp_not:n { \exp_not:n { #2 } } }
%IM Two \exp_not necessary for unknown reasons
%IM Doing the same at leftpar yields an error.
}
+\cs_generate_variant:Nn \semantex_keys_set:nn { nx, no, nV } % Only the first one is currently being used
-
-
-
-
-%\msg_new:nnnn { semantex } { singlekey_not_found } { Unknown~key~#1~passed~to~object~#2~on~input~line~\msg_line_number: } {}
-
-\cs_generate_variant:Nn \g_semantex_keys_set:nn { nx, no, nV }
-
-\cs_generate_variant:Nn \exp_args:Nnx { cnx }
-
-\cs_new:Npn \g_semantex_valuekey:nnn#1#2#3{
- % Takes care of valuekeys, keys with a value
+\cs_new:Npn \semantex_valuekey:nnn#1#2#3{
+ % Takes care of valuekeys, keys taking a value
% For the sake of implementation, the arguments
% come in a strange order
% #1 = value of key
% #2 = name of the key
% #3 = object
- %\tl_set:Nn\l_semantex_key_value_temp{#1}
- \tl_set:Nn\l_semantex_key_value_temp{\exp_not:n{#1}}
- %\tl_set:Nx\l_semantex_key_value_temp{\exp_not:n{\exp_not:n{#1}}} % stores the content of the key in the temporary command \l_semantex_key_value_temp
- %\tl_set:Nn\l_semantex_key_value_temp{#1}
- %\tl_set:No\l_semantex_key_value_temp{\exp_not:n{#1}} % stores the content of the key in the temporary command \l_semantex_key_value_temp
+ \tl_set:Nn\l__semantex_key_value_temp{\exp_not:n{#1}}
%IM think about using extra {...} to avoid interference with keyval str
- \g_semantex_valuekey_get:nnNTF { #3 } { #2 } \l_semantex_custom_valuekey_temp
+ \semantex_valuekey_get:nnNTF { #3 } { #2 } \l__semantex_custom_valuekey_temp
{
- \g_semantex_keys_set:nx { #3 }
- { \l_semantex_custom_valuekey_temp }
+ \semantex_keys_set:nx { #3 }
+ { \l__semantex_custom_valuekey_temp }
}
{
- \cs_if_exist:cTF { g_semantex_primitive_valuekey_#2:nn }
+ \cs_if_exist:cTF { semantex_primitive_valuekey_#2:nn }
{
- \use:c { g_semantex_primitive_valuekey_#2:nn }{ #3 }{ #1 }
+ \use:c { semantex_primitive_valuekey_#2:nn }{ #3 }{ #1 }
}
{
- \msg_error:nnnn { semantex } { keyval_not_found } { #2 } { #3 }
+ \semantex_error_output_format:nN { #3 } \__semantex_valuekey_unknown_key_temp
+ \msg_error:nnxn { semantex } { valuekey_not_found } { \__semantex_valuekey_unknown_key_temp } { #2 }
}
}
}
-\cs_generate_variant:Nn \g_semantex_keys_set:nn { nx }
-
-\cs_new:Npn \g_semantex_novaluekey:nn#1#2
+\cs_new:Npn \semantex_singlekey:nn#1#2
{
% #1 = name of the key
% #2 = object
-% % takes care of single keys, keys without a value
- \g_semantex_novaluekey_get:nnNTF { #2 } { #1 } \l_semantex_custom_novaluekey_temp
+% Takes care of single keys, keys without a value
+ \semantex_singlekey_get:nnNTF { #2 } { #1 } \l__semantex_custom_singlekey_temp
{
- \g_semantex_keys_set:nx { #2 }
+ \semantex_keys_set:nx { #2 }
{
- \l_semantex_custom_novaluekey_temp
+ \l__semantex_custom_singlekey_temp
}
}
{
- \g_semantex_keys_set:nn { #2 } { default = { #1 } }
+ \semantex_keys_set:nn { #2 } { default = { #1 } }
}
}
-%IMplement the same thing for upper, lower?? Probably not.
-
-\cs_new:Npn \g_semantex_arg_primitive_valuekey_sep_auxiliary_function_withsep:nn#1#2
-{
- #1#2
-}
-
-\cs_new:Npn \g_semantex_arg_primitive_valuekey_sep_auxiliary_function_withoutsep:nn#1#2
-{
- #2
-}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% COMMANDS CONTROLLING THE ARGUMENT KEYVAL INTERFACE
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\cs_new:Npn \g_semantex_primitive_arg_valuekey_sep:nn#1#2
+\cs_new:Npn \semantex_primitive_arg_valuekey_othersep:nn#1#2
{
- \g_semantex_data_bool_get:nnTF { #1 } { first_arg }
+ % Uses syntax sep={separator}{argument}; adds an argument
+ % with the specified separator
+ \semantex_data_bool_get:nnTF { #1 } { nextargwithsep }
{
- \g_semantex_data_tl_put_right:nnn { #1 } { arg } {
- \exp_not:n { \g_semantex_arg_primitive_valuekey_sep_auxiliary_function_withoutsep:nn #2 }
+ \semantex_data_tl_put_right:nnn { #1 } { arg } {
+ \exp_not:n {
+ \semantex_grab_first_argument_of_two:nn #2
+ \semantex_grab_second_argument_of_two:nn #2
+ }
}
- %IM These do not use :x, unlike the ones below
}
{
- \g_semantex_data_tl_put_right:nnn { #1 } { arg } { \exp_not:n { \g_semantex_arg_primitive_valuekey_sep_auxiliary_function_withsep:nn #2 } }
+ \semantex_data_tl_put_right:nnn { #1 } { arg } {
+ \exp_not:n {
+ \semantex_grab_second_argument_of_two:nn #2
+ }
+ }
+ %IM These do not use :x, unlike the ones below
}
- \g_semantex_primitive_valuekey_ifrightreturnbeforerender:nn{#1}{true}
- \g_semantex_data_bool_set_false:nn { #1 } { first_arg }
+ \semantex_data_int_incr:nn { #1 } { numberofarguments }
+ \semantex_data_bool_set_true:nn { #1 } { nextargwithsep }
}
-\cs_new:Npn \g_semantex_primitive_arg_valuekey_standardsep:nn#1#2
+\cs_new:Npn \semantex_primitive_arg_valuekey_s:nn#1#2
{
- \g_semantex_data_bool_get:nnTF { #1 } { first_arg }
+ % Adds to the argument, with the standard separator
+ \semantex_data_bool_get:nnTF { #1 } { nextargwithsep }
{
- \g_semantex_data_tl_put_right:nnn { #1 } { arg } { \exp_not:n { #2 } }
+ \semantex_data_tl_put_right:nnx { #1 } { arg } { \exp_not:n { \semantex_data_tl_get:nn { #1 } { argsep } } }
+ \semantex_data_tl_put_right:nnn { #1 } { arg } {\exp_not:n { #2 } }
+ % As an experiment, I tried changing cx to cn, and it failed
+ % when changing the separator on the fly.
+ }
+ {
+ \semantex_data_tl_put_right:nnn { #1 } { arg } { \exp_not:n { #2 } }
%IM Recently corrected
% Previously, this was cx, but I didn’t see any point of this;
% this was mostly to create symmetry with the below case where
% cx is strictly necessary.
}
- {
- \g_semantex_data_tl_put_right:nnx { #1 } { arg } { \exp_not:n { \g_semantex_data_tl_get:nn { #1 } { argsep } } }
- \g_semantex_data_tl_put_right:nnn { #1 } { arg } {\exp_not:n { #2 } }
- % As an experiment, I tried changing cx to cn, and it failed
- % when changing the separator on the fly.
- }
-% \g_semantex_primitive_valuekey_ifoutput:nn { #1 } { true }
- \g_semantex_primitive_valuekey_ifrightreturnbeforerender:nn{#1}{true}
- \g_semantex_data_bool_set_false:nn { #1 } { first_arg }
+% \semantex_primitive_valuekey_ifoutput:nn { #1 } { true }
+ \semantex_data_int_incr:nn { #1 } { numberofarguments }
+ \semantex_data_bool_set_true:nn { #1 } { nextargwithsep }
}
-\cs_new:Npn \g_semantex_primitive_arg_valuekey_dots:nn#1#2
+\cs_generate_variant:Nn \semantex_primitive_arg_valuekey_s:nn { nx }
+
+\cs_new:Npn \semantex_primitive_arg_valuekey_dots:nn#1#2
{
- \g_semantex_primitive_arg_valuekey_standardsep:nn { #1 } { \g_semantex_data_tl_get:nn { #1 } { argdots } }
+ % Writes dots in the argument
+ \semantex_primitive_arg_valuekey_s:nx { #1 } { \semantex_data_tl_get_exp_not:nn { #1 } { argdots } }
}
-\cs_new:Npn \g_semantex_primitive_arg_valuekey_slot:nn#1#2
+\cs_new:Npn \semantex_primitive_arg_valuekey_slot:nn#1#2
{
- \g_semantex_primitive_arg_valuekey_standardsep:nn { #1 } { \g_semantex_data_tl_get:nn { #1 } { slot } }
+ % Writes the slot in teh argument
+ \semantex_primitive_arg_valuekey_s:nx { #1 } { \semantex_data_tl_get_exp_not:nn { #1 } { argslot } }
}
-\cs_generate_variant:Nn \g_semantex_arg_keys_set:nn { nx }
+\cs_generate_variant:Nn \semantex_arg_keys_set:nn { nx }
-\cs_new:Npn \g_semantex_arg_valuekey:nnn#1#2#3
+\cs_new:Npn \semantex_arg_valuekey:nnn#1#2#3
{
% Takes care of valuekeys, keys with a value
% For the sake of implementation, the arguments
@@ -2850,164 +4754,181 @@
% #1 = value of key
% #2 = name of the key
% #3 = object
- \tl_set:Nn\l_semantex_arg_key_value_temp{\exp_not:n{#1}} % stores the content of the key in the temporary command \l_semantex_key_value_temp
- \g_semantex_arg_valuekey_get:nnNTF { #3 } { #2 } \l_semantex_custom_arg_valuekey_temp
+ \tl_set:Nn\l__semantex_arg_key_value_temp{\exp_not:n{#1}} % stores the content of the key in the temporary command \l__semantex_key_value_temp
+ \semantex_arg_valuekey_get:nnNTF { #3 } { #2 } \l__semantex_custom_arg_valuekey_temp
{
- \g_semantex_arg_keys_set:nx { #3 } { \l_semantex_custom_arg_valuekey_temp }
+ \semantex_arg_keys_set:nx { #3 } { \l__semantex_custom_arg_valuekey_temp }
}
{
- \cs_if_exist:cTF { g_semantex_primitive_arg_valuekey_#2:nn }
+ \cs_if_exist:cTF { semantex_primitive_arg_valuekey_#2:nn }
{
- \use:c { g_semantex_primitive_arg_valuekey_#2:nn }{ #3 }{ #1 }%
+ \use:c { semantex_primitive_arg_valuekey_#2:nn }{ #3 }{ #1 }
}
{
- \msg_error:nnnn { semantex } { arg_valuekey_not_found } { #2 } { #3 }
+% \msg_error:nnnn { semantex } { arg_valuekey_not_found } { #2 } { #3 }
+ \semantex_error_output_format:nN { #3 } \__semantex_arg_valuekey_unknown_key_temp
+ \msg_error:nnxn { semantex } { arg_valuekey_not_found } { \__semantex_arg_valuekey_unknown_key_temp } { #2 }
}
}
}
-\cs_new:Npn \g_semantex_arg_novaluekey:nn#1#2
+\cs_new:Npn \semantex_arg_singlekey:nn#1#2
{
% #1 = name of the key
% #2 = object
% % takes care of single keys, keys without a value
% the class key is not actually necessary
- \g_semantex_arg_novaluekey_get:nnNTF { #2 } { #1 } \l_semantex_custom_arg_novaluekey_temp
+ \semantex_arg_singlekey_get:nnNTF { #2 } { #1 } \l__semantex_custom_arg_singlekey_temp
{
%\exp_args:NNno
%\exp_args:Nno
- %\use:c { g_semantex_data_cs_#3_arg:n }
- \g_semantex_arg_keys_set:nx { #2 }
+ \semantex_arg_keys_set:nx { #2 }
{
- \l_semantex_custom_arg_novaluekey_temp
+ \l__semantex_custom_arg_singlekey_temp
}
}
{
- \g_semantex_data_tl_inherit_x:nn { #2 } { arg }
- \g_semantex_arg_keys_set:nn { #2 } { default={\exp_not:n { #1 } }}
- %\g_semantex_arg_keys_set:nn { #3 } { default={#1}}
+ \semantex_data_tl_inherit_x:nn { #2 } { arg }
+ \semantex_arg_keys_set:nn { #2 } { default={\exp_not:n { #1 } }}
%IM THis \exp_not:n was added late, might be needed elsewhere, too.
}
}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SETTING UP THE BASE CLASS SemantexVariable
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
-\g_semantex_data_tl_provide:nn { semantexvariable } { output }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { output }
-\g_semantex_data_tl_set:nnn { semantexvariable } { output } { semantexvariable }
+\semantex_data_tl_set:nnn { class_SemantexVariable } { output } { class_SemantexVariable }
-\g_semantex_data_tl_provide:nn { semantexvariable } { upper_index }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { upper }
-\g_semantex_data_tl_provide:nn { semantexvariable } { uppersep }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { uppersep }
-\g_semantex_data_tl_set:nnn { semantexvariable } { uppersep } { , }
+\semantex_data_tl_set:nnn { class_SemantexVariable } { uppersep } { , }
%IM Also, need commands like forgetupperindex, reverting to the class standard
-\g_semantex_data_tl_provide:nn { semantexvariable } { lower_index }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { lower }
-\g_semantex_data_tl_provide:nn { semantexvariable } { lowersep }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { lowersep }
-\g_semantex_data_tl_set:nnn { semantexvariable } { lowersep } { , }
+\semantex_data_tl_set:nnn { class_SemantexVariable } { lowersep } { , }
-\g_semantex_data_tl_provide:nn { semantexvariable } { preupper }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { preupper }
-\g_semantex_data_tl_provide:nn { semantexvariable } { postupper }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { postupper }
-\g_semantex_data_tl_provide:nn { semantexvariable } { prelower }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { prelower }
-\g_semantex_data_tl_provide:nn { semantexvariable } { postlower }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { postlower }
-\g_semantex_data_tl_provide:nn { semantexvariable } { upper_left_index }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { upperleft }
-\g_semantex_data_tl_provide:nn { semantexvariable } { upperleftsep }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { upperleftsep }
-\g_semantex_data_tl_set:nnn { semantexvariable } { upperleftsep } { , }
+\semantex_data_tl_set:nnn { class_SemantexVariable } { upperleftsep } { , }
-%IM do the same with all the others, INCLUDING if_upper_grading and symbol
+%IM do the same with all the others, INCLUDING if_uppergrading and symbol
%IM Also, need commands like forgetupperindex, reverting to the class standard
-\g_semantex_data_tl_provide:nn { semantexvariable } { lower_left_index }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { lowerleft }
+
+\semantex_data_tl_provide:nn { class_SemantexVariable } { lowerleftsep }
-\g_semantex_data_tl_provide:nn { semantexvariable } { lowerleftsep }
+\semantex_data_tl_set:nnn { class_SemantexVariable } { lowerleftsep } { , }
-\g_semantex_data_tl_set:nnn { semantexvariable } { lowerleftsep } { , }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { preupperleft }
-\g_semantex_data_tl_provide:nn { semantexvariable } { preupperleft }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { postupperleft }
-\g_semantex_data_tl_provide:nn { semantexvariable } { postupperleft }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { prelowerleft }
-\g_semantex_data_tl_provide:nn { semantexvariable } { prelowerleft }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { postlowerleft }
-\g_semantex_data_tl_provide:nn { semantexvariable } { postlowerleft }
+\semantex_data_int_provide:nn { class_SemantexVariable } { numberofarguments }
+\semantex_data_bool_provide:nn { class_SemantexVariable } { nextargwithsep }
-\g_semantex_data_bool_provide:nn { semantexvariable } { first_upper_left }
-\g_semantex_data_bool_set_true:nn { semantexvariable } { first_upper_left }
+\semantex_data_bool_provide:nn { class_SemantexVariable } { nextupperleftwithsep }
+\semantex_data_bool_provide:nn { class_SemantexVariable } { nextlowerleftwithsep }
-\g_semantex_data_bool_provide:nn { semantexvariable } { first_lower_left }
-\g_semantex_data_bool_set_true:nn { semantexvariable } { first_lower_left }
+\semantex_data_int_provide:nn { class_SemantexVariable } { numberofupperleftindices }
+\semantex_data_int_provide:nn { class_SemantexVariable } { numberoflowerleftindices }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { prearg }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { postarg }
-\g_semantex_data_tl_provide:nn { semantexvariable } { prearg }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { arg }
-\g_semantex_data_tl_provide:nn { semantexvariable } { postarg }
-%IMplement these later
+\semantex_data_tl_provide:nn { class_SemantexVariable } { argsep }
+\semantex_data_tl_set:nnn { class_SemantexVariable } { argsep } {,}
-\g_semantex_data_tl_provide:nn { semantexvariable } { arg }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { argslot }
+\semantex_data_tl_set:nnn { class_SemantexVariable } { argslot } { \SemantexSlot }
-\g_semantex_data_tl_provide:nn { semantexvariable } { argsep }
-\g_semantex_data_tl_set:nnn { semantexvariable } { argsep } {,}
+\semantex_data_tl_provide:nn { class_SemantexVariable } { argdots }
+\semantex_data_tl_set:nnn { class_SemantexVariable } { argdots } {\dots}
-\g_semantex_data_tl_provide:nn { semantexvariable } { slot }
-\g_semantex_data_tl_set:nnn { semantexvariable } { slot } { \semantexslot }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { symbol }
-\g_semantex_data_tl_provide:nn { semantexvariable } { argdots }
-\g_semantex_data_tl_set:nnn { semantexvariable } { argdots } {\dots}
+\semantex_data_seq_provide:nn { class_SemantexVariable } { commands_sequence }
-\g_semantex_data_tl_provide:nn { semantexvariable } { symbol }
+\semantex_data_bool_provide:nn { class_SemantexVariable } { uppergrading }
+\semantex_data_bool_set_true:nn { class_SemantexVariable } { uppergrading }
-\g_semantex_data_seq_provide:nn { semantexvariable } { commands_sequence }
+\semantex_data_bool_provide:nn { class_SemantexVariable } { output }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { outputoptions }
-\g_semantex_data_bool_provide:nn { semantexvariable } { upper_grading }
-\g_semantex_data_bool_set_true:nn { semantexvariable } { upper_grading }
+\semantex_data_bool_provide:nn { class_SemantexVariable } { nextupperwithsep }
+\semantex_data_bool_provide:nn { class_SemantexVariable } { nextlowerwithsep }
-\g_semantex_data_bool_provide:nn { semantexvariable } { output }
+\semantex_data_int_provide:nn { class_SemantexVariable } { numberofupperindices }
+\semantex_data_int_provide:nn { class_SemantexVariable } { numberoflowerindices }
-\g_semantex_data_tl_provide:nn { semantexvariable } { output_options }
+\semantex_data_bool_provide:nn { class_SemantexVariable } { par }
+\semantex_data_bool_set_true:nn { class_SemantexVariable } { par }
-\g_semantex_data_bool_provide:nn { semantexvariable } { first_arg }
-\g_semantex_data_bool_set_true:nn { semantexvariable } { first_arg }
+\semantex_data_bool_provide:nn { class_SemantexVariable } { flexpar }
-\g_semantex_data_bool_provide:nn { semantexvariable } { first_upper }
-\g_semantex_data_bool_set_true:nn { semantexvariable } { first_upper }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { parseoptions }
-\g_semantex_data_bool_provide:nn { semantexvariable } { first_lower }
-\g_semantex_data_bool_set_true:nn { semantexvariable } { first_lower }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { texclass }
-\g_semantex_data_bool_provide:nn { semantexvariable } { par }
-\g_semantex_data_bool_set_true:nn { semantexvariable } { par }
+\semantex_data_bool_provide:nn { class_SemantexVariable } { leftargument }
-\g_semantex_data_bool_provide:nn { semantexvariable } { rightreturnbeforerender }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { upperdots }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { upperslot }
-\g_semantex_data_tl_provide:nn { semantexvariable } { parseoptions }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { lowerdots }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { lowerslot }
-\g_semantex_data_tl_provide:nn { semantexvariable } { texclass }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { upperleftdots }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { upperleftslot }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { lowerleftdots }
+\semantex_data_tl_provide:nn { class_SemantexVariable } { lowerleftslot }
-%\tl_set:Nn\g_objectmath_semantexvariable_upper_index { hej }
-%\tl_set:Nn \g_semantexvariable_output { semantexvariable }
-%\bool_new:N \g_semantexvariable_output_if_provided
-%\bool_set_true:N \g_semantexvariable_output_if_provided
+%\tl_set:Nn\g_objectmath_SemantexVariable_upper { hej }
+%\tl_set:Nn \SemantexVariable_output { class_SemantexVariable }
+%\bool_new:N \SemantexVariable_output_if_provided
+%\bool_set_true:N \SemantexVariable_output_if_provided
-\newvariableclass{semantexvariable}[
- %parent=semantexvariable,
+\semantex_new_variable_class:Nw \SemantexVariable [
+ %parent=SemantexVariable,
+ output=\SemantexVariable,
+ ifoutput=false,
symbol=,
- gradingpos=upper,
+ gradingposition=upper,
%upper=,
%lower=,
leftpar=(,
@@ -3017,21 +4938,51 @@
rightspar=),
sparsize=normal,
%arg=,
- ifoutput=false,
- output=semantexvariable,
- novaluekeys={
- {bullet}{d={\noexpand\semantexbullet}},
- {doublebullet}{d={\noexpand\semantexdoublebullet}},
+ setupperdots=\dots,
+ setlowerdots=\dots,
+ setupperslot=\g_semantex_bullet,
+ setlowerslot=\g_semantex_bullet,
+ setupperleftdots=\dots,
+ setlowerleftdots=\dots,
+ setupperleftslot=\g_semantex_bullet,
+ setlowerleftslot=\g_semantex_bullet,
+ singlekeys={
{prime}{upper={\prime}},
{'}{prime},
{''}{prime,prime},
{'''}{prime,prime,prime},
- {ibullet}{i={\noexpand\semantexbullet}},
- {idoublebullet}{i={\noexpand\semantexdoublebullet}},
- {*}{bullet},
- {**}{doublebullet},
- {i*}{ibullet},
- {i**}{idoublebullet},
+ {*}{sdegree=\g_semantex_bullet},
+ {**}{sdegree=\g_semantex_double_bullet},
+ {degree*}{degree=\g_semantex_bullet},
+ {degree**}{degree=\g_semantex_double_bullet},
+ {sdegree*}{sdegree=\g_semantex_bullet},
+ {sdegree**}{sdegree=\g_semantex_double_bullet},
+ {cdegree*}{cdegree=\g_semantex_bullet},
+ {cdegree**}{cdegree=\g_semantex_double_bullet},
+ {deg*}{deg=\g_semantex_bullet},
+ {deg**}{deg=\g_semantex_double_bullet},
+ {sdeg*}{sdeg=\g_semantex_bullet},
+ {sdeg**}{sdeg=\g_semantex_double_bullet},
+ {cdeg*}{cdeg=\g_semantex_bullet},
+ {cdeg**}{cdeg=\g_semantex_double_bullet},
+ {d*}{d=\g_semantex_bullet},
+ {d**}{d=\g_semantex_double_bullet},
+ {sd*}{sd=\g_semantex_bullet},
+ {sd**}{sd=\g_semantex_double_bullet},
+ {cd*}{cd=\g_semantex_bullet},
+ {cd**}{cd=\g_semantex_double_bullet},
+ {index*}{index=\g_semantex_bullet},
+ {index**}{index=\g_semantex_double_bullet},
+ {sindex*}{sindex=\g_semantex_bullet},
+ {sindex**}{sindex=\g_semantex_double_bullet},
+ {cindex*}{cindex=\g_semantex_bullet},
+ {cindex**}{cindex=\g_semantex_double_bullet},
+ {i*}{i=\g_semantex_bullet},
+ {i**}{i=\g_semantex_double_bullet},
+ {si*}{si=\g_semantex_bullet},
+ {si**}{si=\g_semantex_double_bullet},
+ {ci*}{ci=\g_semantex_bullet},
+ {ci**}{ci=\g_semantex_double_bullet},
{smash}{command=\noexpand\smash},
% (widebar}{command=\noexpand\widebar},%For unknown reasons, this only seems to work when run as a primitive
{tilde}{command=\noexpand\tilde},
@@ -3051,51 +5002,187 @@
{spar}{spar=},
{parse}{parse=},
{par}{ifpar=true},
+ {neverpar}{ifpar=never},
{nopar}{ifpar=false},
+ {clearupper}{clearupper=},
+ {clearlower}{clearlower=},
+ {clearupperleft}{clearupperleft=},
+ {clearlowerleft}{clearlowerleft=},
+ {clearcommand}{clearcommand=},
+ {cleard}{cleard=},
+ {cleardeg}{cleardeg=},
+ {cleardegree}{cleardegree=},
+ {cleari}{cleari=},
+ {clearindex}{clearindex=},
+ {upperdots}{upperdots=},
+ {upper...}{upperdots=},
+ {upperslot}{upperslot=},
+ {upper-}{upperslot=},
+ {lowerdots}{lowerdots=},
+ {lower...}{lowerdots=},
+ {lowerslot}{lowerslot=},
+ {lower-}{lowerslot=},
+ {upperleftdots}{upperleftdots=},
+ {upperleft...}{upperleftdots=},
+ {upperleftslot}{upperleftslot=},
+ {upperleft-}{upperleftslot=},
+ {lowerleftdots}{lowerleftdots=},
+ {lowerleft...}{lowerleftdots=},
+ {lowerleftslot}{lowerleftslot=},
+ {lowerleft-}{lowerleftslot=},
+ {idots}{idots=},
+ {indexdots}{indexdots=},
+ {islot}{islot=},
+ {indexslot}{indexslot=},
+ {i...}{idots=},
+ {index...}{indexdots=},
+ {i-}{islot=},
+ {index-}{indexslot=},
+ {ddots}{ddots=},
+ {degdots}{degdots=},
+ {degreedots}{degreedots=},
+ {dslot}{dslot=},
+ {degslot}{degslot=},
+ {degreeslot}{degreeslot=},
+ {d...}{ddots=},
+ {deg...}{degdots=},
+ {degree...}{degreedots=},
+ {d-}{dslot=},
+ {deg-}{degslot=},
+ {degree-}{degreeslot=},
+ {cupperdots}{cupperdots=},
+ {cupper...}{cupperdots=},
+ {cupperslot}{cupperslot=},
+ {cupper-}{cupperslot=},
+ {clowerdots}{clowerdots=},
+ {clower...}{clowerdots=},
+ {clowerslot}{clowerslot=},
+ {clower-}{clowerslot=},
+ {cupperleftdots}{cupperleftdots=},
+ {cupperleft...}{cupperleftdots=},
+ {cupperleftslot}{cupperleftslot=},
+ {cupperleft-}{cupperleftslot=},
+ {clowerleftdots}{clowerleftdots=},
+ {clowerleft...}{clowerleftdots=},
+ {clowerleftslot}{clowerleftslot=},
+ {clowerleft-}{clowerleftslot=},
+ {cidots}{cidots=},
+ {cindexdots}{cindexdots=},
+ {cislot}{cislot=},
+ {cindexslot}{cindexslot=},
+ {ci...}{cidots=},
+ {cindex...}{cindexdots=},
+ {ci-}{cislot=},
+ {cindex-}{cindexslot=},
+ {cddots}{cddots=},
+ {cdegdots}{cdegdots=},
+ {cdegreedots}{cdegreedots=},
+ {cdslot}{cdslot=},
+ {cdegslot}{cdegslot=},
+ {cdegreeslot}{cdegreeslot=},
+ {cd...}{cddots=},
+ {cdeg...}{cdegdots=},
+ {cdegree...}{cdegreedots=},
+ {cd-}{cdslot=},
+ {cdeg-}{cdegslot=},
+ {cdegree-}{cdegreeslot=},
+ {supperdots}{supperdots=},
+ {supper...}{supperdots=},
+ {supperslot}{supperslot=},
+ {supper-}{supperslot=},
+ {slowerdots}{slowerdots=},
+ {slower...}{slowerdots=},
+ {slowerslot}{slowerslot=},
+ {slower-}{slowerslot=},
+ {supperleftdots}{supperleftdots=},
+ {supperleft...}{supperleftdots=},
+ {supperleftslot}{supperleftslot=},
+ {supperleft-}{supperleftslot=},
+ {slowerleftdots}{slowerleftdots=},
+ {slowerleft...}{slowerleftdots=},
+ {slowerleftslot}{slowerleftslot=},
+ {slowerleft-}{slowerleftslot=},
+ {sidots}{sidots=},
+ {sindexdots}{sindexdots=},
+ {sislot}{sislot=},
+ {sindexslot}{sindexslot=},
+ {si...}{sidots=},
+ {sindex...}{sindexdots=},
+ {si-}{sislot=},
+ {sindex-}{sindexslot=},
+ {sddots}{sddots=},
+ {sdegdots}{sdegdots=},
+ {sdegreedots}{sdegreedots=},
+ {sdslot}{sdslot=},
+ {sdegslot}{sdegslot=},
+ {sdegreeslot}{sdegreeslot=},
+ {sd...}{sddots=},
+ {sdeg...}{sdegdots=},
+ {sdegree...}{sdegreedots=},
+ {sd-}{sdslot=},
+ {sdeg-}{sdegslot=},
+ {sdegree-}{sdegreeslot=},
+ {...}{sidots=},
+ {-}{sislot=},
% The following four commands do not work due to expansion issues:
% {useargwithkeyval}{useargwithkeyval=},
% {argwithkeyval}{
% valuekeys={
-% {arg}{argwithkeyval={\noexpand\l_semantex_key_value_temp}},
+% {arg}{argwithkeyval={\noexpand\l__semantex_key_value_temp}},
% },
% },
-% {argwithnovaluekeys}{
+% {argwithsinglekeys}{
% valuekeys={
-% {arg}{argwithnovaluekeys={\noexpand\l_semantex_key_value_temp}},
+% {arg}{argwithsinglekeys={\noexpand\l__semantex_key_value_temp}},
% },
% },
% {argwithoutkeyval}{
% valuekeys={
-% {arg}{argwithoutkeyval={\noexpand\l_semantex_key_value_temp}},
+% {arg}{argwithoutkeyval={\noexpand\l__semantex_key_value_temp}},
% },
% },
-% {argwithonenovaluekey}{
+% {argwithonesinglekey}{
% valuekeys={
-% {arg}{argwithonenovaluekey={\noexpand\l_semantex_key_value_temp}},
+% {arg}{argwithonesinglekey={\noexpand\l__semantex_key_value_temp}},
% },
% },
},
valuekeys={
- {default}{si={#1}},
+ {default}{sindex={#1}},
% {arg}{argwithkeyval={#1}},
- {arg}{argwithnovaluekeys={#1}},
- {degreedefault}{sd={#1}},
- {parseoptions}{
- execute={
- \semantexdataputright{parseoptions}{#1}
- },
- },
+ {arg}{argwithsinglekeys={#1}},
+ {degreedefault}{sdegree={#1}},
+ {*withothersep}{degreewithothersep={#1}{\g_semantex_bullet}},
+ {**withothersep}{degreewithothersep={#1}{\g_semantex_double_bullet}},
+ {degree*withothersep}{degreewithothersep={#1}{\g_semantex_bullet}},
+ {degree**withothersep}{degreewithothersep={#1}{\g_semantex_double_bullet}},
+ {deg*withothersep}{degwithothersep={#1}{\g_semantex_bullet}},
+ {deg**withothersep}{degwithothersep={#1}{\g_semantex_double_bullet}},
+ {d*withothersep}{dwithothersep={#1}{\g_semantex_bullet}},
+ {d**withothersep}{dwithothersep={#1}{\g_semantex_double_bullet}},
+ {index*withothersep}{indexwithothersep={#1}{\g_semantex_bullet}},
+ {index**withothersep}{indexwithothersep={#1}{\g_semantex_double_bullet}},
+ {i*withothersep}{iwithothersep={#1}{\g_semantex_bullet}},
+ {i**withothersep}{iwithothersep={#1}{\g_semantex_double_bullet}},
},
-% argwithnovaluekeys,
+% argwithsinglekeys,
argvaluekeys={
- {default}{standardsep={#1}},
+ {default}{s={#1}},
},
- argnovaluekeys={
+ argsinglekeys={
{slot}{slot=},
{-}{slot=},
- {*}{slot=},
+% {*}{slot=}, % would be confusing since * does not correspond to slot in the indices
{...}{dots=},
},
%command=,
% useargwithkeyval,
-] \ No newline at end of file
+]
+
+\cs_set_eq:NN\__semantex_old_version_of_semantex_new_object_of_class_SemantexVariable:Nw \__semantex_new_object_of_class_SemantexVariable:Nw
+
+\cs_set:Npn \__semantex_new_object_of_class_SemantexVariable:Nw#1
+{
+ \msg_error:nnn { semantex } { created_a_SemantexVariable } { #1 }
+ \__semantex_old_version_of_semantex_new_object_of_class_SemantexVariable:Nw #1
+} \ No newline at end of file
diff --git a/macros/latex/contrib/semantex/semantex.tex b/macros/latex/contrib/semantex/semantex.tex
index da8cfd390b..c273d1dcec 100644
--- a/macros/latex/contrib/semantex/semantex.tex
+++ b/macros/latex/contrib/semantex/semantex.tex
@@ -9,9 +9,7 @@
\frenchspacing
-\usepackage{mathtools,etoolbox, microtype,xspace}
-
-
+\usepackage{mathtools,etoolbox, microtype,xspace,color}
\usepackage[shortlabels]{enumitem}%control lists
@@ -36,7 +34,7 @@
\usepackage[nameinlink]{cleveref}
-\title{Seman\!\TeX: Object-oriented mathematics (v$0.1\alpha$)}
+\title{Seman\!\TeX: Semantic mathematics (v$0.2\alpha$)}
\date{\today}
\author{Sebastian Ørsted (\href{mailto:sorsted@gmail.com}{sorsted@gmail.com})}
@@ -56,139 +54,129 @@
\usepackage{semantex}
-\newvariableclass{var}[
- output=var,
+\NewVariableClass\MyVar[
+ output=\MyVar,
]
-\newvar\va{a}
-\newvar\vb{b}
-\newvar\vc{c}
-\newvar\vd{d}
-\newvar\ve{e}
-\newvar\vf{f}
-\newvar\vg{g}
-\newvar\vh{h}
-\newvar\vi{i}
-\newvar\vj{j}
-\newvar\vk{k}
-\newvar\vl{l}
-\newvar\vm{m}
-\newvar\vn{n}
-\newvar\vo{o}
-\newvar\vp{p}
-\newvar\vq{q}
-\newvar\vr{r}
-\newvar\vs{s}
-\newvar\vt{t}
-\newvar\vu{u}
-\newvar\vv{v}
-\newvar\vw{w}
-\newvar\vx{x}
-\newvar\vy{y}
-\newvar\vz{z}
-
-\newvar\vA{A}
-\newvar\vB{B}
-\newvar\vC{C}
-\newvar\vD{D}
-\newvar\vE{E}
-\newvar\vF{F}
-\newvar\vG{G}
-\newvar\vH{H}
-\newvar\vI{I}
-\newvar\vJ{J}
-\newvar\vK{K}
-\newvar\vL{L}
-\newvar\vM{M}
-\newvar\vN{N}
-\newvar\vO{O}
-\newvar\vP{P}
-\newvar\vQ{Q}
-\newvar\vR{R}
-\newvar\vS{S}
-\newvar\vT{T}
-\newvar\vU{U}
-\newvar\vV{V}
-\newvar\vW{W}
-\newvar\vX{X}
-\newvar\vY{Y}
-\newvar\vZ{Z}
-
-\newvar\valpha{\alpha}
-\newvar\vvaralpha{\varalpha}
-\newvar\vbeta{\beta}
-\newvar\vgamma{\gamma}
-\newvar\vdelta{\delta}
-\newvar\vepsilon{\epsilon}
-\newvar\vvarepsilon{\varepsilon}
-\newvar\vzeta{\zeta}
-\newvar\veta{\eta}
-\newvar\vtheta{\theta}
-\newvar\viota{\iota}
-\newvar\vkappa{\kappa}
-\newvar\vlambda{\lambda}
-\newvar\vmu{\mu}
-\newvar\vnu{\nu}
-\newvar\vxi{\xi}
-\newvar\vpi{\pi}
-\newvar\vvarpi{\varpi}
-\newvar\vrho{\rho}
-\newvar\vsigma{\sigma}
-\newvar\vtau{\tau}
-\newvar\vupsilon{\upsilon}
-\newvar\vphi{\phi}
-\newvar\vvarphi{\varphi}
-\newvar\vchi{\chi}
-\newvar\vpsi{\psi}
-\newvar\vomega{\omega}
-
-\newvar\vGamma{\Gamma}
-\newvar\vDelta{\Delta}
-\newvar\vTheta{\Theta}
-\newvar\vLambda{\Lambda}
-\newvar\vXi{\Xi}
-\newvar\vPi{\Pi}
-\newvar\vSigma{\Sigma}
-\newvar\vUpsilon{\Upsilon}
-\newvar\vPhi{\Phi}
-\newvar\vPsi{\Psi}
-\newvar\vOmega{\Omega}
-
-\newvar\sheafF{\mathcal{F}}
-\newvar\sheafG{\mathcal{G}}
-\newvar\sheafO{\mathcal{O}}
-\newvar\sheafHom{\mathcal{H}\!\!om}
-
-\newvar\Hom{\operatorname{Hom}}
-
-\usepackage{showexpl,newunicodechar}
-
-\newunicodechar{⟨}{\textlangle}
-\newunicodechar{⟩}{\textrangle}
-
-
-\setupclass{var}{
- novaluekeys={
- {inverseimage}{upper={-1},nopar},
- },
-}
-
-\newcohomologyclass{cohomology}[
- parent=var,
- valuekeys={
- {arg}{argwithkeyval={#1}},
- },
- gradingpos=upper,
+\NewObject\MyVar\va{a}
+\NewObject\MyVar\vb{b}
+\NewObject\MyVar\vc{c}
+\NewObject\MyVar\vd{d}
+\NewObject\MyVar\ve{e}
+\NewObject\MyVar\vf{f}
+\NewObject\MyVar\vg{g}
+\NewObject\MyVar\vh{h}
+\NewObject\MyVar\vi{i}
+\NewObject\MyVar\vj{j}
+\NewObject\MyVar\vk{k}
+\NewObject\MyVar\vl{l}
+\NewObject\MyVar\vm{m}
+\NewObject\MyVar\vn{n}
+\NewObject\MyVar\vo{o}
+\NewObject\MyVar\vp{p}
+\NewObject\MyVar\vq{q}
+\NewObject\MyVar\vr{r}
+\NewObject\MyVar\vs{s}
+\NewObject\MyVar\vt{t}
+\NewObject\MyVar\vu{u}
+\NewObject\MyVar\vv{v}
+\NewObject\MyVar\vw{w}
+\NewObject\MyVar\vx{x}
+\NewObject\MyVar\vy{y}
+\NewObject\MyVar\vz{z}
+
+\NewObject\MyVar\vA{A}
+\NewObject\MyVar\vB{B}
+\NewObject\MyVar\vC{C}
+\NewObject\MyVar\vD{D}
+\NewObject\MyVar\vE{E}
+\NewObject\MyVar\vF{F}
+\NewObject\MyVar\vG{G}
+\NewObject\MyVar\vH{H}
+\NewObject\MyVar\vI{I}
+\NewObject\MyVar\vJ{J}
+\NewObject\MyVar\vK{K}
+\NewObject\MyVar\vL{L}
+\NewObject\MyVar\vM{M}
+\NewObject\MyVar\vN{N}
+\NewObject\MyVar\vO{O}
+\NewObject\MyVar\vP{P}
+\NewObject\MyVar\vQ{Q}
+\NewObject\MyVar\vR{R}
+\NewObject\MyVar\vS{S}
+\NewObject\MyVar\vT{T}
+\NewObject\MyVar\vU{U}
+\NewObject\MyVar\vV{V}
+\NewObject\MyVar\vW{W}
+\NewObject\MyVar\vX{X}
+\NewObject\MyVar\vY{Y}
+\NewObject\MyVar\vZ{Z}
+
+\NewObject\MyVar\valpha{\alpha}
+\NewObject\MyVar\vvaralpha{\varalpha}
+\NewObject\MyVar\vbeta{\beta}
+\NewObject\MyVar\vgamma{\gamma}
+\NewObject\MyVar\vdelta{\delta}
+\NewObject\MyVar\vepsilon{\epsilon}
+\NewObject\MyVar\vvarepsilon{\varepsilon}
+\NewObject\MyVar\vzeta{\zeta}
+\NewObject\MyVar\veta{\eta}
+\NewObject\MyVar\vtheta{\theta}
+\NewObject\MyVar\viota{\iota}
+\NewObject\MyVar\vkappa{\kappa}
+\NewObject\MyVar\vlambda{\lambda}
+\NewObject\MyVar\vmu{\mu}
+\NewObject\MyVar\vnu{\nu}
+\NewObject\MyVar\vxi{\xi}
+\NewObject\MyVar\vpi{\pi}
+\NewObject\MyVar\vvarpi{\varpi}
+\NewObject\MyVar\vrho{\rho}
+\NewObject\MyVar\vsigma{\sigma}
+\NewObject\MyVar\vtau{\tau}
+\NewObject\MyVar\vupsilon{\upsilon}
+\NewObject\MyVar\vphi{\phi}
+\NewObject\MyVar\vvarphi{\varphi}
+\NewObject\MyVar\vchi{\chi}
+\NewObject\MyVar\vpsi{\psi}
+\NewObject\MyVar\vomega{\omega}
+
+\NewObject\MyVar\vGamma{\Gamma}
+\NewObject\MyVar\vDelta{\Delta}
+\NewObject\MyVar\vTheta{\Theta}
+\NewObject\MyVar\vLambda{\Lambda}
+\NewObject\MyVar\vXi{\Xi}
+\NewObject\MyVar\vPi{\Pi}
+\NewObject\MyVar\vSigma{\Sigma}
+\NewObject\MyVar\vUpsilon{\Upsilon}
+\NewObject\MyVar\vPhi{\Phi}
+\NewObject\MyVar\vPsi{\Psi}
+\NewObject\MyVar\vOmega{\Omega}
+
+\NewObject\MyVar\sheafF{\mathcal{F}}
+\NewObject\MyVar\sheafG{\mathcal{G}}
+\NewObject\MyVar\sheafreg{\mathcal{O}}
+\NewObject\MyVar\sheafHom{\mathop{\mathcal{H}om}}
+
+\NewObject\MyVar\Hom{\operatorname{Hom}}
+
+\NewCohomologyClass\MyCohomology[
+ parent=\MyVar,
+ gradingposition=upper,
]
-\newcohomologyclass{homology}[
- parent=cohomology,
- gradingpos=lower,
+\NewCohomologyClass\MyHomology[
+ parent=\MyCohomology,
+ gradingposition=lower,
]
-\newcohomology\co{H}
+\NewObject\MyCohomology\co{H}
-\newhomology\ho{H}
+\NewObject\MyHomology\ho{H}
+
+\usepackage{showexpl,newunicodechar}
+
+\newunicodechar{⟨}{\textlangle}
+\newunicodechar{⟩}{\textrangle}
\makeatother
@@ -214,100 +202,200 @@
-\newcommand*\mybs{$\backslash$}
+\newcommand\mybs{$\backslash$}
-\newcommand*\commandname[1]{\mybs\texttt{#1}}
+\newcommand\commandname[1]{\mybs\texttt{#1}}
\let\pack=\texttt
\newcommand\semantex{Seman\!\TeX\xspace}
\noindent
-The \semantex package for \LaTeX\ delivers a more semantic, systematized way of writing mathematics, compared to the ordinary math syntax. The system is object-oriented and uses keyval syntax, and everything is highly customizable. At the same time, care has been taken to make it intuitive, natural, practical, and with an easy-to-use and lightweight syntax.
+The \semantex package for \LaTeX\ delivers a more semantic, systematized way of writing mathematics, compared to the classical math syntax in~\LaTeX.
+The system uses keyval syntax and is highly customizable. At the same time, care has been taken to make it the syntax as simple, natural, practical, and lightweight as possible.
\textbf{Note: \semantex is still in its alpha stage and cannot be considered stable at this point. You are more than welcome to report bugs and come with suggestions!}
\begingroup
- \setupclass{var}{
- novaluekeys={
+ \SetupClass\MyVar{
+ singlekeys={
+ {conj}{overline},
+ {inv}{upper={-1}},
{inverseimage}{upper={-1},nopar},
},
valuekeys={
- {stalk}{lower=#1},
- {res}{ return,symbolputright={|}, lower={#1} },
- },
- argvaluekeys={
- {coef}{sep={;}{#1}},
+ {der}{upper={ (#1) } },
+ {res}{ return ,symbolputright ={|}, lower ={#1} },
+ {stalk}{clower={#1}},
+ % "clower" means "comma lower", i.e. lower index
+ % separated from any previous lower index by a comma
},
}
- Traditional math notation in \TeX\ is not particularly semantic -- you usually type the raw \emph{notation} rather than the underlying
- \emph{meaning} of your math.
- Take, for instance, the following equations from algebraic geometry:
- \begin{align*}
- \vf[inverseimage]{\sheafF}[spar,stalk=\vp]
- &=
- \sheafF[stalk=\vf{\vp}] ,
- \\
- \sheafO[\vU]
- &=
- \sheafO[\vX,res=\vU] ,
- \\
- \sheafHom{ \sheafF , \sheafG }{\vU}
- &=
- \Hom[\sheafO[\vU]]{ \sheafF[res=\vU] , \sheafG[res=\vU] } ,
- \\
- \co{0}{\vU,coef=\sheafO[\vX]} &= \sheafO[\vX]{\vU}
- .
- \end{align*}
- Here, \( \sheafF \) and~\( \sheafG \)
- are sheaves on some scheme~\( \vX \),
- \( \sheafO[\vX] \)~is the structure sheaf,
- and~\( \vU \subset \vX \) an open subset.
- In traditional \TeX, you would probably define a collection of commands \lstinline!\sheafF!, \lstinline!\sheafG!, \lstinline!\sheafO!, and~\lstinline!\sheafHom! for~\( \sheafF \),~\( \sheafG \), \( \sheafO \), and~\( \sheafHom \) and then proceed
- something like
- \begin{lstlisting}
-(f^{-1}\sheafF)_{p}=\sheafF_{f(p)},
-\sheafO_{U} = \sheafO_{X}|_{U},
-\sheafHom( \sheafF , \sheafG)(U)
- = \Hom_{\sheafO_{X} ( \sheafF|_{U} , \sheafG|_{V} ),
- H^{0}(U;\sheafF) = \sheafF(U).
- \end{lstlisting}
- For more than~90~\% of all mathematicians, this solution will be completely satisfactory; it prints what it is supposed to, and that's that.
- If this is how you feel, there is absolutely no reason for you to continue reading. This package is for the remaining less than~10~\% who would prefer to write
- something like the following instead:
- \begin{lstlisting}
-\vf[inverseimage]{ \sheafF }[spar,stalk=\vp]
- = \sheafF[ stalk=\vf{\vp} ] ,
-\sheafO[\vU] = \sheafO[ \vX, res=\vU ],
-\sheafHom{ \sheafF , \sheafG }{\vU}
- = \Hom[\sheafO[\vU]]{ \sheafF[res=\vU], \sheafG[res=\vU] },
-\co{0}{ \vU, coef=\sheafO[\vX] } = \sheafO[\vX]{\vU}.
- \end{lstlisting}
- A lot of comments are in order.
- The whole syntax will be explained in later chapters, but let us take a moment to look at these examples and understand the logic.
- First of all, what is up with all the~\lstinline!v!'s in the command names \lstinline!\vf!, \lstinline!\vX!, \lstinline!\vU!? The~\lstinline!v!~stands for \textquote{variable}, and it is the prefix I recommend using for all standard variables. So for all letters in the alphabet, uppercase and lowercase, as well as the Greek ones, there will be a command: \lstinline!\va!, \lstinline!\vA!, \lstinline!\vb!, \lstinline!\vB!,~etc.
- It is not always necessary to use them; for instance, in the above example, both \lstinline!\vX! and \lstinline!\vU! could have been replaced by simply~\lstinline!X!,~\lstinline!U! without changing anything. This is because we did not apply any arguments to these symbols. However, for the sake of consistency, I prefer to switch completely to using commands instead of writing the symbols directly.
- How \emph{you} use the system is completely up to you.
+ Let us take an example from elementary analysis
+ to demonstrate the idea of the package:
+ Suppose we want to take the complex conjugate of a function~\( \vf \)
+ and then derive it \( \vn \)~times, i.e.~take~\( \smash{ \vf[conj,der=\vn] } \).
+ \semantex allows you to typeset this something like this:
+\begin{LTXexample}
+$ \vf[conj,der=\vn] $
+\end{LTXexample}
+ I shall explain the syntax in detail below, but some immediate comments are in order: First and foremost, the~\lstinline!v!
+ in the command names \lstinline!\vf! and~\lstinline!\vn! stands for~\enquote{variable}, so these commands are the
+ variables \( \vf \) and~\( \vn \).
+ In \semantex, it is usually best to create
+ commands \lstinline!\va!, \lstinline!\vA!, \lstinline!\vb!, \lstinline!\vB!, \ldots
+ for each variable you are using, upper- and lowercase.
+ However, it is completely up to the user how to do that and what to call them.
+ Note also that all of the keys
+ \lstinline!inv!,~\lstinline!res!,~etc.\ are defined by the
+ \emph{user}, and they can be modified and adjusted for all sorts of situations in any kinds of mathematics.
+ In other words, for the most part, you get to choose your own syntax.
- In \semantex, all entries are being built up from the inside and out.
- The basic syntax layout for most \semantex commands is
- \begin{lstlisting}
-\command[options]{argument}
- \end{lstlisting}
- Let us try focusing on the first example from above:
- \begin{LTXexample}
-$\vf[inverseimage]{\sheafF}[spar,stalk=\vp]$
- \end{LTXexample}
- You always start with a central piece: a \emph{symbol}.
- In the case of~\lstinline!\vf!, the symbol is~\( f \). After the symbol follows the options we apply to it, written in brackets~\lstinline![...]!. In this case, we the option~\lstinline!inverseimage!. This tells \semantex that we want the inverse image functor~\( \vf[inverseimage] \), so it adds a superscript~\lstinline!-1! to the symbol. After this, we apply the function~\lstinline!\vf[inverseimage]! to something, namely the sheaf~{$\sheafF$}. This is done by enclosing them in braces~\lstinline!{...}!.\footnote{You should be aware that this argument in braces~\texttt{\{...\}} is \emph{optional}. You can simply write~\texttt{$\backslash$vf[inverseimage]} if you want, and it will produce~\smash{\( \vf[inverseimage] \)}.}
+ Next, suppose we want to invert a function~\( \vg \) and restrict it to a subset~\( \vU \), and then apply it to~\( \vx \),
+ i.e.~take~\( \vg[inv,res=\vU]{\vx} \). This can be done by writing
+\begin{LTXexample}
+$ \vg[inv,res=\vU]{\vx} $
+\end{LTXexample}
+ Next, let us take an example from algebraic geometry:
+ Suppose \( \sheafF \)~is a sheaf and \( \vh \)~a~map,
+ and that we want to typeset the
+ equation~\( \smash{
+ \vh[inverseimage]{\sheafF}[
+ spar,stalk=\vp]
+ =
+ \sheafF[stalk=\vh{\vp}]
+ } \),
+ saying that the stalk of the inverse image~\( \vh[inverseimage]{\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]
+=
+\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} \).
- Next, we want to take the stalk of this sheaf at the point~\( \vp \). If we simply wrote~\lstinline!\vf[inverseimage]{\sheafF}[stalk=\vp]!, we would get~\smash{\( \vf[inverseimage]{\sheafF}[stalk=\vp] \)}, which looks confusing. So we want to enclose~\smash{\( \vf[inverseimage]{\sheafF} \)} in parentheses before taking the stalk. This is done with the key~\lstinline!spar! (an abbreviation for \textquote{symbol parentheses}).
- This key takes whatever has been typed so far, symbol and indices, and adds parentheses around it (of course, type and size is adjustable).
- This~\lstinline!spar! is a key you fill find yourself using a lot.
+ Let us see how you could set up all the above notation:
+\begin{lstlisting}
+\documentclass{article}
+
+\usepackage{amsmath,semantex}
+
+\NewVariableClass\MyVar % creates a new class of variables, called "\MyVar"
+
+% Now we create a couple of variables of the class \MyVar:
+\NewObject\MyVar\vf{f}
+\NewObject\MyVarr\vg{g}
+\NewObject\MyVar\vh{h}
+\NewObject\MyVar\sheafF{\mathcal{F}}
+
+% Now we set up the class \MyVar:
+\SetupClass\MyVar{
+ 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:
+ singlekeys={ % keys taking no values
+ {inv}{upper={-1}},
+ {conj}{overline},
+ {inverseimage}{upper={-1},nopar},
+ },
+ valuekeys={ % keys taking a value
+ {der}{upper={(#1)}},
+ {stalk}{clower={#1}},
+ % "clower" means "comma lower", i.e. lower index
+ % separated from any previous lower index by a comma
+ {res}{ return ,symbolputright ={|}, lower ={#1} },
+ },
+}
+\end{lstlisting}
\endgroup
+%\begingroup
+% \SetupClass\MyVar{
+% singlekeys={
+% {inverseimage}{upper={-1},nopar},
+% },
+% valuekeys={
+% {stalk}{lower=#1},
+% {res}{ return,symbolputright={|}, lower={#1} },
+% },
+% argvaluekeys={
+% {coef}{othersep={;}{#1}},
+% },
+% }
+%
+% Traditional math notation in \TeX\ is not particularly semantic -- you usually type the raw \emph{notation} rather than the underlying
+% \emph{meaning} of your math.
+% Take, for instance, the following equations from algebraic geometry:
+% \begin{align*}
+% \vf[inverseimage]{\sheafF}[spar,stalk=\vp]
+% &=
+% \sheafF[stalk=\vf{\vp}] ,
+% \\
+% \sheafreg[\vU]
+% &=
+% \sheafreg[\vX,res=\vU] ,
+% \\
+% \sheafHom{ \sheafF , \sheafG }{\vU}
+% &=
+% \Hom[\sheafreg[\vU]]{ \sheafF[res=\vU] , \sheafG[res=\vU] } ,
+% \\
+% \co{0}{\vU,coef=\sheafreg[\vX]}
+% &= \sheafreg[\vX]{\vU}
+% .
+% \end{align*}
+% Here, \( \sheafF \) and~\( \sheafG \)
+% are sheaves on some scheme~\( \vX \),
+% \( \sheafreg[\vX] \)~is the structure sheaf,
+% and~\( \vU \subset \vX \) an open subset.
+% In traditional \TeX, you would probably define a collection of commands \lstinline!\sheafF!, \lstinline!\sheafG!, \lstinline!\sheafreg!, and~\lstinline!\sheafHom! for~\( \sheafF \),~\( \sheafG \), \( \sheafreg \), and~\( \sheafHom \) and then proceed
+% something like
+% \begin{lstlisting}
+%(f^{-1}\sheafF)_{p}=\sheafF_{f(p)},
+%\sheafreg_{U} = \sheafreg_{X}|_{U},
+%\sheafHom( \sheafF , \sheafG)(U)
+% = \Hom_{\sheafreg_{X} ( \sheafF|_{U} , \sheafG|_{V} ),
+% H^{0}(U;\sheafF) = \sheafF(U).
+% \end{lstlisting}
+% For more than~90~\% of all mathematicians, this solution will be completely satisfactory; it prints what it is supposed to, and that's that.
+% If this is how you feel, there is absolutely no reason for you to continue reading. This package is for the remaining less than~10~\% who would prefer to write
+% something like the following instead:
+% \begin{lstlisting}
+%\vf[inverseimage]{ \sheafF }[spar,stalk=\vp]
+% = \sheafF[ stalk=\vf{\vp} ] ,
+%\sheafreg[\vU] = \sheafreg[ \vX, res=\vU ],
+%\sheafHom{ \sheafF , \sheafG }{\vU}
+% = \Hom[\sheafreg[\vU]]{ \sheafF[res=\vU], \sheafG[res=\vU] },
+%\co{0}{ \vU, coef=\sheafreg[\vX] } = \sheafreg[\vX]{\vU}.
+% \end{lstlisting}
+%
+% A lot of comments are in order.
+% The whole syntax will be explained in later chapters, but let us take a moment to look at these examples and understand the logic.
+% First of all, what is up with all the~\lstinline!v!'s in the command names \lstinline!\vf!, \lstinline!\vX!, \lstinline!\vU!? The~\lstinline!v!~stands for \textquote{variable}, and it is the prefix I recommend using for all standard variables. So for all letters in the alphabet, uppercase and lowercase, as well as the Greek ones, there will be a command: \lstinline!\va!, \lstinline!\vA!, \lstinline!\vb!, \lstinline!\vB!,~etc.
+% It is not always necessary to use them; for instance, in the above example, both \lstinline!\vX! and \lstinline!\vU! could have been replaced by simply~\lstinline!X!,~\lstinline!U! without changing anything. This is because we did not apply any arguments to these symbols. However, for the sake of consistency, I prefer to switch completely to using commands instead of writing the symbols directly.
+% How \emph{you} use the system is completely up to you.
+%
+% In \semantex, all entries are being built up from the inside and out.
+% The basic syntax layout for most \semantex commands is
+% \begin{lstlisting}
+%\⟨object⟩[⟨options⟩]{⟨argument⟩}
+% \end{lstlisting}
+% Let us try focusing on the first example from above:
+% \begin{LTXexample}
+%$\vf[inverseimage]{\sheafF}[spar,stalk=\vp]$
+% \end{LTXexample}
+% You always start with a central piece: a \emph{⟨symbol⟩}.
+% In the case of~\lstinline!\vf!, the symbol is~\( f \). After the symbol follows the options we apply to it, written in brackets~\lstinline![...]!. In this case, we the option~\lstinline!inverseimage!. This tells \semantex that we want the inverse image functor~\( \vf[inverseimage] \), so it adds a superscript~\lstinline!-1! to the symbol. After this, we apply the function~\lstinline!\vf[inverseimage]! to something, namely the sheaf~{$\sheafF$}. This is done by enclosing them in braces~\lstinline!{...}!.\footnote{You should be aware that this argument in braces~\texttt{\{...\}} is \emph{optional}. You can simply write~\texttt{$\backslash$vf[inverseimage]} if you want, and it will produce~\smash{\( \vf[inverseimage] \)}.}
+%
+%
+% Next, we want to take the stalk of this sheaf at the point~\( \vp \). If we simply wrote~\lstinline!\vf[inverseimage]{\sheafF}[stalk=\vp]!, we would get~\smash{\( \vf[inverseimage]{\sheafF}[stalk=\vp] \)}, which looks confusing. So we want to enclose~\smash{\( \vf[inverseimage]{\sheafF} \)} in parentheses before taking the stalk. This is done with the key~\lstinline!spar! (an abbreviation for \textquote{symbol parentheses}).
+% This key takes whatever has been typed so far, symbol and indices, and adds parentheses around it (of course, type and size is adjustable).
+% This~\lstinline!spar! is a key you fill find yourself using a lot.
+%\endgroup
+
\chapter{Getting started}
To get started using \semantex, load down the package
@@ -316,54 +404,59 @@ with
\usepackage{semantex}
\end{lstlisting}
The \semantex system is object-oriented; all entities are objects of some class. When you load the package, there
-is only one class by default, which is simply called \lstinline!semantexvariable!.
+is only one class by default, which is simply called \lstinline!\SemantexVariable!.
You should think of this as a low-level class, the parent of all other classes. Therefore, I highly advice against using it directly or modifying it.
Instead, we create a new, more high-level variable class.
-To make notations brief, we call it \lstinline!var!.
-We could write \lstinline!\newvariableclass{var}!, but we choose to
+We choose to call it \lstinline!\MyVar!.
+It is best to always start class names with uppercase letters to separate them from objects.
+We could write \lstinline!\NewVariableClass\MyVar!, but we choose to
pass some options to it in~\lstinline![...]!:
\begin{lstlisting}
-\newvariableclass{var}[output=var]
+\NewVariableClass\MyVar[output=\MyVar]
\end{lstlisting}
-This \lstinline!output=var! option will be explained better below.
+This \lstinline!output=\MyVar! option will be explained better below.
Roughly speaking, it tells \semantex that everything
a variable \emph{outputs} will also be a variable.
-For instance, if the function~\lstinline!\vf! (i.e.~\( \vf \)) is of class~\lstinline!var!,
-then \lstinline!\vf{\vx}!~(i.e.~\( \vf{\vx} \))~will also of class~\lstinline!var!.
+For instance, if the function~\lstinline!\vf! (i.e.~\( \vf \)) is of class~\lstinline!\MyVar!,
+then \lstinline!\vf{\vx}!~(i.e.~\( \vf{\vx} \))~will also of class~\lstinline!\MyVar!.
Now we have a class, but we do not have any objects.
-When we create the class~\lstinline!var!, the system
-automatically defines the command \lstinline!\newvar!
-that creates a new object of class~\lstinline!var!. The syntax is
+To create the object~\lstinline!\vf! of class~\lstinline!\MyVar! with symbol~\( f \),
+we write~\lstinline!\NewObject\MyVar\vf{f}!.
+In general, when you have class~\lstinline!\⟨Class⟩!, you
+can create objects of that class wtih the syntax
\begin{lstlisting}
-\newvar\⟨variable name⟩{⟨variable symbol⟩}[options]
+\NewObject\⟨Class⟩\⟨object⟩{⟨object symbol⟩}[⟨options⟩]
\end{lstlisting}
-For instance, we may write
+To distinguish objects from classes, it is a good idea to denote
+objects by lowercase letters.\footnote{We shall not follow this convention strictly, as we shall later create objects with names like~\commandname{Hom}; using lowercase letters for these would just look weird.}
+So after writing,
\begin{lstlisting}
-\newvar\vf{f}
-\newvar\vx{x}
+\NewObject\MyVar\vf{f}
+\NewObject\MyVar\vx{x}
\end{lstlisting}
-to get two variables \lstinline!\vf! and~\lstinline!\vx! with symbols \( f \) resp.~\( x \).
+we get two variables \lstinline!\vf! and~\lstinline!\vx! with symbols \( f \) resp.~\( x \).
Let us perform a stupid test to see if the variables work:
\begin{LTXexample}
$\vf$, $\vx$
\end{LTXexample}
-Th general syntax of a variable-type command is
+Th general syntax of a variable-type object is
\begin{lstlisting}
-\command[options]{argument}
+\⟨object⟩[⟨options⟩]{⟨argument⟩}
\end{lstlisting}
-Both \lstinline!options! and \lstinline!argument! are optional
+Both \lstinline!⟨options⟩! and \lstinline!⟨argument⟩! are optional
arguments (they can be left out if you do not need them).
-The \lstinline!options! should consist of a list of options separated by commas, using keyval syntax. On the other hand, \lstinline!argument! is the actual argument of the function.
+The \lstinline!⟨options⟩! should consist of a list of options separated by commas, using keyval syntax. On the other hand, \lstinline!⟨argument⟩! is the actual argument of the function.
By design, \semantex does not distinguish between variables and functions, so all variables can take arguments.
This is a design choice to make the system easier to use; after all, it is fairly common in mathematics that something is first a variable and then a moment later takes an argument.
So we may write:
\begin{LTXexample}
-$\vf{1}$, $\vf{\vx}$
+$\vf{1}$, $\vf{\vx}$,
+$\vx{\vx}$
\end{LTXexample}
So far, we do not have very many options to write in the
-\lstinline!options! position, since we have not added any keys yet. However, we do have access
+\lstinline!⟨options⟩! position, since we have not added any keys yet. However, we do have access
to the most important of all options: the \emph{index}.
There is a simple shortcut for writing an index: You simply write the index itself in the options tag:
\begin{LTXexample}
@@ -382,99 +475,99 @@ than just \( \vf \) and~\( \vx \).
In fact, I advise you to create a variable for each letter in the Latin and Greek alphabets, both uppercase and lowercase.
This is pretty time-consuming, so I did it for you already:
\begin{lstlisting}
-\newvar\va{a}
-\newvar\vb{b}
-\newvar\vc{c}
-\newvar\vd{d}
-\newvar\ve{e}
-\newvar\vf{f}
-\newvar\vg{g}
-\newvar\vh{h}
-\newvar\vi{i}
-\newvar\vj{j}
-\newvar\vk{k}
-\newvar\vl{l}
-\newvar\vm{m}
-\newvar\vn{n}
-\newvar\vo{o}
-\newvar\vp{p}
-\newvar\vq{q}
-\newvar\vr{r}
-\newvar\vs{s}
-\newvar\vt{t}
-\newvar\vu{u}
-\newvar\vv{v}
-\newvar\vw{w}
-\newvar\vx{x}
-\newvar\vy{y}
-\newvar\vz{z}
-
-\newvar\vA{A}
-\newvar\vB{B}
-\newvar\vC{C}
-\newvar\vD{D}
-\newvar\vE{E}
-\newvar\vF{F}
-\newvar\vG{G}
-\newvar\vH{H}
-\newvar\vI{I}
-\newvar\vJ{J}
-\newvar\vK{K}
-\newvar\vL{L}
-\newvar\vM{M}
-\newvar\vN{N}
-\newvar\vO{O}
-\newvar\vP{P}
-\newvar\vQ{Q}
-\newvar\vR{R}
-\newvar\vS{S}
-\newvar\vT{T}
-\newvar\vU{U}
-\newvar\vV{V}
-\newvar\vW{W}
-\newvar\vX{X}
-\newvar\vY{Y}
-\newvar\vZ{Z}
-
-\newvar\valpha{\alpha}
-\newvar\vvaralpha{\varalpha}
-\newvar\vbeta{\beta}
-\newvar\vgamma{\gamma}
-\newvar\vdelta{\delta}
-\newvar\vepsilon{\epsilon}
-\newvar\vvarepsilon{\varepsilon}
-\newvar\vzeta{\zeta}
-\newvar\veta{\eta}
-\newvar\vtheta{\theta}
-\newvar\viota{\iota}
-\newvar\vkappa{\kappa}
-\newvar\vlambda{\lambda}
-\newvar\vmu{\mu}
-\newvar\vnu{\nu}
-\newvar\vxi{\xi}
-\newvar\vpi{\pi}
-\newvar\vvarpi{\varpi}
-\newvar\vrho{\rho}
-\newvar\vsigma{\sigma}
-\newvar\vtau{\tau}
-\newvar\vupsilon{\upsilon}
-\newvar\vphi{\phi}
-\newvar\vvarphi{\varphi}
-\newvar\vchi{\chi}
-\newvar\vpsi{\psi}
-\newvar\vomega{\omega}
-
-\newvar\vGamma{\Gamma}
-\newvar\vDelta{\Delta}
-\newvar\vTheta{\Theta}
-\newvar\vLambda{\Lambda}
-\newvar\vXi{\Xi}
-\newvar\vPi{\Pi}
-\newvar\vSigma{\Sigma}
-\newvar\vUpsilon{\Upsilon}
-\newvar\vPhi{\Phi}
-\newvar\vPsi{\Psi}
-\newvar\vOmega{\Omega}
+\NewObject\MyVar\va{a}
+\NewObject\MyVar\vb{b}
+\NewObject\MyVar\vc{c}
+\NewObject\MyVar\vd{d}
+\NewObject\MyVar\ve{e}
+\NewObject\MyVar\vf{f}
+\NewObject\MyVar\vg{g}
+\NewObject\MyVar\vh{h}
+\NewObject\MyVar\vi{i}
+\NewObject\MyVar\vj{j}
+\NewObject\MyVar\vk{k}
+\NewObject\MyVar\vl{l}
+\NewObject\MyVar\vm{m}
+\NewObject\MyVar\vn{n}
+\NewObject\MyVar\vo{o}
+\NewObject\MyVar\vp{p}
+\NewObject\MyVar\vq{q}
+\NewObject\MyVar\vr{r}
+\NewObject\MyVar\vs{s}
+\NewObject\MyVar\vt{t}
+\NewObject\MyVar\vu{u}
+\NewObject\MyVar\vv{v}
+\NewObject\MyVar\vw{w}
+\NewObject\MyVar\vx{x}
+\NewObject\MyVar\vy{y}
+\NewObject\MyVar\vz{z}
+
+\NewObject\MyVar\vA{A}
+\NewObject\MyVar\vB{B}
+\NewObject\MyVar\vC{C}
+\NewObject\MyVar\vD{D}
+\NewObject\MyVar\vE{E}
+\NewObject\MyVar\vF{F}
+\NewObject\MyVar\vG{G}
+\NewObject\MyVar\vH{H}
+\NewObject\MyVar\vI{I}
+\NewObject\MyVar\vJ{J}
+\NewObject\MyVar\vK{K}
+\NewObject\MyVar\vL{L}
+\NewObject\MyVar\vM{M}
+\NewObject\MyVar\vN{N}
+\NewObject\MyVar\vO{O}
+\NewObject\MyVar\vP{P}
+\NewObject\MyVar\vQ{Q}
+\NewObject\MyVar\vR{R}
+\NewObject\MyVar\vS{S}
+\NewObject\MyVar\vT{T}
+\NewObject\MyVar\vU{U}
+\NewObject\MyVar\vV{V}
+\NewObject\MyVar\vW{W}
+\NewObject\MyVar\vX{X}
+\NewObject\MyVar\vY{Y}
+\NewObject\MyVar\vZ{Z}
+
+\NewObject\MyVar\valpha{\alpha}
+\NewObject\MyVar\vvaralpha{\varalpha}
+\NewObject\MyVar\vbeta{\beta}
+\NewObject\MyVar\vgamma{\gamma}
+\NewObject\MyVar\vdelta{\delta}
+\NewObject\MyVar\vepsilon{\epsilon}
+\NewObject\MyVar\vvarepsilon{\varepsilon}
+\NewObject\MyVar\vzeta{\zeta}
+\NewObject\MyVar\veta{\eta}
+\NewObject\MyVar\vtheta{\theta}
+\NewObject\MyVar\viota{\iota}
+\NewObject\MyVar\vkappa{\kappa}
+\NewObject\MyVar\vlambda{\lambda}
+\NewObject\MyVar\vmu{\mu}
+\NewObject\MyVar\vnu{\nu}
+\NewObject\MyVar\vxi{\xi}
+\NewObject\MyVar\vpi{\pi}
+\NewObject\MyVar\vvarpi{\varpi}
+\NewObject\MyVar\vrho{\rho}
+\NewObject\MyVar\vsigma{\sigma}
+\NewObject\MyVar\vtau{\tau}
+\NewObject\MyVar\vupsilon{\upsilon}
+\NewObject\MyVar\vphi{\phi}
+\NewObject\MyVar\vvarphi{\varphi}
+\NewObject\MyVar\vchi{\chi}
+\NewObject\MyVar\vpsi{\psi}
+\NewObject\MyVar\vomega{\omega}
+
+\NewObject\MyVar\vGamma{\Gamma}
+\NewObject\MyVar\vDelta{\Delta}
+\NewObject\MyVar\vTheta{\Theta}
+\NewObject\MyVar\vLambda{\Lambda}
+\NewObject\MyVar\vXi{\Xi}
+\NewObject\MyVar\vPi{\Pi}
+\NewObject\MyVar\vSigma{\Sigma}
+\NewObject\MyVar\vUpsilon{\Upsilon}
+\NewObject\MyVar\vPhi{\Phi}
+\NewObject\MyVar\vPsi{\Psi}
+\NewObject\MyVar\vOmega{\Omega}
\end{lstlisting}
Just like~\lstinline!\vf!, these can all be regarded as functions, so~\lstinline!\va{\vb}!~produces~\( \va{\vb} \).
@@ -489,7 +582,7 @@ $\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!:
+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):
\begin{LTXexample}
$\vf[nopar]{\vx}$
\end{LTXexample}
@@ -504,29 +597,34 @@ $\vf['''] = \vf[prime,prime,prime]$
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.
Keys are being added via two different keys:
\begin{center}
- \lstinline!novaluekeys!
+ \lstinline!singlekeys!
\qquad\qquad and \qquad\qquad
\lstinline!valuekeys!.
\end{center}
-In short, \lstinline!novaluekeys! is for keys that do \emph{not} take a value (i.e.~keys using the syntax~\lstinline!\command[key]!), and \lstinline!valuekeys! is for keys that \emph{do} take a value
-(i.e.~keys using the syntax~\lstinline!\command[key=value]!)).
+In short, \lstinline!singlekeys! is for keys that do \emph{not} take a value (i.e.~keys using the syntax~\lstinline!\⟨object⟩[key]!), and \lstinline!valuekeys! is for keys that \emph{do} take a value
+(i.e.~keys using the syntax~\lstinline!\⟨object⟩[key=value]!)).
We explain the syntax for using them in the next section where we show how to make keyval syntax for elementary calculus.
+\begingroup\color{red}%
+For the rest of the manual, we assume that you have already defined a class~\lstinline!\MyVar! and the variables~\lstinline!\va!, \lstinline!\vA!, \lstinline!\vb!, \lstinline!\vB!, \ldots, as above.
+\endgroup
+
\chapter{Example: Elementary calculus}
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!novaluekeys!:
+We add this key using the key \lstinline!singlekeys!,
+which is for keys that do not take a value:
\begin{lstlisting}
-\setupclass{var}{
- novaluekeys={
+\SetupClass\MyVar{
+ singlekeys={
{inv}{ upper={-1} },
},
}
\end{lstlisting}
-\setupclass{var}{
-novaluekeys={
+\SetupClass\MyVar{
+singlekeys={
{inv}{ upper={-1} },
},
}
@@ -538,19 +636,17 @@ $\va[inv]$, $\vf[inv]$,
$\vg[1,2,inv]$,
$\vh[\va,\vb,inv]$
\end{LTXexample}
-The key \lstinline!novaluekeys! is for keys that take no value,
-like \lstinline!inv!.
Other keys might need to take a value.
For defining such, we have the command~\lstinline!valuekeys!.
%There are two different keys for adding new keys
-%to a class: \lstinline!novaluekeys! and \lstinline!valuekeys!.
+%to a class: \lstinline!singlekeys! and \lstinline!valuekeys!.
%The difference is that
For instance, suppose we want a command for deriving a function \( n \)~times.
-For this, we add the following extra keyval key~\lstinline!der!:
+For this, we add the key~\lstinline!der!:
\begin{lstlisting}
-\setupclass{var}{
- novaluekeys={
+\SetupClass\MyVar{
+ singlekeys={
{inv}{ upper={-1} },
},
valuekeys={
@@ -558,58 +654,55 @@ For this, we add the following extra keyval key~\lstinline!der!:
},
}
\end{lstlisting}
-\setupclass{var}{
+\SetupClass\MyVar{
valuekeys={
{der}{ upper={(#1)} },
},
}
The~\lstinline!#1! will contain whatever the
-user added as the value of the key.
+user wrote as the value of the key.
Now we can write:
\begin{LTXexample}
$\vf[der=\vn]{\vx}$
\end{LTXexample}
-Maybe we also want a more elementary operation:
-raising a variable to some \emph{power}.
-We could have called the key \lstinline!power!, but this is long and cumbersome, so let us simply call it \lstinline!to!:
+Maybe we also want a more elementary key~\lstinline!power! for raising a variable to a power:
\begin{lstlisting}
-\setupclass{var}{
- novaluekeys={
+\SetupClass\MyVar{
+ singlekeys={
{inv}{ upper={-1} },
},
valuekeys={
{der}{ upper={(#1)} },
- {to}{ upper={#1} },
+ {power}{ upper={#1} },
},
}
\end{lstlisting}
-\setupclass{var}{
+\SetupClass\MyVar{
valuekeys={
- {to}{ upper={#1} },
+ {power}{ upper={#1} },
},
}
This allows us to write
\begin{LTXexample}
-$\vx[to=2]$,
-$\vy[1,to=2] + \vy[2,to=2]$
+$\vx[power=2]$,
+$\vy[1,power=2] + \vy[2,power=2]$
\end{LTXexample}
-In the long run, you might want to define a command~\lstinline!squared! or~\lstinline!sq! and make it equivalent to~\lstinline!to=2!.
-Let us try doing something a bit more complicated: Adding a key for restricting a function to a smaller subset.
+Let us try doing something a bit more complicated: adding a key for restricting a function to a smaller subset.
For this, we do the following:
\begin{lstlisting}
-\setupclass{var}{
- novaluekeys={
+\SetupClass\MyVar{
+ singlekeys={
{inv}{ upper={-1} },
},
valuekeys={
{der}{ upper={(#1)} },
- {to}{ upper={#1} },
+ {power}{ upper={#1} },
{res}{ return,symbolputright={|}, lower={#1} },
},
}
\end{lstlisting}
-\setupclass{var}{
+\SetupClass\MyVar{
valuekeys={
{res}{ return,symbolputright={|}, lower={#1} },
},
@@ -626,54 +719,56 @@ $\vg[1,res=\vY]{\vy}$,
$\vh[inv,res=\vT]{\vz}$
\end{LTXexample}
-If the reader starts playing around with the \semantex functions, they will discover that whenever you apply a function to something, the result becomes a new function that can take an argument itself. This behaviour is both useful and extremely necessary in order for the package to be useful in practice. For instance, you may write
+If the reader starts playing around with the \semantex functions, they will discover that whenever you apply a function to something, the result becomes a new function that can take an argument itself (this is why we wrote~\lstinline!output=\MyVar! in the definition of the class~\lstinline!\MyVar!). This behaviour is both useful and extremely necessary in order for the package to be useful in practice. For instance, you may write
\begin{LTXexample}
$\vf[der=\vn]{\vx}{\vy}{\vz}
=\vg{\vu,\vv,\vw}[3]{
- \vx[1],\vx[2]}[8,1,der=2]{\vt}$
+ \vx[1],\vx[2]}[8,1,der=2]{
+ \vt}$
\end{LTXexample}
-Some people prefer to be able to scale the restriction
-line. I rarely do that, but for that purpose, we could do the following:
+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{var}{
+\SetupClass\MyVar{
valuekeys={
{bigres}{ return, symbolputright=\big\vert, lower={#1} },
{Bigres}{ return, symbolputright=\Big\vert, lower={#1} },
{biggres}{ return, symbolputright=\bigg\vert, lower={#1} },
{Biggres}{ return, symbolputright=\Bigg\vert, lower={#1} },
- {autores}{ return, sparsize=auto, otherspar=.\vert,
- sparsize=normal, lower={#1} },
- % This auto scales the vertical bar. See the chapter on the spar
- % key for information about sparsize and otherspar
+ {autores}{ return, Otherspar={.}{\vert}{auto},
+ lower={#1} },
+ % This auto scales the vertical bar. See the chapter on the
+ % spar key for information about sparsize and Otherspar
},
}
\end{lstlisting}
-So to sum up, we first defined a class~\lstinline!var!
-via \lstinline!\newvariableclass! and then used \lstinline!\setupclass! to add keys to it. In fact, we could have done it all at once by passing these options directly to \lstinline!\newvariableclass!:
+So to sum up, we first defined a class~\lstinline!\MyVar!
+via \lstinline!\NewVariableClass! and then used \lstinline!\SetupClass! to add keys to it. In fact, we could have done it all at once by passing these options directly to \lstinline!\NewVariableClass!:
\begin{lstlisting}
- \newvariableclass{var}[
- output=var,
- novaluekeys={
- {inv}{ upper={-1} },
- },
- valuekeys={
- {der}{ upper={(#1)} },
- {to}{ upper={#1} },
- {res}{ rightreturn, symbolputright={|},
- lower={#1} },
- },
- ]
+\NewVariableClass\MyVar[
+ output=\MyVar, % This means that the output of an object
+ % of class \MyVar is also of class \MyVar
+ singlekeys={
+ {inv}{ upper={-1} },
+ },
+ valuekeys={
+ {der}{ upper={(#1)} },
+ {power}{ upper={#1} },
+ {res}{ rightreturn, symbolputright={|},
+ lower={#1} },
+ },
+]
\end{lstlisting}
-As we proceed in this guide, we shall use \lstinline!\setupclass!
-to add more and more keys to~\lstinline!var!. However, when you set up your own system, you may as well just add all of the keys like this when you create the class and then be done with it.
+As we proceed in this guide, we shall use \lstinline!\SetupClass!
+to add more and more keys to~\lstinline!\MyVar!. However, when you set up your own system, you may as well just add all of the keys at once like this when you create the class and then be done with it.
+
+Let me add that it is possible to create subclasses of existing classes. You just write \lstinline!parent=\⟨Class⟩! in the class declaration to tell that \lstinline!\⟨Class⟩! is the parent class. \textbf{But a word of warning:} It is a natural idea to create different classes for different mathematical entities, each with their own keyval syntax that fits whatever class you are in; for instance, you could have one class for algebraic structures like rings and modules with keys for opposite rings and algebraic closure, and you could have another class for topological spaces with keys for closure and interior. However, as the reader can probably imagine, this becomes extremely cumbersome to work with in practice since an algebraic structure might very well also carry a topology. So at the end of the day, I advice you to use a single superclass \lstinline!\MyVar! that has all the keyval syntax and mainly use subclasses for further customization. We shall see examples of this below.
-Let me add that it is possible to create subclasses of existing classes. You just write \lstinline!parent=myclass! in the class declaration to tell that \lstinline!myclass! is the parent class. \textbf{But a word of warning:} It is a natural idea to create different classes for different mathematical entities, each with their own keyval syntax that fits whatever class you are in; for instance, you could have one class for algebraic structures like rings and modules with keys for opposite rings and algebraic closure, and you could have another class for topological spaces with keys for closure and interior. However, as the reader can probably imagine, this becomes extremely cumbersome to work with in practice since an algebraic structure might very well also carry a topology. So at the end of the day, I advice you to use a single superclass \lstinline!var! that has all the keyval syntax and only use subclasses for further \emph{customization}. We shall see examples of this below.
\chapter{Example: Elementary algebra}
-\setupclass{var}{
- novaluekeys={
- {pol}{
+\SetupClass\MyVar{
+ singlekeys={
+ {poly}{
par, % This tells semantex to use parentheses around
% the argument in the first place, in case this
% had been turned off
@@ -682,13 +777,13 @@ Let me add that it is possible to create subclasses of existing classes. You jus
},
}
-Let us try to use the \semantex system to build some commands
+Let us try to use \semantex to build some commands
for doing algebra.
-As an algebraist, one of the first things you might want to do is to create polynomial rings~\( \vk[pol]{\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:
+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{var}{
- novaluekeys={
- {pol}{
+\SetupClass\MyVar{
+ singlekeys={
+ {poly}{
par, % This tells semantex to use parentheses around
% the argument in the first place, in case this
% had been turned off
@@ -699,13 +794,13 @@ As an algebraist, one of the first things you might want to do is to create poly
\end{lstlisting}
Now we may write
\begin{LTXexample}
- $\vk[pol]{\vx,\vy,\vz}$
+ $\vk[poly]{\vx,\vy,\vz}$
\end{LTXexample}
It is straightforward how to do adjust this to instead write the \emph{field} generated by the variables~\( x, y, z \):
\begin{lstlisting}
-\setupclass{var}{
- novaluekeys={
- {pol}{
+\SetupClass\MyVar{
+ singlekeys={
+ {poly}{
par, % This tells semantex to use parentheses around
% the argument in the first place, in case this
% had been turned off
@@ -718,8 +813,8 @@ It is straightforward how to do adjust this to instead write the \emph{field} ge
},
}
\end{lstlisting}
-\setupclass{var}{
- novaluekeys={
+\SetupClass\MyVar{
+ singlekeys={
{field}{
par,
leftpar=(,rightpar=),
@@ -727,13 +822,13 @@ It is straightforward how to do adjust this to instead write the \emph{field} ge
},
}
Now \lstinline!\vk[field]{\vx,\vy,\vz}! produces~\( \vk[field]{\vx,\vy,\vz} \). Of course, leaving out the \lstinline!field!
-key would produce the same result with the current configuration of~\lstinline!var!. However, it is still best to use a key for this, both because this makes the semantics more clear, but also because you might later change some settings that would cause the default behaviour to be different.
+key would produce the same result with the current configuration of the class~\lstinline!\MyVar!. However, it is still best to use a key for this, both because this makes the semantics more clear, but also because you might later change some settings that would cause the default behaviour to be different.
-Adding support for free algebras and fields is almost as easy, but there is a catch:
+Adding support for free algebras, power series, and Laurent series is almost as easy, but there is a catch:
\begin{lstlisting}
-\setupclass{var}{
- novaluekeys={
- {pol}{
+\SetupClass\MyVar{
+ singlekeys={
+ {poly}{
par, % This tells semantex to use parentheses around
% the argument in the first place, in case this
% had been turned off
@@ -756,18 +851,18 @@ Adding support for free algebras and fields is almost as easy, but there is a ca
{laurent}{
par,
leftpar=(, rightpar=),
- prearg={\!\!\noexpand\semantexdelimsize(},
- postarg={\noexpand\semantexdelimsize)\!\!},
+ prearg={\!\!\noexpand\SemantexDelimiterSize(},
+ postarg={\noexpand\SemantexDelimiterSize)\!\!},
% These are printed before and after the argument.
- % The command "\semantexdelimsize" is substituted
+ % The command "\SemantexDelimiterSize" is substituted
% by \big, \Big, ..., or whatever size the
% argument delimiters have
},
},
}
\end{lstlisting}
-\setupclass{var}{
- novaluekeys={
+\SetupClass\MyVar{
+ singlekeys={
{freealg}{
par,
leftpar=\noexpand\langle,
@@ -781,10 +876,10 @@ Adding support for free algebras and fields is almost as easy, but there is a ca
{laurent}{
par,
leftpar=(, rightpar=),
- prearg={\!\!\noexpand\semantexdelimsize(},
- postarg={\noexpand\semantexdelimsize)\!\!},
+ prearg={\!\!\noexpand\SemantexDelimiterSize(},
+ postarg={\noexpand\SemantexDelimiterSize)\!\!},
% These are printed before and after the argument.
- % The command "\semantexdelimsize" is substituted
+ % The command "\SemantexDelimiterSize" is substituted
% by \big, \Big, ..., or whatever size the
% argument delimiters have
},
@@ -803,8 +898,8 @@ $\vk[laurent]{\vz}$
Let us look at some other algebraic operations that we can control via \semantex:
\begin{lstlisting}
-\setupclass{var}{
- novaluekeys={
+\SetupClass\MyVar{
+ singlekeys={
{op}{upper={\noexpand\mathrm{op}}},
% opposite groups, rings, categories, etc.
{algclosure}{overline},
@@ -835,8 +930,8 @@ Let us look at some other algebraic operations that we can control via \semantex
},
}
\end{lstlisting}
-\setupclass{var}{
- novaluekeys={
+\SetupClass\MyVar{
+ singlekeys={
{op}{upper={\noexpand\mathrm{op}}},
% opposite groups, rings, categories, etc.
{algclosure}{overline},
@@ -887,7 +982,7 @@ does not yield a satisfactory result. However, the \lstinline!spar! key saves th
\begin{LTXexample}
$\vf[der=\vn,spar,inv]$
\end{LTXexample}
-So \lstinline!spar! simply adds a pair of parentheses around the current symbol, complete with all indices that you may have added to it so for. The name \lstinline!spar! stands for \enquote{symbol parentheses}. You can add as many as you like:
+So \lstinline!spar! simply adds a pair of parentheses around the current symbol, complete with all indices that you may have added to it so far. The name \lstinline!spar! stands for \enquote{symbol parentheses}. You can add as many as you like:
\begin{LTXexample}
$ \vf[1,res=\vV,spar,conj,op,spar,0,inv,spar,mod=\vI,spar,dual]{\vx} $
\end{LTXexample}
@@ -907,18 +1002,73 @@ 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 parentheses, use the \lstinline!leftspar! and \lstinline!rightspar! keys:
+To adjust the type of brackets, use the \lstinline!leftspar! and \lstinline!rightspar! keys:
\begin{LTXexample}
$\vf[leftspar={[},rightspar={\}},spar,spar=\Bigg]$
\end{LTXexample}
-Occassionally, it is useful to be able to input a particular kind of parentheses just once,
-without adjusting any settings. For this purpose, we have the (previously mentioned)
-\lstinline!otherspar!~key. It uses the syntax~\lstinline!otherspar={opening parenthesis}{closing parenthesis}!:
+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
+\begin{lstlisting}
+otherspar={⟨opening bracket⟩}{⟨closing bracket⟩}
+Otherspar={⟨opening bracket⟩}{⟨closing bracket⟩}{⟨size⟩}
+\end{lstlisting}
+Let us see them in action:
\begin{LTXexample}
$\vf[otherspar={[}{)},otherspar={\{}{\rangle},
- spar]$
+ Otherspar={\langle}{\rangle}{\Bigg},spar]$
\end{LTXexample}
+\chapter{The \texorpdfstring{\texttt{$\backslash$⟨Class⟩}}{Class} command}
+
+So far, we have learned that every mathematical entity should be treated
+as an object of some class. However, then we run into issues the moment we
+want to write expressions like
+\[
+ \MyVar{\vf\circ\vg}[spar,der=\vn]{\vx}.
+\]
+We do not want to have to define a new variable
+with symbol~\( \vf\circ\vg \) just to write something like this.
+Fortunately, once you have created the class~\lstinline!\MyVar!,
+you can actually use~\lstinline!\MyVar! as a command to create a quick instance of the class.
+More precisely \lstinline!\MyVar{⟨symbol⟩}!~creates a variable on the spot with symbol~\lstinline!⟨symbol⟩!.
+So the above equation can be written
+\begin{LTXexample}
+$\MyVar{\vf\circ\vg}[
+ spar,der=\vn]{\vx}$
+\end{LTXexample}
+More generally, when you crate the class~\lstinline!\⟨Class⟩!,
+you can use it as a command with the following syntax:
+\begin{lstlisting}
+\⟨Class⟩{⟨symbol⟩}[⟨options⟩]⟨usual syntax of class⟩
+\end{lstlisting}
+
+\chapter{The \texttt{return} keys}\label{ch:return}
+
+Suppose you want to take the complex conjugate of the variable~\( \vz[1] \). Then you might write something like
+\begin{LTXexample}
+$\vz[1,conj]$
+\end{LTXexample}
+Notice that the bar has only been added over the~\( \vz \), as is standard mathematical typography; you normally do not write~\( \vz[1,return,conj] \).
+This reveals a design choice that has been made in \semantex:
+When you add an index or a command via the \lstinline{command} key,
+it is not immediately applied to the symbol.
+Rather, both commands and indices are added to a register and are then applied at the very last, right before the symbol is printed.
+This allows us to respect standard mathematical typography, as shown above.
+
+However, there are other times when this behaviour is not what you want.
+For instance, if you want to comjugate the inverse of a function, the following looks wrong:
+\begin{LTXexample}
+$\vf[inv,conj]$
+\end{LTXexample}
+Therefore, there is a command \lstinline!return! that can be applied at any point to invoke the routine of adding all indices and commands to the symbol. Let us try it out:
+\begin{LTXexample}
+$\vf[inv,return,conj]$
+\end{LTXexample}
+In fact, \lstinline!return! is an umbrella key that invokes three different return routines: \lstinline!leftreturn!, \lstinline!innerreturn!, and \lstinline!rightreturn!. The command \lstinline!leftreturn! adds the left indices to the symbol (we have not discussed left indices yet, though). The command \lstinline!innerreturn! adds all commands to the symbol (those defined using the \lstinline!command!~key).
+Finally, \lstinline!rightreturn! adds all right indices and arguments to the symbol.
+In general, the user should probably be satisfied with just using \lstinline!return!.
+
\chapter{The \texttt{command} key}
@@ -932,21 +1082,21 @@ to the symbol. In fact, you can create similar commands yourself via
the \lstinline!command! key.
In fact, you could have defined the \lstinline!overline! yourself as follows:
\begin{lstlisting}
-\setupclass{var}{
- novaluekeys={
+\SetupClass\MyVar{
+ singlekeys={
{overline}{command=\noexpand\overline},
},
}
\end{lstlisting}
-\setupclass{var}{
- novaluekeys={
+\SetupClass\MyVar{
+ singlekeys={
{overline}{command=\noexpand\overline},
},
}
-This is how the key \lstinline!overline! is defined internally, except it is defined on the level of the superclass \lstinline!automathvariable! instead. We need the key \lstinline!\noexpand! in order for everything to expand properly. This is only necessary for some commands, and to tell the truth, I haven't quite figured out the system of which commands need it and which ones do not. However, as usual, if something does not work, try throwing in some \lstinline!\noexpand!'s and see if it solves the problem.
+This is how the key \lstinline!overline! is defined internally, except it is defined on the level of the superclass \lstinline!\SemantexVariable! instead. We need the key \lstinline!\noexpand! in order for everything to expand properly. This is only necessary for some commands, and to tell the truth, I haven't quite figured out the system of which commands need it and which ones do not. However, as usual, if something does not work, try throwing in some \lstinline!\noexpand!'s and see if it solves the problem.
Here are some more examples of predefined keys that use the command key:
\begin{lstlisting}
-\setupclass{var}{ % do not add these -- they are already predefined!
+\SetupClass\MyVar{ % do not add these -- they are already predefined!
novalueskeys={
{smash}{command=\noexpand\smash},
{tilde}{command=\noexpand\tilde},
@@ -965,141 +1115,116 @@ $\va[roman]$,
$\va[bar]$
\end{LTXexample}
-\chapter{The \texttt{return} keys}\label{ch:return}
-
-Suppose you want to take the complex conjugate of the variable~\( \vz[1] \). Then you might write something like
-\begin{LTXexample}
-$\vz[1,conj]$
-\end{LTXexample}
-Notice that the bar has only been added over the~\( \vz \), as is standard mathematical typography; you do not normally write~\( \vz[1,return,conj] \).
-This reveals a design choice that has been made in \semantex:
-When you add an index or a command via the \lstinline{command} key,
-it is not immediately applied to the symbol.
-Rather, both commands and indices are added to a register and are then applied at the very last, right before the symbol is printed.
-This allows us to respect standard mathematical typography, as shown above.
-
-However, there are other times when this behaviour is not what you want.
-For instance, if you want to comjugate the inverse of a function, the following looks wrong:
-\begin{LTXexample}
-$\vf[inv,conj]$
-\end{LTXexample}
-Therefore, there is a command \lstinline!return! that can be applied at any point to invoke the routine of adding all indices and commands to the symbol. Let us try it out:
-\begin{LTXexample}
-$\vf[inv,return,conj]$
-\end{LTXexample}
-In fact, \lstinline!return! is an umbrella key that invokes three different return routines: \lstinline!leftreturn!, \lstinline!innerreturn!, and \lstinline!rightreturn!. The command \lstinline!leftreturn! adds the left indices to the symbol (we have not discussed left indices yet, though). The command \lstinline!innerreturn! adds all commands to the symbol (those defined using the \lstinline!command!~key).
-Finally, \lstinline!rightreturn! adds all right indices and arguments to the symbol.
-In general, the user should probably be satisfied with just using \lstinline!return!.
\chapter{Example: Algebraic geometry}
Let us discuss how to typeset sheaves and operations on morphisms in algebraic geometry.
First of all, adding commands for sheaves is not a big deal:
\begin{lstlisting}
-\newvar\sheafF{\mathcal{F}}
-\newvar\sheafG}{\mathcal{G}}
-\newvar\sheafH{\mathcal{H}}
-\newvar\sheafO{\mathcal{O}}
-\newvar\sheafHom{\mathcal{H}\!\!om}
+\NewObject\MyVar\sheafF{\mathcal{F}}
+\NewObject\MyVar\sheafG}{\mathcal{G}}
+\NewObject\MyVar\sheafH{\mathcal{H}}
+\NewObject\MyVar\sheafreg{\mathcal{O}}
+ % sheaf of regular functions
+\NewObject\MyVar\sheafHom{\mathop{\mathcal{H}om}}
\end{lstlisting}
You can of course add as many sheaf commands as you need.
-Also, to make notations shorter, you could consider
-calling the commands~\lstinline!\shF!, \lstinline!\shG!, \lstinline!\shH!, \lstinline!\shO!, and~\lstinline!\shHom! instead, as I usually do.
-You may also want to have a separate command~\lstinline!shreg!
-for the sheaf~\( \sheafO \)
-of regular functions.
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!var! key:
+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{var}{
- novaluekeys={
- {comor}{upper=\#},
+\SetupClass\MyVar{
+ singlekeys={
+ {comorphism}{upper=\#},
% comorphisms, i.e. f^{\#}
{inverseimage}{upper={-1},nopar},
% inverse image of sheaves
- {shpull}{upper=*,nopar},
+ {sheafpull}{upper=*,nopar},
% sheaf *-pullback
- {shpush}{lower=*,nopar},
+ {sheafpush}{lower=*,nopar},
% sheaf *-pushforward
- {sh!pull}{upper=!,nopar},
+ {sheaf!pull}{upper=!,nopar},
% sheaf !-pullback
- {sh!push}{lower=!,nopar},
+ {sheaf!push}{lower=!,nopar},
% sheaf !-pushforward
},
}
\end{lstlisting}
-\setupclass{var}{
- novaluekeys={
- {comor}{upper=\#},
+\SetupClass\MyVar{
+ singlekeys={
+ {comorphism}{upper=\#},
% comorphisms, i.e. f^{\#}
{inverseimage}{upper={-1},nopar},
% inverse image of sheaves
- {shpull}{upper=*,nopar},
+ {sheafpull}{upper=*,nopar},
% sheaf *-pullback
- {shpush}{lower=*,nopar},
+ {sheafpush}{lower=*,nopar},
% sheaf *-pushforward
- {sh!pull}{upper=!,nopar},
+ {sheaf!pull}{upper=!,nopar},
% sheaf !-pullback
- {sh!push}{lower=!,nopar},
+ {sheaf!push}{lower=!,nopar},
% sheaf !-pushforward
},
}
-We have added the command \lstinline!nopar! to all pullback and pushforward commands since it is custom to write, say,~\( \vf[shpull]{\sheafF} \) rather than~\( \vf[shpull,par]{\sheafF} \). Of course, you can decide that for yourself, and in any case, you can write~\lstinline!\vf[shpull,par]{\shF}! 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!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:
\begin{LTXexample}
For a morphism~$ \vf \colon
\vX \to \vY $ with
-comorphism~$ \vf[comor]
-\colon \sheafO[\vY] \to
-\vf[shpush]{\sheafO[\vX]} $,
+comorphism~$ \vf[comorphism]
+\colon \sheafreg[\vY] \to
+\vf[sheafpush]{\sheafreg[\vX]} $,
and for a sheaf~$ \sheafF $ on~$ \vY $, we can define the
-pullback~$ \vf[shpull]{
+pullback~$ \vf[sheafpull]{
\sheafF} $ by letting~$
-\vf[shpull]{ \sheafF}{\vU} = \cdots $ and the $ ! $-pullback by letting~$
-\vf[sh!pull]{\sheafF}{\vU} = \cdots $.
+\vf[sheafpull]{ \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 other things in math called pullbacks, so I prefer to use the \lstinline!sh!~prefix to show that this is for sheaves.
+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!.
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{var}{
+\SetupClass\MyVar{
valuekeys={
{stalk}{clower={#1}},
- {twist}{return,symbolputright={(#1)}},
+ % "clower" means "comma lower", i.e. lower index
+ % separated from any previous lower index by a comma
+ {sheaftwist}{return,symbolputright={(#1)}},
},
- novaluekeys={
+ singlekeys={
{sheafify}{upper=+},
- {shdual}{upper=\vee},
+ {sheafdual}{upper=\vee},
},
}
\end{lstlisting}
-\setupclass{var}{
+\SetupClass\MyVar{
valuekeys={
{stalk}{clower={#1}},
- {twist}{return,symbolputright={(#1)}},
+ % "clower" means "comma lower", i.e. lower index
+ % separated from any previous lower index by a comma
+ {sheaftwist}{return,symbolputright={(#1)}},
},
- novaluekeys={
+ singlekeys={
{sheafify}{upper=+},
- {shdual}{upper=\vee},
+ {sheafdual}{upper=\vee},
},
}
-The key \lstinline!clower! stands for \enquote{comma-lower}.
+The key \lstinline!clower! stands for \enquote{comma lower}.
It is like \lstinline!lower!, except that it checks whether the index
is already non-empty, and if so, it separates the new index from the previous index by a comma. There is, of course, a \lstinline!cupper!~key that does the same with the upper index.
\begin{LTXexample}
$\sheafF[res=\vU,stalk=\vp]$,
$\sheafF[res=\vU,spar,stalk=
\vp]$,
-$\sheafO[\vX,stalk=\vp]$,
+$\sheafreg[\vX,stalk=\vp]$,
$\sheafG[sheafify]$,
-$\vf[inverseimage]{\sheafO[
+$\vf[inverseimage]{\sheafreg[
\vY]}[spar,stalk=\vx]$
-$\sheafG[shdual]$,
-$\sheafO[\vX][twist=-1]$,
-$\sheafO[twist=1,shdual]$
+$\sheafG[sheafdual]$,
+$\sheafreg[\vX][sheaftwist=-1]$,
+$\sheafreg[sheaftwist=1,sheafdual]$
\end{LTXexample}
\chapter{Example: Homological algebra}
@@ -1108,18 +1233,18 @@ Before you venture into homological algebra, you should probably
define some keys for the standard constructions:
\begin{lstlisting}
-\newvar\Hom{\operatorname{Hom}}
-\newvar\Ext{\operatorname{Ext}}
-\newvar\Tor{\operatorname{Tor}}
+\NewObject\MyVar\Hom{\operatorname{Hom}}
+\NewObject\MyVar\Ext{\operatorname{Ext}}
+\NewObject\MyVar\Tor{\operatorname{Tor}}
\end{lstlisting}
-\newvar\Ext{\operatorname{Ext}}
-\newvar\Tor{\operatorname{Tor}}
+\NewObject\MyVar\Ext{\operatorname{Ext}}
+\NewObject\MyVar\Tor{\operatorname{Tor}}
Now the ability to easily print indices via the options key will come in handy:
\begin{LTXexample}
$\Hom[\vA]{\vM,\vN}$,
$\Ext[\vA]{\vM,\vN}$
\end{LTXexample}
-\setupclass{var}{
+\SetupClass\MyVar{
valuekeys={
{shift}{ return,symbolputright={ \relax [ {#1} ] } },
% \relax is necessary since otherwise [...] can
@@ -1128,7 +1253,7 @@ valuekeys={
}
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{var}{
+\SetupClass\MyVar{
valuekeys={
{shift}{ return,symbolputright={ \relax [ {#1} ] } },
% \relax is necessary since otherwise [...] can
@@ -1140,6 +1265,14 @@ Let us see that it works:
\begin{LTXexample}
$\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]
+\end{lstlisting}%
+\NewObject\MyVar\dif{d}[nopar]%
+\begin{LTXexample}
+$\dif{\vx} = 0$
+\end{LTXexample}
\section{The keys \texttt{i = index} and \texttt{d = deg = degree}}
@@ -1148,7 +1281,7 @@ 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 (the package author has the privilege to decide).
You can adjust this by writing
-\lstinline!gradingpos=upper! or~\lstinline!gradingpos=lower!.
+\lstinline!gradingposition=upper! or~\lstinline!gradingposition=lower!.
We already learned about the keys \lstinline!upper! and~\lstinline!lower!.
@@ -1167,29 +1300,29 @@ $\Hom[index=\vA,degree=0]$,
$\ho[index=\vDelta,degree=1]$
\end{LTXexample}
These names are not perfect; many people would say 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. These names probably become a bit too heave to write in the long run, so both keys have abbreviated equivalents:
+an index, but feel free to come up with a more satisfactory naming principle, and I shall be happy to consider it. These names probably become a bit too heavy to write in the long run, so both keys have abbreviated equivalents:
\begin{center}
\lstinline!i! = \lstinline!index!
\qquad\qquad and\qquad\qquad
- \lstinline!d! = \lstinline!deg! = \lstinline{degree}
+ \lstinline!d! = \lstinline!deg! = \lstinline!degree!
\end{center}
Let us see them in action:
\begingroup\begin{LTXexample}
$ \vX[d=3,i=\vk] $
-\setupobject\vX{
- gradingpos=lower
+\SetupObject\vX{
+ gradingposition=lower
}
$ \vX[d=3,i=\vk] $
\end{LTXexample}\endgroup
-\noindent (We haven't seen the command \lstinline!\setupobject! before, but I imagine you can guess what it does).
+\noindent (We haven't seen the command \lstinline!\SetupObject! before, but I imagine you can guess what it does).
If you want to print a bullet as the degree, there is the predefined key~\lstinline!*! for this:
\begingroup\begin{LTXexample}
$ \vX[*] $
-\setupobject\vX{
- gradingpos=lower
+\SetupObject\vX{
+ gradingposition=lower
}
$ \vX[*] $
@@ -1199,8 +1332,8 @@ I guess it is also time to reveal that the previously mentioned shorthand notati
\begingroup\begin{LTXexample}
$ \vX[1] $
-\setupobject\vX{
- gradingpos=lower
+\SetupObject\vX{
+ gradingposition=lower
}
$ \vX[1] $
@@ -1212,8 +1345,8 @@ $\ho[\vDelta,d=1]$
\end{LTXexample}
-Note that the use of the short notations \lstinline!d! and~\lstinline!i! does not mean you cannot write e.g. \lstinline!\vx[d]! and~\lstinline!\vx[i]!.
-In fact, this is not the case:
+Note that the use of the short notations \lstinline!d! and~\lstinline!i! does not prevent you from writing \lstinline!\vx[d]! and~\lstinline!\vx[i]!.
+This still works fine:
\begin{LTXexample}
$\vf[i]$, $\vf[i=]$,
$\vf[d]$, $\vf[d=]$
@@ -1221,31 +1354,35 @@ $\vf[d]$, $\vf[d=]$
As we see, it is only when a \lstinline!d! or~\lstinline!i! key is followed by an equality sign~\lstinline!=!
that the routines of these keys are invoked.
In fact, \semantex carefully separates
-\lstinline!valuekeys! from \lstinline!novaluekeys!.
+\lstinline!valuekeys! from \lstinline!singlekeys!.
-\section{The \texttt{cohomology} class type}
+\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, but there are several others.
-The first one we shall need is the \lstinline!cohomology! class type, which has a different input syntax that fits cohomology.
+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{cohomology}[parent=var,gradingpos=upper]
+\NewCohomologyClass\MyCohomology[
+ parent=\MyVar,gradingposition=upper
+]
-\newcohomology\co{H}
+\NewObject\MyCohomology\co{H}
-\newcohomologyclass{homology}[parent=cohomology,gradingpos=lower]
+\NewCohomologyClass\MyHomology[
+ parent=\MyCohomology,gradingposition=lower
+]
-\newhomology\ho{H}
+\NewObject\MyHomology\ho{H}
\end{lstlisting}
The cohomology command~\lstinline!\co! in general works very much
-like a command of variable type. However, the input syntax is a bit different:
+like a command of \lstinline!Variable! type. However, the input syntax is a bit different:
\begin{lstlisting}
-\co[options]{degree}{argument}
+\co[⟨options⟩]{⟨degree⟩}{⟨argument⟩}
\end{lstlisting}
All three arguments are optional. Let us see it in practice:
\begin{LTXexample}
@@ -1268,16 +1405,16 @@ Of course, you can define similar commands for cocycles, coboundaries, and all s
You might also want to implement feature like reduced cohomology, \v{C}ech cohomology,
and hypercohomology. This is quite easy with the \lstinline!command! key:
\begin{lstlisting}
-\setupclass{var}{
- novaluekeys={
+\SetupClass\MyVar{
+ singlekeys={
{reduced}{command=\widetilde},
{cech}{command=\noexpand\check},
{hyper{command=\noexpand\mathbb},
},
}
\end{lstlisting}
-\setupclass{var}{
- novaluekeys={
+\SetupClass\MyVar{
+ singlekeys={
{reduced}{command=\widetilde},
{cech}{command=\noexpand\check},
{hyper}{command=\noexpand\mathbb},
@@ -1290,14 +1427,14 @@ $\co[cech]{*}$,
$\co[hyper,cech]{0}{\vX}$
\end{LTXexample}
-The cohomology class also provides a nice way
+The \lstinline!Cohomology! class type also provides a nice way
to implement derived functors:
\begin{lstlisting}
-\newcohomology\Lder{\mathbb{L}}[nopar]
-\newcohomology\Rder{\mathbb{R}}[nopar]
+\NewObject\MyCohomology\Lder{\mathbb{L}}[nopar]
+\NewObject\MyCohomology\Rder{\mathbb{R}}[nopar]
\end{lstlisting}
-\newcohomology\Lder{\mathbb{L}}[nopar]
-\newcohomology\Rder{\mathbb{R}}[nopar]
+\NewObject\MyCohomology\Lder{\mathbb{L}}[nopar]
+\NewObject\MyCohomology\Rder{\mathbb{R}}[nopar]
For instance, we can write
\begin{LTXexample}
$\Lder{\vi}{\vf}$,
@@ -1308,7 +1445,7 @@ Alternatively, the user might prefer to use keyval syntax
on the level of the function itself (\( \vf \)~in this case).
This can be done the following way:
\begin{lstlisting}
-\setupclass{var}{
+\SetupClass\MyVar{
valuekeys={
{Lder} {
innerreturn,leftreturn,
@@ -1319,7 +1456,7 @@ This can be done the following way:
symbolputleft=\noexpand\mathbb{R}^{#1},
},
},
- novaluekeys={
+ singlekeys={
{Lder} {
innerreturn,leftreturn,
symbolputleft=\noexpand\mathbb{L},
@@ -1331,7 +1468,7 @@ This can be done the following way:
},
}
\end{lstlisting}
-\setupclass{var}{
+\SetupClass\MyVar{
valuekeys={
{Lder} {
innerreturn,leftreturn,
@@ -1342,7 +1479,7 @@ This can be done the following way:
symbolputleft=\noexpand\mathbb{R}^{#1},
},
},
- novaluekeys={
+ singlekeys={
{Lder} {
innerreturn,leftreturn,
symbolputleft=\noexpand\mathbb{L},
@@ -1363,23 +1500,29 @@ $\Hom[Rder]{\vX,\vY}$
If you get tired of having to write \lstinline!\Hom[Rder]! all
the time, you can create a shortcut:
\begin{lstlisting}
-\newvar\RHom[copy=\Hom,Rder]
+\NewObject\MyVar\RHom[clone=\Hom,Rder]
\end{lstlisting}
-\newvar\RHom[copy=\Hom,Rder]
-The \lstinline!copy! key is like the \lstinline!parent! key,
+\NewObject\MyVar\RHom[clone=\Hom,Rder]
+The \lstinline!clone! key is like the \lstinline!parent! key,
except it allows you to inherit the settings from an \emph{object} rather than a \emph{class}. Notice that we did not specify a symbol; the symbol argument is optional, and in this case, it was unnecessary, as the symbol was inherited from~\lstinline!\Hom!. Let us see it in action:
\begin{LTXexample}
$\RHom{\vX,\vY}$
\end{LTXexample}
-\section{Keyval syntax in arguments (Example: Cohomology with coefficients)}
+\chapter{Keyval syntax in arguments (Example: Cohomology with coefficients)}
-\setupclass{var}{
+\SetupClass\MyVar{
argvaluekeys={
- {coef}{ sep={;}{#1} },
+ {coef}{ othersep={;}{#1} },
},
}
+\SetupObject\co{
+ valuekeys={
+ {arg}{argwithkeyval={#1}},
+ },
+}%
+
Imagine we want to do cohomology with coefficients in some ring~\( \vR \).
It is common to write this as~\( \co{*}{\vX,coef=\vR} \)
with a semicolon instead of a comma. This can be implemented, too, with the syntax
@@ -1389,20 +1532,20 @@ $\co{*}{\vX,coef=\vR}$
This shows that arguments of functions also support keyval syntax.
In order to customize this, there are two extra keys:
\begin{center}
-\lstinline!argnovaluekeys!
+\lstinline!argsinglekeys!
\qquad\qquad\text{and}\qquad\qquad
\lstinline!argvaluekeys!
\end{center}
-These work exactly like \lstinline!novaluekeys! and~\lstinline!valuekeys!.
+These work exactly like \lstinline!singlekeys! and~\lstinline!valuekeys!.
\begin{lstlisting}
-\setupclass{var}{
+\SetupClass\MyVar{
argvaluekeys={
- {coef}{ sep={;}{#1} },
+ {coef}{ othersep={;}{#1} },
},
}
\end{lstlisting}
(But it will not quite work yet -- stay tuned for a moment!)
-The key \lstinline!sep! is a key that controls the separator
+The key \lstinline!othersep! 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.
@@ -1410,7 +1553,7 @@ However, even with the above setup, the notation \lstinline!\co{*}{\vX,coef=\vR}
just yet. For the keys you define using \lstinline!argvaluekeys!
are turned off by default. To turn them on for the object~\lstinline!\co!, run the following code:
\begin{lstlisting}
-\setupobject\co{
+\SetupObject\co{
valuekeys={
{arg}{argwithkeyval={#1}},
},
@@ -1420,15 +1563,15 @@ The reason the keys are turned off by default is that keys in arguments that sup
every occurrence of an equality sign in arguments, and the following
would not work:
\begin{LTXexample}
-$\Hom[\sheafO[\vU]]{
+$\Hom[\sheafreg[\vU]]{
\sheafF[res=\vU],
\sheafG[res=\vU]
}$
\end{LTXexample}
It should be noted that there are several predefined
-keys (of type \mbox{\lstinline!novaluekey!)} which are defined on the level
-of the class \lstinline!semantexvariable!. The full list is:\fxfatal{Finish this}
+keys (of type \mbox{\lstinline!singlekey!)} which are defined on the level
+of the class \lstinline!\SemantexVariable!. The full list is:\fxfatal{Finish this}
\begin{itemize}
\item slot, \ldots
@@ -1436,41 +1579,68 @@ of the class \lstinline!semantexvariable!. The full list is:\fxfatal{Finish this
We should also talk about the \lstinline!arg! key.
-\section{The \texttt{binary} class type (Example: Derived tensor products and fibre products)}
+\chapter{Multi-value keys}
+
+\SetupClass\MyVar{
+ 2valuekeys={
+ {projquotient}{ symbolputright={ /\!\!/ _ { #1 } #2 } },
+ }
+}
-\newbinaryclass{binaryoperator}[
- novaluekeys={
+Sometimes, a key with one value is simply not enough. For instance, if you
+work in~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 have the key~\lstinline!2valuekeys!. It works exactly like \lstinline!valuekeys!, except you get to use two arguments instead of one:
+\begin{lstlisting}
+\SetupClass\MyVar{
+ 2valuekeys={
+ {projquotient}{ symbolputright={ /\!\!/ _ { #1 } #2 } },
+ }
+}
+\end{lstlisting}
+
+\begin{LTXexample}
+$\vX[projquotient={\vchi}{\vG}] $
+\end{LTXexample}
+There are also commands \lstinline!3valuekeys!, \lstinline!4valuekeys!, \ldots, \lstinline!9valuekeys!. The syntax for these is completely analoguous.
+There are also commands \lstinline!arg2valuekeys!, \lstinline!arg3valuekeys!, \ldots, \lstinline!arg9valuekeys! for keys in arguments with multiple values.
+
+
+\chapter{The \texttt{Simple} class type (Example: Derived tensor products and fibre products)}
+
+\NewSimpleClass\MyBinaryOperator[
+ singlekeys={
{Lder}{upper=L},
{Rder}{upper=R},
},
mathbin, % this makes sure that the output is wrapped in \mathbin
]
-\newbinaryoperator\tens{\otimes}[
- novaluekeys={
+\NewObject\MyBinaryOperator\tensor{\otimes}[
+ singlekeys={
{der}{Lder},
},
]
-\newbinaryoperator\fibre{\times}[
+\NewObject\MyBinaryOperator\fibre{\times}[
% Americans are free to call it \fiber instead
- novaluekeys={
+ singlekeys={
{der}{Rder},
},
]
-The \semantex system has facilities for printing tensor products~\( \tens \) as well as derived tensor products~\( \tens[der] \).
-For this, we need the \lstinline!binary! 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
+The \semantex system has facilities for printing tensor products~\( \tensor \) as well as derived tensor products~\( \tensor[der] \).
+For this, we need the \lstinline!Simple! 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
\begin{lstlisting}
-\command[options]
+\⟨object⟩[⟨options⟩]
\end{lstlisting}
+(You should normally only use it for special constructions like binary operators and not for e.g.\ variables -- the ability to add arguments to variables comes in handy much more often than one might imagine.)
Let us try to use it to define tensor products and fibre products:
\begin{lstlisting}
-\newbinaryclass{binaryoperator}[
- novaluekeys={
+\NewSimpleClass\MyBinaryOperator[
+ singlekeys={
{Lder}{upper=L},
{Rder}{upper=R},
},
@@ -1478,64 +1648,34 @@ Let us try to use it to define tensor products and fibre products:
% this makes sure that the output is wrapped in \mathbin
]
-\newbinaryoperator\tens{\otimes}[
- novaluekeys={
+\NewObject\MyBinaryOperator\tensor{\otimes}[
+ singlekeys={
{der}{Lder},
},
]
-\newbinaryoperator\fibre{\times}[
+\NewObject\MyBinaryOperator\fibre{\times}[
% Americans are free to call it \fiber instead
- novaluekeys={
+ singlekeys={
{der}{Rder},
},
]
\end{lstlisting}
As you see, this is one of the few cases where I recommend adding keyval
-syntax on the level of subclasses. Also, notice that it does not have any~\lstinline!parent=var!, as I do not really see any reason to inherit all the keyval syntax from the \lstinline!var!~class.
-Now we first define keys \lstinline!Lder! and~\lstinline!Rder! for left and right derived binary operators. Next, we build in a shortcut in both \lstinline!\tens! and~\lstinline!\fibre!
+syntax to other classes than your superclass~\lstinline!\MyVar!. Also, notice that it does not have any~\lstinline!parent=\MyVar!, as I do not really see any reason to inherit all the keyval syntax from the \lstinline!\MyVar!~class.
+Now we first define keys \lstinline!Lder! and~\lstinline!Rder! for left and right derived binary operators. Next, we build in a shortcut in both \lstinline!\tensor! and~\lstinline!\fibre!
so that we can write simply~\lstinline!der! and get the correct notion of derived functor. Let us see it in action:
\begin{LTXexample}
-$\vA \tens \vB$,
-$\vX[*] \tens[\vR] \vY[*]$
-$\vk \tens[\vA,der] \vk$,
+$\vA \tensor \vB$,
+$\vX[*] \tensor[\vR] \vY[*]$
+$\vk \tensor[\vA,der] \vk$,
$\vX \fibre[\vY,der] \vX$
\end{LTXexample}
-\chapter{The \texorpdfstring{\texttt{$\backslash$⟨classname⟩}}{classname} command}
-
-So far, we have learned that every mathematical entity should be treated
-as an object of some class. However, then we run into issues the moment we
-want to write expressions like
-\[
- \var{\vf\circ\vg}[spar,der=\vn]{\vx}.
-\]
-We do not want to have to define a new variable
-with symbol~\( \vf\circ\vg \) in order to write something like this.
-Fortunately, once you have created the class~\lstinline!var!,
-you get an extra command~\lstinline!\var! that has the following syntax
-\begin{lstlisting}
-\var{symbol}[options]{argument}
-\end{lstlisting}
-In other words, it allows you to create a variable on the spot and give in an arbitrary symbol. So the above equation can be written
-\begin{LTXexample}
-$\var{\vf\circ\vg}[
- spar,der=\vn]{\vx}$
-\end{LTXexample}
-More generally, whenever you create a class with name \lstinline!⟨classname⟩!, you automatically get a command
-named~\lstinline!\⟨classname⟩!.
-It has the same input syntax as the class in question,
-except that, as above, the first argument is the symbol:
-\begin{lstlisting}
-\⟨classname⟩{symbol}⟨usual syntax of class⟩
-\end{lstlisting}
-
-Actually, now might be the right time to reveal that the low-level machinery in \semantex does not actually see the difference between an object and a class. Yep, this is how it has been implemented, and there are probably some object-oriented purists who will say that this goes against some general programming philosophy nonsense. So when you create the class \lstinline!⟨classname⟩!, you really create the above object which has a special syntax. And now all other objects of that class simply inherit from this object. (As we saw from above, you can actually inherit from any object; you just write~\lstinline!copy=\objectname! instead of using \lstinline!parent!.)
-
\chapter{Class types}
The \semantex system uses several different \emph{class types}.
-We have been almost exclusively using the \lstinline!variable! class type (which is by far the most important one), but in the last section, we were introduced to the \lstinline!cohomology! and the \lstinline!binary! class types.
+We have been almost exclusively using the \lstinline!Variable! class type (which is by far the most important one), but in the last chpaters, we were introduced to the \lstinline!Cohomology! and the \lstinline!Simple! class types.
In fact, all class types are identical internally; the low-level machinery of \semantex does not \enquote{know} what type a class has.
The only difference between the class types is the \emph{input syntax}.
@@ -1547,84 +1687,84 @@ The current implementation has the following
class types:
\begin{itemize}
- \item \lstinline!variable!:
+ \item \lstinline!Variable!:
A new class is declared with the
syntax
\begin{lstlisting}
- \newvariableclass{⟨classname⟩}[options]
+ \NewVariableClass{\⟨Class⟩}[⟨options⟩]
\end{lstlisting}
A new object is declared by
\begin{lstlisting}
- \new⟨classname⟩\⟨objectname⟩{symbol}[options]
+ \NewObject\⟨Class⟩\⟨object⟩{⟨symbol⟩}[⟨options⟩]
\end{lstlisting}
The syntax for this object is
\begin{lstlisting}
- \⟨objectname⟩[options]{argument}
+ \⟨object⟩[⟨options⟩]{⟨argument⟩}
\end{lstlisting}
- \item \lstinline!cohomology!:
+ \item \lstinline!Cohomology!:
A new class is declared with the
syntax
\begin{lstlisting}
- \newcohomologyclassclass{⟨classname⟩}[options]
+ \NewCohomologyClass\⟨Class⟩[⟨options⟩]
\end{lstlisting}
A new object is declared by
\begin{lstlisting}
- \new⟨classname⟩\⟨objectname⟩{symbol}[options]
+ \NewObject\⟨Class⟩\⟨object⟩{⟨symbol⟩}[⟨options⟩]
\end{lstlisting}
The syntax for this object is
\begin{lstlisting}
- \⟨objectname⟩[options]{degree}{argument}
+ \⟨object⟩[⟨options⟩]{⟨degree⟩}{⟨argument⟩}
\end{lstlisting}
- \item \lstinline!binary!:
+ \item \lstinline!Simple!:
A new class is declared with the
syntax
\begin{lstlisting}
- \newdelimiterclass{⟨classname⟩}[options]
+ \NewSimpleClass\⟨Class⟩[⟨options⟩]
\end{lstlisting}
A new object is declared by
\begin{lstlisting}
- \new⟨classname⟩\⟨objectname⟩{left bracket}{right bracket}[options]
+ \NewObject\⟨Class⟩\⟨object⟩{⟨symbol⟩}[⟨options⟩]
\end{lstlisting}
The syntax for this object is
\begin{lstlisting}
- \⟨objectname⟩[options]{argument}
+ \⟨object⟩[⟨options⟩]{⟨argument⟩}
\end{lstlisting}
- \item \lstinline!delimiter!:
+ \item \lstinline!Delimiter!:
A new class is declared with the syntax
\begin{lstlisting}
- \newtupleclass{⟨classname⟩}[options]
+ \NewDelimiterClass\⟨Class⟩[⟨options⟩]
\end{lstlisting}
A new object is declared by
\begin{lstlisting}
- \new⟨classname⟩\⟨objectname⟩{left bracket}{right bracket}[options]
+ \NewObject\⟨Class⟩\⟨object⟩{⟨left bracket⟩}{⟨right bracket⟩}[⟨options⟩]
\end{lstlisting}
The syntax for this object is
\begin{lstlisting}
- \⟨objectname⟩[options]{argument}
+ \⟨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~\lstinline!\new⟨class type⟩class! and modify it in whatever way you want.
+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~\lstinline!\New⟨Class type⟩Class! and modify it in whatever way you want.
-\chapter{The \texorpdfstring{\texttt{delimiter}}{delimiter} class type}
+\chapter{The \texorpdfstring{\texttt{Delimiter}}{Delimiter} class type}
-\newdelimiterclass{delim}[parent=var]
-\newdelim\norm{\lVert}{\rVert}
-\newdelim\inner{\langle}{\rangle}
+\NewDelimiterClass\MyDelim[parent=\MyVar]
+\NewObject\MyDelim\norm{\lVert}{\rVert}
+\NewObject\MyDelim\inner{\langle}{\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 delimiter:
+that are defined using brackets only. Let us define a class of type \lstinline!Delimiter!:
\begin{lstlisting}
-\newdelimiterclass{delim}[parent=var]
+\NewDelimiterClass\MyDelim[parent=\MyVar]
\end{lstlisting}
-Now we get a command \lstinline!\newdelim! with the following syntax:
+Now we can create instances of the class~\lstinline!\MyDelim! with the following syntax:
\begin{lstlisting}
-\newdelim\⟨objectname⟩{left bracket}{right bracket}[options]
+\NewObject\MyDelim\⟨object⟩{⟨left bracket⟩}{⟨right bracket⟩}[⟨options⟩
\end{lstlisting}
Now we can do the following:
\begin{lstlisting}
-\newdelim\norm{\lVert}{\rVert}
-\newdelim\inner{\langle}{\rangle}
+\NewObject\MyDelim\norm{\lVert}{\rVert}
+\NewObject\MyDelim\inner{\langle}{\rangle}
\end{lstlisting}
Indeed:
\begin{LTXexample}
@@ -1633,16 +1773,17 @@ $\inner{\va,\vb}$,
$\inner{slot,slot}$
\end{LTXexample}
We can also use it 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!~command:
\begin{lstlisting}
\newcommand\where{
\nonscript\:
- \semantexdelimsize\vert
+ \SemantexDelimiterSize\vert
\allowbreak
\nonscript\:
\mathopen{}
}
-\newdelim\Set{\lbrace}{\rbrace}[
+\NewObject\MyDelim\Set{\lbrace}{\rbrace}[
prearg={\,},postarg={\,},
% adds \, inside {...}, as recommended by D. Knuth
valuekeys={
@@ -1653,13 +1794,13 @@ We can also use it for more complicated constructions, like sets.
\end{lstlisting}
\newcommand\where{
\nonscript\:
- \semantexdelimsize\vert
+ \SemantexDelimiterSize\vert
\allowbreak
\nonscript\:
\mathopen{}
}
-\newdelim\Set{\lbrace}{\rbrace}[
+\NewObject\MyDelim\Set{\lbrace}{\rbrace}[
prearg={\,},postarg={\,},
% adds \, inside {...}, as recommended by D. Knuth
valuekeys={
@@ -1685,16 +1826,18 @@ $\Set{
Tuple-like commands are also possible:
\begin{lstlisting}
-\newdelim\tup{(}{)} % tuples
-\newdelim\pcoor{[}{]}[ % projective coordinates
- argsep=\mathpunct{:}, % changes the argument separator to :
- argdots=\cdots, % changes what is inserted if you write "..."
+\NewObject\MyDelim\tup{(}{)} % tuples
+\NewObject\MyDelim\pcoor{[}{]}[ % projective coordinates
+ setargsep=\mathpunct{:},
+ % changes the argument separator to colon
+ setargdots=\cdots,
+ % changes what is inserted if you write "..."
]
\end{lstlisting}
-\newdelim\tup{(}{)} % tuples
-\newdelim\pcoor{[}{]}[ % projective coordinates
- argsep=\mathpunct{:}, % changes the argument separator to :
- argdots=\cdots, % changes what is inserted if you write "..."
+\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 "..."
]
Let us see them in action:
\begin{LTXexample}
@@ -1704,178 +1847,381 @@ $\pcoor{\va,\vb,...,\vz}$
One can also use tuples for other, less obvious purposes, like calculus differentials:
\begin{lstlisting}
-\newdelimiterclass{calculusdifferential}[
- parent=var,
+\NewDelimiterClass\CalculusDifferential[
+ parent=\MyVar,
argvaluekeys={
- {default}{standardsep={d\!#1}},
+ {default}{s={d\!#1}},
+ % default is the key that is automatically applied by the
+ % system to anything you write in the argument. The s key
+ % is a key that prints the value of the key with the
+ % standard argument separator in front.
},
- argdots=\cdots,
- ifpar=false,
+ setargdots=\cdots,
+ neverpar,
+ % neverpar is like nopar, except nopar will still print
+ % parentheses when there is more than one argument
+ % -- neverpar does not even print parentheses in this case
]
-\newcalculusdifferential\intD{(}{)}[argsep={\,},iffirstarg=false]
+\NewObject\CalculusDifferential\intD{(}{)}[setargsep={\,},iffirstarg=false]
-\newcalculusdifferential\wedgeD{(}{)}[argsep=\wedge]
+\NewObject\CalculusDifferential\wedgeD{(}{)}[setargsep=\wedge]
\end{lstlisting}
-\newdelimiterclass{calculusdifferential}[
- parent=var,
+\NewDelimiterClass\CalculusDifferential[
+ parent=\MyVar,
argvaluekeys={
- {default}{standardsep={d\!#1}},
+ {default}{s={d\!#1}},
},
- argdots=\cdots,
- ifpar=false,
+ setargdots=\cdots,
+ neverpar,
+ % neverpar is like nopar, except nopar will still print
+ % parentheses when there is more than one argument
+ % -- neverpar does not even print parentheses in this case
]
-\newcalculusdifferential\intD{(}{)}[argsep={\,},iffirstarg=false]
+\NewObject\CalculusDifferential\intD{(}{)}[setargsep={\,},ifnextargwithsep=false]
-\newcalculusdifferential\wedgeD{(}{)}[argsep=\wedge]
+\NewObject\CalculusDifferential\wedgeD{(}{)}[setargsep=\wedge]
\begin{LTXexample}
-$\int \vf \intD{\vx[1],\vx[2],...,\vx[n]}$,
+$\int \vf \intD{\vx[1],
+ \vx[2],...,\vx[n]}$,
-$\int \vf \wedgeD{\vx[1],\vx[2],...,\vx[n]}$
+$\int \vf \wedgeD{\vx[1],
+ \vx[2],...,\vx[n]}$
\end{LTXexample}
-\chapter{The \texttt{execute} and \texttt{parseoptions} keys}
+\chapter{The \texttt{parse} routine}
-As you can see above, \semantex has a ``waterfall-like'' behaviour. It parses keys in the order it receives them. This works fine most of the time, but for some more complicated constructions, it is useful to be able to provide a data set in any order and have them printed in a fixed order. For this purpose, we have the \lstinline!execute! and \lstinline!parseoptions!~keys.
+As you can see above, \semantex has a ``waterfall-like'' behaviour. It runs keys in the order it receives them. This works fine most of the time, but for some more complicated constructions, it is useful to be able to provide a data set in any order and have them printed in a fixed order. For this purpose, we have the \lstinline!parse! routine.
-\newvar\Mat{\operatorname{Mat}}[
+
+
+Suppose we want to be able to write the set of \( \vn \times \vm \)-matrices with entries in~\( \vk \) as~\( \MyVar{\operatorname{Mat}}[\vn\times\vm]{\vk} \). We can in principle do the following:
+\begingroup\begin{LTXexample}
+\NewObject\MyVar\Mat{
+ \operatorname{Mat}}
+$ \Mat[\vn\times\vm]{\vk} $.
+\end{LTXexample}\endgroup%
+\noindent However, this is not quite as systematic and semantic as we might have wanted. Indeed, what if later you would like to change the notation to~\( \MyVar{\operatorname{Mat}}[\vn,\vm]{\vk} \)?
+Therefore, we do something like the following instead (we explain the notation below):
+\begin{lstlisting}
+\NewObject\MyVar\Mat{\operatorname{Mat}}[
execute={
- \semantexdataprovide{rows}
- \semantexdataprovide{columns}
+ \SemantexDataProvide{rows}
+ \SemantexDataProvide{columns}
+ % provides data sets for number of rows and columns
+ % for this object
},
valuekeys={
{rows}{
execute={
- \semantexdataset{rows}{#1}
+ \SemantexDataSet{rows}{#1}
},
},
{columns}{
execute={
- \semantexdataset{columns}{#1}
+ \SemantexDataSet{columns}{#1}
},
},
},
parseoptions={
execute={
- \semantexstrifeq{\semantexdatagetexpnot{columns}}{\semantexdatagetexpnot{rows}}
+ \SemantexStrIfEqTF{\SemantexDataGetExpNot{columns}}
+ {\SemantexDataGetExpNot{rows}}
+ % tests if rows = columns
{
- \semantexsetkeysx{
+ \SemantexKeysSetx{
lower={
- \semantexdatagetexpnot{columns}
+ \SemantexDataGetExpNot{columns}
}
}
}
{
- \semantexsetkeysx{
+ \SemantexKeysSetx{
lower={
- \semantexdatagetexpnot{rows}
+ \SemantexDataGetExpNot{rows}
\times
- \semantexdatagetexpnot{columns}
+ \SemantexDataGetExpNot{columns}
}
}
}
},
},
]
-
-Suppose we want to be able to write the set of \( \vn \times \vm \)-matrices with entries in~\( \vk \) as~\( \Mat[rows=\vn,columns=\vm]{\vk} \). We can in principle do the following:
-\begin{LTXexample}
-$ \Mat[\vn\times\vm]{\vk} $.
-\end{LTXexample}
-However, this is not quite as systematic and semantic as we might have wanted. Indeed, what if later you would like to change the notation to~\( \Mat[\vn,\vm]{\vk} \)?
-Therefore, we do something like the following instead (we explain the notation below):
-\begin{lstlisting}
-\newvar\Mat{\operatorname{Mat}}[
+\end{lstlisting}%
+\NewObject\MyVar\Mat{\operatorname{Mat}}[
execute={
- \semantexdataprovide{rows}
- \semantexdataprovide{columns}
- % provides data sets for number of rows and columns
- % for this object
+ \SemantexDataProvide{rows}
+ \SemantexDataProvide{columns}
},
valuekeys={
{rows}{
execute={
- \semantexdataset{rows}{#1}
+ \SemantexDataSet{rows}{#1}
},
},
{columns}{
execute={
- \semantexdataset{columns}{#1}
+ \SemantexDataSet{columns}{#1}
},
},
},
parseoptions={
execute={
- \semantexstrifeq{\semantexdatagetexpnot{columns}}
- {\semantexdatagetexpnot{rows}}
- % tests if rows = columns
+ \SemantexStrIfEqTF{\SemantexDataGetExpNot{columns}}{\SemantexDataGetExpNot{rows}}
{
- \semantexsetkeysx{
+ \SemantexKeysSetx{
lower={
- \semantexdatagetexpnot{columns}
+ \SemantexDataGetExpNot{columns}
}
}
}
{
- \semantexsetkeysx{
+ \SemantexKeysSetx{
lower={
- \semantexdatagetexpnot{rows}
+ \SemantexDataGetExpNot{rows}
\times
- \semantexdatagetexpnot{colums}
+ \SemantexDataGetExpNot{columns}
}
}
}
},
},
-]
-\end{lstlisting}
+]%
Now we can do the following:
\begin{LTXexample}
$ \Mat[rows=\vn,columns=\vm]{\vk} $, $ \Mat[rows=\vn,columns=\vn]{\vk} $
\end{LTXexample}
-The key~\lstinline!execute! is a key that basically just executes code. You can in principle write any \TeX\ code there, and it will be applied right at the spot. However, inside the \lstinline!execute!~key, you can also use the following locally defined commands. These can be used to handle the data that is associated with the object in question:
+The key~\lstinline!execute! is a key that basically just executes code. You can in principle write any \TeX\ code there, and it will be applied right at the spot. However, inside the \lstinline!execute!~key, you can also use the following locally defined commands. These can be used to handle the data that is associated with the object in question. I don't have time to document them right now, so you'll have to guess what they do from the name for now, or you can find their definition in the source code of the package.
\begin{lstlisting}
-\semantexdataprovide{name} % provides a data set with this name
-\semantexdataset{name}{value} % sets the data set
-\semantexdatasetx{name}{value} % sets the data set, but fully expands the argument
-\semantexdataputright{name}{value} % adds something to the right of the data set
-\semantexdataputrightx{name}{value} % the same, but fully expands first
-\semantexdataputleft{name}{value} % adds something to the left of the data set
-\semantexdataputleftx{name}{value} % the same, but fully expands first
-\semantexdataget{name}{value} % outputs the data set
-\semantexdatagetexpnot{name}{value} % outputs the data set wrapped in a \noexpand
-\semantexdataclear{name} % clears the data set
-\semantexsetkeys{keys} % sets keys
-\semantexsetkeysx{keys} % sets keys after expanding
-\semantexstrifeq{str1}{str2}{if true}{if false} % tests if str1 = str2
-\semantexboolprovide{name} % provides a boolean
-\semantexboolsettrue{name} % sets the boolean to true
-\semantexboolsetfalse{name} % sets the boolean to false
-\semantexboolif{name}{if true}{if false} % tests the boolean
+\SemantexDataProvide
+\SemantexDataSet
+\SemantexDataSetx
+\SemantexDataPutRight
+\SemantexDataPutRightx
+\SemantexDataPutLeft
+\SemantexDataPutLeftx
+\SemantexDataGet
+\SemantexDataGetExpNot
+\SemantexDataClear
+\SemantexKeysSet
+\SemantexKeysSetx
+\SemantexStrIfEqTF
+\SemantexStrIfEqT
+\SemantexStrIfEqF
+\SemantexIfBlankTF
+\SemantexIfBlankT
+\SemantexIfBlankF
+\SemantexBoolProvide
+\SemantexBoolSetTrue
+\SemantexBoolSetFalse
+\SemantexBoolIfTF
+\SemantexBoolIfT
+\SemantexBoolIfF
+\SemantexIntProvide
+\SemantexIntGet
+\SemantexIntClear
+\SemantexIntIncr
+\SemantexIntSet
+\SemantexIntIfPositiveTF
+\SemantexIntIfPositiveT
+\SemantexIntIfPositiveF
+\SemantexIntIfGreaterThanOneTF
+\SemantexIntIfGreaterThanOneT
+\SemantexIntIfGreaterThanOneF
+\SemantexExpNot
\end{lstlisting}
-The key~\lstinline!parseoptions! is a key that is executed right before rendering the object. This is where you write whatever the system is supposed to \emph{do} with the data sets you provide.
+The key~\lstinline!parseoptions! is a key that is executed right before rendering the object. This is where you write whatever the system is supposed to \emph{do} with the data sets you provide. You can also force it to be applied at any point by using the \lstinline!parse!~key.
-\chapter{Bugs}
+Let us look at a more complicated example: Let us create a command for partial derivatives:
+
+\NewObject\MyVar\partialdif[
+ nopar,
+ execute={
+ \SemantexBoolProvide{raisedfunction}
+ \SemantexBoolSetTrue{raisedfunction}
+ },
+ setidots=\cdots,
+ setisep=\,,
+ valuekeys={
+ {default}{
+ si={\partial #1},
+ },
+ },
+ singlekeys={
+ {raisedfunction}{
+ execute={
+ \SemantexBoolSetTrue{raisedfunction}
+ },
+ },
+ {noraisedfunction}{
+ execute={
+ \SemantexBoolSetFalse{raisedfunction}
+ },
+ },
+ },
+ parseoptions={
+ execute={
+ \SemantexIfBlankTF{ \SemantexDataGet{upper} }
+ {
+ \SemantexKeysSetx{
+ symbol={
+ \frac
+ {
+ \partial ^ { \SemantexIntGet{numberoflowerindices} }
+ \SemantexBoolIfT{raisedfunction}
+ {
+ \SemantexDataGetExpNot{arg}
+ }
+ }
+ {
+ \SemantexDataGetExpNot{lower}
+ }
+ },
+ }
+ }
+ {
+ \SemantexKeysSetx{
+ symbol={
+ \frac
+ {
+ \partial ^ { \SemantexDataGet{upper} }
+ \SemantexBoolIfT{raisedfunction}
+ {
+ \SemantexDataGetExpNot{arg}
+ }
+ }
+ {
+ \SemantexDataGetExpNot{lower}
+ }
+ },
+ }
+ }
+ \SemantexDataClear{lower}
+ \SemantexDataClear{upper}
+ \SemantexBoolIfT{raisedfunction}
+ {
+ \SemantexDataClear{arg}
+ \SemantexIntClear{numberofarguments}
+ }
+ },
+ },
+]
-The most important current (known) bug happens if you create a variable whose symbol is a mathematical operator. For instance, write
\begin{lstlisting}
-\newvar\Int{\int}
+\NewObject\MyVar\partialdif[
+ nopar,
+ execute={
+ \SemantexBoolProvide{raisedfunction}
+ \SemantexBoolSetTrue{raisedfunction}
+ },
+ setidots=\cdots,
+ setisep=\,,
+ valuekeys={
+ {default}{
+ si={\partial #1},
+ },
+ },
+ singlekeys={
+ {raisedfunction}{
+ execute={
+ \SemantexBoolSetTrue{raisedfunction}
+ },
+ },
+ {noraisedfunction}{
+ execute={
+ \SemantexBoolSetFalse{raisedfunction}
+ },
+ },
+ },
+ parseoptions={
+ execute={
+ \SemantexIfBlankTF{ \SemantexDataGet{upper} }
+ {
+ \SemantexKeysSetx{
+ symbol={
+ \frac
+ {
+ \partial ^ { \SemantexIntGet{numberoflowerindices} }
+ \SemantexBoolIfT{raisedfunction}
+ {
+ \SemantexDataGetExpNot{arg}
+ }
+ }
+ {
+ \SemantexDataGetExpNot{lower}
+ }
+ },
+ }
+ }
+ {
+ \SemantexKeysSetx{
+ symbol={
+ \frac
+ {
+ \partial ^ { \SemantexDataGet{upper} }
+ \SemantexBoolIfT{raisedfunction}
+ {
+ \SemantexDataGetExpNot{arg}
+ }
+ }
+ {
+ \SemantexDataGetExpNot{lower}
+ }
+ },
+ }
+ }
+ \SemantexDataClear{lower}
+ \SemantexDataClear{upper}
+ \SemantexBoolIfT{raisedfunction}
+ {
+ \SemantexDataClear{arg}
+ \SemantexIntClear{numberofarguments}
+ }
+ },
+ },
+]
\end{lstlisting}
-\newvar\Int{\int}
-
+Let us see it in action:
\begin{LTXexample}
-$\int$ \\
-$\Int$ \\
-See the difference: \rlap{$\int$}$\Int$
+\[
+ \partialdif[\vx,\vy,\vz]{
+ \vf } ,
+ \partialdif[\vu^2,\vv^2,
+ d=4]{ \vf },
+ \partialdif[\vx[1],
+ \vx[2],...,\vx[\vn],
+ d=\vn]{ \vf }
+\]
+\[
+ \partialdif[\vx,\vy,\vz,noraisedfunction]{ \vf } ,
+ \partialdif[\vu^2,\vv^2,
+ d=4,noraisedfunction]{
+ \vf },
+ \partialdif[\vx[1],
+ \vx[2],...,\vx[\vn],
+ d=\vn,noraisedfunction]{
+ \vf }
+\]
\end{LTXexample}
-It turns out to be equivalent to the difference between
-\lstinline!$\int$! and~\lstinline!${}\int$!. In other words, this~\lstinline!{}!
-affects the spacing a tiny bit.
-I more or less know where this bug appears, but cannot really solve it without breaking the expansion somewhere else. Suggestions and advice are more than welcome! Then again, even if it affects the spacing a little bit, it still looks fine, only a bit different.
+As you see, we use the \lstinline!d!~key to tell the command what superscript it should put on the~\( \partial \) in the enumerator. If it does not receive a~\lstinline!d!, it counts the number of variables you wrote and prints that. That is why the following would give the wrong result:
+\begin{LTXexample}
+\[
+ \partialdif[\vu^2,\vv^2]{
+ \vf },
+ \partialdif[\vx[1],
+ \vx[2],...,\vx[\vn]]{
+ \vf }
+\]
+\end{LTXexample}
+
+\chapter{Bugs}
+
+Lots of things can be improved in the system, including the order in which things are being expanded internally. I am not going to explain this is detail for now, but hope to correct this in the future. For now, the system seems to work fine as long as you do \enquote{normal} things and insert~\lstinline!\noexpand!'s whenever something goes wrong. The only real bug that I currently know of occurs if you use the key~\lstinline!Othersep! in a heading. Then it all dies painfully.
+Then again, why the heck would you do that in the first place? Who scales parentheses in headings?
%\input{testground}
diff --git a/support/de-macro/README b/support/de-macro/README
index aee8708d40..109b33fa05 100644
--- a/support/de-macro/README
+++ b/support/de-macro/README
@@ -3,6 +3,9 @@ Licensed under the Academic Free Licence version 2.1
DE-MACRO
+Version 1.4 - Luca Citi made it python2.7 and python3 compatible.
+ Peter Gacs improved the parsing of \input{<filename>},
+ and made @ a letter in the style files.
Version 1.3 - this version is much more conservative about deleting
comments and inserting or deleting blank space: tries to
leave in all comments, adds space only when necessary, and
diff --git a/support/de-macro/de-macro b/support/de-macro/de-macro
index 04d286d8ee..c5795fe891 100644..100755
--- a/support/de-macro/de-macro
+++ b/support/de-macro/de-macro
@@ -1,17 +1,20 @@
#!/usr/bin/python -O
-"""
-Copyright 2005 Peter Gacs
+r"""
+Copyright 2005-2020 Peter Gacs
Licensed under the Academic Free Licence version 2.1
- DE-MACRO
+ DE-MACRO
-Version 1.3 - this version is much more conservative about deleting
- comments and inserting or deleting blank space: tries to
- leave in all comments, adds space only when necessary, and
- tries not to delete space in the main text.
- The motivating comments came from Daniel Webb.
-Version 1.2 - a syntactical bug corrected, thanks Brian de Alwis!
+Version 1.4 - Luca Citi made it python2.7 and python3 compatible.
+ Peter Gacs improved the parsing of \input{<filename>},
+ and made @ a letter in the style files.
+Version 1.3 - this version is much more conservative about deleting
+ comments and inserting or deleting blank space: tries to
+ leave in all comments, adds space only when necessary, and
+ tries not to delete space in the main text.
+ The motivating comments came from Daniel Webb.
+Version 1.2 - a syntactical bug corrected, thanks Brian de Alwis!
PURPOSE
@@ -21,13 +24,17 @@ Applications:
- your publisher has difficulty dealing with many private macros
- you cooperate with colleagues who do not understand your macros
- preprocessing before a system like latex2html, which is somewhat
- unpredictable with private macros.
+ unpredictable with private macros.
+
+It cannot be used to eliminate more complex macros that rely on
+more programming-like constructs in style files. In particular, it will
+not replace style files that have options.
USAGE
de-macro [--defs <defs-db>] <tex-file-1>[.tex] [<tex-file-2>[.tex] ...]
-Simplest example: de-macro testament
+Simplest example: de-macro testament
(As you see, the <> is used only in the notation of this documentation,
you should not type it.)
@@ -77,105 +84,105 @@ import sys, os, re, shelve
# Utilities
class No_detail:
- strerror = ""
+ strerror = ""
no_detail = No_detail()
class Error(Exception):
- """Base class for exceptions in this module."""
- pass
+ """Base class for exceptions in this module."""
+ pass
class Empty_text_error(Error):
- """Exception raised for errors in the input.
+ """Exception raised for errors in the input.
- Attributes:
- data -- data that was found empty
- message
- """
+ Attributes:
+ data -- data that was found empty
+ message
+ """
- def __init__(self, data, message):
- self.data = data
- self.message = message
+ def __init__(self, data, message):
+ self.data = data
+ self.message = message
def warn(error_message, detail = no_detail):
- sys.stderr.write(error_message + "\n")
- if no_detail != detail:
- sys.stderr.write(detail.strerror + "\n")
+ sys.stderr.write(error_message + "\n")
+ if no_detail != detail:
+ sys.stderr.write(detail.strerror + "\n")
def die(error_message, detail = no_detail):
- warn(error_message, detail = no_detail)
- sys.exit(1)
+ warn(error_message, detail = no_detail)
+ sys.exit(1)
def getopt_map(one_letter_opts, long_optlist):
- "Turns long options into an option map, using getopt."
- import getopt
- optlist, args = getopt.getopt(sys.argv[1:],
- one_letter_opts, long_optlist)
- opt_map = {}
- for pair in optlist: opt_map[pair[0]] = pair[1] or 1
- return opt_map, args
+ "Turns long options into an option map, using getopt."
+ import getopt
+ optlist, args = getopt.getopt(sys.argv[1:],
+ one_letter_opts, long_optlist)
+ opt_map = {}
+ for pair in optlist: opt_map[pair[0]] = pair[1] or 1
+ return opt_map, args
def newer(file1, file2):
- if not os.path.isfile(file1):
- return False
+ if not os.path.isfile(file1):
+ return False
- try:
- stat_return = os.lstat(file1)
- except OSError, detail:
- die("lstat " + file1 + " failed:", detail)
- time1 = stat_return.st_mtime
+ try:
+ stat_return = os.lstat(file1)
+ except OSError as detail:
+ die("lstat " + file1 + " failed:", detail)
+ time1 = stat_return.st_mtime
- try:
- stat_return = os.lstat(file2)
- except OSError, detail:
- die("lstat " + file2 + " failed:", detail)
- time2 = stat_return.st_mtime
+ try:
+ stat_return = os.lstat(file2)
+ except OSError as detail:
+ die("lstat " + file2 + " failed:", detail)
+ time2 = stat_return.st_mtime
- return time1 > time2
+ return time1 > time2
def cut_extension(filename, ext):
- """
- If filename has extension ext (including the possible dot),
- it will be cut off.
- """
- file = filename
- index = filename.rfind(ext)
- if 0 <= index and len(file)-len(ext) == index:
- file = file[:index]
- return file
+ """
+ If filename has extension ext (including the possible dot),
+ it will be cut off.
+ """
+ file = filename
+ index = filename.rfind(ext)
+ if 0 <= index and len(file)-len(ext) == index:
+ file = file[:index]
+ return file
class Stream:
- data = None
- pos = None
- item = None
-
- def legal(self):
- return 0 <= self.pos and self.pos < len(self.data)
-
- def uplegal(self):
- return self.pos < len(self.data)
-
- def __init__(self, data_v = None):
- self.data = data_v
- if self.data:
- self.pos = 0
- self.item = self.data[self.pos]
-
- def next(self):
- self.pos += 1
- if self.pos < len(self.data):
- self.item = self.data[self.pos]
- return self.item
-
- def reset(self):
- if self.data and 0 < len(self.data):
- self.pos = 0
- self.item = self.data[0]
- return self.item
-
+ data = None
+ pos = None
+ item = None
+
+ def legal(self):
+ return 0 <= self.pos and self.pos < len(self.data)
+
+ def uplegal(self):
+ return self.pos < len(self.data)
+
+ def __init__(self, data_v = None):
+ self.data = data_v
+ if self.data:
+ self.pos = 0
+ self.item = self.data[self.pos]
+
+ def next(self):
+ self.pos += 1
+ if self.pos < len(self.data):
+ self.item = self.data[self.pos]
+ return self.item
+
+ def reset(self):
+ if self.data and 0 < len(self.data):
+ self.pos = 0
+ self.item = self.data[0]
+ return self.item
+
# Basic classes
@@ -186,97 +193,97 @@ blank_or_rbrace_re = re.compile(r"[\s}]")
pos_digit_re = re.compile(r"[1-9]")
def isletter(c, isatletter=False):
- if "@" == c:
- return isatletter
- else:
- return c.isalpha()
+ if "@" == c:
+ return isatletter
+ else:
+ return c.isalpha()
class Token:
- """Type 0 means ordinary character, type 1 means escape sequence
- (without the \ ), type 2 means comment.
- """
- simple_ty = 0
- esc_symb_ty = 1
- esc_str_ty = 2
- comment_ty = 3
-
- type = simple_ty
- val = " "
-
- def __init__(self, type_v=simple_ty, val_v=" "):
- self.type = type_v
- self.val = val_v
-
- def show(self, isatletter=False):
- out = ""
- if simple_ty == self.type or comment_ty == self.type:
- out = self.val
- else:
- out = "\\" + self.val
- return out
+ """Type 0 means ordinary character, types 1,2 mean escape sequence
+ (without the \ ), type 3 means comment.
+ """
+ simple_ty = 0
+ esc_symb_ty = 1
+ esc_str_ty = 2
+ comment_ty = 3
+
+ type = simple_ty
+ val = " "
+
+ def __init__(self, type_v=simple_ty, val_v=" "):
+ self.type = type_v
+ self.val = val_v
+
+ def show(self):
+ out = ""
+ if simple_ty == self.type or comment_ty == self.type:
+ out = self.val
+ else:
+ out = "\\" + self.val
+ return out
# Constants
-g_token = Token(0," ") # generic token
+g_token = Token(0," ") # generic token
simple_ty = g_token.simple_ty
comment_ty = g_token.comment_ty
esc_symb_ty = g_token.esc_symb_ty
esc_str_ty = g_token.esc_str_ty
+def detokenize(text, isatletter=False):
+ """
+ Input is a list of tokens.
+ Output is a string.
+ """
+ out = ""
+ if 0 == len(text):
+ return
+ pos = 0
+ out += text[pos].show()
+ pos += 1
+ while pos < len(text):
+ previtem = text[pos-1]
+ item = text[pos]
+ """Insert a separating space after an escape sequence if it is a
+ string and is followed by a letter."""
+ if (esc_str_ty == previtem.type
+ and simple_ty == item.type and isletter(item.val[0], isatletter)):
+ out += " "
+ out += item.show()
+ pos += 1
+ return out
-def detokenize(text):
- """
- Input is a list of tokens.
- Output is a string.
- """
- out = ""
- if 0 == len(text):
- return
- pos = 0
- out += text[pos].show()
- pos += 1
- while pos < len(text):
- previtem = text[pos-1]
- item = text[pos]
- """Insert a separating space after an escape sequence if it is a
- string and is followed by a letter."""
- if (esc_str_ty == previtem.type
- and simple_ty == item.type and isletter(item.val[0], False)):
- out += " "
- out += item.show()
- pos += 1
- return out
def strip_comments(text):
- """
- Input is a list of tokens.
- Output is the same list except the comment tokens.
- """
- out = []
- for token in text:
- if not comment_ty == token.type:
- out.append(token)
- return out
+ """
+ Input is a list of tokens.
+ Output is the same list except the comment tokens.
+ """
+ out = []
+ for token in text:
+ if not comment_ty == token.type:
+ out.append(token)
+ return out
class Group:
- """type 0 means a token, type 1 means contents of a group within {}
- """
- token_ty = 0
- group_ty = 1
- type = token_ty
- val = [] # Value is a token list.
-
- def __init__(self, type_v, val_v):
- self.type = type_v
- self.val = val_v
-
- def show(self):
- if token_ty == self.type:
- return self.val.show()
- else:
- return "{%s}" % detokenize(self.val)
+ """type 0 means a token, type 1 means contents of a group within {}
+ """
+ token_ty = 0
+ group_ty = 1
+ type = token_ty
+ val = [] # Value is a token list.
+
+ def __init__(self, type_v, val_v):
+ self.type = type_v
+ self.val = val_v
+
+ def show(self):
+ if token_ty == self.type:
+ return self.val.show()
+ else:
+ return "{%s}" % detokenize(self.val)
# Constants
@@ -285,779 +292,779 @@ token_ty = g_group.token_ty
group_ty = g_group.group_ty
-def tokenize(in_str):
- """Returns a list of tokens.
- """
- text = []
- isatletter=False
- cs = Char_stream(in_str)
- cs.reset()
- if not cs.legal():
- raise "No string to tokenize."
- while cs.uplegal():
- if "%" == cs.item:
- comment = cs.scan_comment_token()
- text.append(Token(comment_ty, comment))
- elif "\\" != cs.item:
- text.append(Token(simple_ty, cs.item))
- cs.next()
- else:
- cs.next()
- name = cs.scan_escape_token(isatletter)
- if isletter(name[0], isatletter):
- token = Token(esc_str_ty, name)
- else:
- token = Token(esc_symb_ty, name)
- text.append(token)
- if "makeatletter" == name:
- isatletter=True
- elif "makeatother" == name:
- isatletter=False
- return text
-
-
-
+def tokenize(in_str, isatletter=False):
+ """Returns a list of tokens.
+ """
+ text = []
+ cs = Char_stream(in_str)
+ cs.reset()
+ if not cs.legal():
+ raise Error("No string to tokenize.")
+ while cs.uplegal():
+ if "%" == cs.item:
+ comment = cs.scan_comment_token()
+ text.append(Token(comment_ty, comment))
+ elif "\\" != cs.item:
+ text.append(Token(simple_ty, cs.item))
+ cs.next()
+ else:
+ cs.next()
+ name = cs.scan_escape_token(isatletter)
+ if isletter(name[0], isatletter):
+ token = Token(esc_str_ty, name)
+ else:
+ token = Token(esc_symb_ty, name)
+ text.append(token)
+ if "makeatletter" == name:
+ isatletter=True
+ elif "makeatother" == name:
+ isatletter=False
+ return text
+
+
class Command_def:
- name = "1"
- numargs = 0
- body= ""
+ name = "1"
+ numargs = 0
+ body= ""
- def __init__(self, name_v, numargs_v, body_v):
- self.name = name_v
- self.numargs = numargs_v
- self.body = body_v
+ def __init__(self, name_v, numargs_v, body_v):
+ self.name = name_v
+ self.numargs = numargs_v
+ self.body = body_v
- def show(self):
- out = "\\newcommand{\\%s}" % (self.name)
- if 0 < self.numargs:
- out += "[%d]" % self.numargs
- out += "{%s}" % detokenize(self.body)
- return out
+ def show(self):
+ out = "\\newcommand{\\%s}" % (self.name)
+ if 0 < self.numargs:
+ out += "[%d]" % self.numargs
+ out += "{%s}" % detokenize(self.body)
+ return out
class Env_def:
- name = "1"
- numargs = 0
- begin = ""
- end = ""
-
- def __init__(self, name_v, numargs_v, begin_v, end_v):
- self.name = name_v
- self.numargs = numargs_v
- self.begin = begin_v
- self.end = end_v
-
- def show(self):
- out = "\\newenvironment{%s}" % self.name
- if 0 < self.numargs:
- out += "[%d]" % self.numargs
- out += "{%s}" % detokenize(self.begin)
- out += "{%s}" % detokenize(self.end)
- return out
+ name = "1"
+ numargs = 0
+ begin = ""
+ end = ""
+
+ def __init__(self, name_v, numargs_v, begin_v, end_v):
+ self.name = name_v
+ self.numargs = numargs_v
+ self.begin = begin_v
+ self.end = end_v
+
+ def show(self):
+ out = "\\newenvironment{%s}" % self.name
+ if 0 < self.numargs:
+ out += "[%d]" % self.numargs
+ out += "{%s}" % detokenize(self.begin)
+ out += "{%s}" % detokenize(self.end)
+ return out
class Command_instance:
- name = "1"
- args = []
+ name = "1"
+ args = []
- def __init__(self, name_v, args_v):
- self.name = name_v
- self.args = args_v
+ def __init__(self, name_v, args_v):
+ self.name = name_v
+ self.args = args_v
- def show(self):
- out = "\\"+self.name
- for arg in self.args:
- out += "{%s}" % detokenize(arg)
- return out
+ def show(self):
+ out = "\\"+self.name
+ for arg in self.args:
+ out += "{%s}" % detokenize(arg)
+ return out
class Env_instance:
- name = "1"
- args = []
-
- def __init__(self, name_v, args_v, body_v):
- self.name = name_v
- self.args = args_v
- self.body = body_v
-
- def show(self):
- out = "\\begin{%s}" % self.name
- for arg in self.args:
- out += "{%s}" % detokenize(arg)
- out += detokenize(self.body)
- out += "\\end{%s}" % self.name
- return out
+ name = "1"
+ args = []
+
+ def __init__(self, name_v, args_v, body_v):
+ self.name = name_v
+ self.args = args_v
+ self.body = body_v
+
+ def show(self):
+ out = "\\begin{%s}" % self.name
+ for arg in self.args:
+ out += "{%s}" % detokenize(arg)
+ out += detokenize(self.body)
+ out += "\\end{%s}" % self.name
+ return out
class Char_stream(Stream):
- def scan_escape_token(self, isatletter=False):
- """
- Starts after the escape sign, assumes that it is scanning a symbol.
- Returns a token-string.
- """
- out = self.item # Continue only if this is a letter.
- item = self.next()
- if isletter(out, isatletter):
- while self.uplegal() and isletter(item, isatletter):
- out += item
- item = self.next()
- return out
-
- def scan_comment_token(self):
- """
- Starts at the comment sign %, assumes that it is scanning a comment.
- Returns the whole comment string,
- including the % and all empty space after it.
- """
- comment = ""
- while "\n" != self .item:
- comment += self.item
- self.next()
- while self.uplegal() and blank_re.match(self.item):
- comment += self.item
- self.next()
- return comment
-
- def scan_input_filename(self):
- """We just read an \input token. The next group or word will be
- interpreted as a filename (possibly without .tex).
- Return the filename.
- """
- item = self.item
- while self.uplegal() and blank_re.match(self.item):
- item = self.next()
- if "{" == item:
- item = self.next()
- file = ""
- while self.uplegal() and not blank_or_rbrace_re.match(item):
- file += item
- item = self.next()
- self.next()
- return file
-
- def scan_package_filenames(self):
- """We just read a \usepackage token. The next group will be
- interpreted as a list of filenames (without .sty) separated by commas.
- Return the list.
- """
- item = self.item
- while self.uplegal() and blank_re.match(item):
- item = self.next()
- file = ""
- if not "{" == item:
- raise "\\usepackage not followed by brace."
- item = self.next()
- while self.uplegal() and not blank_or_rbrace_re.match(item):
- file += item
- item = self.next()
- self.next()
- return file.split(",")
+ def scan_escape_token(self, isatletter=False):
+ """
+ Starts after the escape sign, assumes that it is scanning a symbol.
+ Returns a token-string.
+ """
+ out = self.item # Continue only if this is a letter.
+ item = self.next()
+ if isletter(out, isatletter):
+ while self.uplegal() and isletter(item, isatletter):
+ out += item
+ item = self.next()
+ return out
+
+ def scan_comment_token(self):
+ """
+ Starts at the comment sign %, assumes that it is scanning a comment.
+ Returns the whole comment string,
+ including the % and all empty space after it.
+ """
+ comment = ""
+ while self.uplegal() and "\n" != self .item:
+ comment += self.item
+ self.next()
+ while self.uplegal() and blank_re.match(self.item):
+ comment += self.item
+ self.next()
+ return comment
+
+ def scan_input_filename(self):
+ """We have just read an \input token. The next group or word will be
+ interpreted as a filename (possibly without .tex). Filenames should not begin with spaces.
+ Return the filename.
+ """
+ item = self.item
+ file = ""
+ while self.uplegal() and blank_re.match(self.item):
+ item = self.next()
+ if "{" == item:
+ item = self.next()
+ while self.uplegal() and not "}" == item:
+ file += item
+ item = self.next()
+ self.next()
+ else:
+ while self.uplegal() and not blank_re.match(item):
+ file += item
+ item = self.next()
+ return file
+
+ def scan_package_filenames(self):
+ r"""We just read a \usepackage token. The next group will be
+ interpreted as a list of filenames (without .sty) separated by commas.
+ Return the list.
+ """
+ item = self.item
+ while self.uplegal() and blank_re.match(item):
+ item = self.next()
+ file = ""
+ if not "{" == item:
+ raise Error("\\usepackage not followed by brace.")
+ item = self.next()
+ while self.uplegal() and not blank_or_rbrace_re.match(item):
+ file += item
+ item = self.next()
+ self.next()
+ return file.split(",")
class Tex_stream(Stream):
- defs = ({}, {})
- defs_db = "x"
- defs_db_file = "x.db"
- debug = False
-
- def smart_tokenize(self, in_str, handle_inputs=False):
- """Returns a list of tokens.
- It may interpret and carry out all \input commands.
- """
- self.data = []
- text = self.data
- isatletter=False
- cs = Char_stream(in_str)
- cs.reset()
- if not cs.legal():
- raise "No string to tokenize."
- while cs.uplegal():
- if "%" == cs.item:
- comment = cs.scan_comment_token()
- text.append(Token(comment_ty, comment))
- elif "\\" != cs.item:
- text.append(Token(simple_ty, cs.item))
- cs.next()
- else:
- cs.next()
- name = cs.scan_escape_token(isatletter)
- if "input" == name and handle_inputs:
- file = cs.scan_input_filename()
- to_add = self.process_if_newer(file)
- text.extend(to_add)
- elif "usepackage" == name:
- while cs.uplegal() and blank_re.match(cs.item):
- cs.next()
- if "[" == cs.item: # private packages have no options
- text.extend([Token(esc_str_ty, "usepackage"),
- Token(simple_ty, "[")])
- cs.next()
- continue
- files = cs.scan_package_filenames()
- i = 0
- while i < len(files): # process private packages
- file = files[i]
- p = file.rfind("-private")
- if p < 0 or not len(file) - len("-private") == p:
- i += 1
- continue
- defs_db_file = file+".db"
- self.add_defs(file)
- del files[i:(i+1)]
- if files: # non-private packages left
- group_content = ",".join(files)
- to_add_str = "\\usepackage{%s}" % (group_content)
- to_add = tokenize(to_add_str)
- text.extend(to_add)
- else:
- if isletter(name[0], isatletter):
- token = Token(esc_str_ty, name)
- else:
- token = Token(esc_symb_ty, name)
- text.append(token)
- if "makeatletter" == name:
- isatletter=True
- elif "makeatother" == name:
- isatletter=False
- self.reset()
- return self.data
-
- def smart_detokenize(self):
- """
- Output is a string.
- If the list contains an \input{file} then the content of file
- file-clean.tex replaces it in the output.
- """
- self.reset()
- if not self.legal():
- return ""
- out = ""
- previtem = None
- while self.uplegal():
- item = self.item
- """Insert a separating space after an escape sequence if it is a
- string and is followed by a letter."""
- if (None != previtem and esc_str_ty == previtem.type
- and simple_ty == item.type and isletter(item.val[0], False)):
- out += " "
- previtem = item
- if not (esc_str_ty == item.type and "input" == item.val):
- out += item.show()
- self.next()
- else:
- self.next()
- group = self.scan_group()
- file = detokenize(group.val)
- clean_file = "%s-clean.tex" % (file)
- print "Reading file %s" % (clean_file)
- fp = open(clean_file,"r")
- content = fp.read()
- fp.close()
- out += content
- return out
-
- # Basic tex scanning
-
- def skip_blank_tokens(self): # we also skip comment tokens.
- item = self.item
- while (self.uplegal() and
- (comment_ty == item.type or
- (simple_ty == item.type and blank_re.match(item.val)))):
- item = self.next()
- return item
-
- def scan_group(self):
- """Returns group.
- """
- if not self.legal():
- raise "No group to scan."
- item = self.item
- if not (simple_ty == item.type and "{" == item.val):
- return Group(token_ty, [self.item])
- count = 1
- group = []
- item = self.next()
- while count and self.uplegal():
- if simple_ty == item.type:
- if "{" == item.val:
- count += 1
- elif "}" == item.val:
- count -= 1
- if count != 0:
- group.append(item)
- item = self.next()
- return Group(group_ty, group)
-
- # Command and environment definitions
-
- def scan_command_name(self):
- """Returns name.
- """
- if not self.legal():
- raise "No command name to scan."
- item = self.item
- name = ""
- if item.type in [esc_symb_ty, esc_str_ty]:
- name = item.val
- else:
- if not "{" == item.val:
- raise "Command definition misses first {."
- self.next()
- item = self.skip_blank_tokens()
- if not item.type in [esc_symb_ty, esc_str_ty]:
- raise "Command definition does not begin with control sequence."
- name = item.val
- self.next()
- item = self.skip_blank_tokens()
- if not "}" == item.val:
- raise ("Definition for commmand %s misses first }., %s" %
- (name, item.val))
- self.next()
- self.skip_blank_tokens()
- return name
-
- def scan_numargs(self, name):
- """
- name is the name of the command or environment definition being
- scanned.
- Starts on a nonblank token.
- Returns numargs
- where numargs is the number of arguments in a command or environment
- definition,
- """
- if not self.legal():
- raise "No numargs to scan."
- item = self.item
- numargs = 0
- if not simple_ty == item.type:
- raise "Illegal command or environment definition: "+name
- if "[" == item.val:
- if not 4 < len(self.data):
- raise "Command or environment definition is illegal: "+name
- item = self.next()
- if not simple_ty == item.type:
- raise "Illegal command or environment definition: "+name
- numargs = item.val
- if not pos_digit_re.match(numargs):
- raise "%s must be argument number after %s" % (numargs, name)
- numargs = int(numargs)
- self.next()
- item = self.skip_blank_tokens()
- if not simple_ty == item.type:
- raise "Illegal command definition: "+name
- if "]" != item.val:
- raise "Illegal command definition: "+name
- self.next()
- self.skip_blank_tokens()
- return numargs
-
- def scan_command_def(self):
- """Scan a command definition.
- Return command_def.
- Assumes that the number of arguments is at most 9.
- """
- if not self.legal():
- raise "No command definition to scan."
- item = self.item
- if not 2 < len(self.data):
- raise "Command definition is illegal."
- # newcommand or renewcommand
- if not item.type in [esc_symb_ty, esc_str_ty]:
- raise "Command definition should begin with control sequence: "+item.val
- if item.val not in ["newcommand", "renewcommand"]:
- raise "Command definition should begin with control sequence."
- self.next()
- self.skip_blank_tokens()
-
- cmd_name = self.scan_command_name()
- numargs = self.scan_numargs(cmd_name)
-
- body_group = self.scan_group()
- if group_ty != body_group.type:
- raise "Command body missing: "+cmd_name
- body_val = strip_comments(body_group.val)
- return Command_def(cmd_name, numargs, body_val)
-
- def scan_env_name(self):
- """Starts on a {.
- Returns name.
- """
- if not self.legal():
- raise "No environment name to scan."
- item = self.item
- if not "{" == item.val:
- raise "Env. definition begins with %s, not with {" % (item.val)
- self.next()
- item = self.skip_blank_tokens()
- name = ""
- if not simple_ty == item.type:
- raise ("1. Env. def. begins with cont. seq. %s, not with env.name."
- % (item.val))
- while self.uplegal() and not blank_or_rbrace_re.match(item.val):
- name += item.val
- item = self.next()
- if not simple_ty == item.type:
- raise ("2. Env. def. begins with cont. seq. %s, not with env.name."
- % (item.val))
- item = self.skip_blank_tokens()
- if not "}" == item.val:
- raise "Command definition does not begin with control sequence."
- self.next()
- self.skip_blank_tokens()
- return name
-
- def scan_env_def(self):
- """Scan an environment definition.
- Return env_def
- Assumes that the number of arguments is at most 9.
- """
- if not self.legal():
- raise "No environment definition to scan."
- item = self.item
- if not 7 < len(self.data):
- raise "Environment definition is illegal."
- pos = 0
-
- if not item.type in [esc_symb_ty, esc_str_ty]:
- raise ("Env. definition does not begin with control sequence:"+
- item.val)
- if item.val not in ["newenvironment", "renewenvironment"]:
- raise "Env. definition does not begin with control sequence."
- self.next()
- self.skip_blank_tokens()
-
- env_name = self.scan_env_name()
- numargs = self.scan_numargs(env_name)
- self.skip_blank_tokens()
-
- begin_group = self.scan_group()
- if group_ty != begin_group.type:
- raise "Begin body missing: "+env_name
- begin_val = strip_comments(begin_group.val)
-
- self.skip_blank_tokens()
-
- end_group = self.scan_group()
- if group_ty != end_group.type:
- raise "End body missing:"+env_name
- end_val = strip_comments(end_group.val)
-
- return Env_def(env_name, numargs, begin_val, end_val)
-
- def scan_defs(self):
- if not self.legal():
- raise "No definitions to scan."
- self.reset()
- command_defs, env_defs = self.defs
- while self.uplegal():
- if (esc_str_ty == self.item.type
- and self.item.val in ["newcommand", "renewcommand"]):
- command_def = self.scan_command_def()
- command_defs[command_def.name] = command_def
- elif (esc_str_ty == self.item.type and self.item.val
- in ["newenvironment", "renewenvironment"]):
- env_def = self.scan_env_def()
- env_defs[env_def.name] = env_def
- else:
- self.next()
-
- # Instances
-
- def scan_args(self, command_or_env_def):
- """Scan the arguments of a command or environment.
- Return [args].
- """
- if not self.legal():
- raise "No arguments to scan."
- numargs = command_or_env_def.numargs
- name = command_or_env_def.name
-
- args = []
- for i in range(numargs):
- arg = []
- if not (simple_ty == self.item.type and "{" == self.item.val):
- arg = [self.item]
- self.next()
- else:
- group = self.scan_group()
- arg = group.val
- args.append(arg)
- return args
-
- def scan_command(self, command_def):
- """Scan the arguments of a command.
- Return command_instance
- """
- if not self.legal():
- raise "No command to scan."
- if not self.item.type in [esc_symb_ty, esc_str_ty]:
- raise "Command does not begin with control sequence."
- name = self.item.val
- self.next()
- if 0 < command_def.numargs:
- self.skip_blank_tokens()
- args = self.scan_args(command_def)
- else:
- args = []
- return Command_instance(name, args)
-
- def test_env_boundary(self, item):
- """Check whether an environment begin or end follows.
- Return 1 if \begin, -1 if \end, 0 otherwise.
- """
- d = 0
- if esc_str_ty == item.type:
- if "begin"==item.val:
- d = 1
- elif "end"==item.val:
- d = -1
- return d
-
- def scan_env_begin(self):
- """Scan an environment name.
- Return env_name.
- """
- if not self.legal():
- raise "No environment begin to scan."
- item = self.item
- if not (esc_str_ty == item.type and "begin" == item.val):
- raise "Environment does not begin with begin."
- self.next()
- name_group = self.scan_group()
- name = detokenize(name_group.val)
- return name
-
- def scan_env_end(self):
- """Scan an environment end.
- Return env_name.
- """
- if not self.legal():
- raise "No environment end to scan."
- item = self.item
- if not (esc_str_ty == item.type and "end" == item.val):
- raise "Environment does not end with end."
- self.next()
- name_group = self.scan_group()
- name = detokenize(name_group.val)
- return name
-
- def scan_env_rest(self, env_def):
- """Scanning starts after \begin{envname}.
- Returns env_instance.
- """
- if not self.legal():
- raise "No environment rest to scan."
- count = 1 # We are already within a boundary.
- args = self.scan_args(env_def)
- body = []
- while count and self.uplegal():
- old_pos = self.pos
- d = self.test_env_boundary(self.item)
- count += d
- if 1 == d:
- self.scan_env_begin()
- elif -1 == d:
- self.scan_env_end()
- else:
- self.next()
- if 0 < count:
- body.extend(self.data[old_pos : self.pos])
- return Env_instance(env_def.name, args, body)
-
- # Definitions
-
- def restore_defs(self):
- if os.path.isfile(self.defs_db_file):
- print "Using defs db %s" % (self.defs_db_file)
- db_h = shelve.open(self.defs_db)
- self.defs = db_h["defs"]
- db_h.close()
-
- def save_defs(self):
- db_h = shelve.open(self.defs_db)
- if db_h.has_key("defs"):
- del db_h["defs"]
- db_h["defs"] = self.defs
- db_h.close()
-
- def add_defs(self, defs_file):
- defs_file_compl = defs_file + ".sty"
- if not os.path.isfile(defs_file_compl):
- raise "%s does not exist" % (defs_file_compl)
-
- defs_db_file = self.defs_db_file
- if newer(defs_db_file, defs_file_compl):
- print "Using defs db %s for %s" % (defs_db_file, defs_file)
- else:
- defs_fp = open(defs_file_compl, "r")
- defs_str = defs_fp.read()
- defs_fp.close()
- ds = Tex_stream()
- ds.defs = self.defs
- defs_text = ds.smart_tokenize(defs_str)
- # changing ds.defs will change self.defs
- if self.debug:
- defs_seen_file = "%s-seen.sty" % (defs_file)
- defs_seen_fp = open(defs_seen_file, "w")
- out = detokenize(defs_text)
- defs_seen_fp.write(out)
- defs_seen_fp.close()
- ds.scan_defs()
- if self.debug:
- out = ""
- command_defs, env_defs = self.defs
- for def_name in command_defs.keys():
- out += command_defs[def_name].show() + "\n"
- for def_name in env_defs.keys():
- out += env_defs[def_name].show() +"\n"
- print "Definitions after reading %s:" % (defs_file)
- print out
-
- # Applying definitions, recursively
- # (maybe not quite in Knuth order, so avoid tricks!)
-
- def subst_args(self, body, args):
- out = []
- pos = 0
- while pos < len(body):
- item = body[pos]
- if not (simple_ty == item.type and "#" == item.val):
- out.append(item)
- pos += 1
- continue
- pos += 1
- token = body[pos]
- argnum = token.val
- if not pos_digit_re.match(argnum):
- raise "# is not followed by number."
- argnum = int(argnum)
- if argnum > len(args):
- raise "Too large argument number."
- arg = args[argnum-1]
- out += arg
- pos += 1
- return out
-
- def apply_command_recur(self, command_instance):
- command_defs, env_defs = self.defs
- name = command_instance.name
- command_def = command_defs[name]
-
- args = command_instance.args
- body = command_def.body
- result = self.subst_args(body, args)
- try:
- result = self.apply_all_recur(result)
- except Empty_text_error, e:
- raise "apply_all_recur fails on command instance %s: %s, %s" % \
- (command_instance.show(), detokenize(e.data), e.message)
- return result
-
- def apply_env_recur(self, env_instance):
- command_defs, env_defs = self.defs
- name = env_instance.name
- env_def = env_defs[name]
-
- begin, end = env_def.begin, env_def.end
- body, args = env_instance.body, env_instance.args
- out = self.subst_args(begin, args) + body + self.subst_args(end, args)
- return self.apply_all_recur(out)
-
-
- def apply_all_recur(self, data, report=False):
- ts = Tex_stream(data)
- ts.defs = self.defs
- command_defs, env_defs = self.defs
- out = []
- progress_step = 10000
- progress = progress_step
- if not ts.legal():
- raise Empty_text_error(data, "No text to process.")
- while ts.uplegal():
- if self.pos > progress:
- if report:
- print self.pos
- progress += progress_step
- if not ts.item.type in [esc_symb_ty, esc_str_ty]:
- out.append(ts.item)
- ts.next()
- continue
- if 1 == ts.test_env_boundary(ts.item):
- old_pos = ts.pos
- env_name = ts.scan_env_begin()
- if not env_defs.has_key(env_name):
- out.extend(ts.data[old_pos : ts.pos])
- continue
- else:
- env_def = env_defs[env_name]
- env_instance = ts.scan_env_rest(env_def)
- result = ts.apply_env_recur(env_instance)
- out.extend(result)
- elif not command_defs.has_key(ts.item.val):
- out.append(ts.item)
- ts.next()
- continue
- else:
- command_def = command_defs[ts.item.val]
- command_inst = ts.scan_command(command_def)
- result = ts.apply_command_recur(command_inst)
- out.extend(result)
- return out
-
-
- # Processing files
-
- def process_file(self, file):
- """Returns the new defs.
- """
- file = cut_extension(file, ".tex")
- source_file = "%s.tex" % (file)
- print "File %s [" % (source_file)
- source_fp = open(source_file, "r")
- text_str = source_fp.read()
- source_fp.close()
-
- self.smart_tokenize(text_str, handle_inputs=True)
- if not self.data:
- raise "Empty tokenization result."
- self.reset()
-
- if self.debug:
- source_seen_fname = "%s-seen.tex" % (file)
- source_seen_fp = open(source_seen_fname, "w")
- source_seen_fp.write(detokenize(self.data))
- source_seen_fp.close()
-
- self.data = self.apply_all_recur(self.data, report=True)
-
- result_fname = "%s-clean.tex" % (file)
- print "Writing %s [" % (result_fname)
- result_fp = open(result_fname, "w")
- result_fp.write(self.smart_detokenize())
- result_fp.close()
- print "] file %s" % (result_fname)
- print "] file %s" % (source_file)
-
- def process_if_newer(self, file):
- """
- \input{file} is be added to the token list.
- If the input file is newer it is processed.
- Returns tokenized \input{file}.
- """
- file = cut_extension(file, ".tex")
- tex_file = file+".tex"
- clean_tex_file = file+"-clean.tex"
- if newer(clean_tex_file, tex_file):
- print "Using %s." % (clean_tex_file)
- else:
- ts = Tex_stream()
- ts.data = []
- ts.defs = self.defs
- ts.process_file(file)
- to_add = "\\input{%s}" % (file)
- return tokenize(to_add)
-
+ defs = ({}, {})
+ defs_db = "x"
+ defs_db_file = "x.db"
+ debug = False
+
+ def smart_tokenize(self, in_str, handle_inputs=False, isatletter=False):
+ """Returns a list of tokens.
+ It may interpret and carry out all \input commands.
+ """
+ self.data = []
+ text = self.data
+ cs = Char_stream(in_str)
+ cs.reset()
+ if not cs.legal():
+ raise Error("No string to tokenize.")
+ while cs.uplegal():
+ if "%" == cs.item:
+ comment = cs.scan_comment_token()
+ text.append(Token(comment_ty, comment))
+ elif "\\" != cs.item:
+ text.append(Token(simple_ty, cs.item))
+ cs.next()
+ else:
+ cs.next()
+ name = cs.scan_escape_token(isatletter)
+ if "input" == name and handle_inputs:
+ file = cs.scan_input_filename()
+ to_add = self.process_if_newer(file)
+ text.extend(to_add)
+ elif "usepackage" == name:
+ while cs.uplegal() and blank_re.match(cs.item):
+ cs.next()
+ if "[" == cs.item: # Packages with options will not be processed.
+ text.extend([Token(esc_str_ty, "usepackage"),
+ Token(simple_ty, "[")])
+ cs.next()
+ continue
+ files = cs.scan_package_filenames()
+ i = 0
+ while i < len(files): # process private packages
+ file = files[i]
+ p = file.rfind("-private")
+ if p < 0 or not len(file) - len("-private") == p:
+ i += 1
+ continue
+ defs_db_file = file+".db"
+ self.add_defs(file)
+ del files[i:(i+1)]
+ if files: # non-private packages left
+ group_content = ",".join(files)
+ to_add_str = "\\usepackage{%s}" % (group_content)
+ to_add = tokenize(to_add_str,isatletter)
+ text.extend(to_add)
+ else:
+ if isletter(name[0], isatletter):
+ token = Token(esc_str_ty, name)
+ else:
+ token = Token(esc_symb_ty, name)
+ text.append(token)
+ if "makeatletter" == name:
+ isatletter=True
+ elif "makeatother" == name:
+ isatletter=False
+ self.reset()
+ return self.data
+
+ def smart_detokenize(self,isatletter=False):
+ """
+ Output is a string.
+ If the list contains an \input{file} then the content of file
+ file-clean.tex replaces it in the output.
+ """
+ self.reset()
+ if not self.legal():
+ return ""
+ out = ""
+ previtem = None
+ while self.uplegal():
+ item = self.item
+ """Insert a separating space after an escape sequence if it is a
+ string and is followed by a letter."""
+ if (None != previtem and esc_str_ty == previtem.type
+ and simple_ty == item.type and isletter(item.val[0], isatletter)):
+ out += " "
+ previtem = item
+ if not (esc_str_ty == item.type and "input" == item.val):
+ out += item.show()
+ self.next()
+ else:
+ self.next()
+ group = self.scan_group()
+ file = detokenize(group.val)
+ clean_file = "%s-clean.tex" % (file)
+ print("Reading file %s" % (clean_file))
+ fp = open(clean_file,"r")
+ content = fp.read()
+ fp.close()
+ out += content
+ return out
+
+ # Basic tex scanning
+
+ def skip_blank_tokens(self): # we also skip comment tokens.
+ item = self.item
+ while (self.uplegal() and
+ (comment_ty == item.type or
+ (simple_ty == item.type and blank_re.match(item.val)))):
+ item = self.next()
+ return item
+
+ def scan_group(self):
+ """Returns group.
+ """
+ if not self.legal():
+ raise Error("No group to scan.")
+ item = self.item
+ if not (simple_ty == item.type and "{" == item.val):
+ return Group(token_ty, [self.item])
+ count = 1
+ group = []
+ item = self.next()
+ while count and self.uplegal():
+ if simple_ty == item.type:
+ if "{" == item.val:
+ count += 1
+ elif "}" == item.val:
+ count -= 1
+ if count != 0:
+ group.append(item)
+ item = self.next()
+ return Group(group_ty, group)
+
+ # Command and environment definitions
+
+ def scan_command_name(self):
+ """Returns name.
+ """
+ if not self.legal():
+ raise Error("No command name to scan.")
+ item = self.item
+ name = ""
+ if item.type in [esc_symb_ty, esc_str_ty]:
+ name = item.val
+ else:
+ if not "{" == item.val:
+ raise Error("Command definition misses first {.")
+ self.next()
+ item = self.skip_blank_tokens()
+ if not item.type in [esc_symb_ty, esc_str_ty]:
+ raise Error("Command definition does not begin with control sequence.")
+ name = item.val
+ self.next()
+ item = self.skip_blank_tokens()
+ if not "}" == item.val:
+ raise Error("Definition for commmand %s misses first }., %s" %
+ (name, item.val))
+ self.next()
+ self.skip_blank_tokens()
+ return name
+
+ def scan_numargs(self, name):
+ """
+ name is the name of the command or environment definition being
+ scanned.
+ Starts on a nonblank token.
+ Returns numargs
+ where numargs is the number of arguments in a command or environment
+ definition,
+ """
+ if not self.legal():
+ raise Error("No numargs to scan.")
+ item = self.item
+ numargs = 0
+ if not simple_ty == item.type:
+ raise Error("Illegal command or environment definition: "+name)
+ if "[" == item.val:
+ if not 4 < len(self.data):
+ raise Error("Command or environment definition is illegal: "+name)
+ item = self.next()
+ if not simple_ty == item.type:
+ raise Error("Illegal command or environment definition: "+name)
+ numargs = item.val
+ if not pos_digit_re.match(numargs):
+ raise Error("%s must be argument number after %s" % (numargs, name))
+ numargs = int(numargs)
+ self.next()
+ item = self.skip_blank_tokens()
+ if not simple_ty == item.type:
+ raise Error("Illegal command definition: "+name)
+ if "]" != item.val:
+ raise Error("Illegal command definition: "+name)
+ self.next()
+ self.skip_blank_tokens()
+ return numargs
+
+ def scan_command_def(self):
+ """Scan a command definition.
+ Return command_def.
+ Assumes that the number of arguments is at most 9.
+ """
+ if not self.legal():
+ raise Error("No command definition to scan.")
+ item = self.item
+ if not 2 < len(self.data):
+ raise Error("Command definition is illegal.")
+ # newcommand or renewcommand
+ if not item.type in [esc_symb_ty, esc_str_ty]:
+ raise Error("Command definition should begin with control sequence: "+item.val)
+ if item.val not in ["newcommand", "renewcommand"]:
+ raise Error("Command definition should begin with control sequence.")
+ self.next()
+ self.skip_blank_tokens()
+
+ cmd_name = self.scan_command_name()
+ numargs = self.scan_numargs(cmd_name)
+
+ body_group = self.scan_group()
+ if group_ty != body_group.type:
+ raise Error("Command body missing: "+cmd_name)
+ body_val = strip_comments(body_group.val)
+ return Command_def(cmd_name, numargs, body_val)
+
+ def scan_env_name(self):
+ """Starts on a {.
+ Returns name.
+ """
+ if not self.legal():
+ raise Error("No environment name to scan.")
+ item = self.item
+ if not "{" == item.val:
+ raise Error("Env. definition begins with %s, not with {" % (item.val))
+ self.next()
+ item = self.skip_blank_tokens()
+ name = ""
+ if not simple_ty == item.type:
+ raise Error("1. Env. def. begins with cont. seq. %s, not with env.name."
+ % (item.val))
+ while self.uplegal() and not blank_or_rbrace_re.match(item.val):
+ name += item.val
+ item = self.next()
+ if not simple_ty == item.type:
+ raise Error("2. Env. def. begins with cont. seq. %s, not with env.name."
+ % (item.val))
+ item = self.skip_blank_tokens()
+ if not "}" == item.val:
+ raise Error("Command definition does not begin with control sequence.")
+ self.next()
+ self.skip_blank_tokens()
+ return name
+
+ def scan_env_def(self):
+ """Scan an environment definition.
+ Return env_def
+ Assumes that the number of arguments is at most 9.
+ """
+ if not self.legal():
+ raise Error("No environment definition to scan.")
+ item = self.item
+ if not 7 < len(self.data):
+ raise Error("Environment definition is illegal.")
+ pos = 0
+
+ if not item.type in [esc_symb_ty, esc_str_ty]:
+ raise Error("Env. definition does not begin with control sequence:"+
+ item.val)
+ if item.val not in ["newenvironment", "renewenvironment"]:
+ raise Error("Env. definition does not begin with control sequence.")
+ self.next()
+ self.skip_blank_tokens()
+
+ env_name = self.scan_env_name()
+ numargs = self.scan_numargs(env_name)
+ self.skip_blank_tokens()
+
+ begin_group = self.scan_group()
+ if group_ty != begin_group.type:
+ raise Error("Begin body missing: "+env_name)
+ begin_val = strip_comments(begin_group.val)
+
+ self.skip_blank_tokens()
+
+ end_group = self.scan_group()
+ if group_ty != end_group.type:
+ raise Error("End body missing:"+env_name)
+ end_val = strip_comments(end_group.val)
+
+ return Env_def(env_name, numargs, begin_val, end_val)
+
+ def scan_defs(self):
+ if not self.legal():
+ raise Error("No definitions to scan.")
+ self.reset()
+ command_defs, env_defs = self.defs
+ while self.uplegal():
+ if (esc_str_ty == self.item.type
+ and self.item.val in ["newcommand", "renewcommand"]):
+ command_def = self.scan_command_def()
+ command_defs[command_def.name] = command_def
+ elif (esc_str_ty == self.item.type and self.item.val
+ in ["newenvironment", "renewenvironment"]):
+ env_def = self.scan_env_def()
+ env_defs[env_def.name] = env_def
+ else:
+ self.next()
+
+ # Instances
+
+ def scan_args(self, command_or_env_def):
+ """Scan the arguments of a command or environment.
+ Return [args].
+ """
+ if not self.legal():
+ raise Error("No arguments to scan.")
+ numargs = command_or_env_def.numargs
+ name = command_or_env_def.name
+
+ args = []
+ for i in range(numargs):
+ arg = []
+ if not (simple_ty == self.item.type and "{" == self.item.val):
+ arg = [self.item]
+ self.next()
+ else:
+ group = self.scan_group()
+ arg = group.val
+ args.append(arg)
+ return args
+
+ def scan_command(self, command_def):
+ """Scan the arguments of a command.
+ Return command_instance
+ """
+ if not self.legal():
+ raise Error("No command to scan.")
+ if not self.item.type in [esc_symb_ty, esc_str_ty]:
+ raise Error("Command does not begin with control sequence.")
+ name = self.item.val
+ self.next()
+ if 0 < command_def.numargs:
+ self.skip_blank_tokens()
+ args = self.scan_args(command_def)
+ else:
+ args = []
+ return Command_instance(name, args)
+
+ def test_env_boundary(self, item):
+ """Check whether an environment begin or end follows.
+ Return 1 if \begin, -1 if \end, 0 otherwise.
+ """
+ d = 0
+ if esc_str_ty == item.type:
+ if "begin"==item.val:
+ d = 1
+ elif "end"==item.val:
+ d = -1
+ return d
+
+ def scan_env_begin(self):
+ """Scan an environment name.
+ Return env_name.
+ """
+ if not self.legal():
+ raise Error("No environment begin to scan.")
+ item = self.item
+ if not (esc_str_ty == item.type and "begin" == item.val):
+ raise Error("Environment does not begin with begin.")
+ self.next()
+ name_group = self.scan_group()
+ name = detokenize(name_group.val)
+ return name
+
+ def scan_env_end(self):
+ """Scan an environment end.
+ Return env_name.
+ """
+ if not self.legal():
+ raise Error("No environment end to scan.")
+ item = self.item
+ if not (esc_str_ty == item.type and "end" == item.val):
+ raise Error("Environment does not end with end.")
+ self.next()
+ name_group = self.scan_group()
+ name = detokenize(name_group.val)
+ return name
+
+ def scan_env_rest(self, env_def):
+ """Scanning starts after \begin{envname}.
+ Returns env_instance.
+ """
+ if not self.legal():
+ raise Error("No environment rest to scan.")
+ count = 1 # We are already within a boundary.
+ args = self.scan_args(env_def)
+ body = []
+ while count and self.uplegal():
+ old_pos = self.pos
+ d = self.test_env_boundary(self.item)
+ count += d
+ if 1 == d:
+ self.scan_env_begin()
+ elif -1 == d:
+ self.scan_env_end()
+ else:
+ self.next()
+ if 0 < count:
+ body.extend(self.data[old_pos : self.pos])
+ return Env_instance(env_def.name, args, body)
+
+ # Definitions
+
+ def restore_defs(self):
+ if os.path.isfile(self.defs_db_file):
+ print("Using defs db %s" % (self.defs_db_file))
+ db_h = shelve.open(self.defs_db)
+ self.defs = db_h["defs"]
+ db_h.close()
+
+ def save_defs(self):
+ db_h = shelve.open(self.defs_db)
+ if "defs" in db_h:
+ del db_h["defs"]
+ db_h["defs"] = self.defs
+ db_h.close()
+
+ def add_defs(self, defs_file):
+ defs_file_compl = defs_file + ".sty"
+ if not os.path.isfile(defs_file_compl):
+ raise Error("%s does not exist" % (defs_file_compl))
+
+ defs_db_file = self.defs_db_file
+ if newer(defs_db_file, defs_file_compl):
+ print("Using defs db %s for %s" % (defs_db_file, defs_file))
+ else:
+ defs_fp = open(defs_file_compl, "r")
+ defs_str = defs_fp.read()
+ defs_fp.close()
+ ds = Tex_stream()
+ ds.defs = self.defs
+ defs_text = ds.smart_tokenize(defs_str,isatletter=True)
+ # changing ds.defs will change self.defs
+ if self.debug:
+ defs_seen_file = "%s-seen.sty" % (defs_file)
+ defs_seen_fp = open(defs_seen_file, "w")
+ out = detokenize(defs_text,isatletter=True)
+ defs_seen_fp.write(out)
+ defs_seen_fp.close()
+ ds.scan_defs()
+ if self.debug:
+ out = ""
+ command_defs, env_defs = self.defs
+ for def_name in command_defs.keys():
+ out += command_defs[def_name].show() + "\n"
+ for def_name in env_defs.keys():
+ out += env_defs[def_name].show() +"\n"
+ print("Definitions after reading %s:" % (defs_file))
+ print(out)
+
+ # Applying definitions, recursively
+ # (maybe not quite in Knuth order, so avoid tricks!)
+
+ def subst_args(self, body, args):
+ out = []
+ pos = 0
+ while pos < len(body):
+ item = body[pos]
+ if not (simple_ty == item.type and "#" == item.val):
+ out.append(item)
+ pos += 1
+ continue
+ pos += 1
+ token = body[pos]
+ argnum = token.val
+ if not pos_digit_re.match(argnum):
+ raise Error("# is not followed by number.")
+ argnum = int(argnum)
+ if argnum > len(args):
+ raise Error("Too large argument number.")
+ arg = args[argnum-1]
+ out += arg
+ pos += 1
+ return out
+
+ def apply_command_recur(self, command_instance):
+ command_defs, env_defs = self.defs
+ name = command_instance.name
+ command_def = command_defs[name]
+
+ args = command_instance.args
+ body = command_def.body
+ result = self.subst_args(body, args)
+ try:
+ result = self.apply_all_recur(result)
+ except Empty_text_error as e:
+ raise Error("apply_all_recur fails on command instance %s: %s, %s" % \
+ (command_instance.show(), detokenize(e.data), e.message))
+ return result
+
+ def apply_env_recur(self, env_instance):
+ command_defs, env_defs = self.defs
+ name = env_instance.name
+ env_def = env_defs[name]
+
+ begin, end = env_def.begin, env_def.end
+ body, args = env_instance.body, env_instance.args
+ out = self.subst_args(begin, args) + body + self.subst_args(end, args)
+ return self.apply_all_recur(out)
+
+
+ def apply_all_recur(self, data, report=False):
+ ts = Tex_stream(data)
+ ts.defs = self.defs
+ command_defs, env_defs = self.defs
+ out = []
+ progress_step = 10000
+ progress = progress_step
+ if not ts.legal():
+ raise Empty_text_error(data, "No text to process.")
+ while ts.uplegal():
+ if self.pos > progress:
+ if report:
+ print(self.pos)
+ progress += progress_step
+ if not ts.item.type in [esc_symb_ty, esc_str_ty]:
+ out.append(ts.item)
+ ts.next()
+ continue
+ if 1 == ts.test_env_boundary(ts.item):
+ old_pos = ts.pos
+ env_name = ts.scan_env_begin()
+ if env_name not in env_defs:
+ out.extend(ts.data[old_pos : ts.pos])
+ continue
+ else:
+ env_def = env_defs[env_name]
+ env_instance = ts.scan_env_rest(env_def)
+ result = ts.apply_env_recur(env_instance)
+ out.extend(result)
+ elif ts.item.val not in command_defs:
+ out.append(ts.item)
+ ts.next()
+ continue
+ else:
+ command_def = command_defs[ts.item.val]
+ command_inst = ts.scan_command(command_def)
+ result = ts.apply_command_recur(command_inst)
+ out.extend(result)
+ return out
+
+
+ # Processing files
+
+ def process_file(self, file):
+ """Returns the new defs.
+ """
+ file = cut_extension(file, ".tex")
+ source_file = "%s.tex" % (file)
+ print("File %s [" % (source_file))
+ source_fp = open(source_file, "r")
+ text_str = source_fp.read()
+ source_fp.close()
+
+ self.smart_tokenize(text_str, handle_inputs=True)
+ if not self.data:
+ raise Error("Empty tokenization result.")
+ self.reset()
+
+ if self.debug:
+ source_seen_fname = "%s-seen.tex" % (file)
+ source_seen_fp = open(source_seen_fname, "w")
+ source_seen_fp.write(detokenize(self.data))
+ source_seen_fp.close()
+
+ self.data = self.apply_all_recur(self.data, report=True)
+
+ result_fname = "%s-clean.tex" % (file)
+ print("Writing %s [" % (result_fname))
+ result_fp = open(result_fname, "w")
+ result_fp.write(self.smart_detokenize())
+ result_fp.close()
+ print("] file %s" % (result_fname))
+ print("] file %s" % (source_file))
+
+ def process_if_newer(self, file):
+ """
+ \input{file} is added to the token list.
+ If the input file is newer it is processed.
+ Returns tokenized \input{file}.
+ """
+ file = cut_extension(file, ".tex")
+ tex_file = file+".tex"
+ clean_tex_file = file+"-clean.tex"
+ if newer(clean_tex_file, tex_file):
+ print("Using %s." % (clean_tex_file))
+ else:
+ ts = Tex_stream()
+ ts.data = []
+ ts.defs = self.defs
+ ts.process_file(file)
+ to_add = "\\input{%s}" % (file)
+ return tokenize(to_add)
# Main
@@ -1065,15 +1072,15 @@ long_optlist = ["debug","defs="]
options, restargs = getopt_map("x", long_optlist)
debug = False
-if options.has_key("--debug"):
- debug = True
+if "--debug" in options:
+ debug = True
root = restargs[0]
root = cut_extension(root, ".tex")
-if options.has_key("--defs"):
- defs_root = options["--defs"]
+if "--defs" in options:
+ defs_root = options["--defs"]
else:
- defs_root = "%s" % (root)
+ defs_root = "%s" % (root)
defs_db = defs_root
defs_db_file = defs_root+".db"
@@ -1084,7 +1091,7 @@ ts.debug = debug
ts.restore_defs()
for root in restargs:
- ts.process_file(root)
+ ts.process_file(root)
-print "(Re)creating defs db %s" % (defs_db)
+print("(Re)creating defs db %s" % (defs_db))
ts.save_defs()
diff --git a/support/de-macro/user-guide.pdf b/support/de-macro/user-guide.pdf
index 7e5ea4d8db..f41663fb1c 100644
--- a/support/de-macro/user-guide.pdf
+++ b/support/de-macro/user-guide.pdf
Binary files differ
diff --git a/support/de-macro/user-guide.tex b/support/de-macro/user-guide.tex
index 0fc17a32e3..61001e4c71 100644
--- a/support/de-macro/user-guide.tex
+++ b/support/de-macro/user-guide.tex
@@ -21,6 +21,10 @@ Licensed under the Academic Free Licence version 2.1}
\maketitle
+Version 1.4 - Luca Citi made it python2.7 and python3 compatible.
+ Peter Gacs improved the parsing of \verb`\input{<filename>}`,
+ and made @ a letter in the style files.
+
Version 1.3 - this version is much more conservative about deleting
comments and inserting or deleting blank space: tries to
leave in all comments, adds space only when necessary, and
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb b/systems/texlive/tlnet/tlpkg/texlive.tlpdb
index 9a58740a08..d362e8bed8 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb
@@ -26,11 +26,11 @@ depend container_split_src_files/1
depend frozen/0
depend minrelease/2016
depend release/2020
-depend revision/55760
+depend revision/55767
name 00texlive.image
category TLCore
-revision 55751
+revision 55763
shortdesc TeX Live files only in the source repository
longdesc The files here are not copied by the installer and containers
longdesc are not built for them; they exist only in the source
@@ -56464,7 +56464,7 @@ binfiles arch=x86_64-solaris size=1
name cloze
category Package
-revision 55704
+revision 55763
shortdesc A LuaLaTeX package for creating cloze texts
relocated 1
longdesc This is a LuaTeX or LuaLaTeX package for generating cloze
@@ -56473,22 +56473,22 @@ longdesc doesn't change when using the hide and show options. There are
longdesc the commands \cloze, \clozefix, \clozefil, \clozenol,
longdesc \clozestrike and the environments clozepar and clozebox to
longdesc generate cloze texts.
-containersize 8832
-containerchecksum 3c64923e40f0e99b5efa7e7653511ee7573fbe7ee5eaae49f122c9bac20475781f2e21e632cefabb2b9ad1e576801f147ac51483103ced09e3b54d409acef179
-doccontainersize 577860
-doccontainerchecksum 239934910384fa8cdea9cf8389b17047bb38bce3592ab49a7ca22103981862b46a4ac5f636fa87775556c931ecaef95d7d7f9f27a1e9528dda98b041dcd9bd04
-docfiles size=149
+containersize 9208
+containerchecksum f1c986699258bc9e7e27093a2d44f59d001ab13c3d9ba0717dc9bed0c53b00ce8ccf658c9cc3d7d457d18f45357a6d44da4d6710c1661ffcf299a8791822501b
+doccontainersize 577160
+doccontainerchecksum ca3d9e0a4eb7486f40e4a26d0b6a2aa5dbf7e3d28343b9069ee97b089e7906aa137d8e7f8c6d010fd2cf472836191b88b9450248bd99728d80159afc54a8d1e7
+docfiles size=148
RELOC/doc/luatex/cloze/README.md details="Readme"
RELOC/doc/luatex/cloze/cloze.pdf details="Package documentation"
- RELOC/doc/luatex/cloze/cloze.tex
srccontainersize 6008
-srccontainerchecksum a1583532266d8bcdb6f879711286e4db1cdfddbfde777507fe17608d7f49b9fd7e6332872378c94603042fc6fce7b5be5d9c3d8d64f4546ecb2758c544758f5d
+srccontainerchecksum 53d30866958183101890a4999a9b8f4b20b5bbca996d28ca4a22aaf81331f186facc695725917a9e80206545a3e0962b8c17b4e08b4d2db961878a273ba7c209
srcfiles size=8
RELOC/source/luatex/cloze/cloze.dtx
RELOC/source/luatex/cloze/cloze.ins
-runfiles size=10
+runfiles size=11
RELOC/scripts/cloze/cloze.lua
RELOC/tex/luatex/cloze/cloze.sty
+ RELOC/tex/luatex/cloze/cloze.tex
catalogue-contact-bugs https://github.com/Josef-Friedrich/cloze/issues
catalogue-contact-development https://josef.friedrich.rocks
catalogue-contact-repository https://github.com/Josef-Friedrich/cloze
@@ -84305,7 +84305,7 @@ catalogue-version 0.2
name de-macro
category Package
-revision 26355
+revision 55766
shortdesc Expand private macros in a document
longdesc De-macro is a Python script that helps authors who like to use
longdesc private LaTeX macros (for example, as abbreviations). A
@@ -84315,20 +84315,21 @@ longdesc running de-macro on it. De-macro will expand macros defined in
longdesc \(re)newcommand or \(re)newenvironment commands, within the
longdesc document, or in the document's "private" package file.
depend de-macro.ARCH
-containersize 7848
-containerchecksum 5ce9beff85d65654173557af668ff15af6989d9fa6d341fe9c26149d0715ed7cf57bf5b2a59b6cf99e8ec14e4ebb6816e9972268516a0b2a78ee13c6423b3599
-doccontainersize 49764
-doccontainerchecksum 05793930357ad58a57e221696d836895f02dec82cc93b9aa7ea302978bee24410d4b382ff72407faa67f4133c75a84fb2454957de446beca05606776c6581ade
-docfiles size=15
+containersize 7904
+containerchecksum 36d6d47e8d2e04f6f6acbd46c9ad87e7b2e2f2f2dec9f5a06247e6955bf0a8efb3eb1593b6534b8e16049d00a3e66207e1627fd241d98b661dfd78b9f30b18e1
+doccontainersize 57104
+doccontainerchecksum 2c1cf50f37fe354582ff8cf1232188d3e6df1863747d04659e27dcdc1cd4ac919eb453c294ff2c0e13eea2e633e0ccccd2c3c12f9894eacd7f74dd4f6e2e78c5
+docfiles size=17
texmf-dist/doc/support/de-macro/README details="Readme"
texmf-dist/doc/support/de-macro/user-guide.pdf details="Package documentation"
texmf-dist/doc/support/de-macro/user-guide.tex
-runfiles size=9
+runfiles size=8
texmf-dist/scripts/de-macro/de-macro
+catalogue-contact-home http://www.cs.bu.edu/~gacs
catalogue-ctan /support/de-macro
catalogue-license other-free
catalogue-topics macro-supp
-catalogue-version 1.3
+catalogue-version 1.4
name de-macro.aarch64-linux
category Package
@@ -260826,7 +260827,7 @@ catalogue-version 0.302
name semantex
category Package
-revision 55475
+revision 55765
shortdesc Object-oriented mathematics
relocated 1
longdesc The SemanTeX package for LaTeX delivers a more semantic,
@@ -260835,20 +260836,20 @@ longdesc ordinary math syntax. The system is object-oriented and uses
longdesc keyval syntax, and everything is highly customizable. At the
longdesc same time, care has been taken to make the syntax as intuitive,
longdesc natural, practical, and lightweight as possible.
-containersize 12568
-containerchecksum fb6236e9a0c90f6c48cf339a5112119b208ec6b0bb099f126f51c7d5fee541fe4799cd41489d57d3be6475198d2519b9be4c33bf5bcf53e168bac547e5736d22
-doccontainersize 235612
-doccontainerchecksum eda33ed928062d10ee347d9e807cf9fe5460702ba7f3fed4d383f0997b99968fe2e5c6526b2020f9c6d9e871ff64d75dd8d627854aa7afc3ae3d58c059bcd131
-docfiles size=72
+containersize 17332
+containerchecksum efc1d566e6a9257b66ca44c847f8903c4d20a83b62e13128c531cecf672e45f149b061d5a401a4567ec34bca819b57315bdc9876ee1849ffc217e902f65d08c4
+doccontainersize 249820
+doccontainerchecksum c0a4fbf3799c0d1168965be9ed491a2e8bca032824b626f1443021df74345790a87c796d67ea410b2e50b77e452814e4677be3fd22783a9e7dc3b63ccf126d88
+docfiles size=78
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=23
+runfiles size=40
RELOC/tex/latex/semantex/semantex.sty
catalogue-ctan /macros/latex/contrib/semantex
catalogue-license lppl1.3c
-catalogue-topics maths
-catalogue-version 0.1alpha
+catalogue-topics maths expl3
+catalogue-version 0.2alpha
name semantic
category Package
@@ -285949,15 +285950,15 @@ docfiles size=592
name texlive-docindex
category TLCore
-revision 55754
+revision 55762
shortdesc top-level TeX Live doc.html, etc.
longdesc These files are regenerated as needed, which is often, so we
longdesc make them a separate package. See the tl-update-auto script for
longdesc the process.
containersize 388
-containerchecksum 9b364dd297e99e0473c6e3ee810ad95a56120777f045d3697e1f07f3c0958e55c040d05c14116ccee805550c7e8ecb8fb5513d301de58c0774f091fe0f322aa1
-doccontainersize 167256
-doccontainerchecksum f48898e9ab23644aed7a85e10812e1fc671bf1893adfcae4a55ed1a11a403963d99945ff8e259a4fd61836a67605d8c751d6c67c68be5b1a6b4ff9b99628b385
+containerchecksum bda5f56dcc90589462000a9f0e12f93ecaf0d650f9a01a0422e2a6abcad88aea65db34d79703cfab02033bc4ab59a23f19f158a63c095ba207e9e350ff88ac12
+doccontainersize 167232
+doccontainerchecksum 6a2729cd5cc9cfb3cbbb9310bdc2c992fb578c16f8a7e74dfba432eb47b7f3f386285969eeffc35fa86141b96156e14ccbab87a0e28de74beed344ab6247bea7
docfiles size=332
doc.html
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
index 0f22529d8e..67d1f75f20 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
@@ -1 +1 @@
-bf333146ec46cb59ee5d0459684c7bf0 texlive.tlpdb
+d0ac4c3d7ff4cd8eb85038a74c694f8e texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
index 9ea5c9ecf7..902cb24337 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
@@ -1 +1 @@
-1492d579be30bbca335f201ad1c4c3b892601a4399b04ac8fc427c4839f88ed216d7ee072812d00b6da7abe549a3fe0f6a4eab58130cfc1fd98c726a6c3f0d37 texlive.tlpdb
+6b016e17f5983cc2c9354a582625dbfbab7ccfdd1a42097eb3c98ba9c28a1c6b0fb89ad749d28b8c78ee146299301a74af95275ca853f5107cfffb6a5df87033 texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
index 025d761c78..8342e1d780 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-----
-iQEcBAEBCgAGBQJfAmizAAoJEEzhh34ZQ4xwJw0IAIii+V0TV7JUmOq3tfOXzL6O
-DvyToo+NnEuePt/to2A4BC0W35NkveCUQiAAZdB148PCIVn7GirSuCOmfy0XKeRH
-x4/J0iGW2rPHD6ec6oZ829MtLbOPb3OPou65bLJ67DP8YtJqWSasL75vjR3Hp5n1
-7nc290M2MgI8MTBl4bIneNLehvOxmPFI+qO5NOvpMoew5WnyD6+F8f9PH/K9QKNl
-JeWxIP6tBCCbcsmk1+gSNE7lnmSLWWPCpW2hWnonG8q9Zw+LwcRkRgp3/I0VHwKX
-K+cGoT9wOhsHgy3+kZ9f6BMP6Gd/L7w6yJauAmGaDTTrrG3XFpVkuCoq+iZCpzU=
-=ZQi3
+iQEcBAEBCgAGBQJfA7oxAAoJEEzhh34ZQ4xwoG0H/iczOFSx7ANWR3ba3TIDhEdP
+u5FArFWJMja+t0Zy95Xp2predFY7UAAakzoIaZpTYLfAOdVrzi+XgTqigyrWQ/P5
+wLYL4G/baseQqmUk1luzMSQASvOqiunWQUshVohqwh3cj/2GnWkEWEEW81+ch1Dr
+oUNH/a+QxjtAGxWJ7ACDgUEm3/34kDn1FU1zVUxVdUYHlVGEE21Jnp0o9doOUl9F
+QAbcvkvybMqKhxi3ByHs2ZcdRkwvOvl8CDUYNDVDxkPZ3m8vNFHh639MdrCgr/QO
+X8LfVW+fpYanYHr0E+2tl21mlTA5+7bI2fT27SLIZT9lUrZQkOxzh52HrrexQCo=
+=7WfC
-----END PGP SIGNATURE-----
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
index 9b5f4185a5..9530ec9cf4 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/next/pr.ini b/systems/win32/miktex/tm/packages/next/pr.ini
index 3c479cdd2e..a52184af7f 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=1593980126
+date=1594066510
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=2de35387a52b7f105aceb6631b1f6edf
+lstdigest=ec863003e3c859d88c2c394f708c13cc
numpkg=3946
relstate=next
-version=7491
+version=7492
;;;;This configuration file is signed by a MiKTeX maintainer. The signature follows.
;;;;-----BEGIN MIKTEX SIGNATURE-----
-;;;; signature/miktex: imQz22Acs2a2YAdQtuBRqWydrTZPUKYKPGioxqaEkeEi0DZTUUEiBJ1V4eghaNkOSlRKi29VlsSW5lYDDpyaQhSsZosH5VW7dRNetvcoSYnl9Dvsihcd1i7DYfDfuKF8KKvaKqKlpLiP6AN43sh7iD7k+Cj7/5X/aberANM+b08KgE1M2Pv23k6/NT8ot6Zd3hT3/GvwvOq5bN5ZTU+ibrjpjOI3sAWEtbeOBHLNvPVF5bNtXKX0vYAA6x+Odtn3ZSo2sMfMUqNWObVpzCoA/gxkaHCtSWvHYdlRwxYK1Go2/CWjblyWnf8o4KgHCGvCXYzW8tYVsT2F2h6tjlMoHw==
+;;;; signature/miktex: pa4UcVmBDcwJAU4yBDnk9mwJMwJ2OCyop/THLK6Sb7YOsVEfBg0L8KMKxyiW2vTqFfttZa+bSs8qf1+AnCVaxuRStDnCVgmz8/EhWME3w0TrhNR7jwIsNrHziGW5oHXHFX2NcAHFgaQOlYiVbrAI7HdT3iN0YDD/dIixLeOg8Tv/KoJ9R1QT/HMeeyQHaAhhwNZ9NVUXDr6oD79IUpDdb1yzzNSTAFY7JZRiUW4FkUZNpsc0sCeXOQCodb713foNaXMaFlc2MEI34Qp1saF9xQ7K2wrRK8LwIVqAzM1B35Mln31oyTmwiO0IdOf8va5MzXcm+ADlXwh19BP8NUYluQ==
;;;;-----END MIKTEX SIGNATURE-----
diff --git a/systems/win32/miktex/tm/packages/pr.ini b/systems/win32/miktex/tm/packages/pr.ini
index a01a933bbc..eecddf8a9a 100644
--- a/systems/win32/miktex/tm/packages/pr.ini
+++ b/systems/win32/miktex/tm/packages/pr.ini
@@ -1,13 +1,13 @@
[repository]
-date=1593979896
+date=1594066286
lastupd=beamerappendixnote bubblesort draftwatermark etbb expkv fbb mnras richtext verifiche xits babel-french cloze erewhon l3backend nicematrix pm-isomath shtthesis tikzducks tracklang dtk-bibliography
-lstdigest=b5b186fa7848d2af9c111f8c022403fc
+lstdigest=f9311b0b476a0690c16bccdda6a08424
numpkg=3941
relstate=stable
-version=7491
+version=7492
;;;;This configuration file is signed by a MiKTeX maintainer. The signature follows.
;;;;-----BEGIN MIKTEX SIGNATURE-----
-;;;; signature/miktex: LRlqjyxJge7V7bpn4qJCZiTUP0HUFdbXQh+ptgXy7PToSCSa4eaOXCTmImFpho0ABUKZFRvOWJi+/EXtXsAGigv8lPtN29KYb+rIxdmyK0r94gMxtECaVkbsSo08mKb6GClYJSIKJVzmhmWcu5Badw/q8PPOoTNzhIODy4fna/7yLwafGFNgcxk7dQNQ2VSzeIIBOVbdNR/3mTiYYwtV7MyXNkeFmK05R9Bh4zbwm9QX2ndI5/FWDLdDTrYOldMAu7DP1G4PxsY+C/HogZww7aHxz8Y+DXI0t1QXTT2cik8lk64v4s5W3h/pM8pW2T2XM8Y8zUEimW6C+G5zWw6M6w==
+;;;; signature/miktex: OH9PoqgzToR8o+z5A1Xz+XHt7fJEU+WEXguIyogrzVK9JH73YhmSfIrGE5k+mp4wCHV0D+xXc+GQbBVbYJruQJ+hrXoV1DEeEL3LQrJ+FtfPg7bgH9dpXM5V73Rt0yF/Tzd4+4G0U6YHtFMNRpI0YpY7DKKYCvanwgt1orOOtmGHwZE6Ro9pivD82qoVmDodSnEdOdpyoFWfUVKaLPl493Mvep/m518RJzVZLNqDmExwmu+H6Zk4On6oqC5pAoa5fYwz+0jkDprpGDli4x3MVbe6A3XEoOaDvkPwasTej4LHZi3QDIWcetwygLQsx8MzhOTu2FZyqNZcawXr4CjuMQ==
;;;;-----END MIKTEX SIGNATURE-----
diff --git a/systems/win32/w32tex/ChangeLog b/systems/win32/w32tex/ChangeLog
index 5e858e6e3b..b50978994c 100644
--- a/systems/win32/w32tex/ChangeLog
+++ b/systems/win32/w32tex/ChangeLog
@@ -1,5 +1,15 @@
W32TeX (x86 & x64) ChangeLog
+[2020/07/06]
+(01) context.tar.xz
+ ConTeXt version: 2020.07.05 23:00.
+(02) pdftex-w32.tar.xz
+ Update eplain.fmt.
+(03) web2c-lib.tar.xz
+ Update eplain.
+(04) win64/context-w64.tar.xz
+ Update mtxrun.lua
+
[2020/07/05]
(01) ltxpkgs.tar.xz
Update expkv-opt, expkv and expkv-def.
diff --git a/timestamp b/timestamp
index 72235e408f..6d450168a5 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:
-2020-07-06-02-02
+2020-07-07-02-02