summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2020-10-23 03:02:00 +0000
committerNorbert Preining <norbert@preining.info>2020-10-23 03:02:00 +0000
commitc6303e38664a7a78e8f21a4390b69e5aa9cf5c93 (patch)
treeb95dddc8dde54ba0f7189d0edaf24877d61bb44b
parent7448609d1256af02966b8f84fe8464234276ce7a (diff)
CTAN sync 202010230301
-rw-r--r--FILES.byname552
-rw-r--r--FILES.byname.gzbin2233562 -> 2233689 bytes
-rw-r--r--FILES.last07days598
-rw-r--r--graphics/pgf/contrib/utfsym/README22
-rw-r--r--graphics/pgf/contrib/utfsym/doc/utfsym.pdfbin3577246 -> 3582044 bytes
-rw-r--r--graphics/pgf/contrib/utfsym/doc/utfsym.tex25
-rw-r--r--graphics/pgf/contrib/utfsym/latex/utfsym.sty6
-rw-r--r--macros/latex/contrib/askmaps/README6
-rw-r--r--macros/latex/contrib/askmaps/askmaps.pdfbin308877 -> 377937 bytes
-rw-r--r--macros/latex/contrib/askmaps/askmaps.sty571
-rw-r--r--macros/latex/contrib/askmaps/askmaps.tex870
-rw-r--r--macros/latex/contrib/ejpecp/README.md2
-rw-r--r--macros/latex/contrib/ejpecp/ejpecp.dtx25
-rw-r--r--macros/latex/contrib/ejpecp/ejpecp.pdfbin180717 -> 180735 bytes
-rw-r--r--macros/latex/contrib/ejpecp/getmref.py1809
-rw-r--r--macros/latex/contrib/ejpecp/mgetmref.py401
-rw-r--r--macros/latex/contrib/ejpecp/sample.pdfbin155832 -> 155933 bytes
-rw-r--r--macros/latex/contrib/ejpecp/sample.tex17
-rw-r--r--macros/latex/contrib/fgruler/README2
-rw-r--r--macros/latex/contrib/fgruler/fgruler.dtx45
-rw-r--r--macros/latex/contrib/fgruler/fgruler.ins4
-rw-r--r--macros/latex/contrib/fgruler/fgruler.pdfbin252700 -> 259375 bytes
-rw-r--r--macros/latex/contrib/hu-berlin-bundle/README.md5
-rw-r--r--macros/latex/contrib/hu-berlin-bundle/hu-berlin-bundle.dtx34
-rw-r--r--macros/latex/contrib/hu-berlin-bundle/hu-berlin-bundle.pdfbin307158 -> 367917 bytes
-rw-r--r--macros/latex/contrib/scrlttr2copy/README.md8
-rw-r--r--macros/latex/contrib/scrlttr2copy/copy.lco81
-rw-r--r--macros/latex/contrib/scrlttr2copy/letter-copy-test.pdfbin88554 -> 88546 bytes
-rw-r--r--macros/latex/contrib/scrlttr2copy/letter-copy-test.tex11
-rw-r--r--macros/latex/contrib/skills/README.md21
-rw-r--r--macros/latex/contrib/skills/skills.sty325
-rw-r--r--macros/latex/contrib/skills/skillsdoc.pdfbin0 -> 68738 bytes
-rw-r--r--macros/latex/contrib/skills/skillsdoc.tex733
-rw-r--r--macros/latex/contrib/snapshot/README126
-rw-r--r--macros/latex/contrib/snapshot/snapshot.dtx920
-rw-r--r--macros/latex/contrib/snapshot/snapshot.ins8
-rw-r--r--macros/latex/contrib/snapshot/snapshot.pdfbin193747 -> 236859 bytes
-rw-r--r--support/ltx2mathml/COPYING674
-rw-r--r--support/ltx2mathml/README42
-rw-r--r--support/ltx2mathml/src/ltx2mathml.h22
-rw-r--r--support/ltx2mathml/src/ltx2mathmlclasses.cpp185
-rw-r--r--support/ltx2mathml/src/ltx2mathmlclasses.h40
-rw-r--r--support/ltx2mathml/src/ltx2mathmlexceptions.h51
-rw-r--r--support/ltx2mathml/src/ltx2mathmlparser.cpp2367
-rw-r--r--support/ltx2mathml/src/ltx2mathmltables.cpp672
-rw-r--r--support/ltx2mathml/src/ltx2mathmltables.h125
-rw-r--r--support/ltx2mathml/src/test.cpp41
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb190
-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.xzbin2237948 -> 2238168 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/ChangeLog4
-rw-r--r--timestamp2
56 files changed, 9816 insertions, 1860 deletions
diff --git a/FILES.byname b/FILES.byname
index 4399aa8d1c..300bb341cb 100644
--- a/FILES.byname
+++ b/FILES.byname
@@ -5020,7 +5020,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/10/21 | 108743 | FILES.last07days
+2020/10/22 | 93158 | FILES.last07days
2020/08/14 | 104065 | fonts/academicons/academicons.pdf
2020/08/14 | 17247 | fonts/academicons/academicons.sty
2020/08/14 | 6546 | fonts/academicons/academicons.tex
@@ -139502,10 +139502,10 @@
2016/01/15 | 41179 | graphics/pgf/contrib/tkz-orm/tkz-orm.tex
2016/01/16 | 437279 | graphics/pgf/contrib/tkz-orm.zip
2020/10/16 | 689 | graphics/pgf/contrib/utfsym/doc/symbole.tex
-2020/10/16 | 3577246 | graphics/pgf/contrib/utfsym/doc/utfsym.pdf
-2020/10/16 | 3578 | graphics/pgf/contrib/utfsym/doc/utfsym.tex
-2020/10/16 | 77777 | graphics/pgf/contrib/utfsym/latex/utfsym.sty
-2020/10/16 | 1814 | graphics/pgf/contrib/utfsym/README
+2020/10/22 | 3582044 | graphics/pgf/contrib/utfsym/doc/utfsym.pdf
+2020/10/22 | 4305 | graphics/pgf/contrib/utfsym/doc/utfsym.tex
+2020/10/22 | 77767 | graphics/pgf/contrib/utfsym/latex/utfsym.sty
+2020/10/22 | 1752 | graphics/pgf/contrib/utfsym/README
2018/08/26 | 7347 | graphics/pgf/contrib/utfsym/source/usym1F000.tikz
2018/08/26 | 8386 | graphics/pgf/contrib/utfsym/source/usym1F001.tikz
2018/08/26 | 6547 | graphics/pgf/contrib/utfsym/source/usym1F002.tikz
@@ -141186,7 +141186,7 @@
2018/08/26 | 3047 | graphics/pgf/contrib/utfsym/source/usym27BD.tikz
2018/08/26 | 1315 | graphics/pgf/contrib/utfsym/source/usym27BE.tikz
2018/08/26 | 3564 | graphics/pgf/contrib/utfsym/source/usym27BF.tikz
-2020/10/16 | 6523064 | graphics/pgf/contrib/utfsym.zip
+2020/10/22 | 6527992 | graphics/pgf/contrib/utfsym.zip
2011/09/16 | 12002 | graphics/pgf/contrib/xebaposter/images/docs-boxshape.pdf
2011/09/16 | 6050 | graphics/pgf/contrib/xebaposter/images/docs-headerborder.pdf
2011/09/16 | 8472 | graphics/pgf/contrib/xebaposter/images/docs-headershape.pdf
@@ -185162,11 +185162,11 @@
2020/04/13 | 595059 | macros/latex/contrib/askinclude/askinclude.pdf
2020/04/13 | 117 | macros/latex/contrib/askinclude/README.md
2020/04/13 | 601068 | macros/latex/contrib/askinclude.zip
-2013/12/04 | 308877 | macros/latex/contrib/askmaps/askmaps.pdf
-2013/12/04 | 12911 | macros/latex/contrib/askmaps/askmaps.sty
-2013/12/04 | 19318 | macros/latex/contrib/askmaps/askmaps.tex
-2013/12/04 | 745 | macros/latex/contrib/askmaps/README
-2013/12/04 | 313666 | macros/latex/contrib/askmaps.zip
+2020/10/22 | 377937 | macros/latex/contrib/askmaps/askmaps.pdf
+2020/10/22 | 21131 | macros/latex/contrib/askmaps/askmaps.sty
+2020/10/22 | 39241 | macros/latex/contrib/askmaps/askmaps.tex
+2020/10/22 | 814 | macros/latex/contrib/askmaps/README
+2020/10/22 | 385765 | macros/latex/contrib/askmaps.zip
2020/04/15 | 36936 | macros/latex/contrib/asmeconf/asmeconf.bst
2020/08/12 | 35596 | macros/latex/contrib/asmeconf/asmeconf.cls
2020/04/14 | 11967 | macros/latex/contrib/asmeconf/asmeconf-sample.bib
@@ -192060,15 +192060,15 @@
1996/11/26 | 3684 | macros/latex/contrib/eiad/Fr10.mf
1996/11/26 | 3791 | macros/latex/contrib/eiad/README
2005/04/30 | 9493 | macros/latex/contrib/eiad.zip
-2020/08/26 | 19680 | macros/latex/contrib/ejpecp/ejpecp.dtx
+2020/10/22 | 20284 | macros/latex/contrib/ejpecp/ejpecp.dtx
2020/08/26 | 2558 | macros/latex/contrib/ejpecp/ejpecp.ins
-2020/08/26 | 180717 | macros/latex/contrib/ejpecp/ejpecp.pdf
+2020/10/22 | 180735 | macros/latex/contrib/ejpecp/ejpecp.pdf
+2020/10/01 | 64431 | macros/latex/contrib/ejpecp/getmref.py
2020/07/30 | 14439 | macros/latex/contrib/ejpecp/LPPL
-2020/07/30 | 12441 | macros/latex/contrib/ejpecp/mgetmref.py
-2020/08/26 | 7133 | macros/latex/contrib/ejpecp/README.md
-2020/08/26 | 155832 | macros/latex/contrib/ejpecp/sample.pdf
-2020/08/26 | 23646 | macros/latex/contrib/ejpecp/sample.tex
-2020/08/26 | 358492 | macros/latex/contrib/ejpecp.zip
+2020/10/21 | 7192 | macros/latex/contrib/ejpecp/README.md
+2020/10/21 | 155933 | macros/latex/contrib/ejpecp/sample.pdf
+2020/10/21 | 24291 | macros/latex/contrib/ejpecp/sample.tex
+2020/10/22 | 371156 | macros/latex/contrib/ejpecp.zip
2019/01/04 | 35373 | macros/latex/contrib/ekaia/ekaia.dtx
2019/01/04 | 3232 | macros/latex/contrib/ekaia/ekaia.ins
2019/01/04 | 213941 | macros/latex/contrib/ekaia/ekaia.pdf
@@ -193629,11 +193629,11 @@
2015/10/27 | 10838 | macros/latex/contrib/ffslides/tiny_example_1.pdf
2015/10/27 | 15273 | macros/latex/contrib/ffslides/tiny_example_2.pdf
2015/11/19 | 2848864 | macros/latex/contrib/ffslides.zip
-2017/01/16 | 75870 | macros/latex/contrib/fgruler/fgruler.dtx
-2017/01/16 | 1202 | macros/latex/contrib/fgruler/fgruler.ins
-2017/01/16 | 252700 | macros/latex/contrib/fgruler/fgruler.pdf
-2017/01/16 | 714 | macros/latex/contrib/fgruler/README
-2017/01/16 | 259375 | macros/latex/contrib/fgruler.zip
+2020/10/22 | 75635 | macros/latex/contrib/fgruler/fgruler.dtx
+2020/10/22 | 1210 | macros/latex/contrib/fgruler/fgruler.ins
+2020/10/22 | 259375 | macros/latex/contrib/fgruler/fgruler.pdf
+2020/10/22 | 718 | macros/latex/contrib/fgruler/README
+2020/10/22 | 265918 | macros/latex/contrib/fgruler.zip
2014/03/24 | 1586 | macros/latex/contrib/fifo-stack/fifo-stack.cwl
2014/03/24 | 32521 | macros/latex/contrib/fifo-stack/fifo-stack.dtx
2014/03/24 | 1390 | macros/latex/contrib/fifo-stack/fifo-stack.ins
@@ -196292,13 +196292,13 @@
2011/04/29 | 319943 | macros/latex/contrib/hrefhide/hrefhide.pdf
2011/04/29 | 4295 | macros/latex/contrib/hrefhide/README
2011/04/29 | 441688 | macros/latex/contrib/hrefhide.zip
-2020/04/28 | 62648 | macros/latex/contrib/hu-berlin-bundle/hu-berlin-bundle.dtx
-2020/04/28 | 307158 | macros/latex/contrib/hu-berlin-bundle/hu-berlin-bundle.pdf
-2020/04/28 | 37045 | macros/latex/contrib/hu-berlin-bundle/img/hu-berlin-logo.pdf
-2020/04/28 | 14903 | macros/latex/contrib/hu-berlin-bundle/img/texografie-logo.pdf
-2020/04/28 | 3760 | macros/latex/contrib/hu-berlin-bundle/makefile
-2020/04/28 | 5799 | macros/latex/contrib/hu-berlin-bundle/README.md
-2020/04/28 | 343797 | macros/latex/contrib/hu-berlin-bundle.zip
+2020/10/22 | 63195 | macros/latex/contrib/hu-berlin-bundle/hu-berlin-bundle.dtx
+2020/10/22 | 367917 | macros/latex/contrib/hu-berlin-bundle/hu-berlin-bundle.pdf
+2020/10/22 | 37045 | macros/latex/contrib/hu-berlin-bundle/img/hu-berlin-logo.pdf
+2020/10/22 | 14903 | macros/latex/contrib/hu-berlin-bundle/img/texografie-logo.pdf
+2020/10/22 | 3760 | macros/latex/contrib/hu-berlin-bundle/makefile
+2020/10/22 | 5955 | macros/latex/contrib/hu-berlin-bundle/README.md
+2020/10/22 | 347559 | macros/latex/contrib/hu-berlin-bundle.zip
2018/03/03 | 171807 | macros/latex/contrib/hulipsum/hulipsum.dtx
2018/03/03 | 1696 | macros/latex/contrib/hulipsum/hulipsum.ins
2018/03/03 | 145468 | macros/latex/contrib/hulipsum/hulipsum.pdf
@@ -205139,11 +205139,11 @@
2012/09/24 | 2328 | macros/latex/contrib/scrjrnl/scrjrnl.ins
2012/09/24 | 58813 | macros/latex/contrib/scrjrnl/scrjrnl.pdf
2012/09/24 | 126944 | macros/latex/contrib/scrjrnl.zip
-2020/10/20 | 3127 | macros/latex/contrib/scrlttr2copy/copy.lco
-2020/10/20 | 88554 | macros/latex/contrib/scrlttr2copy/letter-copy-test.pdf
-2020/10/20 | 827 | macros/latex/contrib/scrlttr2copy/letter-copy-test.tex
-2016/02/13 | 436 | macros/latex/contrib/scrlttr2copy/README.md
-2020/10/20 | 89317 | macros/latex/contrib/scrlttr2copy.zip
+2020/10/22 | 3123 | macros/latex/contrib/scrlttr2copy/copy.lco
+2020/10/22 | 88546 | macros/latex/contrib/scrlttr2copy/letter-copy-test.pdf
+2020/10/22 | 956 | macros/latex/contrib/scrlttr2copy/letter-copy-test.tex
+2020/10/22 | 576 | macros/latex/contrib/scrlttr2copy/README.md
+2020/10/22 | 89481 | macros/latex/contrib/scrlttr2copy.zip
2020/02/15 | 2232 | macros/latex/contrib/sdaps/README
2020/02/15 | 40896 | macros/latex/contrib/sdaps/sdapsarray.dtx
2020/02/15 | 1893 | macros/latex/contrib/sdaps/sdapsarray.ins
@@ -205988,6 +205988,11 @@
2013/05/16 | 14813 | macros/latex/contrib/skeyval/tex/skeyval-testpkg.sty
2013/05/16 | 14308 | macros/latex/contrib/skeyval/tex/skeyval-view.sty
2013/05/18 | 503288 | macros/latex/contrib/skeyval.zip
+2020/10/22 | 1248 | macros/latex/contrib/skills/README.md
+2020/10/22 | 68738 | macros/latex/contrib/skills/skillsdoc.pdf
+2020/10/22 | 29358 | macros/latex/contrib/skills/skillsdoc.tex
+2020/10/22 | 9440 | macros/latex/contrib/skills/skills.sty
+2020/10/22 | 78454 | macros/latex/contrib/skills.zip
2019/10/15 | 1886 | macros/latex/contrib/skmath/Makefile
2019/10/15 | 1526 | macros/latex/contrib/skmath/README
2019/10/15 | 304439 | macros/latex/contrib/skmath/skmath.pdf
@@ -206046,11 +206051,11 @@
2018/05/30 | 255288 | macros/latex/contrib/smflatex/smflatex.dtx
2018/05/30 | 2160 | macros/latex/contrib/smflatex/smflatex.ins
2018/05/30 | 1122005 | macros/latex/contrib/smflatex.zip
-2019/09/17 | 770 | macros/latex/contrib/snapshot/README
-2019/09/11 | 44861 | macros/latex/contrib/snapshot/snapshot.dtx
-2019/09/11 | 2012 | macros/latex/contrib/snapshot/snapshot.ins
-2019/09/11 | 193747 | macros/latex/contrib/snapshot/snapshot.pdf
-2019/09/17 | 207120 | macros/latex/contrib/snapshot.zip
+2020/10/22 | 4230 | macros/latex/contrib/snapshot/README
+2020/10/22 | 53599 | macros/latex/contrib/snapshot/snapshot.dtx
+2020/10/22 | 2017 | macros/latex/contrib/snapshot/snapshot.ins
+2020/10/22 | 236859 | macros/latex/contrib/snapshot/snapshot.pdf
+2020/10/22 | 252207 | macros/latex/contrib/snapshot.zip
2013/04/21 | 1311 | macros/latex/contrib/snotez/README
2013/04/21 | 457084 | macros/latex/contrib/snotez/snotez_en.pdf
2013/04/21 | 16286 | macros/latex/contrib/snotez/snotez_en.tex
@@ -249350,6 +249355,17 @@
1997/04/01 | 896 | support/ltoh/rq209.sty
1997/04/01 | 4049 | support/ltoh/rq-ltoh.specs
2006/10/23 | 133059 | support/ltoh.zip
+2020/10/22 | 35148 | support/ltx2mathml/COPYING
+2020/10/22 | 1339 | support/ltx2mathml/README
+2020/10/22 | 2492 | support/ltx2mathml/src/ltx2mathmlclasses.cpp
+2020/10/22 | 806 | support/ltx2mathml/src/ltx2mathmlclasses.h
+2020/10/22 | 2003 | support/ltx2mathml/src/ltx2mathmlexceptions.h
+2020/10/22 | 694 | support/ltx2mathml/src/ltx2mathml.h
+2020/10/22 | 42873 | support/ltx2mathml/src/ltx2mathmlparser.cpp
+2020/10/22 | 25090 | support/ltx2mathml/src/ltx2mathmltables.cpp
+2020/10/22 | 2793 | support/ltx2mathml/src/ltx2mathmltables.h
+2020/10/22 | 928 | support/ltx2mathml/src/test.cpp
+2020/10/22 | 32327 | support/ltx2mathml.zip
1998/12/22 | 1058888 | support/ltx2rtf/ltx2rtf.zip
1997/01/22 | 523 | support/ltx2x/bye.ct
1997/01/22 | 18335 | support/ltx2x/detex.ct
@@ -259348,9 +259364,9 @@
2019/02/28 | 19612 | systems/texlive/tlnet/archive/flashmovie.r25768.tar.xz
2019/02/28 | 348720 | systems/texlive/tlnet/archive/flipbook.doc.r25584.tar.xz
2019/02/28 | 1792 | systems/texlive/tlnet/archive/flipbook.r25584.tar.xz
-2020/10/19 | 136572 | systems/texlive/tlnet/archive/flippdf.doc.r56691.tar.xz
-2020/10/19 | 1348 | systems/texlive/tlnet/archive/flippdf.r56691.tar.xz
-2020/10/19 | 4072 | systems/texlive/tlnet/archive/flippdf.source.r56691.tar.xz
+2020/10/22 | 149596 | systems/texlive/tlnet/archive/flippdf.doc.r56724.tar.xz
+2020/10/22 | 1572 | systems/texlive/tlnet/archive/flippdf.r56724.tar.xz
+2020/10/22 | 4728 | systems/texlive/tlnet/archive/flippdf.source.r56724.tar.xz
2019/02/28 | 112620 | systems/texlive/tlnet/archive/float.doc.r15878.tar.xz
2019/02/28 | 304824 | systems/texlive/tlnet/archive/floatflt.doc.r25540.tar.xz
2019/02/28 | 2828 | systems/texlive/tlnet/archive/floatflt.r25540.tar.xz
@@ -259799,8 +259815,8 @@
2020/04/15 | 340 | systems/texlive/tlnet/archive/git-latexdiff.x86_64-solaris.r54732.tar.xz
2019/02/28 | 99728 | systems/texlive/tlnet/archive/gitlog.doc.r38932.tar.xz
2019/02/28 | 2372 | systems/texlive/tlnet/archive/gitlog.r38932.tar.xz
-2020/05/05 | 135936 | systems/texlive/tlnet/archive/gitver.doc.r55019.tar.xz
-2020/05/05 | 2244 | systems/texlive/tlnet/archive/gitver.r55019.tar.xz
+2020/10/22 | 127656 | systems/texlive/tlnet/archive/gitver.doc.r56725.tar.xz
+2020/10/22 | 2236 | systems/texlive/tlnet/archive/gitver.r56725.tar.xz
2019/02/28 | 156772 | systems/texlive/tlnet/archive/globalvals.doc.r49962.tar.xz
2019/02/28 | 1384 | systems/texlive/tlnet/archive/globalvals.r49962.tar.xz
2020/07/24 | 531732 | systems/texlive/tlnet/archive/glosmathtools.doc.r55920.tar.xz
@@ -263788,8 +263804,8 @@
2019/11/16 | 344 | systems/texlive/tlnet/archive/platex.x86_64-linuxmusl.r52800.tar.xz
2019/11/16 | 340 | systems/texlive/tlnet/archive/platex.x86_64-linux.r52800.tar.xz
2019/11/16 | 348 | systems/texlive/tlnet/archive/platex.x86_64-solaris.r52800.tar.xz
-2020/10/15 | 125620 | systems/texlive/tlnet/archive/plautopatch.doc.r56657.tar.xz
-2020/10/15 | 6620 | systems/texlive/tlnet/archive/plautopatch.r56657.tar.xz
+2020/10/22 | 125896 | systems/texlive/tlnet/archive/plautopatch.doc.r56723.tar.xz
+2020/10/22 | 6696 | systems/texlive/tlnet/archive/plautopatch.r56723.tar.xz
2019/02/28 | 552 | systems/texlive/tlnet/archive/play.doc.r15878.tar.xz
2020/08/01 | 251112 | systems/texlive/tlnet/archive/playfair.doc.r56005.tar.xz
2020/08/01 | 1679544 | systems/texlive/tlnet/archive/playfair.r56005.tar.xz
@@ -265957,7 +265973,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/10/20 | 218656 | systems/texlive/tlnet/archive/texlive-scripts.doc.r56701.tar.xz
+2020/10/22 | 218652 | systems/texlive/tlnet/archive/texlive-scripts.doc.r56722.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
@@ -265981,7 +265997,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/10/20 | 132076 | systems/texlive/tlnet/archive/texlive-scripts.r56701.tar.xz
+2020/10/22 | 132080 | systems/texlive/tlnet/archive/texlive-scripts.r56722.tar.xz
2020/08/24 | 36336 | systems/texlive/tlnet/archive/texlive-scripts.win32.r56157.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
@@ -266613,8 +266629,8 @@
2019/02/28 | 254104 | systems/texlive/tlnet/archive/tucv.doc.r20680.tar.xz
2019/02/28 | 1860 | systems/texlive/tlnet/archive/tucv.r20680.tar.xz
2019/02/28 | 4996 | systems/texlive/tlnet/archive/tucv.source.r20680.tar.xz
-2020/10/21 | 1094120 | systems/texlive/tlnet/archive/tuda-ci.doc.r56719.tar.xz
-2020/10/21 | 40404 | systems/texlive/tlnet/archive/tuda-ci.r56719.tar.xz
+2020/10/22 | 1093868 | systems/texlive/tlnet/archive/tuda-ci.doc.r56726.tar.xz
+2020/10/22 | 40564 | systems/texlive/tlnet/archive/tuda-ci.r56726.tar.xz
2020/09/30 | 3743324 | systems/texlive/tlnet/archive/tudscr.doc.r56481.tar.xz
2020/09/30 | 160268 | systems/texlive/tlnet/archive/tudscr.r56481.tar.xz
2020/09/30 | 316968 | systems/texlive/tlnet/archive/tudscr.source.r56481.tar.xz
@@ -267638,16 +267654,16 @@
2020/07/18 | 47816 | systems/texlive/tlnet/archive/zztex.doc.r55862.tar.xz
2020/07/18 | 101724 | systems/texlive/tlnet/archive/zztex.r55862.tar.xz
2020/06/13 | 105829 | systems/texlive/tlnet/install-tl
-2020/10/21 | 5500251 | systems/texlive/tlnet/install-tl-unx.tar.gz
-2020/10/21 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
-2020/10/21 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2020/10/22 | 5500248 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2020/10/22 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2020/10/22 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
2020/08/23 | 4889 | systems/texlive/tlnet/install-tl-windows.bat
-2020/10/21 | 19382474 | systems/texlive/tlnet/install-tl-windows.exe
-2020/10/21 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
-2020/10/21 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2020/10/21 | 24270050 | systems/texlive/tlnet/install-tl.zip
-2020/10/21 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
-2020/10/21 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2020/10/22 | 19380652 | systems/texlive/tlnet/install-tl-windows.exe
+2020/10/22 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2020/10/22 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2020/10/22 | 24270059 | systems/texlive/tlnet/install-tl.zip
+2020/10/22 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2020/10/22 | 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
@@ -267656,7 +267672,7 @@
2020/04/06 | 1280 | systems/texlive/tlnet/tlpkg/gpg/trustdb.gpg
2020/09/22 | 48875 | systems/texlive/tlnet/tlpkg/installer/config.guess
2010/11/11 | 11651 | systems/texlive/tlnet/tlpkg/installer/COPYING.MinGW-runtime.txt
-2020/10/19 | 6569 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+2020/10/21 | 6625 | 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
@@ -267703,12 +267719,12 @@
2020/05/17 | 20322 | systems/texlive/tlnet/tlpkg/TeXLive/TLCrypto.pm
2020/05/03 | 4786 | systems/texlive/tlnet/tlpkg/TeXLive/TLDownload.pm
2020/09/22 | 27563 | systems/texlive/tlnet/tlpkg/TeXLive/TLPaper.pm
-2020/10/21 | 16632290 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
-2020/10/21 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2020/10/22 | 16632330 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2020/10/22 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
2020/05/13 | 86417 | systems/texlive/tlnet/tlpkg/TeXLive/TLPDB.pm
-2020/10/21 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
-2020/10/21 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2020/10/21 | 2238820 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2020/10/22 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2020/10/22 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2020/10/22 | 2237948 | 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
@@ -272208,7 +272224,7 @@
2020/10/03 | 318630 | systems/win32/miktex/tm/packages/filehook.tar.lzma
2012/12/04 | 924573 | systems/win32/miktex/tm/packages/fileinfo.tar.lzma
2011/09/21 | 281409 | systems/win32/miktex/tm/packages/filemod.tar.lzma
-2020/10/21 | 551893 | systems/win32/miktex/tm/packages/files.csv.lzma
+2020/10/22 | 551893 | 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
@@ -273382,9 +273398,9 @@
2018/01/12 | 157226 | systems/win32/miktex/tm/packages/miktex-zip-bin-x64.tar.lzma
2020/10/10 | 39250 | systems/win32/miktex/tm/packages/miktex-zlib-bin-2.9.tar.lzma
2020/10/10 | 43061 | systems/win32/miktex/tm/packages/miktex-zlib-bin-x64-2.9.tar.lzma
-2020/10/21 | 204107 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
-2020/10/21 | 1226949 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
-2020/10/21 | 1144674 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
+2020/10/22 | 204119 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
+2020/10/22 | 1227775 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
+2020/10/22 | 1145353 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
2020/10/10 | 13119 | systems/win32/miktex/tm/packages/miktex-zzip-bin-2.9.tar.lzma
2020/10/10 | 14117 | 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
@@ -273538,187 +273554,187 @@
2018/04/09 | 400132 | systems/win32/miktex/tm/packages/newunicodechar.tar.lzma
2011/09/19 | 101312 | systems/win32/miktex/tm/packages/newvbtm.tar.lzma
2020/09/06 | 231669 | systems/win32/miktex/tm/packages/newverbs.tar.lzma
-2020/10/21 | 552015 | systems/win32/miktex/tm/packages/next/files.csv.lzma
-2020/10/21 | 50490 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
-2020/10/21 | 55997 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
-2020/10/21 | 957324 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
-2020/10/21 | 1060207 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
-2020/10/21 | 28586 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
-2020/10/21 | 30916 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
-2020/10/21 | 29354 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
-2020/10/21 | 34801 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
-2020/10/21 | 49858 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
-2020/10/21 | 57239 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
-2020/10/21 | 84833 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
-2020/10/21 | 93688 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
-2020/10/21 | 65747 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
-2020/10/21 | 73470 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
-2020/10/21 | 26998 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
-2020/10/21 | 30637 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
-2020/10/21 | 329638 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
-2020/10/21 | 392098 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
-2020/10/21 | 32311 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
-2020/10/21 | 36358 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
-2020/10/21 | 50525 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
-2020/10/21 | 55661 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
-2020/10/21 | 204273 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
-2020/10/21 | 224213 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
-2020/10/21 | 179240 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
-2020/10/21 | 195384 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
-2020/10/21 | 51920 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
-2020/10/21 | 58602 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
-2020/10/21 | 20812 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
-2020/10/21 | 22983 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
-2020/10/21 | 460456 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
-2020/10/21 | 45294 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
-2020/10/21 | 51112 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
-2020/10/21 | 279278 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
-2020/10/21 | 318255 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
-2020/10/21 | 40873 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
-2020/10/21 | 45033 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
-2020/10/21 | 116080 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
-2020/10/21 | 130319 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
-2020/10/21 | 1275698 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
-2020/10/21 | 1410502 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
-2020/10/21 | 86806 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
-2020/10/21 | 98609 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
-2020/10/21 | 42913 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
-2020/10/21 | 47713 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
-2020/10/21 | 24877 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
-2020/10/21 | 27777 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
-2020/10/21 | 55796 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
-2020/10/21 | 62953 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
-2020/10/21 | 133431 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
-2020/10/21 | 151872 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
-2020/10/21 | 72956 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
-2020/10/21 | 77263 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
-2020/10/21 | 71632 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
-2020/10/21 | 80436 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
-2020/10/21 | 258288 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
-2020/10/21 | 295336 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
-2020/10/21 | 21853 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
-2020/10/21 | 24825 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
-2020/10/21 | 99214 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
-2020/10/21 | 114550 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
-2020/10/21 | 63618 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
-2020/10/21 | 72721 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
-2020/10/21 | 94701 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
-2020/10/21 | 113424 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
-2020/10/21 | 37724 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
-2020/10/21 | 42259 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
-2020/10/21 | 483008 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
-2020/10/21 | 567996 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
-2020/10/21 | 146905 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
-2020/10/21 | 159737 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
-2020/10/21 | 94621 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
-2020/10/21 | 108954 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
-2020/10/21 | 16007 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
-2020/10/21 | 17671 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
-2020/10/21 | 27679 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
-2020/10/21 | 29723 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
-2020/10/21 | 623605 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
-2020/10/21 | 678192 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
-2020/10/21 | 530951 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
-2020/10/21 | 596690 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
-2020/10/21 | 557650 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
-2020/10/21 | 598544 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
-2020/10/21 | 93694 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
-2020/10/21 | 102872 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
-2020/10/21 | 1689524 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
-2020/10/21 | 1984042 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
-2020/10/21 | 67408 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
-2020/10/21 | 74017 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
-2020/10/21 | 27137 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
-2020/10/21 | 31237 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
-2020/10/21 | 7567 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
-2020/10/21 | 8583 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
-2020/10/21 | 194155 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
-2020/10/21 | 212191 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
-2020/10/21 | 248764 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
-2020/10/21 | 282588 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
-2020/10/21 | 96551 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
-2020/10/21 | 101599 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
-2020/10/21 | 58634 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
-2020/10/21 | 65901 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
-2020/10/21 | 119091 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
-2020/10/21 | 130391 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
-2020/10/21 | 144514 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
-2020/10/21 | 161159 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
-2020/10/21 | 199233 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
-2020/10/21 | 179654 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
-2020/10/21 | 64476 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
-2020/10/21 | 74248 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
-2020/10/21 | 31036 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
-2020/10/21 | 34804 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
-2020/10/21 | 36650 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
-2020/10/21 | 41062 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
-2020/10/21 | 42582 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
-2020/10/21 | 46710 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
-2020/10/21 | 45830 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
-2020/10/21 | 52183 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
-2020/10/21 | 192354 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
-2020/10/21 | 210037 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
-2020/10/21 | 35187 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
-2020/10/21 | 39359 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
-2020/10/21 | 744603 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
-2020/10/21 | 810376 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
-2020/10/21 | 198055 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
-2020/10/21 | 202452 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
-2020/10/21 | 207520 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
-2020/10/21 | 243115 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
-2020/10/21 | 78469 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
-2020/10/21 | 87452 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
-2020/10/21 | 1168451 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
-2020/10/21 | 1302986 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
-2020/10/21 | 19951 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
-2020/10/21 | 23632 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
-2020/10/21 | 31223 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
-2020/10/21 | 36922 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
-2020/10/21 | 63510 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
-2020/10/21 | 71693 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
-2020/10/21 | 42633 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
-2020/10/21 | 50863 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
-2020/10/21 | 1124782 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
-2020/10/21 | 1244807 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
-2020/10/21 | 42061 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
-2020/10/21 | 51476 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
-2020/10/21 | 55962 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
-2020/10/21 | 59605 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
-2020/10/21 | 26858 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
-2020/10/21 | 29188 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
-2020/10/21 | 16019 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
-2020/10/21 | 17752 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
-2020/10/21 | 63194 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
-2020/10/21 | 69610 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
-2020/10/21 | 151803 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
-2020/10/21 | 165684 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
-2020/10/21 | 56688 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
-2020/10/21 | 65279 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
-2020/10/21 | 97391 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
-2020/10/21 | 104636 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
-2020/10/21 | 2514222 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
-2020/10/21 | 2634971 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
-2020/10/21 | 54462 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
-2020/10/21 | 61959 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
-2020/10/21 | 33136 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
-2020/10/21 | 36945 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
-2020/10/21 | 27057 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
-2020/10/21 | 32928 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
-2020/10/21 | 65934 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
-2020/10/21 | 70153 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
-2020/10/21 | 250607 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
-2020/10/21 | 279819 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
-2020/10/21 | 581018 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
-2020/10/21 | 617461 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
-2020/10/21 | 39342 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
-2020/10/21 | 43084 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
-2020/10/21 | 204087 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
-2020/10/21 | 1227318 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
-2020/10/21 | 1145775 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
-2020/10/21 | 13291 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
-2020/10/21 | 14161 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
+2020/10/22 | 552015 | systems/win32/miktex/tm/packages/next/files.csv.lzma
+2020/10/22 | 50432 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
+2020/10/22 | 55967 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
+2020/10/22 | 965656 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
+2020/10/22 | 1076053 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
+2020/10/22 | 28604 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
+2020/10/22 | 30932 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
+2020/10/22 | 28915 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
+2020/10/22 | 34181 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
+2020/10/22 | 49816 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
+2020/10/22 | 57228 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
+2020/10/22 | 84907 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
+2020/10/22 | 93588 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
+2020/10/22 | 65766 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
+2020/10/22 | 73419 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
+2020/10/22 | 27006 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
+2020/10/22 | 30680 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
+2020/10/22 | 329619 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
+2020/10/22 | 392341 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
+2020/10/22 | 32337 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
+2020/10/22 | 36372 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
+2020/10/22 | 50508 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
+2020/10/22 | 55604 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
+2020/10/22 | 204242 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
+2020/10/22 | 224114 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
+2020/10/22 | 179398 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
+2020/10/22 | 195336 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
+2020/10/22 | 51961 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
+2020/10/22 | 58629 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
+2020/10/22 | 20813 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
+2020/10/22 | 23021 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
+2020/10/22 | 461750 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
+2020/10/22 | 45367 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
+2020/10/22 | 51114 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
+2020/10/22 | 279490 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
+2020/10/22 | 318787 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
+2020/10/22 | 40817 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
+2020/10/22 | 44979 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
+2020/10/22 | 115939 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
+2020/10/22 | 130319 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
+2020/10/22 | 1274535 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
+2020/10/22 | 1415725 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
+2020/10/22 | 86661 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
+2020/10/22 | 98596 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
+2020/10/22 | 42912 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
+2020/10/22 | 47675 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
+2020/10/22 | 24888 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
+2020/10/22 | 27757 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
+2020/10/22 | 55826 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
+2020/10/22 | 63008 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
+2020/10/22 | 133472 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
+2020/10/22 | 151808 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
+2020/10/22 | 72878 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
+2020/10/22 | 77234 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
+2020/10/22 | 71728 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
+2020/10/22 | 80687 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
+2020/10/22 | 258219 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
+2020/10/22 | 295366 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
+2020/10/22 | 21850 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
+2020/10/22 | 24839 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
+2020/10/22 | 99225 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
+2020/10/22 | 114400 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
+2020/10/22 | 63601 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
+2020/10/22 | 72705 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
+2020/10/22 | 94441 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
+2020/10/22 | 113868 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
+2020/10/22 | 37681 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
+2020/10/22 | 42236 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
+2020/10/22 | 482421 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
+2020/10/22 | 567100 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
+2020/10/22 | 146831 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
+2020/10/22 | 159523 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
+2020/10/22 | 94604 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
+2020/10/22 | 108943 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
+2020/10/22 | 15987 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
+2020/10/22 | 17626 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
+2020/10/22 | 27705 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
+2020/10/22 | 29728 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
+2020/10/22 | 623783 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
+2020/10/22 | 678088 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
+2020/10/22 | 531486 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
+2020/10/22 | 597313 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
+2020/10/22 | 557910 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
+2020/10/22 | 598217 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
+2020/10/22 | 93663 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
+2020/10/22 | 102879 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
+2020/10/22 | 1707139 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
+2020/10/22 | 1985297 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
+2020/10/22 | 67422 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
+2020/10/22 | 74048 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
+2020/10/22 | 27100 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
+2020/10/22 | 31214 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
+2020/10/22 | 7568 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
+2020/10/22 | 8588 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
+2020/10/22 | 194085 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
+2020/10/22 | 212026 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
+2020/10/22 | 249037 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
+2020/10/22 | 282448 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
+2020/10/22 | 96261 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
+2020/10/22 | 101590 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
+2020/10/22 | 58493 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
+2020/10/22 | 65968 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
+2020/10/22 | 118970 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
+2020/10/22 | 130504 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
+2020/10/22 | 144416 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
+2020/10/22 | 161075 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
+2020/10/22 | 199228 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
+2020/10/22 | 179938 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
+2020/10/22 | 64436 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
+2020/10/22 | 74256 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
+2020/10/22 | 31042 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
+2020/10/22 | 34785 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
+2020/10/22 | 36638 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
+2020/10/22 | 41052 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
+2020/10/22 | 42627 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
+2020/10/22 | 46532 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
+2020/10/22 | 45810 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
+2020/10/22 | 52197 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
+2020/10/22 | 192631 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
+2020/10/22 | 210212 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
+2020/10/22 | 35186 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
+2020/10/22 | 39308 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
+2020/10/22 | 738795 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
+2020/10/22 | 808894 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
+2020/10/22 | 197842 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
+2020/10/22 | 202419 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
+2020/10/22 | 207411 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
+2020/10/22 | 243099 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
+2020/10/22 | 78401 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
+2020/10/22 | 87397 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
+2020/10/22 | 1168162 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
+2020/10/22 | 1302289 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
+2020/10/22 | 19944 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
+2020/10/22 | 23636 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
+2020/10/22 | 31214 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
+2020/10/22 | 36928 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
+2020/10/22 | 63485 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
+2020/10/22 | 71619 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
+2020/10/22 | 42630 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
+2020/10/22 | 50855 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
+2020/10/22 | 1125035 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
+2020/10/22 | 1245393 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
+2020/10/22 | 42076 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
+2020/10/22 | 51473 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
+2020/10/22 | 56009 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
+2020/10/22 | 59549 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
+2020/10/22 | 26980 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
+2020/10/22 | 29154 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
+2020/10/22 | 16057 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
+2020/10/22 | 17714 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
+2020/10/22 | 63180 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
+2020/10/22 | 69713 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
+2020/10/22 | 151774 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
+2020/10/22 | 165515 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
+2020/10/22 | 56653 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
+2020/10/22 | 65272 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
+2020/10/22 | 97447 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
+2020/10/22 | 104485 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
+2020/10/22 | 2514452 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
+2020/10/22 | 2635853 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
+2020/10/22 | 54663 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
+2020/10/22 | 61836 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
+2020/10/22 | 33147 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
+2020/10/22 | 36957 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
+2020/10/22 | 27054 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
+2020/10/22 | 32921 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
+2020/10/22 | 65981 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
+2020/10/22 | 70116 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
+2020/10/22 | 250929 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
+2020/10/22 | 280104 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
+2020/10/22 | 580934 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
+2020/10/22 | 617436 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
+2020/10/22 | 39353 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
+2020/10/22 | 43081 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
+2020/10/22 | 204122 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
+2020/10/22 | 1227670 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
+2020/10/22 | 1146338 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
+2020/10/22 | 13287 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
+2020/10/22 | 14160 | 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/10/21 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini
+2020/10/22 | 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
@@ -274040,7 +274056,7 @@
2008/11/07 | 35981 | systems/win32/miktex/tm/packages/prettyref.tar.lzma
2020/10/20 | 342254 | systems/win32/miktex/tm/packages/preview.tar.lzma
2019/06/20 | 375963 | systems/win32/miktex/tm/packages/prftree.tar.lzma
-2020/10/21 | 831 | systems/win32/miktex/tm/packages/pr.ini
+2020/10/22 | 831 | 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
@@ -275203,7 +275219,7 @@
2020/10/07 | 5178984 | systems/win32/w32tex/aleph-w32.tar.xz
2020/10/20 | 66079124 | systems/win32/w32tex/biblatex-biber.tar.xz
2016/12/13 | 65971452 | systems/win32/w32tex/cbfonts.tar.xz
-2020/10/20 | 726890 | systems/win32/w32tex/ChangeLog
+2020/10/21 | 727943 | 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
@@ -275218,7 +275234,7 @@
2020/06/13 | 483880 | systems/win32/w32tex/dvi2tty-w32.tar.xz
2020/10/18 | 4659736 | systems/win32/w32tex/dvipdfm-w32.tar.xz
2020/10/14 | 4549436 | systems/win32/w32tex/dvipsk-w32.tar.xz
-2020/10/11 | 2649320 | systems/win32/w32tex/dvitools-w32.tar.xz
+2020/10/21 | 2653664 | systems/win32/w32tex/dvitools-w32.tar.xz
2020/10/02 | 1177736 | systems/win32/w32tex/extractpdfmark-w32.tar.xz
2020/06/13 | 17351036 | systems/win32/w32tex/gregorio-w32.tar.xz
2009/08/03 | 1072620 | systems/win32/w32tex/gtftex.zip
@@ -275226,8 +275242,8 @@
2020/10/08 | 46889056 | systems/win32/w32tex/latex-dev.tar.xz
2020/10/15 | 34559844 | systems/win32/w32tex/latex.tar.xz
2020/06/13 | 996116 | systems/win32/w32tex/lcdf-typetools-w32.tar.xz
-2020/10/12 | 400512776 | systems/win32/w32tex/ltxpkgdocs.tar.xz
-2020/10/20 | 33895592 | systems/win32/w32tex/ltxpkgs.tar.xz
+2020/10/20 | 399129948 | systems/win32/w32tex/ltxpkgdocs.tar.xz
+2020/10/20 | 33899136 | systems/win32/w32tex/ltxpkgs.tar.xz
2020/10/05 | 3837980 | systems/win32/w32tex/luajittex-dev-w32.tar.xz
2020/10/05 | 3835924 | systems/win32/w32tex/luajittex-exp-w32.tar.xz
2020/10/05 | 3827288 | systems/win32/w32tex/luajittex-w32.tar.xz
@@ -275245,7 +275261,7 @@
2020/10/04 | 9772292 | systems/win32/w32tex/newtxpx-boondoxfonts.tar.xz
2020/10/03 | 1251136 | systems/win32/w32tex/omegaj-w32.tar.xz
2020/03/01 | 355876 | systems/win32/w32tex/otfbeta.tar.xz
-2020/10/15 | 20986868 | systems/win32/w32tex/pdftex-w32.tar.xz
+2020/10/21 | 20997476 | systems/win32/w32tex/pdftex-w32.tar.xz
2020/10/15 | 81723680 | systems/win32/w32tex/pgfcontrib.tar.xz
2015/01/26 | 189072 | systems/win32/w32tex/plain2-2.54-w32.tar.xz
2020/10/15 | 2804828 | systems/win32/w32tex/platex.tar.xz
@@ -275253,7 +275269,7 @@
2020/06/13 | 1169008 | systems/win32/w32tex/pstoedit-w32.tar.xz
2020/10/11 | 274205160 | systems/win32/w32tex/pstricks.tar.xz
2020/06/13 | 517656 | systems/win32/w32tex/psutils-w32.tar.xz
-2020/10/18 | 6589044 | systems/win32/w32tex/ptex-ng-w32.tar.xz
+2020/10/21 | 6588688 | systems/win32/w32tex/ptex-ng-w32.tar.xz
2020/10/15 | 10627300 | systems/win32/w32tex/ptex-w32.tar.xz
2020/04/10 | 1784316 | systems/win32/w32tex/qpdf-w32.tar.xz
2019/04/15 | 499188 | systems/win32/w32tex/sam2p-w32.tar.xz
@@ -275269,8 +275285,8 @@
2020/09/12 | 4291660 | systems/win32/w32tex/TLTEXINFO/tl-texinfo.zip
2020/08/28 | 2060 | systems/win32/w32tex/TLW64/00README.TLW64
2020/10/13 | 93961057 | systems/win32/w32tex/TLW64/tl-win64.zip
-2020/10/11 | 826404 | systems/win32/w32tex/ttf2pk-w32.tar.xz
-2020/10/11 | 838736 | systems/win32/w32tex/ttf2pt1-w32.tar.xz
+2020/10/21 | 826580 | systems/win32/w32tex/ttf2pk-w32.tar.xz
+2020/10/21 | 838496 | systems/win32/w32tex/ttf2pt1-w32.tar.xz
2017/10/13 | 1773368 | systems/win32/w32tex/tuftelatex.tar.xz
2020/05/30 | 7205464 | systems/win32/w32tex/txpx-pazofonts.tar.xz
2020/01/19 | 5856 | systems/win32/w32tex/txtutil.tar.xz
@@ -275280,7 +275296,7 @@
2013/04/08 | 722652 | systems/win32/w32tex/utf.tar.xz
2013/04/08 | 13748 | systems/win32/w32tex/vf-n2bk.tar.xz
2020/03/27 | 38319492 | systems/win32/w32tex/w32tex-src.tar.xz
-2020/10/18 | 99250072 | systems/win32/w32tex/web2c-lib.tar.xz
+2020/10/21 | 99249868 | systems/win32/w32tex/web2c-lib.tar.xz
2020/10/14 | 45775256 | systems/win32/w32tex/web2c-w32.tar.xz
2020/09/24 | 810868 | systems/win32/w32tex/win64/aleph-w64.tar.xz
2020/08/20 | 22351540 | systems/win32/w32tex/win64/biblatex-biber-w64.tar.xz
@@ -275290,7 +275306,7 @@
2020/06/13 | 447760 | systems/win32/w32tex/win64/dvi2tty-w64.tar.xz
2020/10/18 | 805416 | systems/win32/w32tex/win64/dvipdfm-w64.tar.xz
2020/06/13 | 759644 | systems/win32/w32tex/win64/dvipsk-w64.tar.xz
-2020/10/11 | 2366132 | systems/win32/w32tex/win64/dvitools-w64.tar.xz
+2020/10/21 | 2362648 | systems/win32/w32tex/win64/dvitools-w64.tar.xz
2020/10/02 | 1079944 | systems/win32/w32tex/win64/extractpdfmark-w64.tar.xz
2020/06/13 | 304720 | systems/win32/w32tex/win64/gregorio-w64.tar.xz
2020/07/07 | 587744 | systems/win32/w32tex/win64/jtex-w64.tar.xz
@@ -275308,23 +275324,23 @@
2020/06/13 | 376316 | systems/win32/w32tex/win64/mftrace-w64.tar.xz
2020/01/18 | 362540 | systems/win32/w32tex/win64/m-tx-w64.tar.xz
2020/06/13 | 406920 | systems/win32/w32tex/win64/omegaj-w64.tar.xz
-2020/10/11 | 6328416 | systems/win32/w32tex/win64/pdftex-w64.tar.xz
+2020/10/21 | 6330136 | systems/win32/w32tex/win64/pdftex-w64.tar.xz
2015/01/26 | 41440 | systems/win32/w32tex/win64/plain2-2.54-w64.tar.xz
2020/03/20 | 557532 | systems/win32/w32tex/win64/pmx-w64.tar.xz
2020/06/13 | 789904 | systems/win32/w32tex/win64/pstoedit-w64.tar.xz
2020/06/13 | 385996 | systems/win32/w32tex/win64/psutils-w64.tar.xz
-2020/10/18 | 1711836 | systems/win32/w32tex/win64/ptex-ng-w64.tar.xz
+2020/10/21 | 1711376 | systems/win32/w32tex/win64/ptex-ng-w64.tar.xz
2020/09/24 | 1881112 | systems/win32/w32tex/win64/ptex-w64.tar.xz
2020/01/18 | 40736 | systems/win32/w32tex/win64/t1utils-w64.tar.xz
2020/06/13 | 419688 | systems/win32/w32tex/win64/tex4htk-w64.tar.xz
2020/01/18 | 96788 | systems/win32/w32tex/win64/tiff2png-w64.tar.xz
-2020/10/11 | 734428 | systems/win32/w32tex/win64/ttf2pk-w64.tar.xz
-2020/10/11 | 695720 | systems/win32/w32tex/win64/ttf2pt1-w64.tar.xz
+2020/10/21 | 734416 | systems/win32/w32tex/win64/ttf2pk-w64.tar.xz
+2020/10/21 | 695716 | systems/win32/w32tex/win64/ttf2pt1-w64.tar.xz
2020/01/18 | 42768 | systems/win32/w32tex/win64/txtutil-w64.tar.xz
2020/09/24 | 1811164 | systems/win32/w32tex/win64/uptex-w64.tar.xz
2020/10/05 | 3379968 | systems/win32/w32tex/win64/web2c-w64.tar.xz
-2020/10/18 | 11016708 | systems/win32/w32tex/win64/xetex-w64.tar.xz
-2020/10/20 | 48963060 | systems/win32/w32tex/xetex-w32.tar.xz
+2020/10/21 | 11015312 | systems/win32/w32tex/win64/xetex-w64.tar.xz
+2020/10/21 | 48964680 | systems/win32/w32tex/xetex-w32.tar.xz
2020/05/29 | 2936068 | systems/win32/w32tex/xindy-w32.tar.xz
2013/11/19 | 11356248 | systems/win32/w32tex/xymtex.tar.xz
2016/09/09 | 4334636 | systems/win32/w32tex/xypic.tar.xz
@@ -275421,7 +275437,7 @@
2004/06/04 | 404 | tds/tds.sed
2004/06/23 | 65418 | tds/tds.tex
2019/05/29 | 304264 | tds.zip
-2020/10/22 | 186 | timestamp
+2020/10/23 | 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 abe4594d3d..0c7ff347f0 100644
--- a/FILES.byname.gz
+++ b/FILES.byname.gz
Binary files differ
diff --git a/FILES.last07days b/FILES.last07days
index 3f43b8d272..b99b4c2ec6 100644
--- a/FILES.last07days
+++ b/FILES.last07days
@@ -1,235 +1,351 @@
-2020/10/21 | 99214 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
-2020/10/21 | 98609 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
-2020/10/21 | 97391 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
-2020/10/21 | 96551 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
-2020/10/21 | 957324 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
-2020/10/21 | 94701 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
-2020/10/21 | 94621 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
+2020/10/22 | 99225 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
+2020/10/22 | 98596 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
+2020/10/22 | 97447 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
+2020/10/22 | 965656 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
+2020/10/22 | 96261 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
+2020/10/22 | 956 | macros/latex/contrib/scrlttr2copy/letter-copy-test.tex
+2020/10/22 | 94604 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
+2020/10/22 | 94441 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
+2020/10/22 | 9440 | macros/latex/contrib/skills/skills.sty
+2020/10/22 | 93663 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
+2020/10/22 | 93588 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
+2020/10/22 | 928 | support/ltx2mathml/src/test.cpp
+2020/10/22 | 89481 | macros/latex/contrib/scrlttr2copy.zip
+2020/10/22 | 88546 | macros/latex/contrib/scrlttr2copy/letter-copy-test.pdf
+2020/10/22 | 87397 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
+2020/10/22 | 86661 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
+2020/10/22 | 8588 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
+2020/10/22 | 84907 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
+2020/10/22 | 831 | systems/win32/miktex/tm/packages/pr.ini
+2020/10/22 | 814 | macros/latex/contrib/askmaps/README
+2020/10/22 | 808894 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
+2020/10/22 | 806 | support/ltx2mathml/src/ltx2mathmlclasses.h
+2020/10/22 | 80687 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
+2020/10/22 | 78454 | macros/latex/contrib/skills.zip
+2020/10/22 | 78401 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
+2020/10/22 | 77767 | graphics/pgf/contrib/utfsym/latex/utfsym.sty
+2020/10/22 | 77234 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
+2020/10/22 | 7568 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
+2020/10/22 | 75635 | macros/latex/contrib/fgruler/fgruler.dtx
+2020/10/22 | 74256 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
+2020/10/22 | 74048 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
+2020/10/22 | 738795 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
+2020/10/22 | 73419 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
+2020/10/22 | 72878 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
+2020/10/22 | 72705 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
+2020/10/22 | 718 | macros/latex/contrib/fgruler/README
+2020/10/22 | 71728 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
+2020/10/22 | 71619 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
+2020/10/22 | 70116 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
+2020/10/22 | 69713 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
+2020/10/22 | 694 | support/ltx2mathml/src/ltx2mathml.h
+2020/10/22 | 68738 | macros/latex/contrib/skills/skillsdoc.pdf
+2020/10/22 | 678088 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
+2020/10/22 | 67422 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
+2020/10/22 | 6696 | systems/texlive/tlnet/archive/plautopatch.r56723.tar.xz
+2020/10/22 | 65981 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
+2020/10/22 | 65968 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
+2020/10/22 | 65766 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
+2020/10/22 | 6527992 | graphics/pgf/contrib/utfsym.zip
+2020/10/22 | 65272 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
+2020/10/22 | 64436 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
+2020/10/22 | 63601 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
+2020/10/22 | 63485 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
+2020/10/22 | 63195 | macros/latex/contrib/hu-berlin-bundle/hu-berlin-bundle.dtx
+2020/10/22 | 63180 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
+2020/10/22 | 63008 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
+2020/10/22 | 623783 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
+2020/10/22 | 61836 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
+2020/10/22 | 617436 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
+2020/10/22 | 598217 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
+2020/10/22 | 597313 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
+2020/10/22 | 5955 | macros/latex/contrib/hu-berlin-bundle/README.md
+2020/10/22 | 59549 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
+2020/10/22 | 58629 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
+2020/10/22 | 58493 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
+2020/10/22 | 580934 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
+2020/10/22 | 576 | macros/latex/contrib/scrlttr2copy/README.md
+2020/10/22 | 57228 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
+2020/10/22 | 567100 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
+2020/10/22 | 56653 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
+2020/10/22 | 56009 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
+2020/10/22 | 55967 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
+2020/10/22 | 55826 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
+2020/10/22 | 557910 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
+2020/10/22 | 55604 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
+2020/10/22 | 552015 | systems/win32/miktex/tm/packages/next/files.csv.lzma
+2020/10/22 | 551893 | systems/win32/miktex/tm/packages/files.csv.lzma
+2020/10/22 | 5500248 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2020/10/22 | 54663 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
+2020/10/22 | 53599 | macros/latex/contrib/snapshot/snapshot.dtx
+2020/10/22 | 531486 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
+2020/10/22 | 52197 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
+2020/10/22 | 51961 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
+2020/10/22 | 51473 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
+2020/10/22 | 51114 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
+2020/10/22 | 50855 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
+2020/10/22 | 50508 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
+2020/10/22 | 50432 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
+2020/10/22 | 49816 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
+2020/10/22 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2020/10/22 | 482421 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
+2020/10/22 | 47675 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
+2020/10/22 | 4728 | systems/texlive/tlnet/archive/flippdf.source.r56724.tar.xz
+2020/10/22 | 46532 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
+2020/10/22 | 461750 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
+2020/10/22 | 45810 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
+2020/10/22 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2020/10/22 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2020/10/22 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2020/10/22 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2020/10/22 | 45367 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
+2020/10/22 | 44979 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
+2020/10/22 | 43081 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
+2020/10/22 | 4305 | graphics/pgf/contrib/utfsym/doc/utfsym.tex
+2020/10/22 | 42912 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
+2020/10/22 | 42873 | support/ltx2mathml/src/ltx2mathmlparser.cpp
+2020/10/22 | 42630 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
+2020/10/22 | 42627 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
+2020/10/22 | 4230 | macros/latex/contrib/snapshot/README
+2020/10/22 | 42236 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
+2020/10/22 | 42076 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
+2020/10/22 | 41052 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
+2020/10/22 | 40817 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
+2020/10/22 | 40564 | systems/texlive/tlnet/archive/tuda-ci.r56726.tar.xz
+2020/10/22 | 39353 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
+2020/10/22 | 39308 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
+2020/10/22 | 39241 | macros/latex/contrib/askmaps/askmaps.tex
+2020/10/22 | 392341 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
+2020/10/22 | 385765 | macros/latex/contrib/askmaps.zip
+2020/10/22 | 377937 | macros/latex/contrib/askmaps/askmaps.pdf
+2020/10/22 | 37681 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
+2020/10/22 | 3760 | macros/latex/contrib/hu-berlin-bundle/makefile
+2020/10/22 | 371156 | macros/latex/contrib/ejpecp.zip
+2020/10/22 | 37045 | macros/latex/contrib/hu-berlin-bundle/img/hu-berlin-logo.pdf
+2020/10/22 | 36957 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
+2020/10/22 | 36928 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
+2020/10/22 | 367917 | macros/latex/contrib/hu-berlin-bundle/hu-berlin-bundle.pdf
+2020/10/22 | 36638 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
+2020/10/22 | 36372 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
+2020/10/22 | 3582044 | graphics/pgf/contrib/utfsym/doc/utfsym.pdf
+2020/10/22 | 35186 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
+2020/10/22 | 35148 | support/ltx2mathml/COPYING
+2020/10/22 | 34785 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
+2020/10/22 | 347559 | macros/latex/contrib/hu-berlin-bundle.zip
+2020/10/22 | 34181 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
+2020/10/22 | 33147 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
+2020/10/22 | 329619 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
+2020/10/22 | 32921 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
+2020/10/22 | 32337 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
+2020/10/22 | 32327 | support/ltx2mathml.zip
+2020/10/22 | 318787 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
+2020/10/22 | 3123 | macros/latex/contrib/scrlttr2copy/copy.lco
+2020/10/22 | 31214 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
+2020/10/22 | 31214 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
+2020/10/22 | 31042 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
+2020/10/22 | 30932 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
+2020/10/22 | 30680 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
+2020/10/22 | 29728 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
+2020/10/22 | 295366 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
+2020/10/22 | 29358 | macros/latex/contrib/skills/skillsdoc.tex
+2020/10/22 | 29154 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
+2020/10/22 | 28915 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
+2020/10/22 | 28604 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
+2020/10/22 | 282448 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
+2020/10/22 | 280104 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
+2020/10/22 | 279490 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
+2020/10/22 | 2793 | support/ltx2mathml/src/ltx2mathmltables.h
+2020/10/22 | 27757 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
+2020/10/22 | 27705 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
+2020/10/22 | 27100 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
+2020/10/22 | 27054 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
+2020/10/22 | 27006 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
+2020/10/22 | 26980 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
+2020/10/22 | 265918 | macros/latex/contrib/fgruler.zip
+2020/10/22 | 2635853 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
+2020/10/22 | 259375 | macros/latex/contrib/fgruler/fgruler.pdf
+2020/10/22 | 258219 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
+2020/10/22 | 252207 | macros/latex/contrib/snapshot.zip
+2020/10/22 | 2514452 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
+2020/10/22 | 250929 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
+2020/10/22 | 25090 | support/ltx2mathml/src/ltx2mathmltables.cpp
+2020/10/22 | 2492 | support/ltx2mathml/src/ltx2mathmlclasses.cpp
+2020/10/22 | 249037 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
+2020/10/22 | 24888 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
+2020/10/22 | 24839 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
+2020/10/22 | 243099 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
+2020/10/22 | 24270059 | systems/texlive/tlnet/install-tl.zip
+2020/10/22 | 236859 | macros/latex/contrib/snapshot/snapshot.pdf
+2020/10/22 | 23636 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
+2020/10/22 | 23021 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
+2020/10/22 | 224114 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
+2020/10/22 | 2237948 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2020/10/22 | 2236 | systems/texlive/tlnet/archive/gitver.r56725.tar.xz
+2020/10/22 | 218652 | systems/texlive/tlnet/archive/texlive-scripts.doc.r56722.tar.xz
+2020/10/22 | 21850 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
+2020/10/22 | 212026 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
+2020/10/22 | 21131 | macros/latex/contrib/askmaps/askmaps.sty
+2020/10/22 | 210212 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
+2020/10/22 | 20813 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
+2020/10/22 | 207411 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
+2020/10/22 | 204242 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
+2020/10/22 | 204122 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
+2020/10/22 | 204119 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
+2020/10/22 | 20284 | macros/latex/contrib/ejpecp/ejpecp.dtx
+2020/10/22 | 202419 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
+2020/10/22 | 2017 | macros/latex/contrib/snapshot/snapshot.ins
+2020/10/22 | 2003 | support/ltx2mathml/src/ltx2mathmlexceptions.h
+2020/10/22 | 19944 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
+2020/10/22 | 199228 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
+2020/10/22 | 1985297 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
+2020/10/22 | 197842 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
+2020/10/22 | 195336 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
+2020/10/22 | 194085 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
+2020/10/22 | 19380652 | systems/texlive/tlnet/install-tl-windows.exe
+2020/10/22 | 192631 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
+2020/10/22 | 180735 | macros/latex/contrib/ejpecp/ejpecp.pdf
+2020/10/22 | 179938 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
+2020/10/22 | 179398 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
+2020/10/22 | 17714 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
+2020/10/22 | 17626 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
+2020/10/22 | 1752 | graphics/pgf/contrib/utfsym/README
+2020/10/22 | 1707139 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
+2020/10/22 | 16632330 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2020/10/22 | 165515 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
+2020/10/22 | 161075 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
+2020/10/22 | 16057 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
+2020/10/22 | 15987 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
+2020/10/22 | 159523 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
+2020/10/22 | 1572 | systems/texlive/tlnet/archive/flippdf.r56724.tar.xz
+2020/10/22 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2020/10/22 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2020/10/22 | 151808 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
+2020/10/22 | 151774 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
+2020/10/22 | 149596 | systems/texlive/tlnet/archive/flippdf.doc.r56724.tar.xz
+2020/10/22 | 14903 | macros/latex/contrib/hu-berlin-bundle/img/texografie-logo.pdf
+2020/10/22 | 146831 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
+2020/10/22 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2020/10/22 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2020/10/22 | 144416 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
+2020/10/22 | 14160 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
+2020/10/22 | 1415725 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
+2020/10/22 | 1339 | support/ltx2mathml/README
+2020/10/22 | 133472 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
+2020/10/22 | 13287 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
+2020/10/22 | 132080 | systems/texlive/tlnet/archive/texlive-scripts.r56722.tar.xz
+2020/10/22 | 130504 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
+2020/10/22 | 130319 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
+2020/10/22 | 1302289 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
+2020/10/22 | 127656 | systems/texlive/tlnet/archive/gitver.doc.r56725.tar.xz
+2020/10/22 | 1274535 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
+2020/10/22 | 125896 | systems/texlive/tlnet/archive/plautopatch.doc.r56723.tar.xz
+2020/10/22 | 1248 | macros/latex/contrib/skills/README.md
+2020/10/22 | 1245393 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
+2020/10/22 | 1227775 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
+2020/10/22 | 1227670 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
+2020/10/22 | 1210 | macros/latex/contrib/fgruler/fgruler.ins
+2020/10/22 | 118970 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
+2020/10/22 | 1168162 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
+2020/10/22 | 115939 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
+2020/10/22 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini
+2020/10/22 | 1146338 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
+2020/10/22 | 1145353 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
+2020/10/22 | 114400 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
+2020/10/22 | 113868 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
+2020/10/22 | 1125035 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
+2020/10/22 | 1093868 | systems/texlive/tlnet/archive/tuda-ci.doc.r56726.tar.xz
+2020/10/22 | 108943 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
+2020/10/22 | 1076053 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
+2020/10/22 | 104485 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
+2020/10/22 | 102879 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
+2020/10/22 | 101590 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
+2020/10/21 | 99249868 | systems/win32/w32tex/web2c-lib.tar.xz
2020/10/21 | 9383 | macros/latex/contrib/tuda-ci/tex/beamerouterthemeTUDa.sty
-2020/10/21 | 93694 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
-2020/10/21 | 93688 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
2020/10/21 | 931 | language/japanese/plautopatch/plarydshln.sty
2020/10/21 | 9306 | language/japanese/plautopatch/plautopatch.sty
2020/10/21 | 9205 | macros/latex/contrib/tuda-ci/tex/tudamecheng.cfg
2020/10/21 | 89691 | support/pdfxup/pdfxup.pdf
2020/10/21 | 88913 | language/japanese/plautopatch/plautopatch-ja.pdf
2020/10/21 | 88232 | systems/texlive/tlnet/archive/scrlttr2copy.doc.r56718.tar.xz
-2020/10/21 | 87452 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
2020/10/21 | 871448 | systems/texlive/tlnet/archive/beebe.r56713.tar.xz
-2020/10/21 | 86806 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
-2020/10/21 | 8583 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
-2020/10/21 | 84833 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
-2020/10/21 | 831 | systems/win32/miktex/tm/packages/pr.ini
+2020/10/21 | 838496 | systems/win32/w32tex/ttf2pt1-w32.tar.xz
+2020/10/21 | 826580 | systems/win32/w32tex/ttf2pk-w32.tar.xz
2020/10/21 | 8237 | macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa.sty
2020/10/21 | 81344 | systems/texlive/tlnet/archive/nicematrix.source.r56717.tar.xz
-2020/10/21 | 810376 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
2020/10/21 | 8092 | language/japanese/plautopatch/plautopatch-ja.tex
-2020/10/21 | 80436 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
-2020/10/21 | 78469 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
-2020/10/21 | 77263 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
-2020/10/21 | 7567 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
-2020/10/21 | 744603 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
-2020/10/21 | 74248 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
-2020/10/21 | 74017 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
2020/10/21 | 7348 | macros/latex/contrib/tuda-ci/example/DEMO-TUDaBeamer.tex
-2020/10/21 | 73470 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
-2020/10/21 | 72956 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
-2020/10/21 | 72721 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
+2020/10/21 | 734416 | systems/win32/w32tex/win64/ttf2pk-w64.tar.xz
+2020/10/21 | 727943 | systems/win32/w32tex/ChangeLog
2020/10/21 | 7199 | language/japanese/plautopatch/plautopatch.tex
-2020/10/21 | 71693 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
-2020/10/21 | 71632 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
-2020/10/21 | 70153 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
-2020/10/21 | 69610 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
+2020/10/21 | 7192 | macros/latex/contrib/ejpecp/README.md
+2020/10/21 | 695716 | systems/win32/w32tex/win64/ttf2pt1-w64.tar.xz
2020/10/21 | 6893 | macros/latex/contrib/tuda-ci/example/DEMO-TUDaLeaflet.tex
-2020/10/21 | 678192 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
2020/10/21 | 675683 | macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPub.pdf
-2020/10/21 | 67408 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
2020/10/21 | 6647 | macros/latex/contrib/tuda-ci/tex/tudabeamer.cls
-2020/10/21 | 65934 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
-2020/10/21 | 65901 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
-2020/10/21 | 65747 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
-2020/10/21 | 65279 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
-2020/10/21 | 64476 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
+2020/10/21 | 6625 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+2020/10/21 | 6588688 | systems/win32/w32tex/ptex-ng-w32.tar.xz
2020/10/21 | 642236 | macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPhD.pdf
2020/10/21 | 6416862 | macros/latex/contrib/tuda-ci.zip
2020/10/21 | 636860 | macros/latex/contrib/tuda-ci/doc/DEMO-TUDaThesis.pdf
-2020/10/21 | 63618 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
-2020/10/21 | 63510 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
2020/10/21 | 6331 | macros/latex/contrib/tuda-ci/tex/tudarules.sty
-2020/10/21 | 63194 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
-2020/10/21 | 62953 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
-2020/10/21 | 623605 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
+2020/10/21 | 6330136 | systems/win32/w32tex/win64/pdftex-w64.tar.xz
2020/10/21 | 622105 | macros/latex/contrib/tuda-ci/doc/DEMO-TUDaBeamer.pdf
-2020/10/21 | 61959 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
-2020/10/21 | 617461 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
-2020/10/21 | 598544 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
-2020/10/21 | 596690 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
-2020/10/21 | 59605 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
2020/10/21 | 589226 | macros/latex/contrib/tuda-ci/doc/DEMO-TUDaLetter.pdf
2020/10/21 | 5871 | macros/latex/contrib/tuda-ci/example/DEMO-TUDaPoster.tex
2020/10/21 | 586682 | macros/latex/contrib/tuda-ci/doc/DEMO-TUDaSciPoster.pdf
-2020/10/21 | 58634 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
-2020/10/21 | 58602 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
2020/10/21 | 583236 | macros/latex/contrib/tuda-ci/doc/DEMO-TUDaLeaflet.pdf
2020/10/21 | 5817 | macros/latex/contrib/tuda-ci/tex/tudacolors.sty
-2020/10/21 | 581018 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
2020/10/21 | 5789 | macros/latex/contrib/tuda-ci/tex/tudasize9pt.clo
2020/10/21 | 578332 | macros/latex/contrib/tuda-ci/doc/DEMO-TUDaExercise.pdf
2020/10/21 | 574097 | macros/latex/contrib/tuda-ci/doc/DEMO-TUDaAnnouncement.pdf
-2020/10/21 | 57239 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
-2020/10/21 | 567996 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
-2020/10/21 | 56688 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
2020/10/21 | 5624 | systems/texlive/tlnet/archive/leaflet.r56716.tar.xz
-2020/10/21 | 55997 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
-2020/10/21 | 55962 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
2020/10/21 | 558962 | macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPoster.pdf
-2020/10/21 | 55796 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
-2020/10/21 | 557650 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
-2020/10/21 | 55661 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
-2020/10/21 | 552015 | systems/win32/miktex/tm/packages/next/files.csv.lzma
-2020/10/21 | 551893 | systems/win32/miktex/tm/packages/files.csv.lzma
2020/10/21 | 550585 | macros/latex/contrib/tuda-ci/doc/DEMO-TUDaReport.pdf
-2020/10/21 | 5500251 | systems/texlive/tlnet/install-tl-unx.tar.gz
2020/10/21 | 5479 | language/japanese/plautopatch/plcollcell.sty
-2020/10/21 | 54462 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
2020/10/21 | 5381 | macros/latex/contrib/tuda-ci/tex/tudalettersize10pt.clo
2020/10/21 | 532 | systems/texlive/tlnet/archive/formation-latex-ul.r56714.tar.xz
-2020/10/21 | 530951 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
-2020/10/21 | 52183 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
-2020/10/21 | 51920 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
-2020/10/21 | 51476 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
2020/10/21 | 5143 | macros/latex/contrib/tuda-ci/example/DEMO-TUDaLetter.tex
-2020/10/21 | 51112 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
-2020/10/21 | 50863 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
-2020/10/21 | 50525 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
-2020/10/21 | 50490 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
-2020/10/21 | 49858 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
-2020/10/21 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
-2020/10/21 | 483008 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
-2020/10/21 | 47713 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
+2020/10/21 | 48964680 | systems/win32/w32tex/xetex-w32.tar.xz
2020/10/21 | 4710 | support/pdfxup/pdfxup.1
-2020/10/21 | 46710 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
-2020/10/21 | 460456 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
-2020/10/21 | 45830 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
-2020/10/21 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2020/10/21 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
-2020/10/21 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2020/10/21 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
-2020/10/21 | 45294 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
-2020/10/21 | 45033 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
2020/10/21 | 4441 | macros/latex/contrib/tuda-ci/tex/tudacolors.def
2020/10/21 | 44071 | support/pdfxup/pdfxup
2020/10/21 | 4328 | macros/latex/contrib/tuda-ci/tex/tuda-pgfplots.sty
-2020/10/21 | 43084 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
-2020/10/21 | 42913 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
-2020/10/21 | 42633 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
-2020/10/21 | 42582 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
-2020/10/21 | 42259 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
-2020/10/21 | 42061 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
-2020/10/21 | 41062 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
-2020/10/21 | 40873 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
-2020/10/21 | 40404 | systems/texlive/tlnet/archive/tuda-ci.r56719.tar.xz
2020/10/21 | 39723 | macros/latex/contrib/tuda-ci/tex/tudapub.cls
-2020/10/21 | 39359 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
-2020/10/21 | 39342 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
-2020/10/21 | 392098 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
2020/10/21 | 388 | systems/texlive/tlnet/archive/texlive-docindex.r56713.tar.xz
2020/10/21 | 3883 | macros/latex/contrib/tuda-ci/example/DEMO-TUDaFromaddress.lco
2020/10/21 | 3809 | macros/latex/contrib/tuda-ci/tex/beamercolorthemeTUDa.sty
-2020/10/21 | 37724 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
-2020/10/21 | 36945 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
-2020/10/21 | 36922 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
2020/10/21 | 36765 | language/japanese/plautopatch/plautopatch.pdf
-2020/10/21 | 36650 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
-2020/10/21 | 36358 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
-2020/10/21 | 35187 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
-2020/10/21 | 34804 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
-2020/10/21 | 34801 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
2020/10/21 | 343464 | systems/texlive/tlnet/archive/leaflet.doc.r56716.tar.xz
-2020/10/21 | 33136 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
-2020/10/21 | 329638 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
-2020/10/21 | 32928 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
2020/10/21 | 3243 | macros/latex/contrib/tuda-ci/tex/tudafonts.sty
-2020/10/21 | 32311 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
2020/10/21 | 3214 | language/japanese/plautopatch/README.md
2020/10/21 | 3196 | macros/latex/contrib/tuda-ci/example/DEMO-TUDaAnnouncement.tex
-2020/10/21 | 318255 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
-2020/10/21 | 31237 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
-2020/10/21 | 31223 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
-2020/10/21 | 31036 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
-2020/10/21 | 30916 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
-2020/10/21 | 30637 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
2020/10/21 | 3036 | macros/latex/contrib/flippdf/flippdf.ins
2020/10/21 | 3009 | language/japanese/plautopatch/pxstfloats.sty
-2020/10/21 | 29723 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
-2020/10/21 | 295336 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
-2020/10/21 | 29354 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
2020/10/21 | 2929500 | systems/texlive/tlnet/archive/formation-latex-ul.doc.r56714.tar.xz
-2020/10/21 | 29188 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
2020/10/21 | 28936 | systems/texlive/tlnet/archive/jupynotex.doc.r56715.tar.xz
-2020/10/21 | 28586 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
-2020/10/21 | 282588 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
-2020/10/21 | 279819 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
-2020/10/21 | 279278 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
-2020/10/21 | 27777 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
-2020/10/21 | 27679 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
2020/10/21 | 27403 | macros/latex/contrib/tuda-ci/tex/tudathesis.cfg
-2020/10/21 | 27137 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
-2020/10/21 | 27057 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
-2020/10/21 | 26998 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
-2020/10/21 | 26858 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
2020/10/21 | 2656 | macros/latex/contrib/tuda-ci/example/DEMO-TUDaBibliography.bib
-2020/10/21 | 2634971 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
-2020/10/21 | 258288 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
+2020/10/21 | 2653664 | systems/win32/w32tex/dvitools-w32.tar.xz
2020/10/21 | 25563 | macros/latex/contrib/tuda-ci/tex/tudaexercise.cls
2020/10/21 | 2516 | systems/texlive/tlnet/archive/jupynotex.r56715.tar.xz
-2020/10/21 | 2514222 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
2020/10/21 | 25093 | macros/latex/contrib/tuda-ci/example/DEMO-TUDaPub.tex
-2020/10/21 | 250607 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
-2020/10/21 | 24877 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
-2020/10/21 | 248764 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
-2020/10/21 | 24825 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
-2020/10/21 | 243115 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
-2020/10/21 | 24270050 | systems/texlive/tlnet/install-tl.zip
+2020/10/21 | 24291 | macros/latex/contrib/ejpecp/sample.tex
2020/10/21 | 23690 | macros/latex/contrib/tuda-ci/example/DEMO-TUDaThesis.tex
-2020/10/21 | 23632 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
2020/10/21 | 2362 | macros/latex/contrib/tuda-ci/example/DEMO-TUDaReport.tex
+2020/10/21 | 2362648 | systems/win32/w32tex/win64/dvitools-w64.tar.xz
2020/10/21 | 23588 | macros/latex/contrib/tuda-ci/example/DEMO-TUDaPhD.tex
2020/10/21 | 2353768 | systems/texlive/tlnet/archive/formation-latex-ul.source.r56714.tar.xz
2020/10/21 | 23052 | systems/texlive/tlnet/archive/nicematrix.r56717.tar.xz
-2020/10/21 | 22983 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
-2020/10/21 | 224213 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
-2020/10/21 | 2238820 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
-2020/10/21 | 21853 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
2020/10/21 | 2180 | macros/latex/contrib/tuda-ci/tex/beamerfontthemeTUDa.sty
2020/10/21 | 2172 | macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa.sty
-2020/10/21 | 212191 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
-2020/10/21 | 210037 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
+2020/10/21 | 20997476 | systems/win32/w32tex/pdftex-w32.tar.xz
2020/10/21 | 2086 | language/japanese/plautopatch/plsiunitx.sty
-2020/10/21 | 20812 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
-2020/10/21 | 207520 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
-2020/10/21 | 204273 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
-2020/10/21 | 204107 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
-2020/10/21 | 204087 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
-2020/10/21 | 202452 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
-2020/10/21 | 19951 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
-2020/10/21 | 199233 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
-2020/10/21 | 1984042 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
-2020/10/21 | 198055 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
2020/10/21 | 1965 | language/japanese/plautopatch/plextarydshln.sty
-2020/10/21 | 195384 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
-2020/10/21 | 194155 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
-2020/10/21 | 19382474 | systems/texlive/tlnet/install-tl-windows.exe
-2020/10/21 | 192354 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
2020/10/21 | 1848 | systems/texlive/tlnet/archive/scrlttr2copy.r56718.tar.xz
2020/10/21 | 18335 | macros/latex/contrib/tuda-ci/tex/tudasciposter.cls
-2020/10/21 | 179654 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
-2020/10/21 | 179240 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
-2020/10/21 | 17752 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
-2020/10/21 | 17671 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
2020/10/21 | 17395 | macros/latex/contrib/tuda-ci/tex/tudaposter.cls
+2020/10/21 | 1711376 | systems/win32/w32tex/win64/ptex-ng-w64.tar.xz
2020/10/21 | 169648 | systems/texlive/tlnet/archive/texlive-docindex.doc.r56713.tar.xz
-2020/10/21 | 1689524 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
2020/10/21 | 1686 | macros/latex/contrib/tuda-ci/tex/tuda-a5paper.clo
2020/10/21 | 1684 | macros/latex/contrib/tuda-ci/tex/tuda-a4paper.clo
2020/10/21 | 1682 | macros/latex/contrib/tuda-ci/tex/tuda-a3paper.clo
@@ -237,93 +353,50 @@
2020/10/21 | 1680 | macros/latex/contrib/tuda-ci/tex/tuda-a2paper.clo
2020/10/21 | 1676 | macros/latex/contrib/tuda-ci/tex/tuda-a0paper.clo
2020/10/21 | 16688 | macros/latex/contrib/tuda-ci/tex/tudaletter.cls
-2020/10/21 | 16632290 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
-2020/10/21 | 165684 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
-2020/10/21 | 161159 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
-2020/10/21 | 16019 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
-2020/10/21 | 16007 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
-2020/10/21 | 159737 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
-2020/10/21 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2020/10/21 | 155933 | macros/latex/contrib/ejpecp/sample.pdf
2020/10/21 | 153084 | macros/latex/contrib/flippdf.zip
-2020/10/21 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
-2020/10/21 | 151872 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
-2020/10/21 | 151803 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
2020/10/21 | 1500 | language/japanese/plautopatch/LICENSE
2020/10/21 | 148556 | macros/latex/contrib/flippdf/flippdf.pdf
-2020/10/21 | 146905 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
2020/10/21 | 1468 | systems/texlive/tlnet/archive/collection-mathscience.r56715.tar.xz
-2020/10/21 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
2020/10/21 | 1451412 | systems/texlive/tlnet/archive/nicematrix.doc.r56717.tar.xz
-2020/10/21 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
-2020/10/21 | 144514 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
-2020/10/21 | 14161 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
-2020/10/21 | 1410502 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
2020/10/21 | 139264 | language/japanese/plautopatch.zip
2020/10/21 | 1390 | support/pdfxup/README
2020/10/21 | 13710 | macros/latex/contrib/tuda-ci/tex/tudaleaflet.cls
2020/10/21 | 13700 | systems/texlive/tlnet/archive/leaflet.source.r56716.tar.xz
-2020/10/21 | 133431 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
-2020/10/21 | 13291 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
2020/10/21 | 131492 | macros/latex/contrib/gitver.zip
-2020/10/21 | 130391 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
-2020/10/21 | 130319 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
-2020/10/21 | 1302986 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
-2020/10/21 | 1275698 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
-2020/10/21 | 1244807 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
2020/10/21 | 12363 | macros/latex/contrib/flippdf/flippdf.dtx
-2020/10/21 | 1227318 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
-2020/10/21 | 1226949 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
-2020/10/21 | 119091 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
-2020/10/21 | 1168451 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
-2020/10/21 | 116080 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
-2020/10/21 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini
-2020/10/21 | 1145775 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
-2020/10/21 | 114550 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
-2020/10/21 | 1144674 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
-2020/10/21 | 113424 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
2020/10/21 | 11268 | macros/latex/contrib/tuda-ci/README.md
-2020/10/21 | 1124782 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
2020/10/21 | 1123 | language/japanese/plautopatch/pxpgfrcs.sty
2020/10/21 | 1110 | macros/latex/contrib/flippdf/README.md
-2020/10/21 | 1094120 | systems/texlive/tlnet/archive/tuda-ci.doc.r56719.tar.xz
-2020/10/21 | 108954 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
+2020/10/21 | 11015312 | systems/win32/w32tex/win64/xetex-w64.tar.xz
2020/10/21 | 10712 | macros/latex/contrib/tuda-ci/example/DEMO-TUDaSciPoster.tex
2020/10/21 | 1063 | support/pdfxup/RELEASES
-2020/10/21 | 1060207 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
2020/10/21 | 10524 | macros/latex/contrib/tuda-ci/example/DEMO-TUDaExercise.tex
-2020/10/21 | 104636 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
2020/10/21 | 103721 | support/pdfxup.zip
-2020/10/21 | 102872 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
-2020/10/21 | 101599 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
2020/10/21 | 10072 | macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa-mecheng.sty
2020/10/20 | 92279 | macros/latex/contrib/leaflet/leaflet-manual.pdf
-2020/10/20 | 89317 | macros/latex/contrib/scrlttr2copy.zip
2020/10/20 | 89092 | systems/texlive/tlnet/archive/xecjk.source.r56711.tar.xz
-2020/10/20 | 88554 | macros/latex/contrib/scrlttr2copy/letter-copy-test.pdf
2020/10/20 | 86828 | systems/texlive/tlnet/archive/ctex.source.r56705.tar.xz
2020/10/20 | 86732 | systems/texlive/tlnet/archive/biblatex-oxref.source.r56706.tar.xz
-2020/10/20 | 827 | macros/latex/contrib/scrlttr2copy/letter-copy-test.tex
2020/10/20 | 7604 | systems/texlive/tlnet/archive/color-edits.source.r56707.tar.xz
2020/10/20 | 758292 | systems/texlive/tlnet/archive/optex.r56710.tar.xz
-2020/10/20 | 726890 | systems/win32/w32tex/ChangeLog
2020/10/20 | 6808 | systems/texlive/tlnet/archive/preview.r56708.tar.xz
2020/10/20 | 66079124 | systems/win32/w32tex/biblatex-biber.tar.xz
2020/10/20 | 6176 | systems/texlive/tlnet/archive/collection-latexextra.r56707.tar.xz
2020/10/20 | 5491247 | info/formation-latex-ul.zip
2020/10/20 | 490916 | macros/latex/contrib/nicematrix/nicematrix.dtx
-2020/10/20 | 48963060 | systems/win32/w32tex/xetex-w32.tar.xz
2020/10/20 | 47938 | macros/latex/contrib/leaflet/leaflet.dtx
2020/10/20 | 423871 | macros/latex/contrib/nicematrix/nicematrix-french.pdf
2020/10/20 | 4184 | systems/texlive/tlnet/archive/frimurer.source.r56704.tar.xz
2020/10/20 | 412596 | systems/win32/miktex/tm/packages/xpinyin.tar.lzma
+2020/10/20 | 399129948 | systems/win32/w32tex/ltxpkgdocs.tar.xz
2020/10/20 | 351388 | macros/latex/contrib/leaflet.zip
2020/10/20 | 342254 | systems/win32/miktex/tm/packages/preview.tar.lzma
-2020/10/20 | 33895592 | systems/win32/w32tex/ltxpkgs.tar.xz
+2020/10/20 | 33899136 | systems/win32/w32tex/ltxpkgs.tar.xz
2020/10/20 | 335934 | systems/win32/miktex/tm/packages/expkv-cs.tar.lzma
2020/10/20 | 33486 | macros/latex/contrib/jupynotex.zip
2020/10/20 | 3199 | info/formation-latex-ul/source/notices-diapos.tex
2020/10/20 | 3131 | info/formation-latex-ul/source/notices.tex
-2020/10/20 | 3127 | macros/latex/contrib/scrlttr2copy/copy.lco
2020/10/20 | 312612 | systems/texlive/tlnet/archive/preview.doc.r56708.tar.xz
2020/10/20 | 2974868 | systems/texlive/tlnet/archive/utfsym.doc.r56702.tar.xz
2020/10/20 | 2834 | info/formation-latex-ul/README.md
@@ -336,7 +409,6 @@
2020/10/20 | 22560 | systems/texlive/tlnet/archive/preview.source.r56708.tar.xz
2020/10/20 | 22416 | systems/texlive/tlnet/archive/biblatex-oxref.r56706.tar.xz
2020/10/20 | 220088 | systems/texlive/tlnet/archive/xecjk.r56711.tar.xz
-2020/10/20 | 218656 | systems/texlive/tlnet/archive/texlive-scripts.doc.r56701.tar.xz
2020/10/20 | 212213 | systems/win32/miktex/tm/packages/frimurer.tar.lzma
2020/10/20 | 2017731 | systems/win32/miktex/tm/packages/optex.tar.lzma
2020/10/20 | 201012 | systems/texlive/tlnet/archive/xpinyin.r56709.tar.xz
@@ -360,7 +432,6 @@
2020/10/20 | 141530 | systems/win32/miktex/tm/packages/flippdf.tar.lzma
2020/10/20 | 1384 | systems/texlive/tlnet/archive/collection-pictures.r56702.tar.xz
2020/10/20 | 1346146 | systems/win32/miktex/tm/packages/step.tar.lzma
-2020/10/20 | 132076 | systems/texlive/tlnet/archive/texlive-scripts.r56701.tar.xz
2020/10/20 | 1298132 | systems/win32/miktex/tm/packages/ctex.tar.lzma
2020/10/20 | 128936 | systems/texlive/tlnet/archive/ctex.r56705.tar.xz
2020/10/20 | 1273152 | systems/texlive/tlnet/archive/optex.doc.r56710.tar.xz
@@ -377,7 +448,6 @@
2020/10/19 | 776280 | systems/texlive/tlnet/archive/uplatex.doc.r56699.tar.xz
2020/10/19 | 6984 | systems/texlive/tlnet/archive/xetex.r56699.tar.xz
2020/10/19 | 664 | systems/texlive/tlnet/archive/latex-bin-dev.r56699.tar.xz
-2020/10/19 | 6569 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2020/10/19 | 6326 | fonts/erewhon-math/fourier-otf.sty
2020/10/19 | 617012 | systems/texlive/tlnet/archive/xetex.doc.r56699.tar.xz
2020/10/19 | 6039 | language/chinese/ctex/README.md
@@ -402,7 +472,6 @@
2020/10/19 | 42204 | macros/latex/contrib/jupynotex/example/notebook.ipynb
2020/10/19 | 41898 | macros/latex/contrib/xpinyin/xpinyin.dtx
2020/10/19 | 40820 | systems/texlive/tlnet/archive/platex.r56699.tar.xz
-2020/10/19 | 4072 | systems/texlive/tlnet/archive/flippdf.source.r56691.tar.xz
2020/10/19 | 4010 | macros/luatex/optex/base/optex.ini
2020/10/19 | 396576 | systems/texlive/tlnet/archive/eplain.source.r56699.tar.xz
2020/10/19 | 3896 | systems/texlive/tlnet/archive/expkv-cs.r56693.tar.xz
@@ -446,9 +515,7 @@
2020/10/19 | 15184 | systems/texlive/tlnet/archive/expkv-cs.source.r56693.tar.xz
2020/10/19 | 1478256 | systems/texlive/tlnet/archive/platex.doc.r56699.tar.xz
2020/10/19 | 14740 | systems/texlive/tlnet/archive/uplatex.r56699.tar.xz
-2020/10/19 | 136572 | systems/texlive/tlnet/archive/flippdf.doc.r56691.tar.xz
2020/10/19 | 135884 | systems/texlive/tlnet/archive/platex.source.r56699.tar.xz
-2020/10/19 | 1348 | systems/texlive/tlnet/archive/flippdf.r56691.tar.xz
2020/10/19 | 1348018 | fonts/erewhon-math/unimath-erewhon.pdf
2020/10/19 | 131 | macros/latex/contrib/jupynotex/jupynotex.sty
2020/10/19 | 1300856 | systems/texlive/tlnet/archive/step.r56690.tar.xz
@@ -459,7 +526,6 @@
2020/10/19 | 11357 | macros/latex/contrib/jupynotex/LICENSE
2020/10/19 | 1115618 | language/chinese/ctex/ctex.pdf
2020/10/19 | 1009580 | systems/texlive/tlnet/archive/swfigure.doc.r56695.tar.xz
-2020/10/18 | 99250072 | systems/win32/w32tex/web2c-lib.tar.xz
2020/10/18 | 9548 | fonts/step/tfm/STEP-BoldItalic-tosf-t1.tfm
2020/10/18 | 9544 | fonts/step/tfm/STEP-BoldItalic-tlf-t1.tfm
2020/10/18 | 9384 | fonts/step/tfm/STEP-Regular-tosf-t1.tfm
@@ -535,7 +601,6 @@
2020/10/18 | 67682 | macros/luatex/optex/doc/optex-math.tex
2020/10/18 | 666949 | support/auctex/12.3-extra/auctex.pdf
2020/10/18 | 6607 | support/auctex/RELEASE-12.3
-2020/10/18 | 6589044 | systems/win32/w32tex/ptex-ng-w32.tar.xz
2020/10/18 | 64163 | macros/generic/expkv-cs/expkv-cs.dtx
2020/10/18 | 640 | fonts/step/README
2020/10/18 | 6321947 | systems/win32/miktex/tm/packages/schule.tar.lzma
@@ -823,7 +888,6 @@
2020/10/18 | 1716 | fonts/step/vf/STEP-Italic-tlf-ly1.vf
2020/10/18 | 1716 | fonts/step/vf/STEP-Bold-tosf-ly1.vf
2020/10/18 | 1712 | fonts/step/vf/STEP-Bold-tlf-ly1.vf
-2020/10/18 | 1711836 | systems/win32/w32tex/win64/ptex-ng-w64.tar.xz
2020/10/18 | 1708 | fonts/step/tfm/STEP-Regular-sup-t3.tfm
2020/10/18 | 1708 | fonts/step/tfm/STEP-Regular-sup-t3--base.tfm
2020/10/18 | 1708 | fonts/step/tfm/STEP-Regular-numr-t3.tfm
@@ -984,7 +1048,6 @@
2020/10/18 | 1140 | fonts/frimurer/frimurer.sty
2020/10/18 | 1112 | fonts/step/tfm/STEP-Regular-tosf-sc-ot1--base.tfm
2020/10/18 | 1112 | fonts/step/tfm/STEP-Regular-tlf-sc-ot1--base.tfm
-2020/10/18 | 11016708 | systems/win32/w32tex/win64/xetex-w64.tar.xz
2020/10/18 | 1096 | fonts/step/tfm/STEP-Regular-sup-ot1.tfm
2020/10/18 | 1096 | fonts/step/tfm/STEP-Regular-numr-ot1.tfm
2020/10/18 | 1096 | fonts/step/tfm/STEP-Regular-inf-ot1.tfm
@@ -1041,7 +1104,6 @@
2020/10/16 | 804 | dviware/dvivue/README
2020/10/16 | 79598 | macros/latex/contrib/schule/doc/Beispiele/beispiel-ab-abbott.pdf
2020/10/16 | 7884 | macros/latex/contrib/schule/latex/schuleab.cls
-2020/10/16 | 77777 | graphics/pgf/contrib/utfsym/latex/utfsym.sty
2020/10/16 | 7470 | macros/latex/contrib/schule/doc/Beispiele/minimal-ab-dev.tex
2020/10/16 | 72 | macros/latex/contrib/schule/latex/schule.mod.Storycard.pakete.tex
2020/10/16 | 7197 | macros/latex/contrib/schule/latex/schullzk.sty
@@ -1051,7 +1113,6 @@
2020/10/16 | 66 | macros/latex/contrib/schule/latex/schule.typ.Beurteilung.pakete.tex
2020/10/16 | 661 | macros/latex/contrib/schule/latex/schule.mod.Formulare.code.tex
2020/10/16 | 6595 | macros/latex/contrib/schule/latex/schulinf.sty
-2020/10/16 | 6523064 | graphics/pgf/contrib/utfsym.zip
2020/10/16 | 63299 | macros/unicodetex/latex/quran/doc/quran-test2.pdf
2020/10/16 | 6263 | macros/latex/contrib/schule/latex/schulekl.cls
2020/10/16 | 61565 | macros/latex/contrib/schule/doc/Beispiele/beispiel-ab-formulare.pdf
@@ -1098,8 +1159,6 @@
2020/10/16 | 3702 | macros/latex/contrib/schule/README
2020/10/16 | 36958 | systems/win32/miktex/tm/packages/denisbdoc.tar.lzma
2020/10/16 | 35821 | dviware/dvivue.zip
-2020/10/16 | 3578 | graphics/pgf/contrib/utfsym/doc/utfsym.tex
-2020/10/16 | 3577246 | graphics/pgf/contrib/utfsym/doc/utfsym.pdf
2020/10/16 | 3561 | graphics/pgf/contrib/syntaxdi/doc/syntaxdi.tex
2020/10/16 | 354595 | systems/win32/miktex/tm/packages/leaflet.tar.lzma
2020/10/16 | 35148 | dviware/dvivue/COPYING
@@ -1132,7 +1191,6 @@
2020/10/16 | 187671 | graphics/pgf/contrib/syntaxdi.zip
2020/10/16 | 187370 | graphics/pgf/contrib/syntaxdi/doc/syntaxdi.pdf
2020/10/16 | 184473 | macros/latex/contrib/schule/doc/Beispiele/minimal-ab.pdf
-2020/10/16 | 1814 | graphics/pgf/contrib/utfsym/README
2020/10/16 | 17973 | macros/latex/contrib/schule/latex/schuleub.cls
2020/10/16 | 1786 | macros/latex/contrib/schule/data/xsim-style/xsim.style.schule-default.code.tex
2020/10/16 | 175997 | macros/latex/contrib/schule/doc/Beispiele/minimal-kl.pdf
@@ -1173,97 +1231,3 @@
2020/10/16 | 10728 | macros/latex/contrib/schule/latex/schulekl.sty
2020/10/16 | 1046 | dviware/dvivue/DVIVue/DVIVue.vcxproj.user
2020/10/16 | 10457 | macros/latex/contrib/schule/doc/allgemeines.tex
-2020/10/15 | 954 | macros/latex/contrib/leaflet/leaflet.ins
-2020/10/15 | 930 | macros/latex/contrib/schule/doc/schule-dokumentation.sty
-2020/10/15 | 919 | info/formation-latex-ul/source/colophon-diapos.tex
-2020/10/15 | 891187 | macros/unicodetex/latex/polyglossia/polyglossia.dtx
-2020/10/15 | 819 | info/formation-latex-ul/source/solutions.tex
-2020/10/15 | 7992 | systems/texlive/tlnet/archive/platex-tools.r56661.tar.xz
-2020/10/15 | 7798 | info/formation-latex-ul/source/formation-latex-ul-diapos.tex
-2020/10/15 | 774685 | info/formation-latex-ul/source/images/formation-latex-ul.png
-2020/10/15 | 7344 | info/formation-latex-ul/source/introduction.tex
-2020/10/15 | 719882 | info/formation-latex-ul/source/images/Suricates_Namibia-2-diapos.jpeg
-2020/10/15 | 684273 | install/fonts/firamath.tds.zip
-2020/10/15 | 682757 | fonts/firamath.zip
-2020/10/15 | 6636 | systems/texlive/tlnet/archive/eso-pic.source.r56658.tar.xz
-2020/10/15 | 6620 | systems/texlive/tlnet/archive/plautopatch.r56657.tar.xz
-2020/10/15 | 65751 | info/formation-latex-ul/source/mathematiques.tex
-2020/10/15 | 6324 | systems/texlive/tlnet/archive/babel-russian.r56663.tar.xz
-2020/10/15 | 6307 | info/formation-latex-ul/doc/exercice_complet.tex
-2020/10/15 | 60367 | macros/latex/contrib/apxproof/apxproof.dtx
-2020/10/15 | 583706 | macros/latex/contrib/apxproof.zip
-2020/10/15 | 5750536 | systems/texlive/tlnet/archive/yathesis.doc.r56667.tar.xz
-2020/10/15 | 5708 | systems/texlive/tlnet/archive/firstaid.source.r56668.tar.xz
-2020/10/15 | 566640 | systems/texlive/tlnet/archive/platex-tools.doc.r56661.tar.xz
-2020/10/15 | 563983 | macros/latex/contrib/apxproof/apxproof.pdf
-2020/10/15 | 56230 | fonts/firamath/firamath-demo.pdf
-2020/10/15 | 521525 | fonts/firamath/firamath-specimen.pdf
-2020/10/15 | 50640 | systems/texlive/tlnet/archive/yathesis.source.r56667.tar.xz
-2020/10/15 | 504052 | systems/texlive/tlnet/archive/gentombow.doc.r56665.tar.xz
-2020/10/15 | 497692 | macros/latex/contrib/sagetex/sagetex.pdf
-2020/10/15 | 4902 | fonts/firamath/firamath-demo.tex
-2020/10/15 | 4871 | info/formation-latex-ul/source/mathematiques-diapos.tex
-2020/10/15 | 477946 | macros/unicodetex/latex/polyglossia.zip
-2020/10/15 | 472592 | systems/texlive/tlnet/archive/libertinus-fonts.doc.r56656.tar.xz
-2020/10/15 | 4686 | info/formation-latex-ul/NEWS
-2020/10/15 | 445 | macros/latex/contrib/sagetex/PKG-INFO
-2020/10/15 | 44485 | info/formation-latex-ul/source/tableaux+figures.tex
-2020/10/15 | 4385 | info/formation-latex-ul/source/presentation-diapos.tex
-2020/10/15 | 4380 | info/formation-latex-ul/source/bases-diapos.tex
-2020/10/15 | 42108 | systems/texlive/tlnet/archive/thuthesis.source.r56659.tar.xz
-2020/10/15 | 40670 | info/formation-latex-ul/source/bases.tex
-2020/10/15 | 4065 | info/formation-latex-ul/source/organisation-diapos.tex
-2020/10/15 | 3964 | info/formation-latex-ul/source/couverture-avant-diapos.tex
-2020/10/15 | 39164 | systems/texlive/tlnet/archive/thuthesis.r56659.tar.xz
-2020/10/15 | 38843 | info/formation-latex-ul/source/organisation.tex
-2020/10/15 | 3816 | systems/texlive/tlnet/archive/eso-pic.r56658.tar.xz
-2020/10/15 | 37103 | info/formation-latex-ul/source/trucs+astuces.tex
-2020/10/15 | 3673 | info/formation-latex-ul/source/apparence-diapos.tex
-2020/10/15 | 361456 | info/formation-latex-ul/source/images/Suricates_Namibia-2.jpeg
-2020/10/15 | 35455 | info/formation-latex-ul/source/francais.bst
-2020/10/15 | 3511 | info/formation-latex-ul/source/couverture-avant.tex
-2020/10/15 | 35071 | info/formation-latex-ul/source/bibliographie.tex
-2020/10/15 | 3228 | info/formation-latex-ul/CONTRIBUTING.md
-2020/10/15 | 315 | macros/latex/contrib/apxproof/apxproof.bib
-2020/10/15 | 279219 | macros/unicodetex/latex/polyglossia/polyglossia.pdf
-2020/10/15 | 2760 | systems/texlive/tlnet/archive/firstaid.r56668.tar.xz
-2020/10/15 | 276082 | macros/latex/contrib/sagetex/example.pdf
-2020/10/15 | 2583 | macros/latex/contrib/apxproof/apxproof.ins
-2020/10/15 | 25619 | fonts/firamath/firamath-glyph-list.tex
-2020/10/15 | 251608 | systems/texlive/tlnet/archive/eso-pic.doc.r56658.tar.xz
-2020/10/15 | 2507 | info/formation-latex-ul/source/tableaux-diapos.tex
-2020/10/15 | 2495 | info/formation-latex-ul/source/ulthese.tex
-2020/10/15 | 24340 | systems/texlive/tlnet/archive/babel-russian.source.r56663.tar.xz
-2020/10/15 | 23156 | systems/texlive/tlnet/archive/yathesis.r56667.tar.xz
-2020/10/15 | 223232 | systems/texlive/tlnet/archive/firstaid.doc.r56668.tar.xz
-2020/10/15 | 21392 | systems/texlive/tlnet/archive/denisbdoc.source.r56664.tar.xz
-2020/10/15 | 20188 | info/formation-latex-ul/source/apparence.tex
-2020/10/15 | 1943 | macros/unicodetex/latex/polyglossia/README.md
-2020/10/15 | 19105 | macros/latex/contrib/apxproof/LICENSE
-2020/10/15 | 18277 | info/formation-latex-ul/source/boites.tex
-2020/10/15 | 179840 | fonts/firamath/FiraMath-Regular.otf
-2020/10/15 | 1790 | macros/latex/contrib/apxproof/README.md
-2020/10/15 | 17182 | info/formation-latex-ul/source/formation-latex-ul.tex
-2020/10/15 | 1670592 | systems/texlive/tlnet/archive/libertinus-fonts.r56656.tar.xz
-2020/10/15 | 16055 | fonts/firamath/firamath-specimen.tex
-2020/10/15 | 15716 | info/formation-latex-ul/source/commandes.tex
-2020/10/15 | 1520 | systems/texlive/tlnet/archive/collection-publishers.r56669.tar.xz
-2020/10/15 | 15044 | systems/texlive/tlnet/archive/denisbdoc.r56664.tar.xz
-2020/10/15 | 1503876 | systems/texlive/tlnet/archive/thuthesis.doc.r56659.tar.xz
-2020/10/15 | 14904 | systems/texlive/tlnet/archive/pxjahyper.r56662.tar.xz
-2020/10/15 | 14764 | info/formation-latex-ul/source/presentation.tex
-2020/10/15 | 14762 | info/formation-latex-ul/source/formation-latex-ul.bib
-2020/10/15 | 1404 | info/formation-latex-ul/source/prerequis-diapos.tex
-2020/10/15 | 134860 | systems/texlive/tlnet/archive/circuitikz.r56660.tar.xz
-2020/10/15 | 128828 | systems/texlive/tlnet/archive/babel-russian.doc.r56663.tar.xz
-2020/10/15 | 125620 | systems/texlive/tlnet/archive/plautopatch.doc.r56657.tar.xz
-2020/10/15 | 121700 | systems/texlive/tlnet/archive/pxjahyper.doc.r56662.tar.xz
-2020/10/15 | 1202 | info/formation-latex-ul/source/suite-diapos.tex
-2020/10/15 | 1187036 | systems/texlive/tlnet/archive/circuitikz.doc.r56660.tar.xz
-2020/10/15 | 1184 | systems/texlive/tlnet/archive/denisbdoc.doc.r56664.tar.xz
-2020/10/15 | 1105 | info/formation-latex-ul/source/couverture-arriere-diapos.tex
-2020/10/15 | 10892 | systems/texlive/tlnet/archive/gentombow.r56665.tar.xz
-2020/10/15 | 1077 | info/formation-latex-ul/source/couverture-arriere.tex
-2020/10/15 | 1074 | fonts/firamath/README.md
-2020/10/15 | 1063 | info/formation-latex-ul/source/colophon.tex
-2020/10/15 | 1029839 | install/macros/unicodetex/latex/polyglossia.tds.zip
diff --git a/graphics/pgf/contrib/utfsym/README b/graphics/pgf/contrib/utfsym/README
index 3d9d19bb28..3cea6caf3c 100644
--- a/graphics/pgf/contrib/utfsym/README
+++ b/graphics/pgf/contrib/utfsym/README
@@ -3,13 +3,18 @@ PACKAGE `utfsym'
The 'utfsym' package provides various symbols from the Unicode in order
to be able to use them originally in a school context such as on
worksheets. This could not be used so easily under LaTeX. The use in
-other contexts is also possible.
+other contexts is also possible. For this purpose, the symbols were
+converted from the free font symbola.ttf by George Douros into the TikZ
+format.
+
+Each symbol can be embedded in documents in the desired size and color.
+Only the hex code of the symbol must be specified.
The package was
originally part of the 'schule' package.
------------------------------------------------------------------------
-Version: 0.8.2
-Last change: 2020/10/16
+Version: 0.8.3
+Last change: 2020/10/22
The package is still a work in progress. Open development steps are
shown in the documentation.
@@ -19,19 +24,12 @@ LICENCE
========================================================================
Copyright (C)
2010, 2011, 2012, 2013, 2014, 2020
-Daniel Spittank
+Daniel Spittank, Johannes Pieper
(schulepaket@johpie.de)
-This work may be distributed and/or modified under the
-conditions of the LaTeX Project Public License, either version 1.3
-of this license or (at your option) any later version.
-The latest version of this license is in
- http://www.latex-project.org/lppl.txt
-and version 1.3 or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+This work is under the CC0 license (http://creativecommons.org/publicdomain/zero/1.0/).
-This work has the LPPL maintenance status `maintained'.
--------------------------------------------------------------------------
The main code file of the package syntaxdi is:
utfsym.sty
diff --git a/graphics/pgf/contrib/utfsym/doc/utfsym.pdf b/graphics/pgf/contrib/utfsym/doc/utfsym.pdf
index e6b3afa696..14db8a132d 100644
--- a/graphics/pgf/contrib/utfsym/doc/utfsym.pdf
+++ b/graphics/pgf/contrib/utfsym/doc/utfsym.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/utfsym/doc/utfsym.tex b/graphics/pgf/contrib/utfsym/doc/utfsym.tex
index 033e53e481..ed02b72d64 100644
--- a/graphics/pgf/contrib/utfsym/doc/utfsym.tex
+++ b/graphics/pgf/contrib/utfsym/doc/utfsym.tex
@@ -7,11 +7,11 @@
\setcnltx{
name = utfsym ,
title = utfsym ,
- version = 0.8.2 ,
- date = 2020-10-16 ,
+ version = 0.8.3 ,
+ date = 2020-10-22 ,
subtitle = {\LaTeX-Paket für verschiedne Unicode-Symbole},
info = Paketdokumentation ,
- authors = {Daniel Spittank} ,
+ authors = {Daniel Spittank, Johannes Pieper} ,
email = schulepaket@johpie.de ,
url = https://ddi.uni-wuppertal.de/material/schulepaket.html ,
abstract = {%
@@ -101,4 +101,23 @@ benutzerdefinierter Skalierung eingebunden werden.
\include{symbole}
+\section{Lizenzen}
+Das Paket \pkg{utfsym} fällt unter die Public Domain im Sinne der CC0 (Creative Commons Zero).
+
+
+\section{Changelog}
+Die folgende Liste bietet eine Übersicht über die letzten Änderungen. Diese beginnt mit der Version 0.8.2, da zu diesem Zeitpunkt das Paket ausgekoppelt wurde und erst seit dem als eigenständiges Paket geführt wird.
+\begin{itemize}
+ \item \textbf{0.8.3} -- 2020-10-22
+ \begin{itemize}
+ \item Fehlerbehebung bzgl. Pfade
+ \item Erweiterung der Dokumentation
+ \end{itemize}
+ \item \textbf{0.8.2} -- 2020-10-16
+ \begin{itemize}
+ \item Auskopplung aus dem Paket \pkg{schule}
+ \end{itemize}
+\end{itemize}
+
+
\end{document}
diff --git a/graphics/pgf/contrib/utfsym/latex/utfsym.sty b/graphics/pgf/contrib/utfsym/latex/utfsym.sty
index 965410bf3d..99e75df705 100644
--- a/graphics/pgf/contrib/utfsym/latex/utfsym.sty
+++ b/graphics/pgf/contrib/utfsym/latex/utfsym.sty
@@ -1,5 +1,5 @@
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
-\ProvidesPackage{utfsym}[2016/08/08 Use TikZ to support icons from Unicode blocks ]
+\ProvidesPackage{utfsym}[2020/10/22 Use TikZ to support icons from Unicode blocks ]
%% developed for use in package 'schule' 2016 by Daniel Spittank
%% this package is public domain, CC0
@@ -28,11 +28,11 @@
%% command for symbol usage as a picture, scaling by height
%% \usymH{unicode number}{height}
-\newcommand{\usymH}[2]{\resizebox{!}{#2}{\input{tikz/usym#1.tikz}}}
+\newcommand{\usymH}[2]{\resizebox{!}{#2}{\input{usym#1.tikz}}}
%% command for symbol usage as a picture, scaling by width
%% \usymW{unicode number}{width}
-\newcommand{\usymW}[2]{\resizebox{#2}{!}{\input{tikz/usym#1.tikz}}}
+\newcommand{\usymW}[2]{\resizebox{#2}{!}{\input{usym#1.tikz}}}
%% direct unicode support
\DeclareUnicodeCharacter{1F000}{\usym{1F000}}
diff --git a/macros/latex/contrib/askmaps/README b/macros/latex/contrib/askmaps/README
index 24ec177312..ffa35746c8 100644
--- a/macros/latex/contrib/askmaps/README
+++ b/macros/latex/contrib/askmaps/README
@@ -9,7 +9,9 @@ askmaps.pdf - PDF version of the documentation
The Karnaugh maps are rendered with picture commands; only the pict2e package
is loaded.
-Current version is 0.1. At this point, only 2-5 variable Karnaugh maps
+The Tikz package can be used to shape the Karnaugh maps as pleased.
+
+Current version is 0.2. At this point, only 1-5 variable Karnaugh maps
are supported. People familiar with the Karnaugh package should have
no problem in using the macros in this package.
@@ -18,4 +20,4 @@ Suggestions and bug reports are welcome at J.E.J.opdenBrouw@hhs.nl
Happy TeX-ing!
Jesse op den Brouw
- 2013/12/04
+ 2020/10/23
diff --git a/macros/latex/contrib/askmaps/askmaps.pdf b/macros/latex/contrib/askmaps/askmaps.pdf
index b6803c7472..8cac0e43d3 100644
--- a/macros/latex/contrib/askmaps/askmaps.pdf
+++ b/macros/latex/contrib/askmaps/askmaps.pdf
Binary files differ
diff --git a/macros/latex/contrib/askmaps/askmaps.sty b/macros/latex/contrib/askmaps/askmaps.sty
index 9ff0122fbb..ab77400992 100644
--- a/macros/latex/contrib/askmaps/askmaps.sty
+++ b/macros/latex/contrib/askmaps/askmaps.sty
@@ -1,34 +1,62 @@
%%
%% askmaps.sty
%%
-%% American Style K-maps (2, 3, 4 and 5 variables)
+%% American Style K-maps (1, 2, 3, 4 and 5 variables)
%%
-%% (c)2013 Jesse op den Brouw, <J.E.J.opdenBrouw@hhs.nl>
+%% (c)2020 Jesse op den Brouw, <J.E.J.opdenBrouw@hhs.nl>
%%
%% LPPL LaTeX Public Project License
+%%
+%%
+%% Original rel 0.1 : 2013-12-04
+%% Update rel 0.2 : 2020-10-23
+%% added option oldstylef
+%% added option newstylef
+%% added askmapi - a K-map for one variable
+%% added askmapiiialt - alternate (vertical) version op K-map III
+%% added formatting index size, contents size and bit combination size.
+%% added support for \kvindex and \nokvindex macros when kvmacros.tex is
+%% loaded
+%% added formatting for left-placed variables
+%% implemented a debug possibility
+%% implemented linelength of variable separator
+%% resolved an issue with multiple overfull \hbox'es
+%% added a section on creating covers
+%% changed the use of \askmapindexsize et al. to include the size and
+%% shape of the fonts used
+%%
%%
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
%% Version and date
-\gdef\askmapsversion{0.1}
-\gdef\askmapsdate{2013/12/04}
+\gdef\askmapsversion{0.2}
+\gdef\askmapsdate{2020/10/23}
%
\ProvidesPackage{askmaps}[\askmapsdate\space Version \askmapsversion\space
LaTeX package for drawing American Style Karnaugh maps]
-%% This package provides 2, 3, 4 and 5 variable Karnaugh maps that can
+%% This package provides 1, 2, 3, 4 and 5 variable Karnaugh maps that can
%% be found in numerous american text books on digital design. Note
%% that it is possible to draw many different K-maps that are all
%% legitimate as long as a square (minterm) differs only in one
-%% literal with its adjacent squares.
+%% literal with its adjacent squares. There is an alternate form of the
+%% 3 variable K-map available.
%% This package draws K-maps where the most significant input variables
%% are placed on top of the columns and the least significant variables
-%% are placed left of the rows. Such K-maps can be found in the text books:
-%% Design of Logic Systems, 2nd, Lewin & Protheroe
-%% Digital System Design with VHDL, 2nd, Zwolinski
+%% are placed left of the rows.
%% Packages needed
\RequirePackage{pict2e}
+%% Get the only possible option
+\newcommand{\askmap@usecapf}{\askmap@optftrue}
+\DeclareOption{disablef}{\renewcommand{\askmap@usecapf}{\askmap@optffalse}}
+\DeclareOption*{\PackageWarning{askmaps}{Unknown '\CurrentOption' in package askmaps}}
+\ProcessOptions\relax
+
+%% For debugging purposes, currently draw rectangles around the maps
+%% Use only for debugging purposes
+\newif\ifaskmap@debug\askmap@debugfalse
+
%% The macros \askmapargumentstring, \askmapgetchar and \askmapgetonechar are
%% needed to process the variable-length parameters in \askmapxxx:
%% These routine politely reused from karnaugh package
@@ -40,17 +68,23 @@
\newdimen\askmapunitlength
\askmapunitlength=10mm
+%% The sizes (and shapes) of the text in the maps
+\newcommand{\askmapindexsize}{\scriptsize\slshape}
+\newcommand{\askmapcontentsize}{\normalsize}
+\newcommand{\askmapbitcombinationsize}{\footnotesize}
+
+%% Length of the line separating the input variables top-right and
+%% middle-left
+\newcommand{\askmapvarsep}{0.70}
+
%% Some use options
\newif\ifaskmap@opti% want indexes
\newif\ifaskmap@optf% want output function printed
\newif\ifaskmap@optb% want input variable bit combinations at columns and rows
-%% We want bit combinations along with the columns and rows
-%\askmap@optbtrue
-
%% Process user options
\def\askmap@processoptions#1{%
- \askmap@optifalse\askmap@optftrue\askmap@optbtrue%
+ \askmap@optifalse\askmap@usecapf\askmap@optbtrue%
\@tfor\askmap@opt:=#1\do{%
\if i\askmap@opt\askmap@optitrue\fi%
\if I\askmap@opt\askmap@optifalse\fi%
@@ -69,27 +103,82 @@
%% #3 = function input variables
%% #4 = list of function values
%% #5 = user picture commands
+%\newcommand{\askmap}[5]{}%
+% Starred version or not
+%\@ifstar{\gdef\askmap@printoutputname{f}\askmap@askmap}{\gdef\askmap@printoutputname{F}\askmap@askmap}%
+%}
+%\newcommand{\askmap@askmap}[5]{%
\newcommand{\askmap}[5]{%
-\if 2#1\relax
- \askmapii{#2}{#3}{f}{#4}{#5}%
+\def\askmap@printoutputname{f}
+%% Check if the \kvcurrentindex is set to using indexes
+\def\askmap@printindex{i}
+\ifx\kvcurrentindex\undefined
+\def\askmap@printindex{I}
\else
- \if 3#1\relax
- \askmapiii{#2}{#3}{f}{#4}{#5}%
- \else
- \if 4#1\relax
- \askmapiv{#2}{#3}{f}{#4}{#5}%
- \else
- \if 5#1\relax
- \askmapv{#2}{#3}{f}{#4}{#5}%
- \else
- \PackageWarning{askmaps}{Sorry, no K-maps with #1 variables supported by package askmaps!}
- \fi%
- \fi%
- \fi%
-\fi%
+\ifx\kvcurrentindex\empty
+\def\askmap@printindex{I}
+\fi
+\fi
+%% Sort out the 'call' to the right macro
+\ifcase#1\relax
+ \PackageWarning{askmaps}{Sorry, no K-maps with #1 variables supported by
+package askmaps!}
+\or
+ \askmapi{#2}{#3}{\askmap@printoutputname\askmap@printindex}{#4}{#5}%
+\or
+ \askmapii{#2}{#3}{\askmap@printoutputname\askmap@printindex}{#4}{#5}%
+\or
+ \askmapiii{#2}{#3}{\askmap@printoutputname\askmap@printindex}{#4}{#5}%
+\or
+ \askmapiv{#2}{#3}{\askmap@printoutputname\askmap@printindex}{#4}{#5}%
+\or
+ \askmapv{#2}{#3}{\askmap@printoutputname\askmap@printindex}{#4}{#5}%
+\else
+ \PackageWarning{askmaps}{Sorry, no K-maps with #1 variables supported by
+package askmaps!}
+\fi
}%
%% #1= output function variable
+%% #2= 1 input variable
+%% #3= options list
+%% #4= 2 function values
+%% #5= user defined picture commands
+\newcommand{\askmapi}[5]{%
+{\unitlength\askmapunitlength%
+\askmap@processoptions{#3}%
+\ifaskmap@debug\fboxsep0pt\fbox{\else\fi%
+\begin{picture}(4.4,2)(-1.2,0)%
+\linethickness{1pt}%
+\put(0,0){\framebox(2,1){}}%
+\put(1,0){\line(0,1){1}}%
+\ifaskmap@optf%
+\put(2.35,1.25){\askmapcontentsize#1}%
+\put(1.9,0.9){\line(1,1){0.4}}%
+\fi%
+\askmapargumentstring{#2}%
+\put(-0.4,1.55){\askmapcontentsize\askmapgetchar}%
+\ifaskmap@opti%
+\put(0.01,0.03){\askmapindexsize 0}%
+\put(1.03,0.03){\askmapindexsize 1}%
+\fi%
+\ifaskmap@optb%
+\put(0.5,1.1){\makebox(0,0)[b]{\askmapbitcombinationsize 0}}%
+\put(1.5,1.1){\makebox(0,0)[b]{\askmapbitcombinationsize 1}}%
+\fi%
+\askmapargumentstring{#4}%
+\put(0.5,0.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(1.5,0.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\thicklines%
+\put(0,1){\line(-1,1){\askmapvarsep}}%
+\thinlines%
+#5%
+\end{picture}%
+\ifaskmap@debug}\else\fi%
+}%
+}% end \askmapi
+
+%% #1= output function variable
%% #2= 2 input variables
%% #3= options list
%% #4= 4 function values
@@ -97,42 +186,47 @@
\newcommand{\askmapii}[5]{%
{\unitlength\askmapunitlength%
\askmap@processoptions{#3}%
+\ifaskmap@debug\fboxsep0pt\fbox{\else\fi%
\begin{picture}(4.4,3)(-1.2,0)%
\linethickness{1pt}%
-\put(0,0){\framebox(2,2)}%
+\put(0,0){\framebox(2,2){}}%
\put(1,0){\line(0,1){2}}%
\put(0,1){\line(1,0){2}}%
\ifaskmap@optf%
-\put(2.35,2.25){#1}%
+\put(2.35,2.25){\askmapcontentsize#1}%
\put(1.9,1.9){\line(1,1){0.4}}%
\fi%
\askmapargumentstring{#2}%
-\put(-0.4,2.55){\askmapgetchar}%
-\put(-0.9,2.1){\makebox(0.5,0){\askmapgetchar}}%
+\put(-0.4,2.55){\askmapcontentsize\askmapgetchar}%
+%\put(-0.9,2.1){\askmapcontentsize\askmapgetchar}%
+%\put(-1.0,1.9){\framebox(0.5,0.5)[r]{\askmapcontentsize\askmapgetchar}}%
+\put(-0.5,2.1){\makebox(0.0,0.0)[r]{\askmapcontentsize\askmapgetchar\askmapgetchar}}%
+%\put(-0.9,2.1){\makebox(0.5,0){\askmapcontentsize\askmapgetchar}}%
\ifaskmap@opti%
-\put(0.01,1.05){\scriptsize{\textsl{0}}}% a little bit to the edge because
-\put(0.01,0.03){\scriptsize{\textsl{1}}}% the edge line is thick
-\put(1.03,1.05){\scriptsize{\textsl{2}}}%
-\put(1.03,0.03){\scriptsize{\textsl{3}}}%
+\put(0.01,1.05){\askmapindexsize 0}% a little bit to the edge because
+\put(0.01,0.03){\askmapindexsize 1}% the edge line is thick
+\put(1.03,1.05){\askmapindexsize 2}%
+\put(1.03,0.03){\askmapindexsize 3}%
\fi%
\ifaskmap@optb%
-\put(-0.6,1.5){\makebox(0.5,0)[r]{\footnotesize{0}}}%
-\put(-0.6,0.5){\makebox(0.5,0)[r]{\footnotesize{1}}}%
-\put(0.5,2.2){\makebox(0,0){\footnotesize{0}}}%
-\put(1.5,2.2){\makebox(0,0){\footnotesize{1}}}%
+\put(-0.6,1.5){\makebox(0.5,0)[r]{\askmapbitcombinationsize 0}}%
+\put(-0.6,0.5){\makebox(0.5,0)[r]{\askmapbitcombinationsize 1}}%
+\put(0.5,2.1){\makebox(0,0)[b]{\askmapbitcombinationsize 0}}%
+\put(1.5,2.1){\makebox(0,0)[b]{\askmapbitcombinationsize 1}}%
\fi%
\askmapargumentstring{#4}%
-\put(0.5,1.5){\makebox(0,0){\askmapgetchar}}%
-\put(0.5,0.5){\makebox(0,0){\askmapgetchar}}%
-\put(1.5,1.5){\makebox(0,0){\askmapgetchar}}%
-\put(1.5,0.5){\makebox(0,0){\askmapgetchar}}%
+\put(0.5,1.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(0.5,0.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(1.5,1.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(1.5,0.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
\thicklines%
-\put(0,2){\line(-1,1){0.70}}%
+\put(0,2){\line(-1,1){\askmapvarsep}}%
\thinlines%
#5%
\end{picture}%
-}%
+\ifaskmap@debug}\else\fi%
}% end \askmapii
+}
%% #1= output function variable
%% #2= 3 input variables
@@ -142,50 +236,58 @@
\newcommand{\askmapiii}[5]{%
{\unitlength\askmapunitlength%
\askmap@processoptions{#3}%
+\ifaskmap@debug\fboxsep0pt\fbox{\else\fi%
\begin{picture}(6.4,3)(-1.2,0)%
\linethickness{1pt}%
-\put(0,0){\framebox(4,2)}%
+\put(0,0){\framebox(4,2){}}%
\multiput(1,0)(1,0){3}{\line(0,1){2}}%
\put(0,1){\line(1,0){4}}%
\ifaskmap@optf%
-\put(4.35,2.25){#1}%
+\put(4.35,2.25){\askmapcontentsize#1}%
\put(3.9,1.9){\line(1,1){0.4}}%
\fi%
\askmapargumentstring{#2}%
-\put(-0.4,2.55){\askmapgetchar\askmapgetchar}%
-\put(-0.9,2.1){\makebox(0.5,0){\askmapgetchar}}%
+\put(-0.4,2.55){\askmapcontentsize\askmapgetchar\askmapgetchar}%
+%\put(-0.9,2.1){\framebox(0.5,0.5)[rt]{\askmapcontentsize\askmapgetchar}}%
+%\put(-1.0,1.9){\framebox(0.5,0.5)[rt]{\askmapcontentsize\askmapgetchar}}%
+%\put(-1.0,1.9){\framebox(0.5,0.5)[r]{\askmapcontentsize\askmapgetchar}}%
+%\put(-0.9,2.1){\askmapcontentsize\askmapgetchar}%
+%\put(-0.9,2.1){\makebox(0.5,0){\askmapcontentsize\askmapgetchar}}%
+\put(-0.5,2.1){\makebox(0.0,0.0)[r]{\askmapcontentsize\askmapgetchar\askmapgetchar}}%
+%\put(-1.0,1.9){\makebox(0.5,0.45)[rt]{\askmapcontentsize\askmapgetchar}}%
\ifaskmap@opti%
-\put(0.01,1.05){\scriptsize{\textsl{0}}}%
-\put(0.01,0.03){\scriptsize{\textsl{1}}}%
-\put(1.03,1.05){\scriptsize{\textsl{2}}}%
-\put(1.03,0.03){\scriptsize{\textsl{3}}}%
-\put(3.03,1.05){\scriptsize{\textsl{4}}}%
-\put(3.03,0.03){\scriptsize{\textsl{5}}}%
-\put(2.03,1.05){\scriptsize{\textsl{6}}}%
-\put(2.03,0.03){\scriptsize{\textsl{7}}}%
+\put(0.01,1.05){\askmapindexsize 0}%
+\put(0.01,0.03){\askmapindexsize 1}%
+\put(1.03,1.05){\askmapindexsize 2}%
+\put(1.03,0.03){\askmapindexsize 3}%
+\put(3.03,1.05){\askmapindexsize 4}%
+\put(3.03,0.03){\askmapindexsize 5}%
+\put(2.03,1.05){\askmapindexsize 6}%
+\put(2.03,0.03){\askmapindexsize 7}%
\fi%
\askmapargumentstring{#4}%
-\put(0.5,1.5){\makebox(0,0){\askmapgetchar}}%
-\put(0.5,0.5){\makebox(0,0){\askmapgetchar}}%
-\put(1.5,1.5){\makebox(0,0){\askmapgetchar}}%
-\put(1.5,0.5){\makebox(0,0){\askmapgetchar}}%
-\put(3.5,1.5){\makebox(0,0){\askmapgetchar}}%
-\put(3.5,0.5){\makebox(0,0){\askmapgetchar}}%
-\put(2.5,1.5){\makebox(0,0){\askmapgetchar}}%
-\put(2.5,0.5){\makebox(0,0){\askmapgetchar}}%
+\put(0.5,1.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(0.5,0.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(1.5,1.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(1.5,0.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(3.5,1.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(3.5,0.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(2.5,1.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(2.5,0.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
\ifaskmap@optb%
-\put(-0.6,1.5){\makebox(0.5,0)[r]{\footnotesize{0}}}%
-\put(-0.6,0.5){\makebox(0.5,0)[r]{\footnotesize{1}}}%
-\put(0.5,2.2){\makebox(0,0){\footnotesize{00}}}%
-\put(1.5,2.2){\makebox(0,0){\footnotesize{01}}}%
-\put(2.5,2.2){\makebox(0,0){\footnotesize{11}}}%
-\put(3.5,2.2){\makebox(0,0){\footnotesize{10}}}%
+\put(-0.6,1.5){\makebox(0.5,0)[r]{\askmapbitcombinationsize 0}}%
+\put(-0.6,0.5){\makebox(0.5,0)[r]{\askmapbitcombinationsize 1}}%
+\put(0.5,2.1){\makebox(0,0)[b]{\askmapbitcombinationsize 00}}%
+\put(1.5,2.1){\makebox(0,0)[b]{\askmapbitcombinationsize 01}}%
+\put(2.5,2.1){\makebox(0,0)[b]{\askmapbitcombinationsize 11}}%
+\put(3.5,2.1){\makebox(0,0)[b]{\askmapbitcombinationsize 10}}%
\fi%
\thicklines%
-\put(0,2){\line(-1,1){0.70}}%
+\put(0,2){\line(-1,1){\askmapvarsep}}%
\thinlines%
#5%
\end{picture}%
+\ifaskmap@debug}\else\fi%
}%
}% end \askmapiii
@@ -194,71 +296,135 @@
%% #3= options list
%% #4= 16 function values
%% #5= user defined picture commands
+\newcommand{\askmapiiialt}[5]{%
+{\unitlength\askmapunitlength%
+\askmap@processoptions{#3}%
+\ifaskmap@debug\fboxsep0pt\fbox{\else\fi%
+\begin{picture}(4.4,5)(-1.2,0)%
+\linethickness{1pt}%
+\put(0,0){\framebox(2,4){}}%
+\put(1,0){\line(0,1){4}}%
+\multiput(0,1)(0,1){3}{\line(1,0){2}}%
+\ifaskmap@optf%
+\put(2.35,4.25){\askmapcontentsize#1}%
+\put(1.9,3.9){\line(1,1){0.4}}%
+\fi%
+\askmapargumentstring{#2}%
+\put(-0.4,4.55){\askmapcontentsize\askmapgetchar}%
+%\put(-1.0,4.1){\framebox(0.5,0){\askmapcontentsize\askmapgetchar\askmapgetchar}}%
+%\put(-1.0,3.9){\framebox(0.5,0.5)[r]{\askmapcontentsize\askmapgetchar\askmapgetchar}}%
+\put(-0.5,4.1){\makebox(0.0,0.0)[r]{\askmapcontentsize\askmapgetchar\askmapgetchar}}%
+%\put(-0.9,4.1){\makebox(0.5,0){\askmapcontentsize\askmapgetchar\askmapgetchar}}%
+\ifaskmap@opti%
+\put(0.01,3.05){\askmapindexsize 0}%
+\put(0.01,2.05){\askmapindexsize 1}%
+\put(0.01,0.03){\askmapindexsize 2}%
+\put(0.01,1.05){\askmapindexsize 3}%
+\put(1.03,3.05){\askmapindexsize 4}%
+\put(1.03,2.05){\askmapindexsize 5}%
+\put(1.03,0.03){\askmapindexsize 6}%
+\put(1.03,1.05){\askmapindexsize 7}%
+\fi%
+\askmapargumentstring{#4}%
+\put(0.5,3.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(0.5,2.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(0.5,0.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(0.5,1.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(1.5,3.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(1.5,2.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(1.5,0.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(1.5,1.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\ifaskmap@optb%
+\put(-0.6,3.5){\makebox(0.5,0)[r]{\askmapbitcombinationsize 00}}%
+\put(-0.6,2.5){\makebox(0.5,0)[r]{\askmapbitcombinationsize 01}}%
+\put(-0.6,1.5){\makebox(0.5,0)[r]{\askmapbitcombinationsize 11}}%
+\put(-0.6,0.5){\makebox(0.5,0)[r]{\askmapbitcombinationsize 10}}%
+\put(0.5,4.1){\makebox(0,0)[b]{\askmapbitcombinationsize 0}}%
+\put(1.5,4.1){\makebox(0,0)[b]{\askmapbitcombinationsize 1}}%
+\fi
+\thicklines%
+\put(0,4){\line(-1,1){\askmapvarsep}}%
+\thinlines%
+#5%
+\end{picture}%
+\ifaskmap@debug}\else\fi%
+}%
+}% end \askmapiiialt
+
+%% #1= output function variable
+%% #2= 4 input variables
+%% #3= options list
+%% #4= 16 function values
+%% #5= user defined picture commands
\newcommand{\askmapiv}[5]{%
{\unitlength\askmapunitlength%
\askmap@processoptions{#3}%
+\ifaskmap@debug\fboxsep0pt\fbox{\else\fi%
\begin{picture}(6.4,5)(-1.2,0)%
\linethickness{1pt}%
-\put(0,0){\framebox(4,4)}%
+\put(0,0){\framebox(4,4){}}%
\multiput(1,0)(1,0){3}{\line(0,1){4}}%
\multiput(0,1)(0,1){3}{\line(1,0){4}}%
\ifaskmap@optf%
-\put(4.35,4.25){#1}%
+\put(4.35,4.25){\askmapcontentsize#1}%
\put(3.9,3.9){\line(1,1){0.4}}%
\fi%
\askmapargumentstring{#2}%
-\put(-0.4,4.55){\askmapgetchar\askmapgetchar}%
-\put(-1.0,4.1){\makebox(0.5,0){\askmapgetchar\askmapgetchar}}%
+\put(-0.4,4.55){\askmapcontentsize\askmapgetchar\askmapgetchar}%
+%\put(-1.0,4.1){\framebox(0.5,0){\askmapcontentsize\askmapgetchar\askmapgetchar}}%
+\put(-0.5,4.1){\makebox(0.0,0.0)[r]{\askmapcontentsize\askmapgetchar\askmapgetchar}}%
+%\put(-1.0,4.1){\makebox(0.5,0){\askmapcontentsize\askmapgetchar\askmapgetchar}}%
\ifaskmap@opti%
-\put(0.01,3.05){\scriptsize{\textsl{0}}}%
-\put(0.01,2.05){\scriptsize{\textsl{1}}}%
-\put(0.01,0.03){\scriptsize{\textsl{2}}}%
-\put(0.01,1.05){\scriptsize{\textsl{3}}}%
-\put(1.03,3.05){\scriptsize{\textsl{4}}}%
-\put(1.03,2.05){\scriptsize{\textsl{5}}}%
-\put(1.03,0.03){\scriptsize{\textsl{6}}}%
-\put(1.03,1.05){\scriptsize{\textsl{7}}}%
-\put(3.03,3.05){\scriptsize{\textsl{8}}}%
-\put(3.03,2.05){\scriptsize{\textsl{9}}}%
-\put(3.03,0.03){\scriptsize{\textsl{10}}}%
-\put(3.03,1.05){\scriptsize{\textsl{11}}}%
-\put(2.03,3.05){\scriptsize{\textsl{12}}}%
-\put(2.03,2.05){\scriptsize{\textsl{13}}}%
-\put(2.03,0.03){\scriptsize{\textsl{14}}}%
-\put(2.03,1.05){\scriptsize{\textsl{15}}}%
+\put(0.01,3.05){\askmapindexsize 0}%
+\put(0.01,2.05){\askmapindexsize 1}%
+\put(0.01,0.03){\askmapindexsize 2}%
+\put(0.01,1.05){\askmapindexsize 3}%
+\put(1.03,3.05){\askmapindexsize 4}%
+\put(1.03,2.05){\askmapindexsize 5}%
+\put(1.03,0.03){\askmapindexsize 6}%
+\put(1.03,1.05){\askmapindexsize 7}%
+\put(3.03,3.05){\askmapindexsize 8}%
+\put(3.03,2.05){\askmapindexsize 9}%
+\put(3.03,0.03){\askmapindexsize 10}%
+\put(3.03,1.05){\askmapindexsize 11}%
+\put(2.03,3.05){\askmapindexsize 12}%
+\put(2.03,2.05){\askmapindexsize 13}%
+\put(2.03,0.03){\askmapindexsize 14}%
+\put(2.03,1.05){\askmapindexsize 15}%
\fi%
\askmapargumentstring{#4}%
-\put(0.5,3.5){\makebox(0,0){\askmapgetchar}}%
-\put(0.5,2.5){\makebox(0,0){\askmapgetchar}}%
-\put(0.5,0.5){\makebox(0,0){\askmapgetchar}}%
-\put(0.5,1.5){\makebox(0,0){\askmapgetchar}}%
-\put(1.5,3.5){\makebox(0,0){\askmapgetchar}}%
-\put(1.5,2.5){\makebox(0,0){\askmapgetchar}}%
-\put(1.5,0.5){\makebox(0,0){\askmapgetchar}}%
-\put(1.5,1.5){\makebox(0,0){\askmapgetchar}}%
-\put(3.5,3.5){\makebox(0,0){\askmapgetchar}}%
-\put(3.5,2.5){\makebox(0,0){\askmapgetchar}}%
-\put(3.5,0.5){\makebox(0,0){\askmapgetchar}}%
-\put(3.5,1.5){\makebox(0,0){\askmapgetchar}}%
-\put(2.5,3.5){\makebox(0,0){\askmapgetchar}}%
-\put(2.5,2.5){\makebox(0,0){\askmapgetchar}}%
-\put(2.5,0.5){\makebox(0,0){\askmapgetchar}}%
-\put(2.5,1.5){\makebox(0,0){\askmapgetchar}}%
+\put(0.5,3.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(0.5,2.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(0.5,0.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(0.5,1.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(1.5,3.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(1.5,2.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(1.5,0.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(1.5,1.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(3.5,3.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(3.5,2.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(3.5,0.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(3.5,1.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(2.5,3.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(2.5,2.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(2.5,0.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(2.5,1.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
\ifaskmap@optb%
-\put(-0.6,3.5){\makebox(0.5,0)[r]{\footnotesize{00}}}%
-\put(-0.6,2.5){\makebox(0.5,0)[r]{\footnotesize{01}}}%
-\put(-0.6,1.5){\makebox(0.5,0)[r]{\footnotesize{11}}}%
-\put(-0.6,0.5){\makebox(0.5,0)[r]{\footnotesize{10}}}%
-\put(0.5,4.2){\makebox(0,0){\footnotesize{00}}}%
-\put(1.5,4.2){\makebox(0,0){\footnotesize{01}}}%
-\put(2.5,4.2){\makebox(0,0){\footnotesize{11}}}%
-\put(3.5,4.2){\makebox(0,0){\footnotesize{10}}}%
+\put(-0.6,3.5){\makebox(0.5,0)[r]{\askmapbitcombinationsize 00}}%
+\put(-0.6,2.5){\makebox(0.5,0)[r]{\askmapbitcombinationsize 01}}%
+\put(-0.6,1.5){\makebox(0.5,0)[r]{\askmapbitcombinationsize 11}}%
+\put(-0.6,0.5){\makebox(0.5,0)[r]{\askmapbitcombinationsize 10}}%
+\put(0.5,4.1){\makebox(0,0)[b]{\askmapbitcombinationsize 00}}%
+\put(1.5,4.1){\makebox(0,0)[b]{\askmapbitcombinationsize 01}}%
+\put(2.5,4.1){\makebox(0,0)[b]{\askmapbitcombinationsize 11}}%
+\put(3.5,4.1){\makebox(0,0)[b]{\askmapbitcombinationsize 10}}%
\fi
\thicklines%
-\put(0,4){\line(-1,1){0.70}}%
+\put(0,4){\line(-1,1){\askmapvarsep}}%
\thinlines%
#5%
\end{picture}%
+\ifaskmap@debug}\else\fi%
}%
}% end \askmapiv
@@ -270,104 +436,109 @@
\newcommand{\askmapv}[5]{%
{\unitlength\askmapunitlength%
\askmap@processoptions{#3}%
+\ifaskmap@debug\fboxsep0pt\fbox{\else\fi%
\begin{picture}(10.4,5)(-1.2,0)%
\linethickness{1pt}%
-\put(0,0){\framebox(8,4)}%
+\put(0,0){\framebox(8,4){}}%
\multiput(1,0)(1,0){7}{\line(0,1){4}}%
\multiput(0,1)(0,1){3}{\line(1,0){8}}%
\ifaskmap@optf%
-\put(8.35,4.25){#1}%
+\put(8.35,4.25){\askmapcontentsize#1}%
\put(7.9,3.9){\line(1,1){0.4}}%
\fi%
\askmapargumentstring{#2}%
-\put(-0.4,4.55){\askmapgetchar\askmapgetchar\askmapgetchar}%
-\put(-1.0,4.1){\makebox(0.5,0){\askmapgetchar\askmapgetchar}}%
+\put(-0.4,4.55){\askmapcontentsize\askmapgetchar\askmapgetchar\askmapgetchar}%
+%\put(-1.0,3.9){\framebox(0.5,0.5)[r]{\askmapcontentsize\askmapgetchar\askmapgetchar}}%
+%\put(-1.0,4.1){\framebox(0.5,0)[r]{\askmapcontentsize\askmapgetchar\askmapgetchar}}
+\put(-0.5,4.1){\makebox(0.0,0.0)[r]{\askmapcontentsize\askmapgetchar\askmapgetchar}}%
+%\put(-1.0,4.1){\makebox(0.5,0){\askmapcontentsize\askmapgetchar\askmapgetchar}}%
\ifaskmap@opti%
-\put(0.01,3.05){\scriptsize{\textsl{0}}}%
-\put(0.01,2.05){\scriptsize{\textsl{1}}}%
-\put(0.01,0.03){\scriptsize{\textsl{2}}}%
-\put(0.01,1.05){\scriptsize{\textsl{3}}}%
-\put(1.03,3.05){\scriptsize{\textsl{4}}}%
-\put(1.03,2.05){\scriptsize{\textsl{5}}}%
-\put(1.03,0.03){\scriptsize{\textsl{6}}}%
-\put(1.03,1.05){\scriptsize{\textsl{7}}}%
-\put(3.03,3.05){\scriptsize{\textsl{8}}}%
-\put(3.03,2.05){\scriptsize{\textsl{9}}}%
-\put(3.03,0.03){\scriptsize{\textsl{10}}}%
-\put(3.03,1.05){\scriptsize{\textsl{11}}}%
-\put(2.03,3.05){\scriptsize{\textsl{12}}}%
-\put(2.03,2.05){\scriptsize{\textsl{13}}}%
-\put(2.03,0.03){\scriptsize{\textsl{14}}}%
-\put(2.03,1.05){\scriptsize{\textsl{15}}}%
-\put(7.03,3.05){\scriptsize{\textsl{16}}}%
-\put(7.03,2.05){\scriptsize{\textsl{17}}}%
-\put(7.03,0.03){\scriptsize{\textsl{18}}}%
-\put(7.03,1.05){\scriptsize{\textsl{19}}}%
-\put(6.03,3.05){\scriptsize{\textsl{20}}}%
-\put(6.03,2.05){\scriptsize{\textsl{21}}}%
-\put(6.03,0.03){\scriptsize{\textsl{22}}}%
-\put(6.03,1.05){\scriptsize{\textsl{23}}}%
-\put(4.03,3.05){\scriptsize{\textsl{24}}}%
-\put(4.03,2.05){\scriptsize{\textsl{25}}}%
-\put(4.03,0.03){\scriptsize{\textsl{26}}}%
-\put(4.03,1.05){\scriptsize{\textsl{27}}}%
-\put(5.03,3.05){\scriptsize{\textsl{28}}}%
-\put(5.03,2.05){\scriptsize{\textsl{29}}}%
-\put(5.03,0.03){\scriptsize{\textsl{30}}}%
-\put(5.03,1.05){\scriptsize{\textsl{31}}}%
+\put(0.01,3.05){\askmapindexsize 0}%
+\put(0.01,2.05){\askmapindexsize 1}%
+\put(0.01,0.03){\askmapindexsize 2}%
+\put(0.01,1.05){\askmapindexsize 3}%
+\put(1.03,3.05){\askmapindexsize 4}%
+\put(1.03,2.05){\askmapindexsize 5}%
+\put(1.03,0.03){\askmapindexsize 6}%
+\put(1.03,1.05){\askmapindexsize 7}%
+\put(3.03,3.05){\askmapindexsize 8}%
+\put(3.03,2.05){\askmapindexsize 9}%
+\put(3.03,0.03){\askmapindexsize 10}%
+\put(3.03,1.05){\askmapindexsize 11}%
+\put(2.03,3.05){\askmapindexsize 12}%
+\put(2.03,2.05){\askmapindexsize 13}%
+\put(2.03,0.03){\askmapindexsize 14}%
+\put(2.03,1.05){\askmapindexsize 15}%
+\put(7.03,3.05){\askmapindexsize 16}%
+\put(7.03,2.05){\askmapindexsize 17}%
+\put(7.03,0.03){\askmapindexsize 18}%
+\put(7.03,1.05){\askmapindexsize 19}%
+\put(6.03,3.05){\askmapindexsize 20}%
+\put(6.03,2.05){\askmapindexsize 21}%
+\put(6.03,0.03){\askmapindexsize 22}%
+\put(6.03,1.05){\askmapindexsize 23}%
+\put(4.03,3.05){\askmapindexsize 24}%
+\put(4.03,2.05){\askmapindexsize 25}%
+\put(4.03,0.03){\askmapindexsize 26}%
+\put(4.03,1.05){\askmapindexsize 27}%
+\put(5.03,3.05){\askmapindexsize 28}%
+\put(5.03,2.05){\askmapindexsize 29}%
+\put(5.03,0.03){\askmapindexsize 30}%
+\put(5.03,1.05){\askmapindexsize 31}%
\fi%
\askmapargumentstring{#4}%
-\put(0.5,3.5){\makebox(0,0){\askmapgetchar}}%
-\put(0.5,2.5){\makebox(0,0){\askmapgetchar}}%
-\put(0.5,0.5){\makebox(0,0){\askmapgetchar}}%
-\put(0.5,1.5){\makebox(0,0){\askmapgetchar}}%
-\put(1.5,3.5){\makebox(0,0){\askmapgetchar}}%
-\put(1.5,2.5){\makebox(0,0){\askmapgetchar}}%
-\put(1.5,0.5){\makebox(0,0){\askmapgetchar}}%
-\put(1.5,1.5){\makebox(0,0){\askmapgetchar}}%
-\put(3.5,3.5){\makebox(0,0){\askmapgetchar}}%
-\put(3.5,2.5){\makebox(0,0){\askmapgetchar}}%
-\put(3.5,0.5){\makebox(0,0){\askmapgetchar}}%
-\put(3.5,1.5){\makebox(0,0){\askmapgetchar}}%
-\put(2.5,3.5){\makebox(0,0){\askmapgetchar}}%
-\put(2.5,2.5){\makebox(0,0){\askmapgetchar}}%
-\put(2.5,0.5){\makebox(0,0){\askmapgetchar}}%
-\put(2.5,1.5){\makebox(0,0){\askmapgetchar}}%
-\put(7.5,3.5){\makebox(0,0){\askmapgetchar}}%
-\put(7.5,2.5){\makebox(0,0){\askmapgetchar}}%
-\put(7.5,0.5){\makebox(0,0){\askmapgetchar}}%
-\put(7.5,1.5){\makebox(0,0){\askmapgetchar}}%
-\put(6.5,3.5){\makebox(0,0){\askmapgetchar}}%
-\put(6.5,2.5){\makebox(0,0){\askmapgetchar}}%
-\put(6.5,0.5){\makebox(0,0){\askmapgetchar}}%
-\put(6.5,1.5){\makebox(0,0){\askmapgetchar}}%
-\put(4.5,3.5){\makebox(0,0){\askmapgetchar}}%
-\put(4.5,2.5){\makebox(0,0){\askmapgetchar}}%
-\put(4.5,0.5){\makebox(0,0){\askmapgetchar}}%
-\put(4.5,1.5){\makebox(0,0){\askmapgetchar}}%
-\put(5.5,3.5){\makebox(0,0){\askmapgetchar}}%
-\put(5.5,2.5){\makebox(0,0){\askmapgetchar}}%
-\put(5.5,0.5){\makebox(0,0){\askmapgetchar}}%
-\put(5.5,1.5){\makebox(0,0){\askmapgetchar}}%
+\put(0.5,3.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(0.5,2.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(0.5,0.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(0.5,1.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(1.5,3.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(1.5,2.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(1.5,0.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(1.5,1.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(3.5,3.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(3.5,2.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(3.5,0.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(3.5,1.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(2.5,3.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(2.5,2.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(2.5,0.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(2.5,1.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(7.5,3.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(7.5,2.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(7.5,0.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(7.5,1.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(6.5,3.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(6.5,2.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(6.5,0.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(6.5,1.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(4.5,3.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(4.5,2.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(4.5,0.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(4.5,1.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(5.5,3.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(5.5,2.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(5.5,0.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
+\put(5.5,1.5){\makebox(0,0){\askmapcontentsize\askmapgetchar}}%
\ifaskmap@optb%
-\put(-0.6,3.5){\makebox(0.5,0)[r]{\footnotesize{00}}}%
-\put(-0.6,2.5){\makebox(0.5,0)[r]{\footnotesize{01}}}%
-\put(-0.6,1.5){\makebox(0.5,0)[r]{\footnotesize{11}}}%
-\put(-0.6,0.5){\makebox(0.5,0)[r]{\footnotesize{10}}}%
-\put(0.5,4.2){\makebox(0,0){\footnotesize{000}}}%
-\put(1.5,4.2){\makebox(0,0){\footnotesize{001}}}%
-\put(2.5,4.2){\makebox(0,0){\footnotesize{011}}}%
-\put(3.5,4.2){\makebox(0,0){\footnotesize{010}}}%
-\put(4.5,4.2){\makebox(0,0){\footnotesize{110}}}%
-\put(5.5,4.2){\makebox(0,0){\footnotesize{111}}}%
-\put(6.5,4.2){\makebox(0,0){\footnotesize{101}}}%
-\put(7.5,4.2){\makebox(0,0){\footnotesize{100}}}%
+\put(-0.6,3.5){\makebox(0.5,0)[r]{\askmapbitcombinationsize 00}}%
+\put(-0.6,2.5){\makebox(0.5,0)[r]{\askmapbitcombinationsize 01}}%
+\put(-0.6,1.5){\makebox(0.5,0)[r]{\askmapbitcombinationsize 11}}%
+\put(-0.6,0.5){\makebox(0.5,0)[r]{\askmapbitcombinationsize 10}}%
+\put(0.5,4.1){\makebox(0,0)[b]{\askmapbitcombinationsize 000}}%
+\put(1.5,4.1){\makebox(0,0)[b]{\askmapbitcombinationsize 001}}%
+\put(2.5,4.1){\makebox(0,0)[b]{\askmapbitcombinationsize 011}}%
+\put(3.5,4.1){\makebox(0,0)[b]{\askmapbitcombinationsize 010}}%
+\put(4.5,4.1){\makebox(0,0)[b]{\askmapbitcombinationsize 110}}%
+\put(5.5,4.1){\makebox(0,0)[b]{\askmapbitcombinationsize 111}}%
+\put(6.5,4.1){\makebox(0,0)[b]{\askmapbitcombinationsize 101}}%
+\put(7.5,4.1){\makebox(0,0)[b]{\askmapbitcombinationsize 100}}%
\fi%
\thicklines%
-\put(0,4){\line(-1,1){0.70}}%
+\put(0,4){\line(-1,1){\askmapvarsep}}%
\thinlines%
#5%
\end{picture}%
+\ifaskmap@debug}\else\fi%
}%
}% end \askmapv
diff --git a/macros/latex/contrib/askmaps/askmaps.tex b/macros/latex/contrib/askmaps/askmaps.tex
index 43dac8925d..a94c51148c 100644
--- a/macros/latex/contrib/askmaps/askmaps.tex
+++ b/macros/latex/contrib/askmaps/askmaps.tex
@@ -2,13 +2,19 @@
%%
%% askmaps.tex
%%
-%% (c)2013, J.E.J. op den Brouw <J.E.J.opdenBrouw@hhs.nl>
+%% (c)2020, J.E.J. op den Brouw <J.E.J.opdenBrouw@hhs.nl>
%%
-%% document v0.1 - 2013/12/04
+%% document v0.1 - 2013/12/04
+%% v0.1a - 2013/12/07
+%% - added \karnaughmap example
+%% - minor changes in text
+%% v0.2 - 2020/23/10
+%% - added section on how to render covers
+%% - changes to the text.
%%
\documentclass[a4paper,10pt]{ltxdoc}
-\usepackage[a4paper]{geometry}
+\usepackage[a4paper,left=1.5in,right=1.5in,top=1.5in,bottom=1.5in]{geometry}
%% PDF Version and compression...
\pdfminorversion=5
@@ -24,11 +30,13 @@
\usepackage{float}
\usepackage{listings}
\usepackage{array}
+\usepackage{tikz}
%% The next lines are commented out by default. If you want these to appear
-%% in the resulting PDF, you have to copy the kvmacros.tex file in the
-%% current directory, uncomment the next lines and LaTex this file.
+%% in the resulting PDF, you have to have the kvmacros.tex somewhere is your
+%% LaTeX search path or have a copy of the kvmacros.tex file in the
+%% current directory. If so, uncomment the next lines and LaTeX this file.
%%
-%%\input kvmacros
+\input kvmacros
%% Use askmaps
\usepackage{askmaps}
@@ -40,7 +48,7 @@
linkcolor=blue,
pdftitle={American Style Karnaugh Maps},
pdfauthor={J.E.J op den Brouw},
- pdfsubject={Drawing 2, 3, 4 and 5 variables K-maps},
+ pdfsubject={Drawing 1, 2, 3, 4 and 5 variables K-maps},
pdfkeywords={K-maps, Karnaugh maps, Digital Design}
}
\definecolor{red}{rgb}{1,0,0}
@@ -51,8 +59,13 @@
\definecolor{lightgray}{rgb}{0.95,0.95,0.95}
%% Making captions nicer...
-\usepackage[font=footnotesize,format=plain,labelfont=bf,up,textfont=it,up]
- {caption}
+\usepackage[font=footnotesize,format=plain,labelfont=bf,textfont=sl]{caption}
+\usepackage[labelformat=simple,font=footnotesize,format=plain,labelfont=bf,textfont=sl]{subcaption}
+\captionsetup[figure]{justification=centering,singlelinecheck=off,belowskip=-1ex}
+\captionsetup[table]{justification=centering,singlelinecheck=off,skip=1ex}
+\captionsetup[subtable]{justification=centering,singlelinecheck=off,skip=3pt}
+\renewcommand\thesubfigure{(\alph{subfigure})}
+\renewcommand\thesubtable{(\alph{subtable})}
%% Set up the LaTex language layout
\lstset{ %
@@ -63,7 +76,7 @@
numberstyle=\tiny\color{gray},
stepnumber=1,
numbersep=5pt,
- backgroundcolor=\color{lightgray},
+ %backgroundcolor=\color{lightgray},
showspaces=false,
showstringspaces=false,
showtabs=false,
@@ -79,7 +92,7 @@
}
%% Need one more footnote...
-%% Display package name boldface
+%% Display package name teletype...
\renewcommand*{\thefootnote}{\fnsymbol{footnote}}
\newcommand\Package[1]{\texttt{#1}}
@@ -123,20 +136,21 @@
%% No indent
\setlength{\parindent}{0pt}
+\setlength{\parskip}{1ex plus 0.5ex minus 0.2ex}
%% At last, the document...
\begin{document}
\title{The \Package{askmaps} package}
\author{Jesse op den Brouw\thanks{The Hague University of Applied Sciences,
- \url{J.E.J.opdenBrouw@hhs.nl}}}
+ \href{mailto:J.E.J.opdenBrouw@hhs.nl}{J.E.J.opdenBrouw@hhs.nl}}}
\date{\askmapsdate, version \askmapsversion}
\maketitle
\setcounter{footnote}{1}
\section{Abstract}
\label{sec:abstract}
-This package generates configurable American style Karnaugh maps for
-2, 3, 4 and 5 variables as can be found in numerous books on digital design.
+This package generates configurable American style Karnaugh maps for 1, 2, 3,
+4 and~5 variables as can be found in numerous books on digital design.
Note that there are many ways to draw correct Karnaugh
maps\footnote{E.g., a four-variable Karnaugh map can be drawn in 384 different
and correct ways} and this packages creates only one version.
@@ -144,63 +158,77 @@ and correct ways} and this packages creates only one version.
There are more packages and examples that produce Karnaugh maps. A highly
recommendable package is written by Andreas W. Wieland\footnote{See
\url{http://www.ctan.org/tex-archive/macros/latex/contrib/karnaugh}}.
-However, this package creates maps that are frequently found in dutch
-textbooks\footnote{E.g. Digitale Techniek, A.P. Thijssen}
-but not in American textbooks.
+This package creates maps that are frequently found in European
+textbooks\footnote{E.g. Digitale Techniek, A.P. Thijssen} but not in American
+textbooks.
\section{Overview}
\label{sec:overview}
-After \cmdinvoke{usepackage}{askmaps}, four new commands are loaded
-to draw Karnaugh maps using the picture environment:
+After \cmdinvoke{usepackage}[\textit{option}]{askmaps}, siz new commands are
+available to draw Karnaugh maps:% using the \Package{picture} environment:
\begin{table}[H]
-\begin{tabular}{p{2cm}p{10cm}}
-\cs{askmapii} & draws a two-variable Karnaugh map \\
-\cs{askmapiii} & draws a three-variable Karnaugh map \\
-\cs{askmapiv} & draws a four-variable Karnaugh map \\
-\cs{askmapv} & draws a five-variable Karnaugh map \\
+\begin{tabular}{p{2.8cm}p{10cm}}
+\cs{askmapi} & draws a one-variable Karnaugh map \\
+\cs{askmapii} & draws a two-variable Karnaugh map \\
+\cs{askmapiii} & draws a three-variable Karnaugh map \\
+\cs{askmapiiialt} & draws an alternate style three-variable Karnaugh map \\
+\cs{askmapiv} & draws a four-variable Karnaugh map \\
+\cs{askmapv} & draws a five-variable Karnaugh map \\
\end{tabular}
\end{table}
These commands have five parameters which have the same meaning for each
-commands. This will be explained in section \ref{sec:outline}. As can be seen
-later on, much of the parameters can include typesetting commands such as
+commands. This will be explained in Section \ref{sec:outline}. As can be seen
+later on, many of the parameters can include typesetting commands such as
coloring and math notation.
-The new dimension \cs{askmapunitlength} is available and specifies
-the length of the squares. It defaults to 1 cm (about 0.4 in) which is a good
-value for 12 pt font size.
+The new dimension \cs{askmapunitlength} is available and specifies the length
+and width of the squares. It defaults to 1 cm (about 0.4 in) which is good in
+combination with a~12 pt font size.
The global definitions \cs{askmapsversion} and \cs{askmapsdate} will render
to the current version and date respectively.
+There are three commands that control the size (and shape) of the rendered
+text. The \cs{askmapindexsize} command sets the size and shape of the index
+number, the default is \cs{scriptsize}\cs{slshape}. The \cs{askmapcontentsize} command sets
+the size of the contents of the cells. It defaults to \cs{normalsize}. The
+\cs{askmapbitcombinationsize} sets the the size of the bit combinations
+on the edges of the Karnaugh map. It defaults to \cs{footnotesize}. These
+sizes can be changed using the appropriate \cs{renewcommand} command.
+
+The command \cs{askmapvarsep} contains the length of the variable separator
+line in de Karnaugh maps. The default is 0.7. Note that it is merely a
+number, not a length. It can be altered using the appropriate
+\cs{renewcommand} command. See Section~\ref{sec:use} for more details.
+
The command \cs{askmap} provides drop-in replacement for the \cs{karnaughmap}
-command available in the \Package{kvdocs} package (although it is not really a
-package) and internally calls one of the four
-commands, but there are some drawbacks on using this command.
+command available in the \Package{kvmacros} package and internally calls one
+of the five commands (the \cs{askmapiiialt} command is not supported), but
+there are some drawbacks on using this command.
-\newpage
\section{Outline}
\label{sec:outline}
-All four functions take the form
-\cs{askmap<romannumber>\{\#1\}\{\#2\}\{\#3\}\{\#4\}\{\#5\}}
-where \texttt{<romannumber>} is one of \texttt{ii}, \texttt{iii}, \texttt{iv}
-or \texttt{v} and the parameters \texttt{\#1} to \texttt{\#5} have the
-following meaning:
+%% 2013/12/07: functions -> commands
+All six commands take the form
+\cs{askmap<spec>\{\#1\}\{\#2\}\{\#3\}\{\#4\}\{\#5\}} where \texttt{<spec>} is
+one of \texttt{i}, \texttt{ii}, \texttt{iii}, \texttt{iiialt}, \texttt{iv} or
+\texttt{v} and the parameters \texttt{\#1} to \texttt{\#5} have the following
+meaning:
\begin{itemize}
- \itemsep0pt
- %\labelsep0pt
- \item[\texttt{\#1}] is the function output variable.
- \item[\texttt{\#2}] is a list of function input variables.
- \item[\texttt{\#3}] contains a list op options, see table below.
- \item[\texttt{\#4}] is a list of function values.
- \item[\texttt{\#5}] can be used to display user defined picture commands.
+\itemsep0pt
+\item[\texttt{\#1}] is the function output variable.
+\item[\texttt{\#2}] is a list of function input variables.
+\item[\texttt{\#3}] contains a list op options, see table below.
+\item[\texttt{\#4}] is a list of function values.
+\item[\texttt{\#5}] can be used to display user defined picture commands.
\end{itemize}
If a parameter contains fewer elements than needed, you will get empty spaces
in the Karnaugh map. If a parameter contains more elements than needed, all
elements in excess are not printed. In both situations, you will not be
-notified.\newline
+notified.
The third parameter contains a list of options as explained below.
\begin{itemize}
@@ -210,10 +238,11 @@ The third parameter contains a list of options as explained below.
\item[\texttt{I}] no index numbers are printed (default).
\item[\texttt{f}] function output variable is printed at the upper right
corner of the Karnaugh map together with a small line
- extending from the square to the function name (default).
- \item[\texttt{F}] no function output variable is printed.
+ extending from the square to the function
+ name (default, see Package Option Handling).
+ \item[\texttt{F}] no function output variable is printed
\item[\texttt{b}] bit combinations of the function input variables are
- printed on top of the columns and at the right of the the
+ printed on top of the columns and at the left of the the
rows (default).
\item[\texttt{B}] bit combinations are not printed.
\item[\texttt{c}] shortcut for \texttt{ifb}.
@@ -222,13 +251,21 @@ The third parameter contains a list of options as explained below.
Options are evaluated from left to right, so a combination of \texttt{iI} will
yield in no index numbers being printed. Please note that macros are not
-expanded to a list of tokens but to one token.\newline
+expanded to a list of tokens but to one token.
+
+%%%%If you look at American style Karnaugh maps, you will see that the function
+%%%%output variable usually isn't printed with the map, but is printed below or
+%%%%besides the map (if it is printed at all). This behavior can be simulated by
+%%%%using the \texttt{F} option, in which case the first parameter (the function
+%%%%output variable) may be left unused.
-If you look at American style Karnaugh maps, you will see that the function
-output variable usually isn't printed with the map, but is printed below the
-map (if it is printed at all). This behavior can be simulated by using the
-\texttt{F} option, in which case the first parameter (the function output
-variable) may be left unused.
+\section{Package Option Handling}
+\label{sec:optionhandling}
+As of version 0.2, the option \texttt{disablef} disables the default rendering
+of the function output variable at the upper right corner of the Karnaugh map
+together with a small line extending from the square to the function name
+(option \texttt{f} in the third parameter). This is more common found in
+American textbooks.
\section{Use}
@@ -238,40 +275,41 @@ a and b and the function values 1, 0, 1 and 1 respectively.
\begin{table}[H]
\centering
-\caption{Truth table}
+\caption{A truth table.}
\begin{tabular}{cc|c}
-\hline
+%\hline
a & b & S \\ \hline
0 & 0 & 1 \\
0 & 1 & 0 \\
1 & 0 & 1 \\
1 & 1 & 1 \\
-\hline
+%\hline
\end{tabular}
\end{table}
-Using the command
+The command
\begin{verbatim}
\askmapii{S}{ab}{i}{1011}{}
\end{verbatim}
will produce the two-variable Karnaugh map as presented in
-figure~\ref{fig:askmapii}.
+Figure~\ref{fig:askmapii}.
\begin{figure}[h]
\centering
\askmapunitlength=0.88cm
\askmapii{S}{ab}{i}{1011}{}%
-\caption{Karnaughmap for two variables}
+\caption{Karnaugh map for two variables.}
\label{fig:askmapii}
\end{figure}
As you can see, the function output variable is printed top right of the
Karnaugh map, with a small line from the variable to the top right square.
The most significant function input variable is printed on the top left just
-above the small line extending from the top left square. The least significant
+above the small line extending from the top left square (the variable
+separator line). The least significant
function input variable is printed just below that line. The bit combinations
-for the most significant function input variable is printed on top of the
+for the most significant function input variables are printed on top of the
columns, the bit combinations of the least significant function input variable
-is printed on the left of the rows. You can see how the function values are
+are printed left of the rows. You can see how the function values are
placed in the squares by observing the small index numbers in the lower left
corners of the squares.
\medskip
@@ -281,18 +319,36 @@ The command
\askmapiii{S}{abc}{}{10110110}{}
\end{verbatim}
will produce a three-variable Karnaugh map as presented in
-figure~\ref{fig:askmapiii}. In this case, the index numbers are not printed.
+Figure~\ref{fig:askmapiii}. In this case, the index numbers are not printed.
\begin{figure}[H]
\centering
\askmapunitlength=0.88cm
\askmapiii{S}{abc}{}{10110110}{}%
-\caption{Karnaugh map for three variables}
+\caption{Karnaugh map for three variables.}
\label{fig:askmapiii}
\end{figure}
-Let's draw a Karnaugh map for a logic function with four inputs and one output.
-The output will become logic 1 if three or four inputs are logic 1, otherwise
+Sometimes you need a three-variable Karnaugh map that is printed in the
+vertical direction. It will leave you room to print accompanying text to
+the left or right of the map. The command
+
+\begin{verbatim}
+ \askmapiiialt{S}{abc}{}{10110110}{}
+\end{verbatim}
+will produce the vertical oriented version of the three-variable Karnaugh map
+as can been seen in Figure~\ref{fig:askmapiiialt}.
+
+\begin{figure}[H]
+\centering
+\askmapunitlength=0.88cm
+\askmapiiialt{S}{abc}{}{10110110}{}%
+\caption{Vertical version of the Karnaugh map for three variables.}
+\label{fig:askmapiiialt}
+\end{figure}
+
+Let's draw a Karnaugh map for a logic function with four inputs.
+The output will become logic~1 if three or four inputs are logic 1, otherwise
the output is logic 0. (Of course you can set up a truth table first; this is
left as an exercise to the reader).
The command
@@ -300,13 +356,13 @@ The command
\askmapiv{S}{abcd}{}{0000000100010111}{}
\end{verbatim}
will produce a four-variable Karnaugh map for the given logic function and is
-presented in figure~\ref{fig:askmapiv}.
+presented in Figure~\ref{fig:askmapiv}.
\begin{figure}[H]
\centering
\askmapunitlength=0.88cm
- \askmapiv{S}{abdc}{}{0000000100010111}{}
-\caption{Karnaugh map for four variables}
+ \askmapiv{S}{abcd}{}{0000000100010111}{}
+\caption{Karnaugh map for four variables.}
\label{fig:askmapiv}
\end{figure}
@@ -314,17 +370,17 @@ Using the command
\begin{verbatim}
\askmapv{S}{abcde}{}{00101101010010111011110011101011}{}
\end{verbatim}
-will produce a five-variable Karnaugh map as shown in figure \ref{fig:askmapv}.
+a five-variable Karnaugh map is produced as shown in Figure~\ref{fig:askmapv}.
\begin{figure}[H]
\centering
\askmapunitlength=0.88cm
\askmapv{S}{abcde}{}{00101101010010111011110011101011}{}
-\caption{Karnaugh map for five variables}
+\caption{Karnaugh map for five variables.}
\label{fig:askmapv}
\end{figure}
-Of course you can do a lot more with the parameters of the commands. You
+Of course you can do a lot more with the arguments of the commands. You
can use inline math to produce sophisticated variable names, you can
use coloring for the function values. However, please note that the second
and fourth parameter act as a list of tokens, so you have to use braces to
@@ -343,77 +399,518 @@ will not work. You have to write
\end{verbatim}
The fifth parameter can be used to supply user created picture commands
-such as dashed rectangles of ovals to emphasize the simplifications
-in the function. Note that the origin
-of the picture (0,0) is at the lower left corner of the lower left square.
-Section \ref{sec:examples} shows some examples.
+such as dashed rectangles or ovals to emphasize the simplifications in the
+function. Note that the origin of the picture (0,0) is at the lower left
+corner of the lower left square. Sections~\ref{sec:drawing} and~%
+\ref{sec:examples} show some examples.
\bigskip
-The size of the indexes is scriptsize, the size of the bit combinations
-on the edges of the Karnaugh maps is footnotesize. All other text is
-in normalsize. Note that there are no commands to change the font sizes
-in the Karnaugh diagrams.
+%%%The size of the indexes is scriptsize, the size of the bit combinations
+%%%on the edges of the Karnaugh maps is footnotesize. All other text is
+%%%in normalsize. Note that there are no commands to change the font sizes
+%%%in the Karnaugh maps.
+%%%\bigskip
The command \cs{askmap} provides a drop-in replacement for the command
\cs{karnaughmap} from the Karnaugh package. The command
\begin{verbatim}
- \askmap{4}{F}{abcd}{0100101010100011}{}
+ \askmap{4}{S}{abcd}{0100101010100011}{}
\end{verbatim}
-produces the Karnaugh map in figure \ref{fig:askmap}.
+produces the Karnaugh map in Figure \ref{fig:askmap}.
\begin{figure}[H]
\centering
\askmapunitlength=0.88cm
- \askmap{4}{F}{abcd}{0100101010100011}{}
-\caption{Karnaugh map using drop-in replacement}
+ \askmap{4}{S}{abcd}{0100101010100011}{}
+\caption{Karnaugh map using drop-in replacement.}
\label{fig:askmap}
\end{figure}
-Only Karnaugh maps of two to five variables are supported, any other number
-will trigger a warning. Please note that the \cs{kvindex}, \cs{kvindexsize}
-and \cs{kvcontentsize} commands are not supported.
-\medskip
+Note that when using this command the output function variable is always
+printed.
+
+Only Karnaugh maps of one to five variables are supported, any other number
+will trigger a warning. Please note that \cs{kvindex} and \cs{kvnoindex} are
+supported as can be seen in Figure~\ref{fig:karnaughmapindex}, but
+\cs{kvindexsize} and \cs{kvcontentsize} commands are not supported.
+\begin{verbatim}
+ \kvindex
+ \askmap{4}{f(a,b,c,d):}{abcd}{1110011001100110}{}
+\end{verbatim}
+\begin{figure}[H]
+\centering
+\askmapunitlength=0.88cm
+ \kvindex
+ \askmap{4}{f(a,b,c,d):}{abcd}{1110011001100110}{}
+\caption{Karnaugh map using the \Package{kvmacros} package.}
+\label{fig:karnaughmapindex}
+\end{figure}
%% The next lines are commented out by default. If you want these to appear
%% in the resulting PDF, you have to copy the kvmacros.tex file in the
%% current directory, uncomment the next lines and LaTex this file.
%%
-%%The packages \Package{kvmacros} and \Package{askmaps} can be used in the same
-%%document.
-%%\begin{figure}[H]
-%%\centering
-%% \karnaughmap{4}{f(a,b,c,d):}{abcd}{1110011001100110}{}
-%%\caption{Karnaugh map using the \Package{kvmacros} package}
-%%\label{fig:karnaughmap}
-%%\end{figure}
+The packages \Package{kvmacros} and \Package{askmaps} can be used in the same
+document as shown in Figure \ref{fig:karnaughmapnoindex}.
+\begin{verbatim}
+ \kvnoindex
+ \karnaughmap{4}{f(a,b,c,d):}{abcd}{1110011001100110}{}
+\end{verbatim}
+\begin{figure}[H]
+\centering
+ \kvnoindex
+ \karnaughmap{4}{f(a,b,c,d):}{abcd}{1110011001100110}{}
+\caption{Karnaugh map using the \Package{kvmacros} package.}
+\label{fig:karnaughmapnoindex}
+\end{figure}
-\newpage
+The lenght of the line separating the input variables can be set to a
+different value as shown in Figure~\ref{fig:difflenvarsep}.
+
+\begin{verbatim}
+ \renewcommand{\askmapvarsep}{0.6}
+ \askmapiii{S}{abc}{}{00111010}{}
+ \renewcommand{\askmapvarsep}{0.9}
+ \askmapiii{F}{xyz}{}{11111010}{}
+\end{verbatim}
+\begin{figure}[H]
+\centering
+\renewcommand{\askmapvarsep}{0.6}
+\askmapiii{S}{abc}{}{00111010}{}
+\renewcommand{\askmapvarsep}{0.9}
+\askmapiii{F}{xyz}{}{11111010}{}
+\caption{Different lengths of the variable separator line.}
+\label{fig:difflenvarsep}
+\end{figure}
+
+
+
+\section{Drawing covers and more}
+\label{sec:drawing}
+One of the uses of Karnaugh maps is to simplify logic functions. The
+simplifications are usually shown as (part of) circles or ovals (also squares can be used) combining
+the function values that make up the simplified terms (either product terms
+or sum terms).% These
+
+Let's begin with a simple example. The code is shown below, the map is
+shown in Figure~\ref{fig:kmapsthree}. Note that one function variable is
+covered by all three ovals, hence it looks as if it is covered by a circle.
+
+\begin{minipage}[c]{0.5\textwidth}
+\begin{verbatim}
+ \askmapiii{s}{abc}{}{00010111}{%
+ \put(2.5,1.0){\oval(0.8,1.8)}%
+ \put(2.0,0.5){\oval(1.8,0.8)}%
+ \put(3.0,0.5){\oval(1.8,0.8)}%
+ }%
+\end{verbatim}
+\end{minipage}\hfill%
+\begin{minipage}[c]{0.5\textwidth}
+\begin{figure}[H]
+\centering
+\askmapunitlength=0.88cm
+\askmapiii{s}{abc}{}{00010111}{%
+\put(2.5,1.0){\oval(0.8,1.8)}%
+\put(2.0,0.5){\oval(1.8,0.8)}%
+\put(3.0,0.5){\oval(1.8,0.8)}%
+}%
+\caption{Karnaugh map for three variables.}
+\label{fig:kmapsthree}
+\end{figure}
+\end{minipage}
+\bigskip
+
+Function values on the edges of Karnaugh maps can be combined in one term.
+The values are not adjacent in the maps so covering oval or circle has to be
+split. This is shown in Figure~\ref{fig:kmapsthreemarkedges}. The code is
+shown left. As can be seen, for marking the edges only half a circle has to
+be drawn. Note the lines extending the edges of the map.
+
+
+\bigskip
+\begin{minipage}[c]{0.5\textwidth}
+\begin{verbatim}
+ \askmapiii{s}{abc}{}{11100111}{%
+ \put(2.5,1.0){\oval(0.8,1.8)}%
+ \put(1.0,1.5){\oval(1.8,0.8)}%
+ \put(3.5,0.5){\oval(0.8,0.8)[l]}%
+ \put(3.5,0.9){\line(1,0){0.7}}%
+ \put(3.5,0.1){\line(1,0){0.7}}%
+ \put(0.5,0.5){\oval(0.8,0.8)[r]}%
+ \put(0.5,0.9){\line(-1,0){0.7}}%
+ \put(0.5,0.1){\line(-1,0){0.7}}%
+ }%
+\end{verbatim}
+\end{minipage}\hfill%
+\begin{minipage}[c]{0.5\textwidth}
+\vspace*{-3\baselineskip}
+\begin{figure}[H]
+\centering
+\askmapiii{s}{abc}{}{11100111}{%
+\put(2.5,1.0){\oval(0.8,1.8)}%
+\put(1.0,1.5){\oval(1.8,0.8)}%
+\put(3.5,0.5){\oval(0.8,0.8)[l]}%
+\put(3.5,0.9){\line(1,0){0.7}}%
+\put(3.5,0.1){\line(1,0){0.7}}%
+\put(0.5,0.5){\oval(0.8,0.8)[r]}%
+\put(0.5,0.9){\line(-1,0){0.7}}%
+\put(0.5,0.1){\line(-1,0){0.7}}%
+}%
+\caption{Example of how to mark edges.}
+\label{fig:kmapsthreemarkedges}
+\end{figure}
+\end{minipage}
+\bigskip
+
+Making ``square'' ovals doesn't always produce a good result as can be seen
+in Figure~\ref{fig:kmapsquareoval}. The column second to the right seems to
+be covered by it's own oval.
+
+\bigskip
+\begin{minipage}[c]{0.5\textwidth}
+\begin{verbatim}
+ \askmapiii{s}{abc}{}{00111111}{%
+ \put(2.5,1.0){\oval(0.8,1.8)[rb]}%
+ \put(2.5,1.0){\oval(0.8,1.8)[rt]}%
+ \put(1.5,1.0){\oval(0.8,1.8)[lb]}%
+ \put(1.5,1.0){\oval(0.8,1.8)[lt]}%
+ \put(1.5,1.9){\line(1,0){1.0}}%
+ \put(1.5,0.1){\line(1,0){1.0}}%
+ \put(3.5,1.0){\oval(0.8,1.8)[rb]}%
+ \put(3.5,1.0){\oval(0.8,1.8)[rt]}%
+ \put(2.5,1.0){\oval(0.8,1.8)[lb]}%
+ \put(2.5,1.0){\oval(0.8,1.8)[lt]}%
+ \put(2.5,1.9){\line(1,0){1.0}}%
+ \put(2.5,0.1){\line(1,0){1.0}}%
+ }%
+\end{verbatim}
+\end{minipage}\hfill%
+\begin{minipage}[c]{0.5\textwidth}
+\vspace*{-3\baselineskip}
+\begin{figure}[H]
+\centering
+\askmapiii{s}{abc}{}{00111111}{%
+\put(2.5,1.0){\oval(0.8,1.8)[rb]}% the square oval
+\put(2.5,1.0){\oval(0.8,1.8)[rt]}% in the middle
+\put(1.5,1.0){\oval(0.8,1.8)[lb]}% of the map
+\put(1.5,1.0){\oval(0.8,1.8)[lt]}%
+\put(1.5,1.9){\line(1,0){1.0}}%
+\put(1.5,0.1){\line(1,0){1.0}}%
+\put(3.5,1.0){\oval(0.8,1.8)[rb]}% the square oval
+\put(3.5,1.0){\oval(0.8,1.8)[rt]}% on the right
+\put(2.5,1.0){\oval(0.8,1.8)[lb]}% of the map
+\put(2.5,1.0){\oval(0.8,1.8)[lt]}%
+\put(2.5,1.9){\line(1,0){1.0}}%
+\put(2.5,0.1){\line(1,0){1.0}}%
+}%
+\caption{Example of bad use of ovals.}
+\label{fig:kmapsquareoval}
+\end{figure}
+\end{minipage}
+\bigskip
+
+
+
+
+
+Let's try a four-variable map, see Figure~\ref{fig:kmapsthreemarkedges2}
+and accompanying code. Here we have deliberately used an oval with a
+bigger size (see code line marked \textasteriskcentered) otherwise it will
+interfere with the covering of the lower left and right edges. An example
+of good use of a ``square'' oval can be found in
+Figure~\ref{fig:kmapforfourvarcorner}.
+
+\bigskip
+\begin{minipage}[c]{0.5\textwidth}
+\begin{verbatim}
+ \askmapiv{s}{abcd}{}{0111010001110111}{%
+ \put(2.0,2.5){\oval(3.8,0.8)}%
+ \put(0.5,1.0){\oval(0.8,1.8)[rb]}%
+ \put(0.5,1.0){\oval(0.8,1.8)[rt]}%
+ \put(0.5,1.9){\line(-1,0){0.7}}%
+ \put(0.5,0.1){\line(-1,0){0.7}}%
+ \put(3.0,1.0){\oval(1.8,1.8)}% (*)
+ \put(3.5,1.0){\oval(0.8,1.8)[lb]}%
+ \put(3.5,1.0){\oval(0.8,1.8)[lt]}%
+ \put(3.5,1.9){\line(1,0){0.7}}%
+ \put(3.5,0.1){\line(1,0){0.7}}%
+ }%
+\end{verbatim}
+\end{minipage}\hfill%
+\begin{minipage}[c]{0.5\textwidth}
+\vspace*{-2\baselineskip}
+\begin{figure}[H]
+\centering
+\askmapiv{s}{abcd}{}{0111010001110111}{%
+\put(2.0,2.5){\oval(3.8,0.8)}%
+\put(0.5,1.0){\oval(0.8,1.8)[rb]}%
+\put(0.5,1.0){\oval(0.8,1.8)[rt]}%
+\put(0.5,1.9){\line(-1,0){0.7}}%
+\put(0.5,0.1){\line(-1,0){0.7}}%
+\put(3.0,1.0){\oval(1.8,1.8)}%
+\put(3.5,1.0){\oval(0.8,1.8)[lb]}%
+\put(3.5,1.0){\oval(0.8,1.8)[lt]}%
+\put(3.5,1.9){\line(1,0){0.7}}%
+\put(3.5,0.1){\line(1,0){0.7}}%
+}%
+\caption{Example of how to mark edges.}
+\label{fig:kmapsthreemarkedges2}
+\end{figure}
+\end{minipage}
+\bigskip
+
+
+
+Every textbook on using Karnaugh maps shows how to combine the corners of a
+four-variable map. The complete code is shown below. The result is shown in
+Figure~\ref{fig:kmapforfourvarcorner}. Each corner marking
+consists of three drawing command: two lines (to the left, right up or
+down) and one (part of a) oval (right-bottom, left-bottom, right-top
+and right-bottom).
+
+
+\begin{verbatim}
+ \begin{figure}[H]
+ \centering
+ \askmapiv{s}{abcd}{}{1010000010100000}{%
+ \put(0.5,3.5){\oval(0.8,0.8)[rb]}% left-top
+ \put(0.5,3.1){\line(-1,0){0.7}}%
+ \put(0.9,3.5){\line(0,1){0.7}}%
+ \put(3.5,3.5){\oval(0.8,0.8)[lb]}% right-top
+ \put(3.5,3.1){\line(1,0){0.7}}%
+ \put(3.1,3.5){\line(0,1){0.7}}%
+ \put(0.5,0.5){\oval(0.8,0.8)[rt]}% left-bottom
+ \put(0.5,0.9){\line(-1,0){0.7}}%
+ \put(0.9,0.5){\line(0,-1){0.7}}%
+ \put(3.5,0.5){\oval(0.8,0.8)[lt]}% right-bottom
+ \put(3.5,0.9){\line(1,0){0.7}}%
+ \put(3.1,0.5){\line(0,-1){0.7}}%
+ \put(2.5,2.0){\oval(0.8,1.8)[rb]}% the square oval
+ \put(2.5,2.0){\oval(0.8,1.8)[rt]}% in the middle
+ \put(1.5,2.0){\oval(0.8,1.8)[lb]}% of the map
+ \put(1.5,2.0){\oval(0.8,1.8)[lt]}%
+ \put(1.5,2.9){\line(1,0){1.0}}%
+ \put(1.5,1.1){\line(1,0){1.0}}%
+ }%
+ \caption{The corners of the Karnaugh map are connected.}
+ \label{fig:kmapforfourvarcorner}
+ \end{figure}
+\end{verbatim}
+
+\begin{figure}[H]
+\centering
+\askmapiv{s}{abcd}{}{1010010110100101}{%
+\put(0.5,3.5){\oval(0.8,0.8)[rb]}% left-top
+\put(0.5,3.1){\line(-1,0){0.7}}%
+\put(0.9,3.5){\line(0,1){0.7}}%
+\put(3.5,3.5){\oval(0.8,0.8)[lb]}% right-top
+\put(3.5,3.1){\line(1,0){0.7}}%
+\put(3.1,3.5){\line(0,1){0.7}}%
+\put(0.5,0.5){\oval(0.8,0.8)[rt]}% left-bottom
+\put(0.5,0.9){\line(-1,0){0.7}}%
+\put(0.9,0.5){\line(0,-1){0.7}}%
+\put(3.5,0.5){\oval(0.8,0.8)[lt]}% right-bottom
+\put(3.5,0.9){\line(1,0){0.7}}%
+\put(3.1,0.5){\line(0,-1){0.7}}%
+\put(2.5,2.0){\oval(0.8,1.8)[rb]}% the square oval
+\put(2.5,2.0){\oval(0.8,1.8)[rt]}% in the middle
+\put(1.5,2.0){\oval(0.8,1.8)[lb]}% of the map
+\put(1.5,2.0){\oval(0.8,1.8)[lt]}%
+\put(1.5,2.9){\line(1,0){1.0}}%
+\put(1.5,1.1){\line(1,0){1.0}}%
+}%
+\caption{The corners of the Karnaugh map are connected.}
+\label{fig:kmapforfourvarcorner}
+\end{figure}
+
+
+When writing a textbook on the use of Karnaugh maps, it sometimes helps if
+a cover is accompanied with the term it covers.
+Below is a fine example of explaining the simplification of a logic function
+by showing the product term at each cover. The truth table is shown at the
+right.
+
+\begin{verbatim}
+\begin{figure}[H]
+\begin{subfigure}[c]{0.5\textwidth}
+\centering
+\askmapiii{s}{abc}{}{00010111}{%
+\put(2.5,1.0){\oval(0.8,1.8)}%
+\put(3.0,3.0){\makebox(0,0){$a\cdot b$}}%
+\put(3.0,2.8){\line(-1,-5.0){0.2}}%
+\put(2.0,0.5){\oval(1.8,0.8)}%
+\put(0.5,-0.8){\makebox(0,0){$b\cdot c$}}%
+\put(0.5,-0.6){\line(1,0.9){0.8}}%
+\put(3.0,0.5){\oval(1.8,0.8)}%
+\put(4.5,-0.8){\makebox(0,0){$a\cdot c$}}%
+\put(4.5,-0.6){\line(-1,0.9){0.8}}%
+}%
+\end{subfigure}%
+\begin{subfigure}[c]{0.5\textwidth}
+\centering
+\begin{tabular}{ccc|c}
+$a$ & $b$ & $c$ & $s$ \\ \hline
+ 0 & 0 & 0 & 0 \\
+ 0 & 0 & 1 & 0 \\
+ 0 & 1 & 0 & 0 \\
+ 0 & 1 & 1 & 1 \\
+ 1 & 0 & 0 & 0 \\
+ 1 & 0 & 1 & 1 \\
+ 1 & 1 & 0 & 1 \\
+ 1 & 1 & 1 & 1 \\
+\end{tabular}
+\end{subfigure}%
+\bigskip\caption{Karnaugh map for three variables.}
+\label{fig:karnaughmajorfunctie}
+\end{figure}
+\end{verbatim}
+
+
+\begin{figure}[H]
+\begin{subfigure}[c]{0.5\textwidth}
+\centering
+\askmapunitlength=0.88cm
+\askmapiii{s}{abc}{}{00010111}{%
+\put(2.5,1.0){\oval(0.8,1.8)}%
+\put(3.0,3.0){\makebox(0,0){$a\cdot b$}}%
+\put(3.0,2.8){\line(-1,-5.0){0.2}}%
+\put(2.0,0.5){\oval(1.8,0.8)}%
+\put(0.5,-0.8){\makebox(0,0){$b\cdot c$}}%
+\put(0.5,-0.6){\line(1,0.9){0.8}}%
+\put(3.0,0.5){\oval(1.8,0.8)}%
+\put(4.5,-0.8){\makebox(0,0){$a\cdot c$}}%
+\put(4.5,-0.6){\line(-1,0.9){0.8}}%
+}%
+\end{subfigure}%
+\begin{subfigure}[c]{0.5\textwidth}
+\centering
+\begin{tabular}{ccc|c}
+$a$ & $b$ & $c$ & $s$ \\ \hline
+ 0 & 0 & 0 & 0 \\
+ 0 & 0 & 1 & 0 \\
+ 0 & 1 & 0 & 0 \\
+ 0 & 1 & 1 & 1 \\
+ 1 & 0 & 0 & 0 \\
+ 1 & 0 & 1 & 1 \\
+ 1 & 1 & 0 & 1 \\
+ 1 & 1 & 1 & 1 \\
+\end{tabular}
+\end{subfigure}%
+\bigskip\caption{Karnaugh map for three variables.}
+\label{fig:karnaughmajorfunction}
+\end{figure}
+
+A very notable feature is when you use Ti\textsl{k}Z. When you use the package with
+
+\begin{verbatim}
+\usepackage{tikz}
+\end{verbatim}
+
+you can use Ti\textsl{k}Z' opacity control to add opaque solid rectangles in the back:
+
+\begin{verbatim}
+\askmapii{F}{xy}{f}{0111}{
+\setlength\fboxsep{0pt}\linethickness{0pt}
+\put(1.1,0.1){\pgfsetfillopacity{0.2}\colorbox{red}{\framebox(0.8,1.8){}}\pgfsetfillopacity{1}}%
+\put(0.1,0.1){\pgfsetfillopacity{0.2}\colorbox{blue}{\framebox(1.8,0.8){}}\pgfsetfillopacity{1}}%
+}
+\end{verbatim}
+
+\askmapii{F}{xy}{f}{0111}{
+\setlength\fboxsep{0pt}\linethickness{0pt}
+\put(1.1,0.1){\pgfsetfillopacity{0.2}\colorbox{red}{\framebox(0.8,1.8){}}\pgfsetfillopacity{1}}%
+\put(0.1,0.1){\pgfsetfillopacity{0.2}\colorbox{blue}{\framebox(1.8,0.8){}}\pgfsetfillopacity{1}}%
+}
+
+\bigskip
+In fact, you can use a \texttt{tikzpicture} environment to use Ti\textsl{k}Z commands
+but you have to set an invisible point to coordinate to (0,0):
+
+\begin{verbatim}
+\askmapii{F}{xy}{f}{0111}{%
+\begin{tikzpicture}[x=\askmapunitlength,y=\askmapunitlength]%
+\draw[draw=none,fill=none] (0,0) -- (0,0); % Set default corner
+\draw[red, ultra thick] (0,0) rectangle (2,2);%
+\end{tikzpicture}%
+}
+\end{verbatim}
+
+\askmapii{F}{xy}{f}{0111}{%
+\begin{tikzpicture}[x=\askmapunitlength,y=\askmapunitlength]%
+\draw[draw=none,fill=none] (0,0) -- (0,0); % Set default corner
+\draw[red,ultra thick] (0,0) rectangle (2,2);%
+\end{tikzpicture}%
+}
+
+
+\section{Additional command}
+The command \cmdinvoke{askmapindexsize} sets the size and typeface of the minterm numbers in the cells. The default definition is set to
+
+\begin{lstlisting}
+\newcommand{\askmapindexsize}{\scriptsize\slshape}
+\end{lstlisting}
+
+The command \cmdinvoke{askmapcontentsize} sets the size and typeface for the cell's contents. The default definition is
+
+\begin{lstlisting}
+\newcommand{\askmapcontentsize}{\normalsize}
+\end{lstlisting}
+
+The command \cmdinvoke{askmapbitcombinationsize} sets the size and typeface for the bit combinations at the top and the left. The default definition is
+
+\begin{lstlisting}
+\newcommand{\askmapbitcombinationsize}{\footnotesize}
+\end{lstlisting}
+
+The command \cmdinvoke{askmapvarsep} sets the relative line length of the variable separator on the left of the Karnaugh map. The default definition is
+
+\begin{lstlisting}
+\newcommand{\askmapvarsep}{0.70}
+\end{lstlisting}
+
+These commands may be changed using the appropriate \cmdinvoke{renewcommand} command.
+
+
+%\newpage
\section{Examples}
\label{sec:examples}
\askmapunitlength=0.88cm
-The Karnaugh maps for two variables: plain, with indexes, without function
-output variable.
+The most simple Karnaugh maps you can make with only one variable.
+\begin{verbatim}
+ \askmapi{s}{a}{i}{00}{}
+ \askmapi{s}{a}{}{01}{}
+ \askmapi{s}{a}{}{10}{}
+ \askmapi{s}{a}{}{11}{}
+\end{verbatim}
+\askmapi{s}{a}{i}{00}{}%
+\askmapi{s}{a}{}{01}{}%
+\askmapi{s}{a}{}{10}{}%
+\askmapi{s}{a}{}{11}{}%
+\bigskip\bigskip
+
+The Karnaugh maps for two variables: plain, with indexes and output
+variable.
\begin{verbatim}
- \askmapii{S}{ab}{}{1010}{}
+ \askmapii{S}{ab}{F}{1010}{}
\askmapii{S}{ab}{i}{1110}{}
- \askmapii{S}{ab}{F}{1110}{}
+ \askmapii{S}{ab}{}{1110}{}
\end{verbatim}
-\askmapii{S}{ab}{}{1010}{}
+\askmapii{S}{ab}{F}{1010}{}
\askmapii{S}{ab}{i}{1110}{}
-\askmapii{S}{ab}{F}{1110}{}
+\askmapii{S}{ab}{}{1110}{}
\bigskip\bigskip
-The Karnaugh maps for three variables: plain, with indexes but without function
+The Karnaugh maps for three variables: plain, with indexes and function
output variable.
\begin{verbatim}
- \askmapiii{S}{abc}{}{00111010}{}
- \askmapiii{F}{xyz}{iF}{11111010}{}
+ \askmapiii{S}{abc}{F}{00111010}{}
+ \askmapiii{F}{xyz}{i}{11111010}{}
\end{verbatim}
-\askmapiii{S}{abc}{}{00111010}{}
-\askmapiii{F}{xyz}{iF}{11111010}{}
+\askmapiii{S}{abc}{F}{00111010}{}
+\askmapiii{F}{xyz}{i}{11111010}{}
\bigskip\bigskip
-The Karnaugh maps for four variables: without function output variable, with
+The Karnaugh maps for four variables: plain, with function output variable and
indexes.
\begin{verbatim}
\askmapiv{f}{wxyz}{F}{1110001101000101}{}
@@ -425,19 +922,17 @@ indexes.
You can also do math things by using the known \$ signs... and you can make an
empty map for your exams...
-\newpage
\begin{verbatim}
\askmapii{$S_{0}$}{{$a_{1}$}{$a_{0}$}}{}{1010}{}
- \askmapii{}{}{}{}{}
+ \askmapii{}{}{F}{}{}
\end{verbatim}
\askmapii{$S_{0}$}{{$a_{1}$}{$a_{0}$}}{}{1010}{}
-\askmapii{}{}{}{}{}
+\askmapii{}{}{F}{}{}
\bigskip\bigskip
-You can do the math thing in roman font... and of course you can make a
-\textsl{really} empty map for your exams...
+You can do the math thing in roman upright font... and of course you can make
+a \textsl{really} empty map for your exams...
\begin{verbatim}
- \begin{verbatim}
\askmapiii{$\mathrm{M^{n+1}_{0}}$}{{$\mathrm{M^{n}_{2}}$}{$\mathrm{M^{n}_{1}}$}
{$\mathrm{M^{n}_{0}}$}}{}{11100111}{}
\askmapiii{}{}{BF}{}{}
@@ -447,13 +942,48 @@ You can do the math thing in roman font... and of course you can make a
\askmapiii{}{}{BF}{}{}
\bigskip\bigskip
+The vertical version of the three variable map, used in a \verb|minipage|
+environment:
+\begin{verbatim}
+\begin{minipage}[c]{0.25\textwidth}
+\askmapiiialt{s}{{c$_{in}$}ab}{}{01101001}{}
+\end{minipage}
+\begin{minipage}[c]{0.25\textwidth}
+\askmapiiialt{c$_{out}$}{{c$_{in}$}ab}{}{00010111}{}
+\end{minipage}\hfill%
+\begin{minipage}[c]{0.40\textwidth}
+As you can see on the left, the function of the sum of the full adder cannot
+be simplified as all 1's are placed diagonal in the map. This means that the
+function for the sum can be expressed with XOR ports.
+
+The carry-out function on the otherhand can be simplified.
+\end{minipage}
+\end{verbatim}
+
+\begin{minipage}[c]{0.25\textwidth}
+\askmapiiialt{s}{{c$_{in}$}ab}{}{01101001}{}
+\end{minipage}
+\begin{minipage}[c]{0.25\textwidth}
+\askmapiiialt{c$_{out}$}{{c$_{in}$}ab}{}{00010111}{}
+\end{minipage}\hfill%
+\begin{minipage}[c]{0.40\textwidth}
+As you can see on the left, the function of the sum of the full adder cannot
+be simplified as all 1's are placed diagonal in the map. This means that the
+function for the sum can be expressed with XOR ports.
+
+The carry-out function on the otherhand can be simplified.
+\end{minipage}
+
+\bigskip\bigskip
+
+
You can do things with don't cares...
\begin{verbatim}
\askmapii{S}{ab}{}{011-}{}
- \askmapiii{S}{abc}{F}{001--10-}{}
+ \askmapiii{S}{abc}{}{001--10-}{}
\end{verbatim}
\askmapii{S}{ab}{}{011-}{}
-\askmapiii{S}{abc}{F}{001--10-}{}
+\askmapiii{S}{abc}{}{001--10-}{}
\bigskip\bigskip
You can use colors and empty function values and variables as values too...
@@ -467,7 +997,7 @@ You can use colors and empty function values and variables as values too...
\askmapii{S}{ab}{}{{$i_{0}$}{$i_{1}$}{$i_{2}$}{$i_{3}$}}{}
\bigskip
-\newpage
+
You can set the font to something else ... and use sans math font ...
\begin{verbatim}
{\fontfamily{phv}\selectfont%
@@ -492,9 +1022,11 @@ that the origin of the picture (0,0) is at the lower left corner of the lower
left square. It is also possible to use \cs{raisebox} in conjuction with
horizontal spacing to adjust the placing of the left (least significant)
variable(s).
+
+%\newpage
\begin{verbatim}
{\fontfamily{phv}\selectfont\sansmath
- \askmapiii{F}{xy{\raisebox{2ex}{\ \ z}}}{}{11100111}{% raise Z input
+ \askmapiii{F}{xy{\raisebox{2ex}{\ \ z}}}{f}{11100111}{% raise Z input
\color{red}\put(0.1,0.1){\dashbox{0.1}(0.8,1.8){}}%
\color{blue}\put(1.1,1.1){\dashbox{0.1}(1.8,0.8){}}%
\color{darkgreen}\put(2.1,0.1){\dashbox{0.1}(1.8,0.8){}}%
@@ -511,7 +1043,7 @@ variable(s).
}}%
\end{verbatim}
{\fontfamily{phv}\selectfont\sansmath
-\askmapiii{F}{xy{\raisebox{1.5ex}{\ \ z}}}{}{11100111}{% raise Z input
+\askmapiii{F}{xy{\raisebox{1.5ex}{\ \ z}}}{f}{11100111}{% raise Z input
\color{red}\put(0.1,0.1){\dashbox{0.1}(0.8,1.8){}}%
\color{blue}\put(1.1,1.1){\dashbox{0.1}(1.8,0.8){}}%
\color{darkgreen}\put(2.1,0.1){\dashbox{0.1}(1.8,0.8){}}%
@@ -541,19 +1073,21 @@ affect the rendering of the text...
\askmapii{S}{ab}{}{1011}{}
\end{verbatim}
-{\askmapunitlength=1cm
-\askmapii{S}{ab}{}{1011}{}
-\askmapunitlength=0.88cm
-\askmapii{S}{ab}{}{1011}{}
-\askmapunitlength=0.8cm
-\askmapii{S}{ab}{}{1011}{}
-\askmapunitlength=0.5cm
+{\askmapunitlength=1cm%
+\askmapii{S}{ab}{}{1011}{}%
+\askmapunitlength=0.88cm%
+\askmapii{S}{ab}{}{1011}{}%
+\askmapunitlength=0.8cm%
+\askmapii{S}{ab}{}{1011}{}%
+\askmapunitlength=0.5cm%
\askmapii{S}{ab}{}{1011}{}}
\bigskip\bigskip
+%\newpage
An example directly from the Karnaugh package:
\begin{verbatim}
+ \kvnoindex
\askmap{4}{$f(a,b,c,d):$}{{$a$}{$b$}{$c$}{$d$}}%
{0110011001100110}%
{%
@@ -564,26 +1098,88 @@ An example directly from the Karnaugh package:
}
\end{verbatim}
{\askmapunitlength=0.88cm
+\kvnoindex
\askmap{4}{$f(a,b,c,d):$}{{$a$}{$b$}{$c$}{$d$}}%
{0110011001100110}%
{%
-\put(0,2){\oval(1.9,1.9)[r]}
-\put(4,2){\oval(1.9,1.9)[l]}
-\put(2,0){\oval(1.9,1.9)[t]}
-\put(2,4){\oval(1.9,1.9)[b]}
+\put(0,2){\oval(1.8,1.8)[r]}
+\put(4,2){\oval(1.8,1.8)[l]}
+\put(2,0){\oval(1.8,1.8)[t]}
+\put(2,4){\oval(1.8,1.8)[b]}
}}
\bigskip
-but please note that the ovals do not cover the logic 1's in the Karnaughmap
-because the function values are placed differently.
+but please note that the ovals do not cover the logic 1's in the Karnaugh map
+because the function values are placed in a different order.
+
+One can use Ti\textsl{k}Z. Please note you have to set a default corner to
+(0,0), because Ti\textsl{k}Z will create a bounding box around the the
+\texttt{tikzpicture}:
+
+\begin{verbatim}
+A static hazard can be found by inspecting the Karnaugh map and see if a change
+of minterms will cross implicants:
+
+\askmapiii{F}{xyz}{}{011100100}{%
+\begin{tikzpicture}[x=\askmapunitlength,y=\askmapunitlength]%
+\draw[draw=none,fill=none] (0,0) -- (0,0); % Set default corner
+\draw[red] (0.1,0.1) rectangle (1.9,0.9);
+\draw[blue] (1.1,1.1) rectangle (2.9,1.9);
+\draw[purple,thick,->] (1.6,1.5) to[bend left] (1.6,0.5);
+\end{tikzpicture}%
+}
+
+The function is $F = \overline{x}z + y\overline{z}$. But if the circuit is
+changing from minterm $m_2$ to $m_3$, a static hazard will occur as can
+be seen by the arrow.
+\end{verbatim}
+
+
+A static hazard can be found by inspecting the Karnaugh map and see if a change
+of minterms will cross implicants:
+
+\askmapiii{F}{xyz}{}{011100100}{%
+\begin{tikzpicture}[x=\askmapunitlength,y=\askmapunitlength]%
+\draw[draw=none,fill=none] (0,0) -- (0,0); % Set default corner
+\draw[red] (0.1,0.1) rectangle (1.9,0.9);
+\draw[blue] (1.1,1.1) rectangle (2.9,1.9);
+\draw[purple,thick,->] (1.6,1.5) to[bend left] (1.6,0.5);
+\end{tikzpicture}%
+}
+
+The function is $F = \overline{x}z + y\overline{z}$. But if the circuit is
+changing from minterm $m_2$ to $m_3$, a static hazard will occur as can
+be seen by the arrow.
+
+
+
+\section{Changelog}
+\label{sec:changelog}
+\begin{verbatim}
+ 4-dec-2013 -- v0.1
+ initial release
+ 23-oct-2020 -- v0.2
+ added option disablef
+ added askmapi - a K-map for one variable
+ added askmapiiialt - alternate (vertical) version op K-map III
+ added formatting index size, contents size and bit combination size.
+ added support for \kvindex and \nokvindex macros when kvmacros.tex is loaded
+ added formatting for left-placed variables
+ implemented a debug possibility
+ implemented linelength of variable separator
+ resolved an issue with multiple overfull \hbox'es
+ added a section on creating covers
+ added examples with Tikz
+\end{verbatim}
+
\newpage
\section{The source code}
\label{sec:sourcecode}
The source code is pretty straight forward. It uses a lot of picture primitives
for drawing the maps. The package uses three macros for processing
-variable-length parameters, which were completely reused from the karnaugh
-package.
+variable-length parameters, which were completely reused from the
+\Package{kvmacros} package.
\lstinputlisting{askmaps.sty}
diff --git a/macros/latex/contrib/ejpecp/README.md b/macros/latex/contrib/ejpecp/README.md
index 8deecbb803..d30626bca4 100644
--- a/macros/latex/contrib/ejpecp/README.md
+++ b/macros/latex/contrib/ejpecp/README.md
@@ -68,6 +68,8 @@ https://github.com/vtex-soft/texsupport.ims-ejpecp
## CHANGELOG
+- 2020/10/21 v1.9.0
+ - Supplement environment added
- 2020/08/26 v1.8.3
- Updated URLs
- 2020/08/05
diff --git a/macros/latex/contrib/ejpecp/ejpecp.dtx b/macros/latex/contrib/ejpecp/ejpecp.dtx
index bc8a7ecaf1..8e9d67c4e1 100644
--- a/macros/latex/contrib/ejpecp/ejpecp.dtx
+++ b/macros/latex/contrib/ejpecp/ejpecp.dtx
@@ -26,7 +26,7 @@
%<class>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<class>\ProvidesClass{ejpecp}
%<*class>
- [2020/08/26 v1.8.3 class for EJP and ECP journals]
+ [2020/10/21 v1.9.0 class for EJP and ECP journals]
%</class>
%<class>\ClassInfo{ejpecp}{Copyright (c) 2019-2020 Edgaras SAKURAS, VTeX, Lithuania.}
%<class>\ClassInfo{ejpecp}{Copyright (c) 2018 Deimantas GALCIUS, VTeX, Lithuania.}
@@ -47,7 +47,7 @@
%</driver>
% \fi
%
-% \CheckSum{805}
+% \CheckSum{845}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -81,6 +81,7 @@
% \changes{v1.7}{2019/04/04}{merged with production version: fixltx2e removed, natbib setup with afterpackage, etc}
% \changes{v1.8.2}{2020/07/30}{no. prefix updated and msc2020}
% \changes{v1.8.3}{2020/08/26}{Update URLs}
+% \changes{v1.9.0}{2020/10/21}{Supplement envirnment}
% \GetFileInfo{ejpecp.dtx}
%
% \DoNotIndex{\newcommand,\newenvironment}
@@ -382,6 +383,26 @@
\hypersetup{pdfauthor={Please see \@doiprefix\@DOI}}%
}%END-PDFFIELDS
+%% Supplement
+\def\supplement@name{Supplementary Material}
+\def\stitle#1{\def\@stitle{#1}}
+\def\stitle@fmt#1{\textbf{#1.}\ }
+\def\sdescription#1{\def\@sdescription{#1}}
+\def\suppsection@fmt{\section*{\supplement@name}}
+\long\def\supplement{\@ifnextchar[{\@supplement}{\@supplement[]}}
+\long\def\@supplement[#1]{%
+ \suppsection@fmt
+ \global\let\suppsection@fmt\smallskip
+ }
+\def\endsupplement{%
+ \@ifundefined{@stitle}%
+ {}%
+ {\stitle@fmt{\@stitle}}%
+ %
+ \@ifundefined{@sdescription}{}{\@sdescription}%
+ \par
+ }
+
%% Bibliography
\def\@MRExtract#1 #2!{#1} % thanks, Martin!
\newcommand{\MR}[1]{% we need to strip the "(...)"
diff --git a/macros/latex/contrib/ejpecp/ejpecp.pdf b/macros/latex/contrib/ejpecp/ejpecp.pdf
index 7c703f05ea..290f565d11 100644
--- a/macros/latex/contrib/ejpecp/ejpecp.pdf
+++ b/macros/latex/contrib/ejpecp/ejpecp.pdf
Binary files differ
diff --git a/macros/latex/contrib/ejpecp/getmref.py b/macros/latex/contrib/ejpecp/getmref.py
new file mode 100644
index 0000000000..3241aac3aa
--- /dev/null
+++ b/macros/latex/contrib/ejpecp/getmref.py
@@ -0,0 +1,1809 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+##################################################################################
+#
+# getmref.py - gets the references links to MathSciNet through the BatchMRef:
+# https://mathscinet.ams.org/batchmref?qdata=xmldocument
+#
+# Copyright (C) 2017 Sigitas Tolusis, VTeX Ltd., Jim Pitman, Dept. Statistics,
+# U.C. Berkeley and Lolita Tolene, VTeX Ltd.
+# E-mail: latex-support@vtex.lt
+# http://www.stat.berkeley.edu/users/pitman
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# Requires:
+# - python ver. >=2.2
+# - [ for option --enc=auto ]
+# Universal Encoding Detector library, written by Mark Pilgrim.
+#
+# Usage:
+# getmref.py <bbl or tex file>
+#
+# Program (description):
+# - makes inputfile copy to <inputfilename>.getmref.bak;
+# - for each successful bibitem reference search adds line \MR{<mrid>},
+# where <mrid> is data from XML tag <mrid> without front symbols "MR";
+# - writes all adds to <inputfilename>;
+# - generates log file <inputfilename>.getmref.log;
+# - writes to stdout log info
+#
+# Changes:
+# 2004/04/26 - \bibitem line removed from the query
+# 2017/01/12 - input file may contain 'amsrefs', 'bibtex' and 'tex' type
+# references (all at once);
+# input references can be formatted as 'amsrefs', 'bibtex',
+# 'tex' or 'html' type references
+#
+#
+##################################################################################
+
+__version__ = "GetMRef, v2.4"
+
+import sys
+import os
+import re
+import string
+import urllib
+import urllib2
+import ssl
+import shutil
+import logging
+from time import time, sleep
+from xml.dom.minidom import parseString
+from xml.parsers.expat import ExpatError
+
+BASICFORMATTER = logging.Formatter('%(message)s')
+DEBUGFORMATTER = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
+
+log = logging.getLogger(__name__)
+log.addHandler(logging.NullHandler())
+flog = slog = log
+
+
+class RefTypes(object):
+ """ This class declares recognized bibliography reference formats
+
+ Formats description
+ -------------------
+ Source: only AMS
+ "tex": LaTeX code without any specific beginning/ending;
+ MR number is given in plain text
+ "html": <a href="http://www.ams.org/mathscinet-getitem?mr=7digits">
+ 7digits
+ </a>
+
+ Source: only user
+ "bibitem": \bibitem[<name-year info>]{<cite_key>}
+ ...
+ \MR{<7 digits>}
+ \endbibitem,
+ where '[<name-year info>]' and '\endbibitem' are optional
+ Requires environment
+ \begin{thebibliography}{<ref no>}
+ ...
+ \end{thebibliography}
+
+ Source: AMS and user
+ "bibtex": @<ref type>{<cite_key>,
+ <key1>={<value1>},
+ <key2>={<value2>},
+ MRNUMBER={<7 digits>}
+ ...}
+ "amsrefs": \bib{<cite_key>}{<ref type>}{
+ <key1>={<value1>},
+ <key2>={<value2>},
+ review={\MR{<7 digits>}}
+ ...}
+ Requires environment
+ \begin{biblist}
+ ...
+ \end{biblist}
+ """
+
+ TEX = "tex"
+ BIBITEM = "bibitem"
+ IMS = "ims"
+ BIBTEX = "bibtex"
+ AMSREFS = "amsrefs"
+ HTML = "html"
+
+ # Reference input formats
+ ITYPES = (BIBITEM, BIBTEX, AMSREFS)
+
+ # Reference output formats
+ OTYPES = (TEX, BIBTEX, IMS, AMSREFS, HTML)
+
+
+class LessThanFilter(logging.Filter):
+ """ This class allows to add an upper bound to the logged messages
+
+ Example
+ -------
+ One needs to log all non-error messages to stdout, and all errors
+ (higher level) only to stderr
+ """
+
+ def __init__(self, exclusive_maximum, name=""):
+ super(LessThanFilter, self).__init__(name)
+ self.max_level = exclusive_maximum
+
+ def filter(self, record):
+ # A non-zero return means we log this message
+ return 1 if record.levelno <= self.max_level else 0
+
+
+class FilesHandler(RefTypes):
+ """ This class unites methods and attributes related to
+ files I/O actions """
+
+ IN = 'in'
+ BAK = 'bak'
+ OUT = 'out'
+ DATA = 'data'
+ TMP = 'tmp'
+ AUX = 'aux'
+ BIB = 'bib'
+ HTML = 'html'
+ LOG = 'log'
+ ERR = 'err'
+
+ # File status map:
+ # if True file will be open until closed;
+ # if False it will be opened on demand
+ FILE_STATUS = {OUT: True,
+ LOG: False,
+ ERR: False,
+ DATA: True,
+ BIB: True,
+ AUX: True,
+ HTML: True,
+ TMP: False}
+
+ READ = 'r'
+ WRITE = 'w'
+
+ GMR_SUFFIX = 'getmref'
+
+ def __init__(self, infile, outputtype):
+ """ Initiate file handling methods and attributes
+
+ Parameters
+ ----------
+ infile : str or None
+ Path to input file
+ outputtype : str or None
+ Required bibliography reference output format type
+ """
+
+ self.infile = infile
+ self._basename = os.path.splitext(infile)[0]
+
+ # Determining needed file types for given reference output type
+ msg = ("The given references will be formatted in '%s' format. "
+ % (outputtype if outputtype is not None else "orig"))
+
+ unnecessary = [self.DATA, self.BIB, self.AUX, self.HTML]
+ if outputtype in [self.BIBTEX, self.IMS]:
+ unnecessary = [self.DATA, self.HTML]
+ # Referring to 'BIB' file as 'DATA'
+ self.DATA = self.BIB
+ msg += "Additional files will be created: *.%s, *.%s" \
+ % (self.BIB, self.AUX)
+ elif outputtype == self.HTML:
+ unnecessary = [self.DATA, self.BIB, self.AUX]
+ # Referring to 'HTML' file as 'DATA'
+ self.DATA = self.HTML
+ msg += "Additional file will be created: *.%s" % self.HTML
+ elif outputtype in [self.TEX, self.AMSREFS]:
+ unnecessary = [self.HTML, self.BIB, self.AUX]
+ msg += "Additional file will be created: *.%s" % self.DATA
+
+ self.files = dict()
+ for suffix, status in self.FILE_STATUS.items():
+ # Deleting old files
+ self._delete(suffix)
+ if suffix in unnecessary:
+ continue
+ if status:
+ self.open(suffix)
+ continue
+ self.files.update({suffix: self.get_fname(suffix)})
+
+ flog.info("File: %s" % infile)
+ if not (os.path.isfile(infile) and os.path.exists(infile)):
+ logging.shutdown()
+ for suffix in self.FILE_STATUS:
+ self.close_and_delete(suffix)
+ raise ValueError("Provided source file does not exist! "
+ "Please provide the valid one.")
+
+ flog.debug("Workdir: %s" % os.path.abspath(os.path.dirname(infile)))
+ flog.debug(msg)
+
+ def set_fname(self, suffix):
+ """ Set a filepath for a file with the provided suffix
+
+ Parameters
+ ----------
+ suffix : str
+ File suffix without punctuation
+
+ Returns
+ -------
+ str
+ """
+ return ("%s.%s.%s" % (self._basename, self.GMR_SUFFIX, suffix)
+ if suffix != self.IN else self.infile)
+
+ def get_fname(self, suffix):
+ """ Get filepath of a file with the required suffix
+
+ Parameters
+ ----------
+ suffix : str
+ File suffix without punctuation
+
+ Returns
+ -------
+ str
+ If requested file is open, returning file object name,
+ or the filepath otherwise
+ """
+ target = self.files.get(suffix, self.set_fname(suffix))
+ if isinstance(target, file):
+ return target.name
+ return target
+
+ def open(self, suffix, mask=WRITE):
+ """ Open file for the selected action
+
+ Parameters
+ ----------
+ suffix : str
+ File suffix without punctuation
+ mask : str
+ Possible actions are read or write
+
+ File is opened and file object is added to the dictionary
+ for later access
+ """
+ self.files.update({suffix: file(self.get_fname(suffix), mask)})
+
+ def read(self, suffix):
+ """ Get the content of a file with the required suffix
+
+ Parameters
+ ----------
+ suffix : str
+ File suffix without punctuation
+
+ Yields
+ ------
+ str
+ """
+ with open(self.get_fname(suffix), self.READ) as ifile:
+ for iline in ifile:
+ yield iline
+
+ def write(self, suffix, msg):
+ """ Write to the file with the required suffix
+ only if this file is open
+
+ Parameters
+ ----------
+ suffix : str
+ File suffix without punctuation
+ msg : str
+ """
+ target = self.files.get(suffix, None)
+ if isinstance(target, file):
+ target.write(msg)
+
+ def close(self, suffix):
+ """ Close the file with the required suffix
+
+ Parameters
+ ----------
+ suffix : str
+ File suffix without punctuation
+ """
+ fileobj = self.files.get(suffix, "")
+ if isinstance(fileobj, file):
+ fileobj.close()
+
+ def _delete(self, suffix):
+ """ Delete the file with the required suffix
+
+ Parameters
+ ----------
+ suffix : str
+ File suffix without punctuation
+ """
+ dfile = self.get_fname(suffix)
+ try:
+ os.unlink(dfile)
+ flog.debug("Deleted: %s" % os.path.split(dfile)[1])
+ except OSError:
+ if os.path.isfile(dfile) and os.path.exists(dfile):
+ flog.exception("Can't remove file: %s" % dfile)
+
+ def close_and_delete(self, suffix):
+ """ Close and delete the file with the required suffix
+
+ Parameters
+ ----------
+ suffix : str
+ File suffix without punctuation
+ """
+ self.close(suffix)
+ self._delete(suffix)
+
+ def close_files(self):
+ """ Close all open files and logging instances,
+ create backup of the input file and
+ overwrite it with the new content, delete auxiliary files
+ """
+ flog.debug("Closing files...")
+ for suffix in self.files:
+ self.close(suffix)
+
+ self._delete(self.TMP)
+
+ bfile = self.get_fname(self.BAK)
+ if os.path.exists(bfile):
+ shutil.copy2(self.infile, bfile)
+ else:
+ os.rename(self.infile, bfile)
+ flog.debug("Created backup of the input file: %s"
+ % os.path.split(bfile)[1])
+
+ ofile = self.get_fname(self.OUT)
+ if os.path.exists(ofile):
+ shutil.copy2(ofile, self.infile)
+ self._delete(self.OUT)
+ else:
+ os.rename(ofile, self.infile)
+ flog.debug("The input file is overwritten with: %s"
+ % os.path.split(ofile)[1])
+
+ logging.shutdown()
+
+
+class RefHandler(RefTypes):
+ """ This class unites methods and attributes related to bibliography
+ reference format types and their content modifications """
+
+ # Bibliography environment
+ BIBL_ENV = "environment"
+ BIBL_BEGIN = "begin"
+ BIBL_END = "end"
+
+ # Declaration of typical reference type ending and
+ # MR id format for this type
+ FORMAT_PROPERTIES = {
+ RefTypes.BIBTEX: {
+ "ref_ending": "}",
+ "mr_format": ",\nMRNUMBER={%s},\n"
+ },
+ RefTypes.AMSREFS: {
+ "ref_ending": "}",
+ "mr_format": ",\nreview={\MR{%s}},\n"
+ },
+ RefTypes.BIBITEM: {
+ "ref_ending": "\\endbibitem",
+ "mr_format": "\n\\MR{%s}\n"
+ }
+ }
+
+ # Meaningful reference keys for AMS Batch MR Lookup query
+ KEYS = {"0AUTH": ("author",),
+ "1TTL": ("title", "maintitle"),
+ "2JOUR": ("journal", "journaltitle", "fjournal", "booktitle"),
+ "3VID": ("volume",),
+ "4IID": ("number", "series"),
+ "5PID": ("pages",),
+ "6YNO": ("year", "date"),
+ "7ISSN": ("issn", "isrn", "isbn")}
+
+ PATTERN_KEY_VALUE = "^\s*([\w-]+)\s*=\s*(.*?)$"
+
+ PATTERN_LINE_END = r'(\r?\n)+'
+ PATTERN_PAR = r'(\r?\n){2}'
+
+ PATTERN_BIBL_ENV = (r'\s*\\(?P<envstatus>begin|end)\s*'
+ r'\{(thebibliography|biblist\*?)\}(.*)$')
+
+ PATTERN_BIBRE = r'^\s*\\bibitem.*'
+ PATTERN_BIBREF = (r'\s*\\bibitem\s*(?P<biblabel>\[.*?\])*?\s?'
+ r'\{(?P<citekey>.*?)\}(?P<text>.*)$')
+ PATTERN_BIBTEX = (r'^\s*(@\S+)(?<!@preamble)\s*'
+ r'{(?P<citekey>\S+)\s*,(?P<text>.*)$')
+ PATTERN_AMSREFS = r"\\bib\s*{(?P<citekey>.*)}\s*{(.*)}\s*{(?P<text>.*)$"
+
+ def __init__(self, outputtype):
+ """ Initiate reference handling methods and attributes
+
+ Parameters
+ ----------
+ outputtype : str or None
+ Required reference output format type
+ """
+
+ self.outputtype = outputtype
+
+ self.re_bibl_env = re.compile(self.PATTERN_BIBL_ENV)
+ self.re_bibre = re.compile(self.PATTERN_BIBRE)
+ self.re_bibreF = re.compile(self.PATTERN_BIBREF, re.S)
+ self.re_bibtex = re.compile(self.PATTERN_BIBTEX, re.M)
+ self.re_amsrefs = re.compile(self.PATTERN_AMSREFS, re.M)
+
+ self.re_lineend = re.compile(self.PATTERN_LINE_END)
+ self.re_par = re.compile(self.PATTERN_PAR)
+ self.re_key_value = re.compile(self.PATTERN_KEY_VALUE, re.DOTALL)
+
+ def find_reference(self, line):
+ """ Identify reference environment or element by using regex patterns
+
+ Parameters
+ ----------
+ line : str
+
+ Returns
+ -------
+ str or None
+ If match is found, returns the reference type, None otherwise
+ dict
+ Dictionary contains regex pattern group names and their matches
+
+ The value of the key 'text' is the line part without user
+ defined strings, such as citekey and biblabel, because they may
+ contain some misleading information for BatchMRef query
+ """
+
+ elems = {self.BIBL_ENV: self.re_bibl_env,
+ self.BIBTEX: self.re_bibtex,
+ self.AMSREFS: self.re_amsrefs}
+
+ # BIBITEM search starts with an additional check
+ # which other reference types doesn't have
+ if self.re_bibre.search(line) is not None:
+ elems = {self.BIBITEM: self.re_bibreF}
+
+ for reftype, pattern in elems.items():
+ match = pattern.search(line)
+ if match is not None:
+ return reftype, match.groupdict()
+ elif reftype == self.BIBITEM:
+ # If final search for BIBITEM fails, it means that the typical
+ # structure for this reference type is placed on several lines,
+ # therefore the current line is prepended to the next input line
+ return reftype, {"line": line}
+ return None, dict()
+
+ def extract_keys_data(self, lines):
+ """ Extract values from selected keys in reference
+
+ Parameters
+ ----------
+ lines : list
+
+ Returns
+ -------
+ str
+ Output contains extracted values separated by commas
+ """
+ flog.debug(">> Extracting key values from reference")
+ querystring = ""
+ user_key = None
+ found = list()
+ for line in lines:
+ match = self.re_key_value.search(line)
+ if match:
+ user_key, user_value = match.groups()
+ user_key = user_key.lower()
+ for key, value in sorted(self.KEYS.items()):
+ if user_key in value and (user_key in found or key not in found):
+ found.append(key)
+ found.append(user_key)
+ querystring += "%s, " % user_value.strip().rstrip(",")\
+ .strip().strip('"')\
+ .strip().rstrip("}")\
+ .lstrip("{").strip()
+ break
+ elif len(found) > 0 and found[-1] == user_key:
+ querystring = "%s %s, " % (querystring.strip(", "),
+ line.strip().rstrip(",").strip().strip('"')
+ .strip().rstrip("}").lstrip("{")
+ .strip().rstrip(",").strip())
+
+ return querystring.strip(", ")
+
+ def insert_mrid(self, reftype, refstring, mrid):
+ """ Format MR number according to the input reference format and
+ append it to the input reference
+
+ Parameters
+ ----------
+ reftype : str
+ Determined input bibliography reference item type
+ refstring : str
+ Input bibliography reference item content
+ mrid : str
+ MR number returned by query to BatchMRef
+
+ Returns
+ -------
+ str
+ Output contains input bibliography reference element including
+ according to reftype formatted mrid.
+ """
+ properties = self.FORMAT_PROPERTIES.get(reftype, None)
+ if properties is None:
+ outstring = self.re_lineend.sub('\n', refstring)
+ return '%s\\MR{%s}\n\n' % (outstring, mrid)
+
+ mr_string = properties["mr_format"] % mrid
+ ending_index = refstring.rfind(properties["ref_ending"])
+ if ending_index == -1:
+ paragraph = self.re_par.search(refstring)
+ if paragraph is not None:
+ ending_index = paragraph.start()
+ mr_string += "\n"
+
+ if ending_index != -1:
+ return "%s%s%s" % (refstring[:ending_index].strip().strip(","),
+ mr_string,
+ refstring[ending_index:].lstrip())
+
+ return refstring.strip() + mr_string + "\n"
+
+ def insert_citekey(self, outref, citekey, biblabel, querystring):
+ """ Add a cite key, extracted from an input reference item,
+ to the reference content, returned by the query to BatchMRef
+ (XML tag <outref>), in the required reference output format
+
+ Parameters
+ ----------
+ outref : str or None
+ Reference item content returned by the query to BatchMRef
+ citekey : str
+ Input bibliography reference item cite key
+ biblabel : str or None
+ Input bibliography reference item label,
+ provided in optional parameter of reference type of BIBITEM
+ querystring : str
+ Input bibliography reference item formatted for query
+ to BatchMRef
+
+ Returns
+ -------
+ str or None
+ Returned string is the outref including the citekey and
+ the biblabel (if provided) if reference has been found in
+ the AMS MR DB, else string is formatted according to the
+ requested output type.
+
+ If allowed output type is not provided, None is returned
+ """
+
+ if self.outputtype is None:
+ return None
+
+ if outref is None:
+ if self.outputtype == self.TEX:
+ return ("\\bibitem%s{%s}\n Not Found!\n\n"
+ % (biblabel if biblabel is not None else "",
+ citekey))
+ if self.outputtype == self.BIBTEX:
+ return '@MISC {%s,\n NOTE = {Not Found!}\n}\n\n' % citekey
+ if self.outputtype == self.IMS:
+ return ('@MISC {%s,\n HOWPUBLISHED = {%s},\n}\n\n'
+ % (citekey, querystring))
+ if self.outputtype == self.AMSREFS:
+ return ('\\bib{%s}{misc}{\n note = {Not Found!}\n}\n\n'
+ % citekey)
+ if self.outputtype == self.HTML:
+ return '<!-- %s -->\nNot Found!\n<br/><br/>\n\n' % citekey
+ return None
+
+ outref = outref.strip() + '\n\n'
+ if self.outputtype == self.TEX:
+ return ('\\bibitem%s{%s}\n%s'
+ % (biblabel if biblabel is not None else "",
+ citekey, outref))
+ if self.outputtype in [self.BIBTEX, self.IMS]:
+ return self.re_bibtex.sub(r'\1 {%s,' % citekey, outref)
+ if self.outputtype == self.AMSREFS:
+ return self.re_amsrefs.sub(r'\\bib\0{%s}{\2}' % citekey, outref)
+ if self.outputtype == self.HTML:
+ return '<!-- %s -->\n%s<br/><br/>\n' % (citekey, outref)
+ return None
+
+
+class RefElement(object):
+ """ This is a container for one bibliography reference item,
+ containing all data related to it """
+
+ FORMAT_PROPERTIES = RefHandler.FORMAT_PROPERTIES
+
+ def __init__(self, refid=None, reftype=None, citekey=None, biblabel=None):
+ """ Initiate reference item container
+
+ Parameters
+ ----------
+ refid : int or None
+ reftype : str or None
+ Input bibliography reference type (one of RefTypes.ITYPES).
+ citekey : str or None
+ Input bibliography reference cite key
+ biblabel : str or None
+ Input bibliography reference label,
+ provided in the optional parameter of RefTypes.BIBITEM type
+ reference item
+ """
+
+ self.reftype = reftype
+ self.refid = refid
+ self.citekey = citekey
+ self.biblabel = biblabel
+
+ self.orig_lines = list()
+ self.cleaned_lines = list()
+ self.query_lines = list()
+ self.comment_lines = list()
+
+ self.errno = 0
+ self._init_querystring = None
+ self._querystring = None
+ self._mrid = None
+ self.outref = None
+
+ def normalize(self, lines):
+ """ Normalize the reference item content
+ Parameters
+ ----------
+ lines : list
+
+ Returns
+ -------
+ str
+ Returned string doesn't contain trailing spaces and
+ typical ending for the reference of reftype (if found)
+ """
+ nstring = re.sub('\s+', ' ', ''.join(lines)).strip()
+ ending = self.FORMAT_PROPERTIES.get(self.reftype,
+ dict()).get("ref_ending", "")
+ ending_index = nstring.rfind(ending)
+ if ending_index != -1:
+ nstring = nstring[:ending_index].strip()
+ return nstring
+
+ @property
+ def init_querystring(self):
+ if self._init_querystring is not None:
+ return self._init_querystring
+
+ flog.debug(">> Normalizing the reference")
+ self._init_querystring = self.normalize(self.query_lines)
+
+ return self._init_querystring
+
+ @property
+ def querystring(self):
+ if self._querystring is not None:
+ return self._querystring
+ return self.init_querystring
+
+ @querystring.setter
+ def querystring(self, istring):
+ self._querystring = istring
+
+ @property
+ def mrid(self):
+ return self._mrid
+
+ @mrid.setter
+ def mrid(self, mrid):
+ """ Normalize MR number, returned by the query to BatchMRef
+
+ Parameters
+ ----------
+ mrid : str
+
+ Returns
+ -------
+ str
+ If original MR number is shorter than 7 symbols, prepending 0,
+ till it reaches 7 symbol length
+ """
+ if mrid is not None:
+ self._mrid = mrid.encode('ascii').lstrip("MR").rjust(7, '0')
+
+ def __repr__(self):
+ result = "<%s:\n" % self.__class__.__name__
+ for key, value in sorted(self.__dict__.items()):
+ if key.startswith("_"):
+ continue
+ result += " %s = %s\n" % (key, repr(value))
+ result += " >\n"
+ return result
+
+ def __str__(self):
+ return self.__repr__()
+
+
+class RefsContainer(object):
+ """ This is a container holding as many bibliography reference items as
+ is allowed by the denoted query to BatchMRef limit and data common
+ to all of them """
+
+ def __init__(self):
+ super(RefsContainer, self).__init__()
+ self.elems = list()
+ self.qerrno = 0
+
+ def append_elem(self, ref_element):
+ """ Add bibliography reference item instance to the container
+
+ Parameters
+ ----------
+ ref_element : RefElement() instance
+ """
+
+ self.elems += (ref_element,)
+
+ def get_elem_by_refid(self, refid):
+ """ Get bibliography reference item instance by its id
+
+ Parameters
+ ----------
+ refid : int
+
+ Returns
+ -------
+ RefElement() instance or None
+ If element with required id is not found, None is returned
+ """
+
+ elem = [e for e in self.elems if e.refid == refid]
+ if elem:
+ return elem[0]
+
+ def __str__(self):
+ result = "<%s:\n" % self.__class__.__name__
+ for key, value in sorted(self.__dict__.items()):
+ if key == "elems":
+ for elem in value:
+ result += " %s" % repr(elem)
+ elif key not in ["elems", "qresult", "xml"]:
+ result += " GLOBAL: {} = {}\n".format(key, value)
+ result += " >\n"
+ return result
+
+
+class QueryHandler(RefTypes):
+ """ This class unites methods and attributes related to actions necessary
+ for the AMS BatchMRef query """
+
+ AUTO_ENC = "auto"
+ LATIN1 = 'latin1'
+ ASCII = "ascii"
+
+ AMS_URL = 'https://mathscinet.ams.org/batchmref'
+
+ # AMS BatchMRef limit of items no per query
+ QUERY_ITEMS_LIMIT = 100
+
+ QUERY_XML_HEADING_STRING = '<?xml version="1.0" encoding="UTF-8"?>\n'
+
+ QUERY_HEADING_STRING = (
+ '<mref_batch>\n'
+ ' %s'
+ '</mref_batch>'
+ )
+
+ QUERY_ITEM_STRING = (
+ '<mref_item outtype="%s">\n'
+ ' <inref>\n'
+ ' %s\n'
+ ' </inref>\n'
+ ' <myid>%d</myid>\n'
+ '</mref_item>\n'
+ )
+
+ QUERY_FORMATS = {
+ RefTypes.TEX: RefTypes.TEX,
+ RefTypes.BIBTEX: RefTypes.BIBTEX,
+ RefTypes.IMS: RefTypes.BIBTEX,
+ RefTypes.AMSREFS: RefTypes.AMSREFS,
+ RefTypes.HTML: RefTypes.HTML,
+ None: RefTypes.TEX
+ }
+
+ PATTERN_MREF_ITEM = '(\<mref_item outtype="(?:bibtex|tex|amsrefs|html)"\>.*?\</mref_item\>)'
+ PATTERN_BATCH_ERROR = '\<batch_error\>(.*?)\</batch_error\>'
+
+ # AMS gives the following message in HTML if requested website is broken
+ AMS_MSG = "The AMS Website is temporarily unavailable."
+
+ def __init__(self, encoding, outputtype, refscontainer, address=AMS_URL):
+ """ Initiate query to BatchMRef handling methods and attributes
+
+ Parameters
+ ----------
+ encoding : str
+ Input file encoding
+ outputtype : str or None
+ Reference output format type passed for BatchMRef query
+ refscontainer : RefsContainer() instance
+ address : str
+ BatchMRef query address
+ """
+
+ self.encoding = encoding
+ flog.debug("Provided encoding format: %s" % encoding)
+ self.address = address
+ self.query_format = self.QUERY_FORMATS.get(outputtype, self.TEX)
+ flog.debug("Query settings: URL = %s, output format = %s"
+ % (address, self.query_format))
+ self.outputtype = outputtype
+
+ self.errno = 0
+ self.qresult = None
+ self.qcode = None
+ self.xml = None
+ self.re_mref_item = re.compile(self.PATTERN_MREF_ITEM, re.DOTALL)
+ self.re_batch_error = re.compile(self.PATTERN_BATCH_ERROR, re.DOTALL)
+
+ self._refscontainer = refscontainer
+ self.query_elems = list()
+
+ @property
+ def refscontainer(self):
+ return self._refscontainer
+
+ def _encode_str(self, istring):
+ """ Change query string encoding into the ASCII
+
+ Parameters
+ ----------
+ istring : str
+
+ Returns
+ -------
+ str
+ """
+
+ str_enc = self.encoding
+ self.errno = 0
+ if str_enc == self.AUTO_ENC:
+ detector = UniversalDetector()
+ detector.feed(istring)
+ detector.close()
+ str_enc = detector.result.get('encoding', self.ASCII)
+ flog.debug(">> Determined string encoding: %s" % str_enc)
+
+ if str_enc == self.ASCII:
+ return istring
+ if str_enc is None:
+ flog.debug(">> Encoding determination has FAILED! ")
+ return istring
+
+ try:
+ return istring.decode(str_enc.lower()).encode(self.ASCII,
+ errors='replace')
+ except:
+ flog.debug(">> encoding given reference element FAILED!")
+ msg = (">> encoding given reference element FAILED!\n"
+ "[Input string]:\n%s\n" % istring)
+ flog.exception(msg)
+ self.errno = -2
+ return istring
+
+ @staticmethod
+ def _escape_tex(istring):
+ """ Convert TeX symbols into XML valid symbols
+
+ Parameters
+ ----------
+ istring : str
+
+ Returns
+ -------
+ str
+ """
+
+ flog.debug(">> Converting TeX symbols into XML valid symbols")
+ return reduce(lambda a, b: string.replace(a, b[0], b[1]),
+ (istring, ("\\&", '&amp;'), ("<", '&lt;'), (">", '&gt;'),
+ ("&", '&amp;'), (r"\ndash ", "-")))
+
+ def _parse_str(self, istring, check=False):
+ """ Parse string into XML object
+
+ Parameters
+ ----------
+ istring : str
+ check : bool
+ If True, checking if string parses to valid XML.
+ If False, saving parsed XML or an error code
+ if parsing was unsuccessful
+ """
+
+ try:
+ xml = parseString(istring)
+ if not check:
+ self.xml = xml
+ else:
+ flog.debug("VALIDATING XML string ...")
+ flog.debug(">> XML contains no errors")
+ except ExpatError as err:
+ flog.debug(">> Parsing given XML FAILED!")
+ msg = (">> Parsing given XML FAILED!\n",
+ "[Parse query]:\n%s\n" % istring)
+ flog.exception(msg)
+ self.errno = err.code
+
+ def prepare_query_str(self, refid, querystring):
+ """ Format the reference as an XML string and validate it
+
+ Parameters
+ ----------
+ refid : int
+ RefElement() instance id
+ querystring : str
+
+ Returns
+ -------
+ int
+ If query string was encoded and parsed into valid XML
+ successfully, it is appended to a future query strings list
+ and error code is set to 0
+
+ If something went wrong, non-zero value is returned
+ """
+
+ self.errno = 0
+ flog.debug("PREPARING query reference")
+
+ single_qstring = self._encode_str(
+ self.QUERY_ITEM_STRING % (self.query_format,
+ self._escape_tex(querystring),
+ refid)
+ )
+ flog.debug(">> Formed query XML:\n"
+ + "~" * 70 + "\n%s\n" % single_qstring + "~" * 70)
+
+ # Checking if formed string is a valid XML
+ self._parse_str(single_qstring, check=True)
+ if self.errno != 0:
+ return self.errno
+
+ self.query_elems.append(single_qstring)
+ return self.errno
+
+ def _send_query(self, querystring):
+ """ Send query to BatchMRef
+
+ Parameters
+ ----------
+ querystring : str
+ Validated XML query string, containing as many reference items
+ as QueryHandler.QUERY_ITEMS_LIMIT allows
+
+ If request to BatchMRef was successful, saving query result,
+ otherwise non-zero error code is saved
+ """
+
+ queryinfo = {'qdata': querystring}
+ queryval = urllib.urlencode(queryinfo)
+ try:
+ flog.debug("SENDING query ...")
+ req = urllib2.Request(url=self.address, data=queryval)
+ flog.debug(">> Query POST data: %s" % req.get_data())
+ context = ssl._create_unverified_context()
+ batchmref = urllib2.urlopen(req, context=context)
+ self.qcode = batchmref.getcode()
+ flog.debug(">> Query result code: %s" % self.qcode)
+ self.qresult = batchmref.read()
+
+ if self.qcode == 200 and \
+ self.qresult.startswith(self.QUERY_XML_HEADING_STRING):
+ flog.debug(">> Query result string:\n"
+ + "~"*70 + "\n%s\n" % self.qresult.strip() + "~"*70)
+ else:
+ msg = "\n%s" % self.AMS_MSG if self.AMS_MSG in self.qresult else ""
+ flog.debug(">> Query FAILED! %s" % msg)
+ flog.error("Query returned an error:\n%s\n\n%s"
+ % (msg, self.qresult))
+ self.errno = self.qcode if self.qcode != 200 else -2
+ self.qresult = None
+
+ batchmref.close()
+ except:
+ msg = ">> Query FAILED!"
+ flog.debug(msg)
+ flog.exception(msg)
+ self.errno = -2
+ self.qresult = None
+
+ @staticmethod
+ def _extract_xml_data(xml_elem, tag):
+ """ Extract text data from an XML object
+
+ Parameters
+ ----------
+ xml_elem : XML object
+ tag : str
+ XML tag of interest
+
+ Returns
+ -------
+ str or None
+ Content of XML element with the requested tag.
+ If element with the tag hasn't been found, None is returned
+ """
+
+ childelem = xml_elem.getElementsByTagName(tag)
+ if childelem:
+ childnodes = childelem[0].childNodes
+ if childnodes:
+ return childnodes[0].data
+
+ def _analyze_xml(self, xml):
+ """ Extract reference data from the BatchMRef returned XML string,
+ parsed into XML object
+
+ Parameters
+ ----------
+ xml : XML object
+
+ If no matches have been found in the AMS MR DB,
+ current RefElement() instance gets a non-zero error code.
+ Otherwise MR number and reference content (if requested output type
+ is not None) are saved in the current RefElement() instance
+ """
+
+ mref_item = xml.getElementsByTagName("mref_item")[0]
+ refid = int(self._extract_xml_data(mref_item, "myid"))
+ elem = self.refscontainer.get_elem_by_refid(refid)
+
+ matches = self._extract_xml_data(mref_item, "matches")
+ if matches == '1':
+ flog.debug(">> MRef DB: reference `%s' found!" % elem.citekey)
+ elem.mrid = self._extract_xml_data(mref_item, "mrid")
+ flog.debug(">> MRef ID: %s" % elem.mrid)
+
+ if self.outputtype is not None:
+ elem.outref = self._extract_xml_data(mref_item, "outref")
+ flog.debug(">> MRef output reference:\n"
+ + "~"*70 + "\n%s\n" % elem.outref.strip() + "~"*70)
+ else:
+ elem.errno = -1
+ flog.debug(">> MRef DB: reference `%s' not found!" % elem.citekey)
+
+ def query(self):
+ """ Send a request to AMS BatchMRef and analyze the returned data
+
+ If query result contains 'batch_error' element or returned
+ XML string can't be parsed into XML object,
+ RefsContainer() instance gets a non-zero error code.
+ """
+
+ self.errno = 0
+ self.qresult = None
+
+ querystring = (self.QUERY_XML_HEADING_STRING
+ + self.QUERY_HEADING_STRING % ("\n".join(self.query_elems)))
+ if self.errno == 0:
+ self._send_query(querystring)
+ if self.qresult is not None:
+ error_obj = self.re_batch_error.search(self.qresult)
+ if error_obj:
+ flog.debug(">> Query XML contains an ERROR!")
+ flog.error("[batch_error]:\n%s\n\n[querystring]:\n%s"
+ % (self._encode_str(error_obj.group(1)),
+ querystring))
+ self.errno = -2
+ flog.debug("Splitting query result and analyzing parts separately")
+ for item_qresult in self.re_mref_item.finditer(self.qresult):
+ self.xml = None
+ self._parse_str(self._encode_str(item_qresult.group()))
+ if self.xml is not None:
+ self._analyze_xml(self.xml)
+
+ self.refscontainer.qerrno = self.errno
+ self.query_elems = list()
+
+
+class HandleBBL(RefTypes):
+ """ This is the main class containing and initiating other classes'
+ methods and attributes for provided input data processing """
+
+ # MR number pattern matching all recognized reference formats
+ PATTERN_MR = r'MRNUMBER=\{.*?\}(,|)|review=\{\\MR\{.*?\}\}(,|)|\\MR\{.*?\}'
+
+ PATTERN_BIBRE_LINE = r'^%.*\r?\n$'
+ PATTERN_BIBRE_PART = r'\s*(.*?)(?<!\\)%.*\r?\n$'
+
+ PATTERN_TEX_ACCENTS = r"""(?:\{|)\\(?:"|'|`|\^|-|H|~|c|k|=|b|\.|d|r|u|v|A)(?:|\{)([a-zA-Z])\}(?:\}|)"""
+ PATTERN_BRACED_LETTERS = r"""(\s)(?<!\\)([a-zA-Z]*)\{([A-Z]+)\}"""
+
+ # Mark of the input file ending
+ EOF = "EOF"
+
+ # Default bibstyle format
+ PLAIN = 'plain'
+
+ def __init__(self, inputfile, encoding, clean_comments,
+ itemno, wait, outputtype, bibstyle, debug, version=str()):
+ """ Initiate all methods and attributes required to process input data
+
+ Parameters
+ ----------
+ inputfile : str or None
+ encoding : str
+ Input file encoding
+ clean_comments : bool
+ If TeX comments cleaning is selected,
+ full comment lines will be moved to the beginning of each
+ identified bibliography reference item
+ itemno : int
+ Limit of reference items per query to BatchMRef
+ wait: int
+ Pause length after each query to BatchMRef
+ outputtype : str or None
+ If not None, additional files with the requested references,
+ extracted from the AMS MR DB in the requested output format,
+ will be generated
+ bibstyle : str or None
+ Used only if the requested output type is BIBTEX or IMS
+ debug : int
+ If debug value is greater than 0, debug messages will be
+ written to the FileHandler.LOG file. Also, depending on the
+ given debug value, final data written to the input file will
+ contain TeX comments with query data.
+ version : str
+ """
+
+ self.refscontainer = RefsContainer()
+
+ self.fh = FilesHandler(inputfile, outputtype)
+ self.rh = RefHandler(outputtype)
+ self.qh = QueryHandler(encoding, outputtype, self.refscontainer)
+
+ if itemno < self.qh.QUERY_ITEMS_LIMIT:
+ self.qh.QUERY_ITEMS_LIMIT = itemno
+ self.wait = wait
+
+ self.outputtype = outputtype
+ self.bibstyle = bibstyle
+ flog.debug("Comments will be cleaned from the output: %s"
+ % clean_comments)
+ self.clean_comments = clean_comments
+ self.debug = debug
+ self.version = version
+
+ self.re_bibre_line = re.compile(self.PATTERN_BIBRE_LINE)
+ self.re_bibre_part = re.compile(self.PATTERN_BIBRE_PART)
+ self.re_MR = re.compile(self.PATTERN_MR)
+ self.re_tex_accents = re.compile(self.PATTERN_TEX_ACCENTS)
+ self.re_braced_letters = re.compile(self.PATTERN_BRACED_LETTERS)
+
+ self.eof = False
+ self.ifile_end_lines = list()
+
+ @property
+ def icontent(self):
+ """ Input file content """
+ return self.fh.read(self.fh.IN)
+
+ @property
+ def write(self):
+ return self.fh.write
+
+ @property
+ def get_fname(self):
+ return self.fh.get_fname
+
+ def preprocess_ofiles(self):
+ """ Depending on the requested bibliography output type,
+ certain files are pre-filled with required data.
+ Writing action is fulfilled only if requested file was pre-opened.
+ """
+ self.write(self.fh.AUX, '\\bibstyle{%s}\n' % self.bibstyle)
+ self.write(self.fh.HTML, "<!DOCTYPE html>\n<html>\n<body>\n\n")
+
+ def postprocess_ofiles(self, refcount):
+ """ Depending on the requested bibliography output type,
+ certain files are filled up with the required data.
+ Writing action is fulfilled only if requested file was pre-opened.
+
+ Parameters
+ ----------
+ refcount: int
+ If refcount is 0, it means no references have been found
+ in the input file, and pre-opened additional files are deleted
+
+ If requested bibliography output type is TEX,
+ number of bibliography items found is written to the first line of
+ FileHandler.DATA file. Therefore this file is written twice into.
+ """
+
+ if refcount == 0:
+ self.fh.close_and_delete(self.fh.DATA)
+ self.fh.close_and_delete(self.fh.AUX)
+ return None
+
+ datafilepath = self.get_fname(self.fh.DATA)
+ self.write(self.fh.AUX,
+ '\\bibdata{%s}' % os.path.splitext(datafilepath)[0])
+ self.write(self.fh.HTML, "\n</body>\n</html>\n")
+
+ # Formatting the DATA file output according to requested output format
+ obiblenv = {
+ self.TEX: {
+ "begin": "\\begin{thebibliography}{%s}\n"
+ "\\csname bibmessage\\endcsname\n\n",
+ "end": "\\end{thebibliography}\n"
+ },
+ self.AMSREFS: {
+ "begin": "\\begin{bibdiv}\n\\begin{biblist}\n\n",
+ "end": "\\end{biblist}\n\\end{bibdiv}"
+ }
+ }
+
+ strings = obiblenv.get(self.outputtype, None)
+ if strings is None:
+ return None
+
+ start_string, finish_string = sorted(strings.values())
+ self.write(self.fh.DATA, finish_string)
+
+ # Total items count is known only after processing all references and
+ # writing to the DATA file, therefore 'thebibliography' environment
+ # starting string is written to this file when all processing is
+ # finished
+ self.fh.close(self.fh.DATA)
+ os.rename(datafilepath, self.get_fname(self.fh.TMP))
+ self.fh.open(self.fh.TMP, self.fh.READ)
+
+ if self.outputtype == self.TEX:
+ start_string = start_string % refcount
+ self.fh.open(self.fh.DATA, self.fh.WRITE)
+ self.write(self.fh.DATA, start_string)
+
+ shutil.copyfileobj(self.fh.files[self.fh.TMP],
+ self.fh.files[self.fh.DATA])
+
+ def _remove_tex_comments(self, line):
+ """ Remove TeX comments
+
+ Parameters
+ ----------
+ line : str
+
+ Returns
+ -------
+ str
+ """
+ fmtline = self.re_bibre_line.sub('', line)
+ if fmtline:
+ matchobj = self.re_bibre_part.search(fmtline)
+ if matchobj is not None:
+ return "%s\n" % matchobj.groups(1)[0]
+ return fmtline
+ return fmtline
+
+ def _remove_tex_accents(self, line):
+ """ Remove TeX accents and braces around upper case letters
+
+ BatchMRef may not found a reference in the AMS MR DB because of
+ braces and accents present in reference string (tested), therefore
+ accented letters "{\'a}" and "\'{a}" are changed to plain "a".
+ Also "{ABC}" is changed to "ABC".
+
+ Parameters
+ ----------
+ line : str
+
+ Returns
+ -------
+ str
+ """
+ mline = self.re_tex_accents.sub(r'\1', line)
+ if mline:
+ return self.re_braced_letters.sub(r'\1\2\3', mline)
+ return mline
+
+ def gather_records(self, require_env):
+ """ Extract bibliography reference items from the input file
+
+ Parameters
+ ----------
+ require_env : bool
+ If True, get bibliography reference items only inside
+ the bibliography environment. If False, gel all bibliography
+ reference items found in the input file
+
+ Yields
+ -------
+ str
+ Denotes reference format type (one of ITYPES),
+ bibliography environment state (RefHandler.BIBL_BEGIN or
+ RefHandler.BIBL_END),
+ or input file end mark (EOF)
+
+ RefElement() instance, str, or None
+ If reference of one of ITYPES type has been found,
+ a RefElement() instance is returned with the following
+ attributes filled in:
+ reftype, citekey, biblabel,
+ orig_lines, cleaned_lines, query_lines
+
+ If end of input file has been determined, None is returned
+
+ Otherwise current line is returned
+ """
+
+ def sort_comments_out(comment_lines):
+ """ Assign gathered comment lines to the rightful reference item
+
+ Parameters
+ ----------
+ comment_lines : list
+
+ Returns
+ -------
+ list
+ Comment lines, belonging to current reference item
+ list
+ Comment lines, belonging to the next reference item
+ """
+
+ next_elem_comments = []
+ reversed_comments = comment_lines[::-1]
+ reversed_comments_backup = comment_lines[::-1]
+ advanced_by = 0
+ for no, cline in enumerate(reversed_comments):
+ if len(element.orig_lines) < (no + 1 + advanced_by):
+ break
+ while not element.orig_lines[-(no + 1 + advanced_by)].strip():
+ # skipping empty lines
+ advanced_by += 1
+ if cline == element.orig_lines[-(no + 1 + advanced_by)]:
+ reversed_comments_backup.pop(0)
+ next_elem_comments.append(reversed_comments[no])
+ current_elem_comments = reversed_comments_backup[::-1]
+ return current_elem_comments, next_elem_comments
+
+ # Allowing gathering the references according to
+ # the bibliography environment status
+ envmap = {self.rh.BIBL_BEGIN: True,
+ self.rh.BIBL_END: False,
+ "not found": False if require_env else True}
+ gather = envmap["not found"]
+ search = True
+
+ multiline = ""
+ element = RefElement()
+ envstatus = None
+ for line in self.icontent:
+ line = multiline + line
+ clean_line = self._remove_tex_comments(line)
+
+ if not clean_line and element.orig_lines:
+ element.orig_lines.append(line)
+ element.comment_lines.append(line)
+ continue
+
+ reftype = None
+ if search:
+ reftype, additional_info = self.rh.find_reference(clean_line)
+
+ if require_env and reftype == self.rh.BIBL_ENV:
+ if element.reftype is not None:
+ # Full bibliography item
+ element.comment_lines, next_elem_comments = \
+ sort_comments_out(element.comment_lines)
+ yield element.reftype, element
+ element = RefElement()
+ element.comment_lines = next_elem_comments
+
+ # Bibliography environment
+ envstatus = additional_info.pop("envstatus", None)
+ if envstatus in envmap:
+ gather = envmap[envstatus]
+ search = gather
+ yield envstatus, line
+ continue
+
+ elif reftype in self.ITYPES:
+ multiline = additional_info.get("line", "")
+ if multiline:
+ continue
+
+ if element.reftype is not None:
+ # Full bibliography item
+ element.comment_lines, next_elem_comments = \
+ sort_comments_out(element.comment_lines)
+ yield element.reftype, element
+ element = RefElement()
+ element.comment_lines = next_elem_comments
+
+ if gather:
+ element.reftype = reftype
+ element.citekey = additional_info.get("citekey", None)
+ element.biblabel = additional_info.get("biblabel", None)
+ element.orig_lines.append(line)
+
+ mrid_free_line = self.re_MR.sub('', clean_line)
+ element.cleaned_lines.append(mrid_free_line)
+
+ ref_format_free_line = additional_info.get("text", clean_line)
+ mrid_free_line = self.re_MR.sub('', ref_format_free_line)
+ accent_free_line = self._remove_tex_accents(mrid_free_line)
+ element.query_lines.append(accent_free_line)
+ continue
+
+ if gather and element.reftype is not None:
+ element.orig_lines.append(line)
+ mrid_free_line = self.re_MR.sub('', clean_line)
+ element.cleaned_lines.append(mrid_free_line)
+ accent_free_line = self._remove_tex_accents(mrid_free_line)
+ element.query_lines.append(accent_free_line)
+ else:
+ # Before and after the bibliography environment
+ yield envstatus, line
+
+ if element.reftype is not None:
+ # The last full bibliography item
+ element.comment_lines, _ = sort_comments_out(element.comment_lines)
+ yield element.reftype, element
+
+ yield self.EOF, None
+
+ def transfer_to_file(self):
+ """ After each query to BatchMRef write gathered data into files
+
+ Returns
+ -------
+ int
+ Number of references, for which data has been successfully
+ obtained
+ """
+
+ successful = 0
+
+ for elem in self.refscontainer.elems:
+ if self.refscontainer.qerrno != 0:
+ elem.errno = self.refscontainer.qerrno
+ outstring = ''.join(elem.cleaned_lines if self.clean_comments else
+ elem.orig_lines)
+
+ elem.outref = self.rh.insert_citekey(
+ elem.outref, elem.citekey, elem.biblabel,
+ elem.normalize(elem.cleaned_lines[1:]))
+ if elem.mrid is not None:
+ outstring = self.rh.insert_mrid(elem.reftype, outstring, elem.mrid)
+ slog.info(elem.mrid)
+ elif elem.errno == -1:
+ slog.warn('NotFound')
+ else:
+ slog.error('QueryError')
+
+ if self.clean_comments:
+ outstring = "".join(elem.comment_lines) + outstring
+
+ if self.debug == 1:
+ outstring = '%%%% %s\n%s' % (elem.querystring, outstring)
+ elif self.debug == 2:
+ outstring = '%%%% %s\n%s' % (elem.errno, outstring)
+ elif self.debug == 3:
+ outstring = '%%%% %s\n%%%% %s\n%s' % (elem.querystring,
+ elem.errno,
+ outstring)
+
+ flog.debug("\n" + ">" * 70
+ + "\nFINAL reference with MR id in original format:\n"
+ + "\n%s\n" % outstring.strip())
+
+ if elem.outref is not None:
+ flog.debug("FINAL reference in '%s' format:\n" % self.outputtype
+ + "\n%s\n" % elem.outref.strip() + "<" * 70)
+ self.write(self.fh.OUT, outstring)
+ self.write(self.fh.DATA, elem.outref if elem.outref else "")
+ self.write(self.fh.AUX, '\\citation{%s}\n' % elem.citekey)
+
+ if elem.errno == 0 and self.refscontainer.qerrno == 0:
+ successful += 1
+
+ if self.eof:
+ while self.ifile_end_lines:
+ self.write(self.fh.OUT, self.ifile_end_lines.pop(0))
+
+ self.refscontainer = RefsContainer()
+ self.qh._refscontainer = self.refscontainer
+
+ return successful
+
+ def get_mr_codes(self, require_env):
+ """ Analyze input file content and process found reference items
+
+ Parameters
+ ----------
+ require_env : bool
+ If True, and if no bibliography reference items have been found
+ inside the bibliography environment, or an environment hasn't
+ been found at all, parameter is set to False this method and
+ reruns itself in order to search reference items in
+ the whole input file.
+
+ Returns
+ -------
+ int
+ Total bibliography reference items found
+ int
+ Total number of references, for which data has been
+ successfully obtained
+ int
+ Reference items processed with errors count
+
+ If reference item of ITYPES has been found, current
+ RefElement() instance attribute 'refid' is assigned a value
+ """
+
+ msg = ("in the bibliography environment only"
+ if require_env else "in the whole input file")
+ flog.debug("SEARCHING for reference items: %s" % msg)
+
+ total = 0
+ valid = 0
+ successful = 0
+ records = self.gather_records(require_env=require_env)
+ pseudo_citekey = 0
+ for reftype, record in records:
+ if reftype == self.EOF:
+ self.eof = True
+
+ elif reftype not in self.ITYPES:
+ if reftype != self.rh.BIBL_END:
+ self.write(self.fh.OUT, record)
+ else:
+ self.ifile_end_lines.append(record)
+ continue
+
+ elif valid == 0 or valid % self.qh.QUERY_ITEMS_LIMIT != 0:
+ total += 1
+
+ record.refid = total
+ if not record.citekey:
+ pseudo_citekey += 1
+ record.citekey = '%s' % pseudo_citekey
+
+ flog.debug("=" * 70)
+ flog.debug("FOUND reference %s: type=%s, cite_key=%s, biblabel=%s"
+ % (total, reftype, record.citekey, record.biblabel))
+
+ if reftype != self.BIBITEM:
+ record.querystring = self.rh.extract_keys_data(record.query_lines)
+ self.refscontainer.append_elem(record)
+ record.errno = self.qh.prepare_query_str(record.refid,
+ record.querystring)
+ if record.errno == 0:
+ valid += 1
+
+ if valid != 0 and (valid % self.qh.QUERY_ITEMS_LIMIT == 0
+ or self.eof):
+ self.qh.query()
+ successful += self.transfer_to_file()
+ valid = 0
+ if not self.eof:
+ sleep(self.wait)
+
+ if total == 0 and require_env:
+ # If no bibliography items were found in the bibliography
+ # environment, then trying to search for them everywhere
+ # in the input file
+ flog.debug("FOUND no references! Changing the search mode ... ")
+ self.eof = False
+ self.ifile_end_lines = list()
+ self.fh.close(self.fh.OUT)
+ self.fh.open(self.fh.OUT)
+ return self.get_mr_codes(require_env=False)
+
+ if self.ifile_end_lines:
+ self.transfer_to_file()
+
+ flog.debug("=" * 70)
+ errors = total - successful
+ return total, successful, errors
+
+ def run(self, require_env):
+ """ Main method
+
+ Parameters
+ ----------
+ require_env : bool
+
+ Returns
+ -------
+ get_mr_codes() output
+ """
+
+ slog.info("# %s #\nJob started:" % self.version)
+ starttime = time()
+
+ self.preprocess_ofiles()
+ total, successful, errors = self.get_mr_codes(require_env=require_env)
+ self.postprocess_ofiles(refcount=total)
+
+ flog.info(" total: %s, found: %s, not found: %s, time: %ss"
+ % (total, successful, errors, int(round(time()-starttime))))
+
+ slog.info("Job ended")
+ slog.info("Total: %s, found: %s, not found: %s"
+ % (total, successful, errors))
+ slog.info('Job completed in %ss' % int(round(time()-starttime)))
+
+ self.fh.close_files()
+ return total, successful, errors
+
+
+if __name__ == '__main__':
+ import argparse
+
+ # Logging to console
+ osh = logging.StreamHandler(stream=sys.stdout)
+ osh.setFormatter(BASICFORMATTER)
+ osh.setLevel(logging.INFO)
+ osh.addFilter(LessThanFilter(logging.INFO))
+
+ esh = logging.StreamHandler(stream=sys.stderr)
+ esh.setFormatter(BASICFORMATTER)
+ esh.setLevel(logging.WARN)
+
+ slog = logging.getLogger("%s.StreamLogger" % __name__)
+ slog.setLevel(logging.INFO)
+ slog.addHandler(osh)
+ slog.addHandler(esh)
+
+ # Logging to files
+ flog = logging.getLogger("%s.FileLogger" % __name__)
+ flog.setLevel(logging.DEBUG)
+
+ def setup_logging_files(debug, basename=""):
+ """ Set up logging files
+
+ Parameters
+ ----------
+ debug : int
+ basename: str
+ Input file name
+
+ Returns
+ -------
+ logging instance
+ """
+
+ if debug == 0:
+ log_min_level = logging.INFO
+ log_max_level = logging.INFO
+ formatter = BASICFORMATTER
+ else:
+ log_min_level = logging.DEBUG
+ log_max_level = logging.WARN
+ formatter = DEBUGFORMATTER
+
+ ofh = logging.FileHandler(filename="{}.{}.{}".format(basename,
+ FilesHandler.GMR_SUFFIX,
+ FilesHandler.LOG),
+ mode='w', delay=True)
+ ofh.setFormatter(formatter)
+ ofh.setLevel(log_min_level)
+ ofh.addFilter(LessThanFilter(log_max_level))
+ flog.addHandler(ofh)
+
+ efh = logging.FileHandler(filename="{}.{}.{}".format(basename,
+ FilesHandler.GMR_SUFFIX,
+ FilesHandler.ERR),
+ mode='w', delay=True)
+ efh.setFormatter(DEBUGFORMATTER)
+ efh.setLevel(logging.ERROR)
+ flog.addHandler(efh)
+ return flog
+
+ VERSION = __version__.split("-")[0]
+ DESCRIPTION = (
+ "Tool %s, is designed for: " % VERSION
+ + "(1) getting MR numbers for given references from AMS MRef database, "
+ + "(2) formatting the given references in one of AMS allowed formats. "
+ + "Maintainer: L.Tolene <lolita.tolene@vtex.lt>."
+ )
+
+ def get_cmd_args():
+ """ Command line input parser """
+
+ parser = argparse.ArgumentParser(
+ description=DESCRIPTION,
+ formatter_class=argparse.ArgumentDefaultsHelpFormatter
+ )
+ parser.add_argument("filepath", help="References containing file")
+ parser.add_argument(
+ "--enc", '-e', type=str, default=QueryHandler.LATIN1,
+ help="Source file encoding or 'auto'"
+ )
+ parser.add_argument(
+ "--format", '-f', choices=set(RefTypes.OTYPES),
+ help="Outputs the given references in provided format. "
+ "For more information about these formats please "
+ "consult the AMS MRef tool website. The 'ims' format "
+ "is almost the same as the 'bibtex' format"
+ )
+ parser.add_argument(
+ "--bibstyle", '-s', default=HandleBBL.PLAIN,
+ help="BibTeX style. For more information please consult "
+ "the BibTeX documentation"
+ )
+ parser.add_argument(
+ "--nobibenv", action='store_true',
+ help="If activated, references are searched throughout "
+ "all source file content; otherwise searching only "
+ "inside the bibliography environment. Currently "
+ "recognizable are the 'thebibliography' and 'biblist' "
+ "environments"
+ )
+ parser.add_argument(
+ "--clean", '-c', action='store_true',
+ help="If activated, cleans comments appearing in references"
+ )
+ parser.add_argument(
+ "--itemno", default=100, type=int,
+ help="Maximum item count for one AMS query. "
+ "AMS batchmref has a limit of 100 items per query."
+ )
+ parser.add_argument(
+ "--wait", default=10, type=int,
+ help="time (in seconds) to wait between queries to AMS batchmref."
+ )
+ parser.add_argument(
+ "--debug", '-d', choices={0, 1, 2, 3}, default=0, type=int,
+ help="Outputs additional info for debugging purposes."
+ )
+ parser.add_argument(
+ "--version", '-v', action='version', version=VERSION,
+ help="Module version."
+ )
+ args = parser.parse_args()
+ return (args.filepath, args.enc, args.format, args.bibstyle,
+ args.nobibenv, args.clean, args.itemno, args.wait, args.debug)
+
+ # Get input parameter values
+ inputfile, encoding, output_format, bibstyle, nobibenv, clean, itemno, wait, debug \
+ = get_cmd_args()
+
+ # Load additional library is needed
+ if encoding == QueryHandler.AUTO_ENC:
+ from chardet.universaldetector import UniversalDetector
+
+ # Setup logging files
+ flog = setup_logging_files(debug=debug,
+ basename=os.path.splitext(inputfile)[0])
+
+ # Create HandleBBL() instance
+ bblobj = HandleBBL(inputfile=inputfile, encoding=encoding,
+ clean_comments=clean, itemno=itemno, wait=wait,
+ outputtype=output_format, bibstyle=bibstyle,
+ debug=debug, version=VERSION)
+
+ # Process input file
+ bblobj.run(require_env=not nobibenv)
diff --git a/macros/latex/contrib/ejpecp/mgetmref.py b/macros/latex/contrib/ejpecp/mgetmref.py
deleted file mode 100644
index 8910556c82..0000000000
--- a/macros/latex/contrib/ejpecp/mgetmref.py
+++ /dev/null
@@ -1,401 +0,0 @@
-#! /usr/bin/env python
-##################################################################################
-#
-# getmref.py - gets the references links to MathSciNet throught the BatchMRef:
-# http://www.ams.org/batchref?qdata=xmldocument
-#
-# Copyright (C) 2004 Sigitas Tolusis, VTeX Ltd. and Jim Pitman, Dept. Statistics,
-# U.C. Berkeley
-# E-mail: sigitas@vtex.let
-# http://www.stat.berkeley.edu/users/pitman
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# Requires python ver. 2.2
-#
-# Usage:
-# getmref.py <bbl or tex file>
-#
-# Program (description):
-# - makes inputfile copy to <inputfilename>.getmref.bak;
-# - for each successful bibitem reference search adds line \MR{<mrid>},
-# where <mrid> is data from XML tag <mrid> without front symbols "MR";
-# - writes all adds to <inputfilename>;
-# - generates log file <inputfilename>.getmref.log;
-# - writes to stdout log info
-#
-# Changes:
-# 2004/04/26 - \bibitem line removed from the query
-#
-#
-###################################################################################
-SVNinfo = "$Id: getmref.py 46 2006-03-30 07:02:14Z sigitas $"
-
-import sys, urllib, re, os.path, time, string
-from xml.dom.minidom import parseString
-import xml.parsers.expat as par
-
-starttime = time.time()
-res = re.search(r'\S+:\s\S+\s+(.*?)\s.*\$', SVNinfo)
-if res:
- ver = res.group(1)
-else:
- ver = '0.0'
-print "# getmref, v. %s #" % ver
-
-#
-# bbl file parsing /begin
-#
-
-def escapetex(instr):
- res = reduce(lambda a,b: string.replace(a, b[0], b[1]), (instr, ("\\&", '&amp;'), ("<", '&lt;'), (">", '&gt;')))
- return res
-
-def query(instring, bibID, address = 'http://www.ams.org/batchmref'):
- domas = None; res = None; err = 0
- escapetexstring = escapetex(instring)
- querystring = r'''<?xml version = "1.0" encoding = "UTF-8"?>
-<mref_batch>
-<mref_item outtype="tex">
-<inref>
-%s
-</inref>
-<myid>%s</myid>
-</mref_item>
-</mref_batch>''' % (escapetexstring, bibID)
- try:
- indom = parseString(querystring)
- except par.ExpatError, err:
- print >>sys.stderr,"[parse query]: %s" % querystring
- print >>sys.stderr,sys.exc_info()
- pass
- else:
- queryinfo = {}
- queryinfo['qdata'] = querystring
- queryval = urllib.urlencode(queryinfo)
- try:
- batchmref = urllib.urlopen(address, queryval)
- res = batchmref.read()
- domas = parseString(res)
- except err:
- print >>sys.stderr,"[parse res]: %s" % res
- print >>sys.stderr,sys.exc_info()
- pass
- return domas, res, err
-
-def remcomm(line):
- "Removes TeX comments"
- bibre = re.compile(r'\s*(.*?)(?<!\\)%.*\n$')
- fmtline = re.sub('^%.*\n$','', line)
- if fmtline:
- matchobj = bibre.search(fmtline)
- if matchobj:
- return matchobj.groups(1)[0]
- else:
- return fmtline
- else:
- return fmtline
-
-def formatbibitem(bibID, domas):
- errstring = None; outtype = None; mrid = None; myid = bibID; outref = None; err = 0
- try:
- mref = domas.getElementsByTagName("mref_batch")[0]
- mref_errors = mref.getElementsByTagName("batch_error")
- if len(mref_errors):
- errlist = [ mref_error.childNodes[0].nodeValue() for mref_error in mref_errors ]
- errstring = ''.join(errlist)
- err = -2
- else:
- mref_items = [item for item in mref.getElementsByTagName("mref_item")]
- matches = mref_items[0].getElementsByTagName("matches")[0].childNodes[0]._get_nodeValue()
- if matches == '1':
- for item in mref_items:
- outtype = dict(item.attributes.items())["outtype"]
- mrid = item.getElementsByTagName("mrid")[0].childNodes[0]._get_nodeValue()
- err = 0
- if mrid[:2] == "MR":
- mrid = mrid[2:]
- myids = item.getElementsByTagName("myid")
- if len(myids):
- myid = myids[0].childNodes[0]._get_nodeValue()
- else:
- myid = bibID
- outref = string.strip(item.getElementsByTagName("outref")[0].childNodes[0]._get_nodeValue())
- else:
- err = -1
- except:
- err = -3
- print >>sys.stderr,"[formatbibitem]: %s" % bibID
- print >>sys.stderr,sys.exc_info()
- pass
- return mrid, outref, err
-
-
-def handlebibitem(lines, bibID, biblabel=None):
- res = 0; err = None; outref = None
- outstring = string.strip(''.join(lines))
- lines[:] = [re.sub(r'\\MR\{.*?\}', '', a) for a in lines]
- biblines = [x for x in [remcomm(a) for a in lines] if x]
- bibstring = re.sub(r'\n', ' ', ''.join(biblines))
- match = re.search(r'\\bibitem\s*?(?:\[.*?\])?\s?\{(?:.*?)\}(.*)(\\endbibitem)?$',bibstring.strip())
- if match:
- querystring = match.group(1).strip()
- else:
- querystring = bibstring
- domas = None
- try:
- domas, xmlres, err = query(querystring, bibID)
- except:
- res = -2
- print >>sys.stderr,"[parse query]: %s" % querystring
- print >>sys.stderr,sys.exc_info()
- print 'Error',
- else:
- mrid, outref, err = formatbibitem(bibID, domas)
- if not mrid:
- print 'Not Found',
- res = -1
- else:
- print mrid,
- if mrid[:2] == "MR":
- outstring = bibstring + '\\MR{%s}' % mrid[2:].rjust(7,'0')
- else:
- outstring = bibstring + '\\MR{%s}' % mrid.rjust(7,'0')
- outstrip, nsub = re.subn(r'\\endbibitem',r'',outstring)
- if nsub:
- outstrip += '\n\\endbibitem'
- outstring = re.sub(r' ', r' ', outstrip)
- if not outref:
- outref = "Not found!"
- else:
- outref = re.sub(r'(?<!\\)#',r'\#', outref)
- if biblabel:
- print >>datafile, '\\bibitem%s{%s}\n%s\n' % (biblabel, bibID, outref)
- else:
- print >>datafile, '\\bibitem{%s}\n%s\n' % (bibID, outref)
- return '%s\n' % outstring, res
-
-def handleextra(extralines):
- if len(extralines):
- print >>outputfile, ''.join(extralines),
-
-def handlebbl(inputfile, out=sys.stdout, data=sys.stdout):
- print "Job started:",
- total = 0; successful = 0; errors = 0; state = 0; pseudobibID = 0; readbib = ''
- bibl_begin = re.compile(r'\s*\\begin\s*\{thebibliography\}.*$')
- bibre = re.compile(r'^\s*\\bibitem.*')
- bibreF = re.compile(r'\s*\\bibitem\s*(\[.*?\])*?\s?\{(.*?)\}.*$',re.S)
- comments = re.compile(r'\s*%.*$')
- bibl_end = re.compile(r'\s*\\end\s*\{thebibliography\}.*$')
- for line in inputfile:
- if len(readbib):
- readbib += line
- matchobj = bibreF.search(readbib)
- if matchobj:
- line = "%s" % readbib
- readbib = ''
- else:
- continue
- if line:
- if state == 0:
- matchobj = bibl_begin.search(line)
- if matchobj:
- print >>data,matchobj.group(0)
- print >>data,"\\csname bibmessage\\endcsname\n"
- state = 1
- print >>out, line,
- continue
- elif state == 1:
- matchobj = bibre.search(line)
- if matchobj:
- matchobj = bibreF.search(line)
- if matchobj:
- biblabel, bibID = matchobj.groups()
- if not len(bibID):
- pseudobibID += 1
- bibID = '%s' % pseudobibID
- state = 2
- lines = [line]
- extralines = []
- continue
- else:
- readbib = line
- continue
- else:
- print >>out, line,
- continue
- elif state == 2:
- matchobj = bibre.search(line)
- if matchobj:
- matchobj = bibreF.search(line)
- if matchobj:
- total += 1
- print >>data,line
- outstring, sres = handlebibitem(lines, bibID, biblabel)
- if not sres:
- successful += 1
- else:
- errors += 1
- print >>out, outstring,
- handleextra(extralines)
- lines = [line]
- extralines = []
- biblabel, bibID = matchobj.groups()
- if not len(bibID):
- pseudobibID += 1
- bibID = '%s' % pseudobibID
- continue
- else:
- readbib = line
- continue
- else:
- matchobj = bibl_end.search(line)
- if matchobj:
- state = 0
- total += 1
- outstring, sres = handlebibitem(lines, bibID, biblabel)
- if not sres:
- successful += 1
- else:
- errors += 1
- print >>out, outstring,
- handleextra(extralines)
- print >>out, line,
- print >>data,matchobj.group(0)
- continue
- else:
- if line[:-1] == '':
- state = 3
- extralines = [line]
- continue
- matchobj = comments.search(line)
- if matchobj:
- state = 3
- extralines = [line]
- continue
- lines.append(line)
- continue
- elif state == 3:
- matchobj = bibre.search(line)
- if matchobj:
- matchobj = bibreF.search(line)
- if matchobj:
- state = 2
- total += 1
- outstring, sres = handlebibitem(lines, bibID, biblabel)
- if not sres:
- successful += 1
- else:
- errors += 1
- print >>out, outstring,
- handleextra(extralines)
- lines = [line]
- extralines = []
- biblabel, bibID = matchobj.groups()
- if not len(bibID):
- pseudobibID += 1
- bibID = '%s' % pseudobibID
- continue
- else:
- readbib = line
- continue
- else:
- matchobj = bibl_end.search(line)
- if matchobj:
- state = 0
- total += 1
- outstring, sres = handlebibitem(lines, bibID, biblabel)
- if not sres:
- successful += 1
- else:
- errors += 1
- print >>out, outstring,
- handleextra(extralines)
- print >>out, line,
- print >>data,matchobj.group(0)
- continue
- else:
- if line[:-1] == '':
- extralines.append(line)
- continue
- matchobj = comments.search(line)
- if matchobj:
- extralines.append(line)
- continue
- state = 2
- lines.extend(extralines)
- lines.append(line)
- extralines = []
- continue
- else:
- break
- print "Job ended"
- print "Total: %s, found: %s, errors: %s" % (total, successful, errors)
- return (total, successful, errors)
-
-#
-# bbl file parsing /end
-#
-
-if len(sys.argv) < 2:
- progname = os.path.basename(sys.argv[0])
- print "Usage:\n %s <bbl or tex file>" % progname
- sys.exit(1)
-infilename = sys.argv[1]
-filebase = os.path.splitext(infilename)[0]
-outfilename = "%s.getmref.tmp" % filebase
-datafilename = "%s.getmref.data" % filebase
-logfilename = "%s.getmref.log" % filebase
-
-inputfile = file(infilename, 'r')
-outputfile = file(outfilename, 'w')
-datafile = file(datafilename, 'w')
-logfile = file(logfilename, 'w')
-if os.path.isfile("%s.getmref.bak" % filebase):
- os.unlink("%s.getmref.bak" % filebase)
-
-sys.stderr = file("%s.getmref.err" % filebase, 'w')
-total = 0; successful = 0; errors = 0
-print >>logfile, "File: %s" % infilename
-try:
- total, successful, errors = handlebbl(inputfile, outputfile, datafile)
-except:
- print >>sys.stderr,"[handlebbl]"
- print >>sys.stderr,sys.exc_info()
-print >>logfile, " total: %s, found: %s, errors: %s, time: %ss" % (total, successful,
- errors, int(round(time.time()-starttime)))
-
-inputfile.close()
-outputfile.close()
-datafile.close()
-logfile.close()
-sys.stderr.close()
-sys.stderr = sys.__stderr__
-if os.path.isfile("%s.getmref.err" % filebase):
- if not os.stat("%s.getmref.err" % filebase)[6]:
- os.unlink("%s.getmref.err" % filebase)
-if os.path.isfile("%s.getmref.bak" % filebase):
- os.unlink("%s.getmref.bak" % filebase)
-os.rename(infilename, "%s.getmref.bak" % filebase)
-
-#mes modif
-#os.rename(outfilename, infilename)
-f=open(outfilename,"r")
-g=open(infilename,"w")
-x=f.read()
-g.write(re.sub(r"\r"," ",x))
-
-#fin de la modif
-
-print 'Job completed in %ss' % int(round(time.time()-starttime))
-
-
-
diff --git a/macros/latex/contrib/ejpecp/sample.pdf b/macros/latex/contrib/ejpecp/sample.pdf
index 79f20ac7fa..aa47175278 100644
--- a/macros/latex/contrib/ejpecp/sample.pdf
+++ b/macros/latex/contrib/ejpecp/sample.pdf
Binary files differ
diff --git a/macros/latex/contrib/ejpecp/sample.tex b/macros/latex/contrib/ejpecp/sample.tex
index 2930a08567..fed48e097e 100644
--- a/macros/latex/contrib/ejpecp/sample.tex
+++ b/macros/latex/contrib/ejpecp/sample.tex
@@ -114,7 +114,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\VOLUME{0}
-\YEAR{2016}
+\YEAR{2020}
\PAPERNUM{0}
\DOI{10.1214/YY-TN}
@@ -459,6 +459,21 @@ and in that case, you should provide the MR number instead of the arXiv
identifier. It is acceptable to leave arXiv links in the bibliography
(alongside MR links) even if the article has been published.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% %%
+%% Supplementary Material, if any, should be provided in %%
+%% {supplement} environment with title and short description. %%
+%% %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{supplement}
+\stitle{Title of Supplement A.}
+\sdescription{Short description of Supplement A.}
+\end{supplement}
+\begin{supplement}
+\stitle{Title of Supplement B.}
+\sdescription{Short description of Supplement B.}
+\end{supplement}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% %%
diff --git a/macros/latex/contrib/fgruler/README b/macros/latex/contrib/fgruler/README
index de38814440..266910338c 100644
--- a/macros/latex/contrib/fgruler/README
+++ b/macros/latex/contrib/fgruler/README
@@ -1,6 +1,6 @@
fgruler.sty package
-Copyright 2017- by Tibor Tomacs
+Copyright 2017-2020 by Tibor Tomacs
Package for drawing rulers on the foreground or in the text
diff --git a/macros/latex/contrib/fgruler/fgruler.dtx b/macros/latex/contrib/fgruler/fgruler.dtx
index 18d16a6260..dd7ec0ba06 100644
--- a/macros/latex/contrib/fgruler/fgruler.dtx
+++ b/macros/latex/contrib/fgruler/fgruler.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 2017- by Tibor Tomacs
+% Copyright 2017-2020 by Tibor Tomacs
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
@@ -20,8 +20,8 @@
%<*driver>
\ProvidesFile{fgruler.dtx}
%</driver>
-%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
-%<package>\ProvidesPackage{fgruler}[2017/01/16 v1.0 Package for drawing rulers on the foreground or in the text]
+%<package>\NeedsTeXFormat{LaTeX2e}[2020/10/01]
+%<package>\ProvidesPackage{fgruler}[2020/10/22 v1.1 Package for drawing rulers on the foreground or in the text]
%
%<*driver>
\documentclass{ltxdoc}
@@ -60,7 +60,7 @@ keepspaces]}
%
% \GetFileInfo{fgruler.sty}
%
-% \title{The {\bfseries\sffamily fgruler} package\\{\large v1.0 (2017/01/16)}}
+% \title{The {\bfseries\sffamily fgruler} package\\{\large v1.1 (2020/10/22)}}
% \author{Tibor T\'{o}m\'{a}cs\\{\normalsize\url{tomacs.tibor@uni-eszterhazy.hu}}}
% \date{}
% \maketitle
@@ -1053,7 +1053,7 @@ keepspaces]}
\else
-\@ifpackageloaded{eso-pic}{}{\RequirePackage{eso-pic}}
+\@ifpackageloaded{eso-pic}{}{\RequirePackage{eso-pic}[2020/10/14]}
\def\fgruler@frame{%
\begingroup
@@ -1085,30 +1085,27 @@ keepspaces]}
\endgroup
}
-\let\fgruler@shipout\AtBeginShipoutUpperLeftForeground
\def\fgruler@output@{}
+
\ESO@isMEMOIR{%
-\def\AtBeginShipoutUpperLeftForeground#1{%
- \fgruler@shipout{#1%
- \put(\fgruler@lentounit{\@tempdima},\fgruler@lentounit{\@tempdimb}){%
- \iffgruler@showframe\fgruler@frame\fi%
- \fgruler@output%
- \fgruler@output@%
- \global\let\fgruler@output@\@empty%
- }%
- }%
+ \AddToHook{shipout/foreground}{%
+ \ESO@MEMOIR@corr
+ \put(\ESO@tempdima,\ESO@tempdimb){%
+ \iffgruler@showframe\fgruler@frame\fi%
+ \fgruler@output%
+ \fgruler@output@%
+ \global\let\fgruler@output@\@empty%
}%
+ }%
}{%
-\def\AtBeginShipoutUpperLeftForeground#1{%
- \fgruler@shipout{#1%
- \put(0,\fgruler@lentounit{\ESO@yoffsetI}){%
- \iffgruler@showframe\fgruler@frame\fi%
- \fgruler@output%
- \fgruler@output@%
- \global\let\fgruler@output@\@empty%
- }%
- }%
+ \AddToHook{shipout/foreground}{%
+ \put(0,\ESO@yoffsetI){%
+ \iffgruler@showframe\fgruler@frame\fi%
+ \fgruler@output%
+ \fgruler@output@%
+ \global\let\fgruler@output@\@empty%
}%
+ }%
}
\fgruler@activate@type
diff --git a/macros/latex/contrib/fgruler/fgruler.ins b/macros/latex/contrib/fgruler/fgruler.ins
index 13ea6a1a4b..38cac59ba0 100644
--- a/macros/latex/contrib/fgruler/fgruler.ins
+++ b/macros/latex/contrib/fgruler/fgruler.ins
@@ -1,5 +1,5 @@
-% Copyright 2017- by Tibor Tomacs
+% Copyright 2017-2020 by Tibor Tomacs
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
@@ -19,7 +19,7 @@
\preamble
This is a generated file.
-Copyright 2017- by Tibor Tomacs
+Copyright 2017-2020 by Tibor Tomacs
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3
diff --git a/macros/latex/contrib/fgruler/fgruler.pdf b/macros/latex/contrib/fgruler/fgruler.pdf
index 04352acad0..eb3be627b8 100644
--- a/macros/latex/contrib/fgruler/fgruler.pdf
+++ b/macros/latex/contrib/fgruler/fgruler.pdf
Binary files differ
diff --git a/macros/latex/contrib/hu-berlin-bundle/README.md b/macros/latex/contrib/hu-berlin-bundle/README.md
index b803882b22..31ca809bcb 100644
--- a/macros/latex/contrib/hu-berlin-bundle/README.md
+++ b/macros/latex/contrib/hu-berlin-bundle/README.md
@@ -67,6 +67,11 @@ All notable changes to this project will be documented in the [README.md](https:
This project **does not** adhere to [Semantic Versioning](http://semver.org/).
The markdown syntax is inspired by the conventions proposed by [keepachangelog.com](http://keepachangelog.com/).
+### v1.0.6 (2020-10-22)
+* (letter) changed address separator
+* (letter) fixed empty minipage when no metadata given
+* (letter) changed default backaddress
+
### v1.0.5 (2020-04-28)
* (general) Changed logo format to `.pdf`
* (letter) Changed `\ifkomavarempty` to `\ifkomavarempty`, fixes
diff --git a/macros/latex/contrib/hu-berlin-bundle/hu-berlin-bundle.dtx b/macros/latex/contrib/hu-berlin-bundle/hu-berlin-bundle.dtx
index 497c7fedbf..efce1463da 100644
--- a/macros/latex/contrib/hu-berlin-bundle/hu-berlin-bundle.dtx
+++ b/macros/latex/contrib/hu-berlin-bundle/hu-berlin-bundle.dtx
@@ -1,6 +1,6 @@
% \iffalse
%<*internal|cls|sty>
-\def\Version{2020/04/28 v1.0.5}
+\def\Version{2020/10/22 v1.0.6}
%</internal|cls|sty>
%<*internal>
\iffalse
@@ -304,6 +304,12 @@ All notable changes to this project will be documented in the [README.md](https:
This project **does not** adhere to [Semantic Versioning](http://semver.org/).
The markdown syntax is inspired by the conventions proposed by [keepachangelog.com](http://keepachangelog.com/).
+### v1.0.6 (2020-10-22)
+* (letter) changed address separator
+* (letter) fixed empty minipage when no metadata given
+* (letter) changed default backaddress
+
+
### v1.0.5 (2020-04-28)
* (general) Changed logo format to `.pdf`
* (letter) Changed `\ifkomavarempty` to `\ifkomavarempty`, fixes
@@ -511,10 +517,11 @@ you get all these various files described above.
% If your backaddress is to long
% – it will be set up automatically –
% you can redefine it.
+%
% \begin{macrocode}
-\setkomavar{backaddress}{HU Berlin\\
-Unter den Linden 6\\
-D-10099 Berlin}
+%% \setkomavar{backaddress}{HU Berlin\\
+%% Unter den Linden 6\\
+%% D-10099 Berlin}
% \end{macrocode}
% Selfexplaining: the faculty.
% \begin{macrocode}
@@ -960,11 +967,19 @@ Thank you very much for your letter.
% \end{macrocode}
% then the faculty
% \begin{macrocode}
+\Ifkomavarempty{faculty}
+% \end{macrocode}
+% This is a fake space to avoid any trouble
+% if no custom metadata are given.
+% \begin{macrocode}
+ {\hspace*{1em}}
{\usekomafont{faculty}%
\usekomavar{faculty}\\[1\baselineskip]}
% \end{macrocode}
% and the institute.
% \begin{macrocode}
+\Ifkomavarempty{institute}
+ {}
{\usekomafont{institute}\usekomavar{institute}\\[1\baselineskip]}
% \end{macrocode}
% Now anything else regarding the institute.
@@ -1166,8 +1181,15 @@ Thank you very much for your letter.
% \begin{macrocode}
\setkomavar*{fromaddress}{Postanschrift:}
\setkomavar{fromaddress}{%
- Humboldt-Universität zu Berlin\par
- Unter den Linden 6\par
+ Humboldt-Universität zu Berlin\\
+ Unter den Linden 6\\
+ D-10099 Berlin}
+% \end{macrocode}
+% The default backaddress is slightly changed:
+% \begin{macrocode}
+\setkomavar{backaddress}{%
+ Humboldt-Universität zu Berlin\\
+ UdL 6\\
D-10099 Berlin}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/hu-berlin-bundle/hu-berlin-bundle.pdf b/macros/latex/contrib/hu-berlin-bundle/hu-berlin-bundle.pdf
index f801de6173..d66602637e 100644
--- a/macros/latex/contrib/hu-berlin-bundle/hu-berlin-bundle.pdf
+++ b/macros/latex/contrib/hu-berlin-bundle/hu-berlin-bundle.pdf
Binary files differ
diff --git a/macros/latex/contrib/scrlttr2copy/README.md b/macros/latex/contrib/scrlttr2copy/README.md
index 77e30b6f8e..cea1bb15a4 100644
--- a/macros/latex/contrib/scrlttr2copy/README.md
+++ b/macros/latex/contrib/scrlttr2copy/README.md
@@ -1,5 +1,5 @@
# scrlttr2copy
-A letter class option file for automatically creation of copies.
+A letter class option file for automatically creation of page copies.
The file `copy.lco` provides the new class option »copy« for the KOMA-Script
letter class »scrlttr2«. If the option »copy« is given all pages of a specific
@@ -7,6 +7,10 @@ letter are duplicated with background text marking as copies.
For more details see the example document `letter-copy-test.tex`.
-[Rolf Niepraschk](mailto:Rolf.Niepraschk@gmx.de), 2016-02-13
+This work may be distributed and/or modified under the conditions of the LaTeX
+Project Public License, either version 1.3 of this license or (at your option)
+any later version.
+
+Rolf Niepraschk
diff --git a/macros/latex/contrib/scrlttr2copy/copy.lco b/macros/latex/contrib/scrlttr2copy/copy.lco
index 260d3c6eb8..989449a59c 100644
--- a/macros/latex/contrib/scrlttr2copy/copy.lco
+++ b/macros/latex/contrib/scrlttr2copy/copy.lco
@@ -12,7 +12,7 @@
%%
%% This work has the LPPL maintenance status "author-maintained".
-\ProvidesFile{copy.lco}[2020/10/20 v0.2a copy letter-class-option (RN)]
+\ProvidesFile{copy.lco}[2020/10/22 v0.3a copy letter-class-option (RN)]
\providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}
\IfFormatAtLeastTF{2020/10/01}{}{%
\PackageError{copy.lco}{%
@@ -25,49 +25,20 @@
\RequirePackage{xcolor,graphicx}
-\newcounter{copy@pages}
-
-\AtBeginLetter{\shipout@copy}% Output the copy of the pages of the previous letter
-\AtEndDocument{\shipout@copy}% Output the copy of the pages of the last letter
-
-\newcommand*\shipout@copy{%
- \ifnum\c@copy@pages>\z@% ignore the following in the first \AtBeginLetter
- \RemoveFromHook{shipout/before}[CP@save]
- \if@twoside\ifodd\c@copy@pages
- \@latex@info@no@line{Shipout an empty page}%
- \shipout\null
- \fi\fi
- \immediate\closeout\@mainaux
- \immediate\openout\@mainaux\jobname.aux
- \begingroup
- \c@page=\z@
- \AddToHook{shipout/background}[CP@marker]{\LetterCopyMarker}%
- \loop\ifnum\c@page<\c@copy@pages
- \advance\c@page\@ne
- \@latex@info@no@line{Shipout copy of page \the\c@page}%
- \setbox\ShipoutBox=\box\csname out@box\the\c@page\endcsname
- \shipout\box\ShipoutBox
- \repeat
- \RemoveFromHook{shipout/background}[CP@marker]
- \endgroup
- \c@copy@pages=\z@
- \fi
- % Saving all pages of the next letter
- \AddToHook{shipout/before}[CP@save]{\save@page@copies}
+\AtEndLetter{% Saving the number of total pages of each letter in a separate macro
+ \expandafter\xdef\csname CP@max@pages@\the\c@letter\endcsname{\the\c@page}%
}
-\newcommand*\save@page@copies{%
- \@ifundefined{out@box\the\c@page}{%
- \@latex@info@no@line{Alloc savebox for page \the\c@page}%
- \expandafter\newsavebox\csname out@box\the\c@page\endcsname
- }{%
- \@latex@info@no@line{Savebox for page \the\c@page\space already exist}%
- }%
- \@latex@info@no@line{Save page \the\c@page\space to \string\out@box\the\c@page}%
- \global\setbox\csname out@box\the\c@page\endcsname=\copy\ShipoutBox
- \global\c@copy@pages=\c@page
+\newcommand*\save@page@copies{% Saving each output page in a separate box
+ \expandafter\newsavebox\csname page@box@\the\c@letter @\the\c@page\endcsname
+ \@latex@info@no@line{Save page \the\c@page\space of letter \the\c@letter
+ \space to \string\page@box@\the\c@letter @\the\c@page}%
+ \global\setbox\csname page@box@\the\c@letter @\the\c@page\endcsname=
+ \copy\ShipoutBox
}
+\AddToHook{shipout/before}[CP@save]{\save@page@copies}
+
\newcommand*\LetterCopyMarker{%
\put(0.5\paperwidth,-0.5\paperheight){%
\makebox(0,0)[c]{\resizebox{\textwidth}{!}{\rotatebox{45}{%
@@ -75,6 +46,34 @@
}%
}
+\AddToHook{enddocument/afteraux}[CP@shipout]{%
+ \RemoveFromHook{shipout/before}[CP@save]%
+ \if@twoside\ifodd\ReadonlyShipoutCounter
+ \@latex@info@no@line{Output an empty page}%
+ \shipout\null
+ \fi\fi
+ \AddToHook{shipout/background}[CP@marker]{\LetterCopyMarker}%
+ \@tempcnta=\z@
+ \loop% iterate over all letters
+ \advance\@tempcnta\@ne
+ {%
+ \c@page=\z@
+ \edef\@tempa{\@nameuse{CP@max@pages@\the\@tempcnta}}% total pages
+ \loop% iterate over all pages of this letter
+ \advance\c@page\@ne
+ \@latex@info@no@line{Output of the copy of page \the\c@page\space
+ of letter \the\@tempcnta}%
+ \setbox\ShipoutBox=\box\@nameuse{page@box@\the\@tempcnta @\the\c@page}%
+ \shipout\box\ShipoutBox
+ \ifnum \c@page < \@tempa
+ \repeat
+ }%
+ \ifnum \@tempcnta < \c@letter
+ \repeat
+ \RemoveFromHook{shipout/background}[CP@marker]
+ \RemoveFromHook{enddocument/afteraux}[CP@shipout]
+}
+
\newkomavar[\copyname]{copy}
\newcommand*\copyname{Copy}
@@ -82,7 +81,7 @@
english,newzealand,UKenglish,USenglish}\copyname{Copy}%
\defcaptionname{german,ngerman,austrian,naustrian,%
swissgerman,nswissgerman}\copyname{Kopie}
-\defcaptionname{acadian,canadien,francais,french}\copyname{Copie}
+\defcaptionname{acadian,francais,french}\copyname{Copie}
\defcaptionname{spanish,italian,portugese}\copyname{Copia}
\defcaptionname{polish}\copyname{Kopia}
\defcaptionname{russian}\copyname{Копия}
diff --git a/macros/latex/contrib/scrlttr2copy/letter-copy-test.pdf b/macros/latex/contrib/scrlttr2copy/letter-copy-test.pdf
index aee604b509..6a5f347143 100644
--- a/macros/latex/contrib/scrlttr2copy/letter-copy-test.pdf
+++ b/macros/latex/contrib/scrlttr2copy/letter-copy-test.pdf
Binary files differ
diff --git a/macros/latex/contrib/scrlttr2copy/letter-copy-test.tex b/macros/latex/contrib/scrlttr2copy/letter-copy-test.tex
index 1669762527..6ff0819a9c 100644
--- a/macros/latex/contrib/scrlttr2copy/letter-copy-test.tex
+++ b/macros/latex/contrib/scrlttr2copy/letter-copy-test.tex
@@ -1,4 +1,4 @@
-
+\listfiles
\documentclass[%
,copy
,ngerman
@@ -18,15 +18,18 @@
%\setkomavar*{copy}{Zweitschrift}
+% It is possible to redefine the \LetterCopyMarker macro to have a different
+% background for the copied pages.
+
\begin{document}
-\setkomavar{subject}{Ihr Schreiben vom 11.\,5.\,2015}
+\setkomavar{subject}{Ihr Schreiben vom 11.\,5.\,2015}
\begin{letter}{%
Ellen Bogen \\
Dorfstraße 1\\
12345 Musterhausen
-}
+}
\opening{Sehr geehrte Frau Bogen,}
@@ -50,6 +53,6 @@ Dorfstraße 1\\
\closing{Mit freundlichen Grüßen}
-\end{letter}
+\end{letter}
\end{document}
diff --git a/macros/latex/contrib/skills/README.md b/macros/latex/contrib/skills/README.md
new file mode 100644
index 0000000000..2b1f7f43a8
--- /dev/null
+++ b/macros/latex/contrib/skills/README.md
@@ -0,0 +1,21 @@
+# skills v1.0.0 (2020-10-21)
+
+Author: Pierre-Amiel Giraud
+
+## License
+
+This material is subject to the LaTeX Project Public License, either version 1.3 of this license or (at your option) any later version. The latest version of this license is in http://www.latex-project.org/lppl.txt and version 1.3 or later is part of all distributions of LaTeX version 2003/12/01 or later.
+
+- This work has the LPPL maintenance status "maintained".
+- The Current Maintainer of this work is Pierre-Amiel Giraud.
+- This work consists of the files `skills.sty` (the package itself) and `skillsdoc.tex` (its documentation).
+
+Copyright 2020 Pierre-Amiel Giraud
+
+## Description
+
+This package attempts to make it easy for even a LaTeX novice to prepare proficiency tests, especially in combination with the `exam` document class. Thus, almost all command names are very similar.
+
+After defining skills in the preamble or in an external file, they are declared using labels, and can optionally be set as global skills. A skills table is generated to summarize the evaluated competencies and to allow for writing down the resulting proficiency level.
+
+The user's guide `skillsdoc.tex` attempts to explain all of the possibilities in a readable way, with many examples. \ No newline at end of file
diff --git a/macros/latex/contrib/skills/skills.sty b/macros/latex/contrib/skills/skills.sty
new file mode 100644
index 0000000000..a750f5b9c7
--- /dev/null
+++ b/macros/latex/contrib/skills/skills.sty
@@ -0,0 +1,325 @@
+% skills.sty
+%
+% A LaTeX2e package for preparing proficiency tests.
+
+%% skills.sty
+%% Copyright (c) 2020 Pierre-Amiel Giraud
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2003/12/01 or later.
+%
+% This work has the LPPL maintenance status "maintained".
+%
+% This work consists of the files skills.sty and skillsdoc.tex.
+
+
+% The user's guide for skills.sty is in the file skillsdoc.tex.
+
+
+%%% Pierre-Amiel Giraud
+%%% History & Geography teacher
+%%% Chambery Middle School
+%%% 33140 Villenave d'Ornon
+%%% pierre-amiel.giraud@ac-bordeaux.fr
+
+% The newest version of this package should always be available
+% from its git repository: https://framagit.org/pagiraud/skills
+
+\NeedsTeXFormat{LaTeX2e}[1994/06/01]
+\ProvidesPackage{skills}[2020/10/21 Easing the making of proficiency tests]
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Different defaults if exam class is used %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\@ifclassloaded{exam}{%
+ \newcommand{\skillcounter}{question}%
+ \newcommand{\putglobalskills}{}
+ %New question function : \skillquestion
+ \usepackage{xparse}
+ \NewDocumentCommand \skillquestion {o o}
+ {
+ \IfNoValueTF{#2}
+ {\IfNoValueTF{#1}
+ {\question}
+ {\question \skills{#1}}
+ }
+ {\question[#2] \skills{#1}}
+ }
+ \NewDocumentEnvironment{skillquestions}{o}
+ {
+ \IfNoValueTF{#1}
+ {\begin{questions}}
+ {\ifthenelse{\equal{before}{\putglobalskills}}
+ {\begin{questions}
+ \globalskills{#1}
+ }
+ {\begin{questions}}
+ }
+ }
+ {
+ \IfNoValueTF{#1}
+ {\end{questions}}
+ {
+ \ifthenelse{\equal{before}{\putglobalskills}}
+ {\end{questions}}
+ {\globalskills{#1}
+ \end{questions}}
+ }
+ }
+}{%
+ \newcommand{\skillcounter}{section}%
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Build upon the package glossaries functionalities %
+% to ease skills evaluation. %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Allowing to change the default counter
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\RequirePackage{iftex}
+\RequirePackage{kvoptions}
+
+\SetupKeyvalOptions{
+ family=SkillsOpt,
+ prefix=SkillsOpt@
+}
+
+\DeclareStringOption[]{counter}
+\ProcessKeyvalOptions*
+
+\ifx\SkillsOpt@counter\@empty
+\else
+ \renewcommand*{\skillcounter}{\SkillsOpt@counter}
+\fi
+
+% Allowing to avoid the making of the glossary
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newif\if@makenoidxglossaries \@makenoidxglossariesfalse
+\DeclareOption{makenoidxglossaries}{\@makenoidxglossariestrue}
+\DeclareOption{donotmakenoidxglossaries}{\@makenoidxglossariesfalse}
+\DeclareOption*{}%Ne pas charger une option inconnue
+\ExecuteOptions{makenoidxglossaries}
+
+\ProcessOptions\relax
+
+%\PassOptionsToPackage{counter=\skillcounter}{glossaries}
+\RequirePackage{glossaries}
+
+\newglossary*{skills}{}[\skillcounter]
+
+\if@makenoidxglossaries
+ % Make the glossaries with standard compilation
+ \makenoidxglossaries
+\fi
+
+\usepackage{tabularx}
+%\renewcommand{\tabularxcolumn}[1]{>m{#1}}
+% Definiton of the skill table (basically, a glossary style)
+% \renewglossarystyle{skillstable}{def} can be used to custom it.
+\newglossarystyle{skillstable}{%
+ \renewenvironment{theglossary}%
+ {%\begin{center}
+ \renewcommand{\arraystretch}{1.5}
+ %\begin{tabular}{|rp{.58\linewidth}|>{\centering\arraybackslash}p{.12\linewidth}|>{\centering\arraybackslash}p{.1\linewidth}|}}%
+ \tabularx{\linewidth}{|rX|>{\centering\arraybackslash}p{.15\linewidth}|c|}}
+ {\endtabularx
+ }%
+ \renewcommand*{\glossaryheader}{\hline%
+ \multicolumn{2}{|c|}{\descriptionname} & \pagelistname & \skilllevelname \tabularnewline\hline}%
+ \renewcommand{\glossentry}[2]{%
+ \glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
+ \glossentrydesc{##1}\glspostdescription\space & ##2 &\tabularnewline\hline
+ }%
+% \renewcommand{\subglossentry}[3]{%
+% &
+% \glssubentryitem{##2}%
+% \glstarget{##2}{\strut}\glossentrydesc{##2}\glspostdescription\space &
+% ##3 & \tabularnewline
+% }%
+\renewcommand*{\glsgroupskip}{}%
+}
+
+% So that no space is left to display a glossary title
+\renewcommand{\glossarysection}[2][]{}
+
+% Print the skills table
+\newcommand{\skillstable}[1][use]{
+ \printnoidxglossary[type=skills, style=skillstable, sort=#1]}
+
+% Code to define a new skill as a new glossary entry
+\newcommand{\skilldef}[3]{\newglossaryentry{#1}{type=skills, name=#2,description={#3}}}
+
+% Code to use a defined skill as a glossary reference
+\newcommand{\skill}[1]{\gls{#1}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Configuring the way skills are displayed along the evaluation %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Define the skills enclosement in the question
+\newcommand{\defaultskillsopening}{(}
+\newcommand{\defaultskillsclosing}{)}
+
+\newcommand{\skillsopening}{\defaultskillsopening}
+\newcommand{\skillsclosing}{\defaultskillsclosing}
+
+% A function to ease skills enclosement modification by users
+\newcommand{\skillsenclosement}[2]{
+ \renewcommand{\skillsopening}{#1}
+ \renewcommand{\skillsclosing}{#2}
+}
+
+% The separator betwenn skills in the question
+\newcommand{\skillssep}{ }
+
+% Putting it all together
+\newcommand{\multiskills}[1]{%
+ \def\nextitem{\def\nextitem{\skillssep}}%
+ \skillsopening
+ \@for \el:=#1\do{\nextitem\skill{\el}}%
+ \skillsclosing
+}
+
+% Shortcuts for the three possibilities offered for points in the exam class
+\newcommand{\bracketedskills}{\skillsenclosement{[}{]}}
+\newcommand{\nobracketedskills}{\defaultskillsenclosement}
+
+
+% Two more shortcut for displaying only skills, without any decoration
+\newcommand{\onlyskills}{\skillsenclosement{}{}}
+\newcommand{\defaultskillsenclosement}{\skillsenclosement{\defaultskillsopening}{\defaultskillsclosing}}
+\newcommand{\notonlyskills}{\defaultskillsenclosement}
+
+\usepackage{etoolbox}
+\usepackage{marginnote}
+
+\newcommand{\skills}[1]{\multiskills{#1}}
+
+\newtoggle{SkillsInMargin}
+\newtoggle{SkillsInLeftMargin}
+\newtoggle{BoxedSkills}
+
+\renewcommand*{\raggedleftmarginnote}{\raggedright}
+\renewcommand*{\raggedrightmarginnote}{\raggedleft}
+\newcommand{\skillsinmarginvadjust}[1]{\renewcommand{\marginnotevadjust}{#1}}
+
+\newcommand{\PrintingSkillsConfiguration}{
+ \iftoggle{SkillsInMargin}
+ {% If skills are to be printed in the margin
+ \iftoggle{SkillsInLeftMargin}
+ {%If skills are to be printed in the left margin
+ \reversemarginpar
+ \iftoggle{BoxedSkills}
+ { %If skills are to be printed in a box in the left margin
+ \renewcommand{\skills}[1]{\marginnote[\fbox{\parbox{\marginparwidth}{\multiskills{##1}}}]{}}
+ }
+ { %If skills are to be printed without a box in the left margin
+ \renewcommand{\skills}[1]{\marginnote[\multiskills{##1}]{}}
+ }
+ }
+ { %Else : if skills are to be printed in the right margin
+ \normalmarginpar
+ \iftoggle{BoxedSkills}
+ {% If skills are to be printed in a box in the right margin
+ \renewcommand{\skills}[1]{\marginnote{\fbox{\parbox{\marginparwidth}{\multiskills{##1}}}}}
+ }
+ {% If skills are to be printed without a box in the right margin
+ \renewcommand{\skills}[1]{\marginnote{\multiskills{##1}}}
+ }
+ }
+ } % Endif
+ {% Else : skills are to be printed inline
+ \iftoggle{BoxedSkills}
+ {% If skills are to be printed inline in a box
+ \renewcommand{\skills}[1]{\fbox{\multiskills{##1}}}
+ }
+ {%If skills are to be printed inline without a box (default)
+ \renewcommand{\skills}[1]{\multiskills{##1}}
+ }
+ }
+}
+
+\newcommand{\skillsinrightmargin}{
+ \toggletrue{SkillsInMargin}
+ \togglefalse{SkillsInLeftMargin}
+ \PrintingSkillsConfiguration
+}
+
+\newcommand{\skillsinleftmargin}{
+ \toggletrue{SkillsInMargin}
+ \toggletrue{SkillsInLeftMargin}
+ \PrintingSkillsConfiguration
+}
+
+\newcommand{\skillsinmargin}{\skillsinleftmargin}
+
+\newcommand{\noskillsinmargin}{
+ \togglefalse{SkillsInMargin}
+ \PrintingSkillsConfiguration
+}
+
+\newcommand{\noskillsinrightmargin}{\noskillsinmargin}
+
+\newcommand{\boxedskills}{
+ \toggletrue{BoxedSkills}
+ \onlyskills
+ \skillsinmarginvadjust{-\baselineskip}
+ \PrintingSkillsConfiguration
+}
+
+\newcommand{\noboxedskills}{
+ \togglefalse{BoxedSkills}
+ \defaultskillsenclosement
+ \skillsinmarginvadjust{0pt}
+ \PrintingSkillsConfiguration
+}
+
+% The case of global skills
+\newcommand*{\glsgobblenumber}[1]{}
+% \renewcommand*{\glsgobblenumber}[1]{#1}% uncomment for testing
+
+\newcommand*{\globalskill}[2][]{%
+ \glsdoifexists{#2}%
+ {%
+ % \def\@glsnumberformat{glsnumberformat}% DELETED
+ \def\@glsnumberformat{glsgobblenumber}% NEW
+ \edef\@gls@counter{\csname glo@#2@counter\endcsname}%
+ \setkeys{glossadd}{#1}%
+ \@gls@saveentrycounter
+ \@do@wrglossary{#2}%
+ }%
+}
+
+\newcommand{\globalskills}[1]{%
+ \@for \el:=#1\do{\globalskill{\el}}%
+}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Localization. Work on it is needed %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% English (no localization)
+\renewcommand{\descriptionname}{Skill}
+\renewcommand{\pagelistname}{Questions}
+\newcommand{\skilllevelname}{Proficiency}
+
+% French
+\newcommand{\FrenchLocalization}{
+ \addto\captionsfrench{
+ \renewcommand{\pagelistname}{Questions}
+ \renewcommand{\descriptionname}{Compétence}
+ \renewcommand{\skilllevelname}{Maîtrise}
+ }
+}
+
+\@ifpackageloaded{polyglossia}{\FrenchLocalization}{}
+\@ifpackageloaded{babel}{\FrenchLocalization}{}
+
+\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/skills/skillsdoc.pdf b/macros/latex/contrib/skills/skillsdoc.pdf
new file mode 100644
index 0000000000..e60985763f
--- /dev/null
+++ b/macros/latex/contrib/skills/skillsdoc.pdf
Binary files differ
diff --git a/macros/latex/contrib/skills/skillsdoc.tex b/macros/latex/contrib/skills/skillsdoc.tex
new file mode 100644
index 0000000000..ee3cca4195
--- /dev/null
+++ b/macros/latex/contrib/skills/skillsdoc.tex
@@ -0,0 +1,733 @@
+%--------------------------------------------------------------------
+%--------------------------------------------------------------------
+% skillsdoc.tex
+%
+% This is the user's guide for the skills package,
+% by Pierre-Amiel Giraud.
+%
+% The skills package itself is in the file skills.sty.
+
+
+%%% Copyright (c) 2020
+% Pierre-Amiel Giraud
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2003/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Pierre-Amiel Giraud.
+%
+% This work consists of the files skills.sty and skillsdoc.tex.
+
+% The user's guide for skills.sty is in the file skillsdoc.tex.
+
+
+%%% Pierre-Amiel Giraud
+%%% History and Geography Teacher
+%%% Chambery Middle School
+%%% 33140 Villenave d'Ornon (France)
+%%% pierre-amiel.giraud@ac-bordeaux.fr
+
+% The newest version of this package should always be available
+% from my Gitlab page: https://framagit.org/pagiraud/skills/
+
+
+%--------------------------------------------------------------------
+%--------------------------------------------------------------------
+
+\documentclass[12pt]{exam}
+
+\usepackage{luatextra}
+\setmainfont{Linux Libertine O}
+\usepackage{polyglossia}
+\usepackage{microtype}
+
+\usepackage{amssymb}
+
+\usepackage{makeidx}
+
+\usepackage[counter=section]{skills}
+\skilldef{writing}{L1.1}{Writing to argue and write to communicate and share ideas}
+\skilldef{vocabulary}{H3.2}{Learning specific vocabulary and using it in context}
+\skilldef{situationInTime}{C1.1}{Situating in time and elaborating chronological landmarks}
+\renewcommand{\skillcounter}{section}
+
+\usepackage[colorlinks]{hyperref}
+
+% In case we're not using hyperref.sty:
+\providecommand{\texorpdfstring}[2]{#1}
+% The following can be used in \section commands
+% without generating pdf warnings:
+\newcommand{\bs}{\texorpdfstring{\char`\\}{}}
+
+\newcommand{\docversion}{1.0.0}
+\newcommand{\docdate}{October 21, 2020}
+%\newcommand{\docdate}{Draft: \today}
+
+%--------------------------------------------------------------------
+%
+% Changes since version 2.4 are described in the comments
+% near the beginning of the file exam.cls.
+%
+%--------------------------------------------------------------------
+
+\makeindex
+
+\newcommand{\indc}[1]{\index{#1@\texttt{\char`\\#1}}}
+\newcommand{\indcsub}[2]{\index{#1@\texttt{\char`\\#1}!#2}}
+\newcommand{\indcstart}[1]{\index{#1@\texttt{\char`\\#1}|(}}
+\newcommand{\indcstop}[1]{\index{#1@\texttt{\char`\\#1}|)}}
+
+\newcommand{\indt}[1]{\index{#1@\texttt{#1}}}
+\newcommand{\indtsub}[2]{\index{#1@\texttt{#1}!#2}}
+\newcommand{\indtstart}[1]{\index{#1@\texttt{#1}|(}}
+\newcommand{\indtstop}[1]{\index{#1@\texttt{#1}|)}}
+
+%---------------------------------------------------------------------
+\newenvironment{example}%
+ {\bigskip\filbreak
+ \subsubsection{Example:}
+ }%
+ {}
+
+\def\samplehead#1#2#3#4{%
+ \begin{trivlist}
+ \item[]
+ \leavevmode
+ \hbox to \textwidth{%
+ \rlap{\parbox[b]{\textwidth}{\raggedright#1\strut}}%
+ \hfil\parbox[b]{\textwidth}{\centering#2\strut}\hfil
+ \llap{\parbox[b]{\textwidth}{\raggedleft#3\strut}}%
+ }% hbox
+ #4
+ \end{trivlist}
+}
+
+\def\samplefoot#1#2#3#4{%
+ \begin{trivlist}
+ \item[]
+ \leavevmode
+ #1
+ \vskip 3pt
+
+ \hbox to \textwidth{%
+ \rlap{\parbox[t]{\textwidth}{\raggedright#2}}%
+ \hfil\parbox[t]{\textwidth}{\centering#3}\hfil
+ \llap{\parbox[t]{\textwidth}{\raggedleft#4}}%
+ }% hbox
+ \end{trivlist}
+}
+
+% \makeatletter
+% \@ifundefined{AmS}{\def\AmS{{\protect\the\textfont\tw@
+% A\kern-.1667em\lower.5ex\hbox{M}\kern-.125emS}}}
+% {}
+% \makeatother
+
+
+%---------------------------------------------------------------------
+%---------------------------------------------------------------------
+%---------------------------------------------------------------------
+%---------------------------------------------------------------------
+
+\begin{document}
+
+\title{Using the skills package}
+
+\author{Pierre-Amiel Giraud\\
+ History \& geography teacher\\
+ Chambery Middle School\\
+ 33140 Villenave d'Ornon (France)\\
+ pierre-amiel.giraud@ac-bordeaux.fr\\[\bigskipamount]
+ Copyright \copyright~2020\\
+ Pierre-Amiel Giraud}
+
+\date{\docdate}
+
+\maketitle
+
+\begin{center}
+ \small
+ This is the user's guide for version~\docversion{} of the
+ \verb"skills" package.
+\end{center}
+
+\tableofcontents
+%--------------------------------------------------------------------
+\section{Introduction}
+
+The file \verb"skills.sty" provides the \verb"skills" package,
+which attempts to make it easy for even a \LaTeX{} novice to prepare
+proficiency tests, especially in combination with the \verb|exam| document
+class.
+
+Here, what is called a proficiency test is an exam where questions are assigned
+one or more skills, and where the proficiency of the pupil is evaluated for each skill.
+It seems it can also be called, depending on the context and the country, skills assessment
+or skill-based assessment. As far as I know, proficiency tests are more often used in French-speaking areas, where they are called "\textit{évaluations par compétences}". This package has
+been designed with the French approach in mind. If you are using proficiency tests
+but this package doesn't fill your needs, your suggestions or code contributions are welcome.
+
+The \verb|skills| package has also been designed to be best used within the \verb|exam| document class. Thus, almost all command names are very similar. However, the package can be used within a variety of document classes: only a very small subset of the package commands is specific to the \verb|exam| document class.
+
+Some other packages, such as the \verb|competences| packages by Christophe Bares, follow the
+same goal but with different approaches. They might be of some interest if the present
+\verb|skills| package doesn't fill your needs.
+
+The latest version of \verb"skills.sty" (possibly a
+%
+beta\index{beta test} test version) should always be available at
+\verb"https://framagit.org/pagiraud/skills/"\index{web page}.
+
+%--------------------------------------------------------------------
+\subsection{License}
+
+\begin{itemize}
+\item This work may be distributed and/or modified under the
+ %
+ \index{Latex Project Public License@\LaTeX{} Project Public License}
+ %
+ conditions of the \LaTeX{} Project Public
+ License\index{license},\index{LPPL} either version~1.3 of this
+ license or (at your option) any later version. The latest version
+ of this license is in \verb"http://www.latex-project.org/lppl.txt"
+ and version 1.3 or later is part of all distributions of \LaTeX{}
+ version 2003/12/01 or later.
+\item This work has the LPPL maintenance status ``maintained''.
+\item The Current Maintainer of this work is Pierre-Amiel Giraud
+\item This work consists of the files \verb"skills.sty" and
+ \verb"skillsdoc.tex".
+\end{itemize}
+
+\subsection{Version Notes}
+
+\begin{description}
+ \item[v1.0.0] Initial release
+\end{description}
+
+%--------------------------------------------------------------------
+%--------------------------------------------------------------------
+\section{Usage instructions}
+\label{sec:Usage}
+
+This section details how to use the package and the commands it provides,
+from basic usage to customization. Some features are only available when
+the package is loaded within the \verb|exam| document class. They will be
+indicated as such.
+%--------------------------------------------------------------------
+\subsection{Loading the \texttt{skills} package}
+\label{sec:UsageLoadingPackage}
+
+To use the \verb|skills| package, you must load it, like every package,
+with the command
+\begin{center}
+ \verb"\usepackage{skills}"
+\end{center}
+
+\subsubsection*{Package options (advanced use only)}
+The package has only three options:
+\begin{itemize}
+ \item \verb|makenoidxglossaries| (default)
+ \item \verb|donotmakenoidxglossaries|
+ \item \verb|counter=<value>|
+\end{itemize}
+
+The \verb|donotmakenoidxglossaries| option is of any use only if you want to
+use the \verb|glossaries| package, upon which \verb|skills| is based,
+in your document. It deactivates the \verb|\makenoidxglossaries| command included in the \verb|skills.sty| file,
+so that you can handle your glossaries with the indexing option of your
+choice. Please refer to the \verb|glossaries| package documentation for
+more details.
+
+So, if you want to use the \verb|glossaries| and the \verb|skills| packages
+together in your document, it is advised to load the \verb|skills| package
+as follows:
+\begin{center}
+ \verb|\usepackage[donotmakenoidxglossaries]{skills}|
+\end{center}
+
+The \verb|counter| option is to be used only if you to change the default counter for grouping the skills in the skills table (question for the \verb|exam| class, \verb|section| for other classes). The section counter was chosen because it is probably the most widespread logical counter (as opposed to the page counter). This very document, written with the \verb|exam| class, loads the \verb|skills| package with
+
+\begin{verbatim}
+ \usepackage[counter=section]{skills}
+\end{verbatim}
+
+Indeed, multiple \verb|questions| environments are used all along the documentation, and using question as a counter would needlessly clutter the skills table. Any available counter can be used.
+%--------------------------------------------------------------------
+\subsection{Defining skills}
+\label{sec:UsageDefiningSkills}
+
+Skills must be defined in the preamble, using the \verb|skilldef| command:
+\begin{center}
+ \verb|\skilldef{label}{reference}{description}|
+\end{center}
+
+The first argument, \verb|label|, is a simple keyword that will be used in your document
+to indicate that you are evaluating mastery of this skill. The \verb|reference|
+is the code of the skill in your competency framework. Finally, \verb|description| is the
+place where you can put the title of your skill along with some description.
+
+Defining a skill doesn't imply that it will be used. Thus, you can define your whole
+competency framework (or a significant subset) in a file and then simply load it
+with the \verb|\input| command in every proficiency test you make: all skills will
+be available for declaration, but only those explicitly declared in the document body
+will appear on the output file.
+
+For the sake of example, we will define three skills that will be used all along this
+manual:
+
+\begin{verbatim}
+ \skilldef{writing}{L1.1}{Writing to argue and write to communicate
+ and share ideas}
+ \skilldef{vocabulary}{H3.2}{Learning specific vocabulary and using
+ it in context}
+ \skilldef{situationInTime}{C1.1}{Situating in time and elaborating
+ chronological landmarks}
+\end{verbatim}
+
+%--------------------------------------------------------------------
+\subsection{Declaring skills}
+\label{sec:UsageDeclaringSkills}
+
+There are two ways for declaring skills. The first, and the simplest, is available
+only if the loaded document class is \verb|exam|. The second one is class agnostic.
+
+\subsubsection{The easy way (\texttt{exam} document class only)}
+\label{sec:UsageDeclaringSkillsExamClass}
+
+When the \verb|skills| package is used together with the \verb|exam| document class,
+the \verb|skillquestions| environment and the \verb|\skillquestion| command become
+available to the user.
+
+They behave like the \verb|questions| environment and \verb|\question| command from
+the \verb|exam| document class, except they have one more optional argument, used for
+declaring skills:
+
+\begin{center}
+ \begin{verbatim}
+ \begin{skillquestions}[optional list of comma separated skills]
+ \skillquestion[optional list of comma separated skills][optional number of
+ points for the question] Some question
+ \end{skillquestions}
+ \end{verbatim}
+\end{center}
+
+The skills declared as arguments to the \verb|skillquestions| environment are global:
+they are not linked to any specific question in the exam, but are rather evaluated throughout
+the exam and will be flagged as such in the skills table (see subsection~\ref{sec:UsageSkillsTable}). Those declared as arguments
+to a \verb|\skillquestion| command are evaluated only in the questions where they are declared.
+
+Some details need specific attention:
+\begin{itemize}
+ \item The label chosen when defining a skill is used to declare it in the exam.
+ \item If you don't want to declare global skills or if, for any reason, you don't want to declare skills for a question, you should omit the square brackets containing them: don't use empty brackets.
+ \item Don't use spaces in the skills list: write \verb|writing,vocabulary|, not \verb|writing, vocabulary|.
+ \item A skill can't be declared as global and question specific in the same exam. If you try to
+ do so, the question-level declaration will overwrite the global one.
+ \item The \verb|skillquestions| environment and the \verb|\skillquestion| command are only wrappers around the \verb|questions| environment and the \verb|question| command from the \verb|exam| document class. As such, they can be freely mixed: \verb|\question| and \verb|\skillquestion| can be used together both within the \verb|questions| and \verb|skillquestions| environments. Points of \verb|\question| and \verb|skillquestion| add up nicely.
+\end{itemize}
+
+A very basic example, using the three previously defined skills, could thus be:
+
+\begin{verbatim}
+ \begin{skillquestions}[writing]
+ \skillquestion A first question without any skill declared
+ \skillquestion[situationInTime,vocabulary] A second question with two skills
+ \skillquestion[vocabulary][2] A third question with one skill and 2 points.
+ \question[3] A last question without any skill declared but 3 points.
+ \end{skillquestions}
+\end{verbatim}
+
+And would results in:
+ \begin{skillquestions}[writing]
+ \skillquestion A first question without any skill declared
+ \skillquestion[situationInTime,vocabulary] A second question with two skills
+ \skillquestion[vocabulary][2] A third question with one skill and 2 points.
+ \question[3] A last question without any skill declared but 3 points.
+\end{skillquestions}
+
+\bigskip
+
+As you can see, the declared global skill isn't printed: it will be shown only in the skills table (see subsection~\ref{sec:UsageSkillsTable}), which summarizes all declared skills in the exam.
+
+\subsubsection{The other but also easy way (any document class)}
+\label{sec:UsageDeclaringSkillsAnyClass}
+
+Skills and global skills can also be declared with the \verb|\skills| and \verb|\globalskills| commands:
+
+\begin{center}
+ \verb|\skills{list of comma separated skills}|
+ \verb|\globalskills{list of comma separated skills}|
+\end{center}
+
+As for \verb|skillquestion| and \verb|skillquestions|, the separator must be only a comma:don't
+use spaces. In the default configuration (see subsection~\ref{sec:CustomizeWhere} for customization), the skills will appear right
+were you write them. If you type:
+
+\begin{verbatim}
+ Some text \skills{vocabulary} that goes on and on and on.
+\end{verbatim}
+
+You will get:
+
+\bigskip
+Some text \skills{vocabulary} that goes on and on and on.
+\bigskip
+
+So, the \verb|\skills| command can be used in any class. That includes the \verb|exam| document class,
+if you want, for instance, to declare skills at the \verb|subquestion| or \verb|part| level. This won't
+have any effect on the way skills are grouped in the skills table. By default, they are grouped per question in the \verb|exam| class and per section for other document classes.
+
+The \verb|\globalskills| command doesn't print anything. If you type:
+
+\begin{verbatim}
+ Some text \globalskills{writing} that goes on and on and on.
+\end{verbatim}
+
+You will get:
+
+\bigskip
+Some text \globalskills{writing} that goes on and on and on.
+\bigskip
+
+But the place where you put the \verb|\globalskills| command has a direct effect on the skills table, as the skills appear in the order they are firstly declared. What's more, typing the \verb|globalskills| command anywhere in the document will likely result in undesired commas in the skills table. Therefore, as a rule of thumb, all global skills should be declared at once, in the same \verb|\globalskills| command:
+
+\begin{itemize}
+ \item right after \verb|\begin{document}| if you want the global skills to be printed at the beginning of the skills table;
+ \item right before \verb|\end{document}| if you want them to be printed at the end of the skills table.
+\end{itemize}
+
+The \verb|\globalskills| command shouldn't be used at all in the \verb|exam| class, at least in the \verb|skillquestions| environment is used.
+
+%margins. For the full story, see section~\ref{sec:points}.
+
+
+%--------------------------------------------------------------------
+\subsection{Printing the skills table}
+\label{sec:UsageSkillsTable}
+
+There would be very little interest in defining then declaring skills evaluated in an exam if they are not listed somewhere. With the \verb|skills| package, this is done with the command:
+
+\begin{center}
+ \verb|\skillstable[optional sorting argument]|
+\end{center}
+
+So, for most users, a simple \verb|\skillstable| is enough. If you are unhappy with the default sorting (skills sorted in the order they are firstly declared in the document), which is equivalent of typing \verb|\skillstable[use]|, some other options are available: word, letter, standard, def, nocase, case. For more information on these, please refer to the \verb|glossaries| package documentation (chapter 10, Displaying a glossary).
+
+Here, if I type:
+
+\begin{verbatim}
+ \skillstable
+\end{verbatim}
+
+I get:
+
+\bigskip
+
+\noindent
+\skillstable
+
+\bigskip
+
+The global skills can easily be seen as no question number appears in the Questions column.
+
+If the \verb|\globalskills| command is used to declare global skills, the place of the skills in the table is determined by the place the command is put in the document (see subsection~\ref{sec:UsageDeclaringSkillsAnyClass}). If the global skills are
+declared with the optional argument of the \verb|skillquestions| environment, by default, they are put after the other skills in the table, but this can be changed by typing:
+
+\begin{center}
+ \verb|\renewcommand{\putglobalskills}{before}|
+\end{center}
+
+%---------------------------------------------------------------------
+%--------------------------------------------------------------------
+\section{Customizing the display of the skills}
+\label{sec:Customize}
+
+For now, we have only seen how to setup a proficiency test, without modifying
+the default appearance, that is:
+
+\begin{itemize}
+ \item In the \verb|\skills| and \verb|\skillquestion| commands, if several skills are
+ declared, a blank space is used as a separator.
+\end{itemize}
+
+%--------------------------------------------------------------------
+\subsection{The separator in the \texttt{\textbackslash skills} and \texttt{\textbackslash skillquestion} commands}
+\label{sec:CustomizeSeparator}
+
+The default blank space can be changed by renewing the \verb|\skillssep| command. For instance, if you want the skills to be separated with a comma followed by a blank space, type:
+
+\begin{verbatim}
+ \renewcommand{\skillssep}{, }
+\end{verbatim}
+
+\renewcommand{\skillssep}{, }
+
+And now, if you type:
+
+\begin{verbatim}
+ \skills{vocabulary,situationInTime}
+\end{verbatim}
+
+You get:
+
+\bigskip
+\skills{vocabulary,situationInTime}
+\bigskip
+
+\renewcommand{\skillssep}{ }
+%--------------------------------------------------------------------
+\subsection{Where the skills will be printed}
+\label{sec:CustomizeWhere}
+
+The default is that the skills references will be inserted at the beginning of the question with \verb|\skillquestion| or right where the \verb|\skills| command is used, but, for one-sided documents
+
+\begin{itemize}
+ \item the command \verb|\skillsinmargin| (or, equivalently, the command \verb|\skillsinleftmargin|) will cause the skills references to be set in the left margin,
+ \item the command \verb|\skillsinrightmargin| will cause the skills references to be set in the right margin,
+ \item the commands \verb|\noskillsinmargin| and \verb|\noskillsinrightmargin| are equivalent, and either of them will revert to the default situation.
+\end{itemize}
+
+For two-sided documents, \verb|\skillsinmargin| and \verb|\skillsinleftmargin| print skills in the inner margin, while \verb|\skillsinrightmargin| prints them in the outer margin.
+
+If you chose to print the skills references inline (default), you can move where they appear simply by changing the place you type the \verb|\skills| command. For instance, if you want to print the skills at the end of a question, in the \verb|exam| class, you can type:
+
+\begin{verbatim}
+\begin{questions}
+ \skillquestion A very good question. \skills{vocabulary}
+\end{questions}
+\end{verbatim}
+
+You will get:
+
+\bigskip
+\begin{skillquestions}
+ \skillquestion A very good question. \skills{vocabulary}
+\end{skillquestions}
+\bigskip
+
+When the skills are set in a margin, they start on the line they were declared. Sometimes, for instance if you declare bot points and skills for a \verb|\skillquestion| to be shown in the same margin, the skills and points overlap, so you need to move vertically the skills using:
+
+\begin{center}
+ \verb|\skillsinmarginvadjust{some length}|
+\end{center}
+
+Let's see an example:
+\begin{verbatim}
+\begin{questions}
+ \pointsinrightmargin
+ \skillsinrightmargin
+ \skillquestion[vocabulary][2] Some question
+ \skillsinmarginvadjust{\baseline}
+ \skillquestion[vocabulary][2] Some question
+\end{questions}
+\end{verbatim}
+
+\bigskip
+\begin{questions}
+ \pointsinrightmargin
+ \skillsinrightmargin
+ \skillquestion[vocabulary][2] Some question
+ \skillsinmarginvadjust{\baselineskip}
+ \skillquestion[vocabulary][2] Some question
+\end{questions}
+\bigskip
+
+\verb|\skillsinmarginvadjust| can be changed as often as you need.
+
+%-----------------------------------------------------------------
+\subsection{Surronunding the skills: parentheses, brackets, a box, and more}
+\label{CustomizeSurrounding}
+
+By default, skills references are enclosed in parentheses. The package provides two ways for changing this.
+
+\subsubsection{Very quick way}
+Following the syntax used in the \verb|exam| class (but not requiring you to use it), you can very quickly change the way skills are enclosed.
+
+For instance, if you want to have the skills references enclosed in brackets:
+
+\begin{center}
+ \verb|\bracketedskills|
+\end{center}
+
+For example, if you give the command \verb|\bracketedskills|, typing some questions will produce something as follows:
+
+\begin{questions}
+ \bracketedskills
+ \skillquestion[vocabulary] Why is there air?
+ \skillquestion[vocabulary,situationInTime] What if there were no air?
+\end{questions}
+
+If you prefer having the skills enclosed in a box instead of in parentheses, give the command
+
+\begin{center}
+ \verb|\boxedskills|
+\end{center}
+
+For example, if you give the command \verb|\boxedskills|, then the questions typed above will produce
+
+\begin{questions}
+ \boxedskills
+ \skillquestion[vocabulary] Why is there air?
+ \skillquestion[vocabulary,situationInTime] What if there were no air?
+\end{questions}
+
+If you give the commands \verb|\boxedskills| and \verb|\skillsinmargin|, then the above questions will produce
+
+\begin{questions}
+ \boxedskills
+ \skillsinmargin
+ \skillquestion[vocabulary] Why is there air?
+ \skillquestion[vocabulary,situationInTime] What if there were no air?
+\end{questions}
+
+If you want the skills to be not enclosed at all, you can give the command:
+
+\begin{verbatim}
+ \onlyskills
+\end{verbatim}
+
+If you give the commands \verb|\onlyskills| and \verb|\skillsinrightmargin|, then the above questions will produce
+
+\begin{questions}
+ \onlyskills
+ \skillsinrightmargin
+ \skillquestion[vocabulary] Why is there air?
+ \skillquestion[vocabulary,situationInTime] What if there were no air?
+\end{questions}
+
+Other combinations of these commands will produce similar effects.
+
+If you want to switch back and forth between formats during the proficiency test, you can do so by giving one of the commands
+
+\begin{center}
+ \begin{tabular}{l}
+ \verb"\bracketedskills"\\
+ \verb"\nobracketedskills"\\
+ \verb"\boxedskills"\\
+ \verb"\noboxedskills"\\
+ \verb"\onlyskills"\\
+ \verb"\notonlyskills"
+ \end{tabular}
+\end{center}
+
+whenever you want to switch. The commands \verb|\nobracketedskills|, \verb|\noboxedskills| and \verb|\notonlyskills| are equivalent: they all return to the default of putting parentheses around the skills references.
+
+\subsubsection{Using the \texttt{\textbackslash skillsenclosement} command}
+
+It is possible to enclose the skills references with any string of characters, using the \verb|\skillsenclosement| command:
+
+\begin{center}
+ \verb|\skillsenclosement{opening string}{closing string}|
+\end{center}
+
+Actually, \verb|\bracketedskills| and \verb|\onlyskills| definitions are
+
+\begin{verbatim}
+ \newcommand{\bracketedskills}{\skillsenclosement{[}{]}}
+ \newcommand{\onlyskills}{\skillsenclosement{}{}}
+\end{verbatim}
+
+But one can be more imaginative with, for instance
+
+\begin{verbatim}
+ \skillsenclosement{**}{**}
+\end{verbatim}
+
+or even
+
+\begin{verbatim}
+ \skillsenclosement{oO}{Oo}
+\end{verbatim}
+
+This last example would produce
+
+\begin{questions}
+ \skillsenclosement{oO }{ Oo}
+ \skillquestion[vocabulary] Why is there air?
+ \skillquestion[vocabulary,situationInTime] What if there were no air?
+\end{questions}
+
+The \verb|\boxedskills| command uses another mechanism: after triggering an \verb|\onlyskills|, it puts a \verb|\fbox| or a \verb|\parbox| in a \verb|\fbox| around the skills, depending on whether the latter are printed inline or in a margin. It means one can use \verb|\skillsenclosement| after \verb|\boxedskills|. For instance, typing the following commands
+
+\begin{verbatim}
+ \boxedskills
+ \skillsenclosement{oO }{ Oo}
+\end{verbatim}
+
+before the questions printed above would produce
+
+\begin{questions}
+ \boxedskills
+ \skillsenclosement{oO }{ Oo}
+ \skillquestion[vocabulary] Why is there air?
+ \skillquestion[vocabulary,situationInTime] What if there were no air?
+\end{questions}
+
+%--------------------------------------------------------------------
+\subsection{The skills table}
+\label{sec:CustomizeSkillsTable}
+We have already talked about the \verb|\putglobalskills| command (see subsection~\ref{sec:UsageSkillsTable}).
+
+It is also possible to rename the columns of the table by renewing some commands before typing \verb|\skillstable|:
+
+\begin{itemize}
+ \item \verb|\renewcommand{\descriptionname}{Some name}| for the first column (default: Skill)
+ \item \verb|\renewcommand{\pagelistname}{Some name}| for the second column (default: Questions)
+ \item \verb|\renewcommand{\skilllevelname}{Some name}| for the third column (default: Proficiecncy)\\
+\end{itemize}
+
+If you are using the package \verb|polyglossia| or \verb|babel| with French as main language, these names are localized by the \verb|skills| package as "Compétences", "Questions" and "Maîtrise".
+
+It is also possible to totally change the look of the skills table with the command
+
+\begin{verbatim}
+ \renewglossarystyle{skillstable}{A new skills table look}
+\end{verbatim}
+
+This requires some knowledge about the \verb|glossaries| package. Please refer to its documentation, especially section 15.2 (Defining your own glossary style).
+
+%---------------------------------------------------------------------
+%--------------------------------------------------------------------
+\section{Technical informations}
+\label{sec:Technical}
+
+\subsection{Loaded packages}
+\label{sec:TechnicalPackages}
+
+The \verb|skills| package loads some other packages, namely and unordered: \verb|glossaries|, \verb|marginnote|, \verb|xparse|, \verb|tabularx|, \verb|etoolbox|, \verb|iftex| and \verb|kvoptions|.
+
+They are all loaded without any option.
+
+\subsection{Possible improvements (this is not a roadmap)}
+\label{sec:TechnicalImprovements}
+
+In next versions, if any, some improvements will be made:
+\begin{itemize}
+ \item A code cleanup is needed, because I started coding the package with the assumption that the naming convention for commands in the \LaTeX world was all lowercase. Then, I understood that the convention consisted rather in using lowercase names for user commands and camel case names for other commands.
+ \item A deeper code refactoring would replace \LaTeX commands by plain TeX control sequences and limit the dependency to external packages. This lower dependency would also help mitigating the probability of side effects.
+ \item Allowing for multiple skills tables on the same document, for instance on a per part or per section basis.
+ \item Offering some competency framework, that could be chosen with a key/value system as a package option.
+\end{itemize}
+
+%--------------------------------------------------------------------
+
+% The following is necessary to avoid warnings, since we have multiple
+% questions environments in this documentation file:
+\makeatletter
+\@pointschangedfalse
+\makeatother
+
+
+
+
+\end{document}
+%--------------------------------------------------------------------
+%--------------------------------------------------------------------
+%--------------------------------------------------------------------
diff --git a/macros/latex/contrib/snapshot/README b/macros/latex/contrib/snapshot/README
index 570861d37d..4c50606d36 100644
--- a/macros/latex/contrib/snapshot/README
+++ b/macros/latex/contrib/snapshot/README
@@ -1,17 +1,119 @@
-README for snapshot 2019/09/17
-https://www.ams.org/arc/resources/snapshot-about.html
-tech-support@ams.org
+README file for package snapshot 2.14 [2020/06/17]
-The snapshot package helps the owner of a LaTeX document
-obtain a list of the external dependencies of the document, in a
-form that can be embedded at the top of the document. To put it
-another way, it provides a snapshot of the current processing
-context of the document, insofar as it can be determined from
-inside LaTeX.
-
-Originally written by Michael J. Downes, the snapshot package
-is currently maintained by the American Mathematical Society.
+Copyright 1999-2003, 2004, 2010, 2012, 2020 American Mathematical Society.
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3c
of this license or (at your option) any later version.
+The latest version of this license is in
+ http://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+This work has the LPPL maintenance status `maintained'.
+
+The Current Maintainer of this work is the American Mathematical
+Society.
+
+American Mathematical Society
+Technical Support
+Publications Technical Group
+201 Charles Street
+Providence, RI 02904
+USA
+tel: (401) 455-4080
+ (800) 321-4267 (USA and Canada only)
+fax: (401) 331-3842
+email: tech-support@ams.org
+
+========================================================================
+ CONTENTS
+I. OVERVIEW
+II. REMARKS ON THIS RELEASE
+II. CHANGE LOG
+
+========================================================================
+I. OVERVIEW
+
+Complete documentation of all package options is available in
+snapshot.pdf.
+
+Typical usage involves the following steps:
+
+1. Add a \RequirePackage statement at the top of the document:
+
+ \RequirePackage{snapshot}
+ \documentclass{article}
+
+ \usepackage{graphicx}
+
+ \begin{document}
+
+ hello, world
+
+ \end{document}
+
+ Note that snapshot should be the very first thing loaded, even
+ before the \documentclass. Otherwise snapshot will not be able to
+ capture the information for the document class and any packages
+ loaded inside it.
+
+2. Run LaTeX on the document. This will produce a dependency list in a
+ file \jobname.dep.
+
+3. Insert the .dep file at the top of the document, before
+ \documentclass. The following example shows what you would
+ typically end up with for a document that used the article
+ documentclass and the graphicx package:
+
+ \RequirePackage{snapshot}
+
+ \RequireVersions{
+ *{application}{pdfTeX} {0000/00/00 v1.40.21}
+ *{format} {LaTeX2e} {2020-02-02 v2.e}
+ *{package}{snapshot} {2020/06/17 v2.14}
+ *{class} {article} {2019/12/20 v1.4l}
+ *{file} {size10.clo} {2019/12/20 v1.4l}
+ *{package}{graphicx} {2019/11/30 v1.2a}
+ *{package}{keyval} {2014/10/28 v1.15}
+ *{package}{graphics} {2019/11/30 v1.4a}
+ *{package}{trig} {2016/01/03 v1.10}
+ *{file} {graphics.cfg}{2016/06/04 v1.11}
+ *{file} {dvips.def} {2017/06/20 v3.1d}
+ *{file} {l3backend-dvips.def}{2020-05-05 v3}
+ }
+
+ \documentclass{article}
+ [...]
+
+ Now each time you recompile the document, snapshot will compare the
+ list of files actually loaded against the list recorded in
+ \RequireVersions and warn you of any changes.
+
+========================================================================
+II. REMARKS ON THIS RELEASE
+
+Since the snapshot package was originally released, there has been a
+tremendous amount of evolution among TeX engines (what snapshot calls
+the "application"). In addition to the introduction of two major new
+engines, three other engines that were once distinct have effectively
+merged. The algorithm for detecting the identify of the engine has
+been updated to reflect the state of the TeX world as reflected in TeX
+Live 2020.
+
+COMPATIBILITY NOTE: As a result of these improvements, the
+*{application} entry of your documents will almost certainly change.
+The snapshot package does not warn of changes in this entry, but if
+you have an external application that makes use of this information,
+you will probably need to update it.
+
+========================================================================
+III. CHANGE LOG
+
+2020-06-17 snapshot.dtx v2.14
+ -- Added code to detect the aleph, ptex, eptex, uptex, euptex,
+ luatex, and xetex engines in addition to etex, pdftex, and
+ pdfetex. Also distinguish between the various engines which
+ incorporate the eTeX extensions.
+ -- Made snapshot more tolerant of macros in the optional argument
+ to \Provides... declarations.
diff --git a/macros/latex/contrib/snapshot/snapshot.dtx b/macros/latex/contrib/snapshot/snapshot.dtx
index f79605dbf6..38c6b7d656 100644
--- a/macros/latex/contrib/snapshot/snapshot.dtx
+++ b/macros/latex/contrib/snapshot/snapshot.dtx
@@ -1,6 +1,6 @@
% \def\filename{snapshot.dtx}
-% \def\fileversion{2.13}
-% \def\filedate{2012/08/06}
+% \def\fileversion{2.14}
+% \def\filedate{2020/06/17}
%
% \iffalse meta-comment
%
@@ -15,7 +15,7 @@
% fax: (401) 331-3842
% email: tech-support@ams.org
%
-% Copyright 1999-2003, 2004, 2010, 2012 American Mathematical Society.
+% Copyright 1999-2003, 2004, 2010, 2012, 2020 American Mathematical Society.
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
@@ -35,7 +35,10 @@
% \iffalse
%<*driver>
\NeedsTeXFormat{LaTeX2e}
-\documentclass[oneside]{amsdtx}
+\documentclass{amsdtx}
+
+\usepackage{hyperref}
+
\providecommand{\qq}[1]{\textquotedblleft#1\textquotedblright}
\providecommand{\mdash}{\textemdash\penalty\exhyphenpenalty}
\providecommand{\lat}[1]{\protect\LaTeX{}}
@@ -44,12 +47,18 @@
\CodelineIndex
-\begin{document}
\title{The \pkg{snapshot} package}
-\author{American Mathematical Society\\Michael Downes}
+
+\author{American Mathematical Society}
+
\date{Version \fileversion, \filedate}
+
+\begin{document}
+
\DocInput{snapshot.dtx}
+
\PrintIndex
+
\end{document}
%</driver>
% \fi
@@ -57,6 +66,9 @@
% \MakeShortVerb{\|}
%
% \maketitle
+%
+% \tableofcontents
+%
% \section{Introduction}
%
% The \pkg{snapshot} package helps the owner of a \LaTeX{} document
@@ -122,7 +134,6 @@
% \begin{verbatim}
% \RequirePackage[log]{snapshot}
% \end{verbatim}
-%
% Making the necessary arrangements to ensure that future \latex/
% runs of the document actually call in the specified versions is a
% separate problem. The \pkg{snapshot} package only provides a way to
@@ -333,7 +344,7 @@
% Standard declaration of package name and date.
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}[1994/12/01]
-\ProvidesPackage{snapshot}[2012/08/06 v2.13]
+\ProvidesPackage{snapshot}[2020/06/17 v2.14]
% \end{macrocode}
%
% Calling the \pkg{snapshot} package in a document causes \latex/ to
@@ -367,11 +378,17 @@
% their documents.
% \end{minipage}\end{center}
%
+% \begin{macro}{\@xp}
+% \begin{macro}{\@nx}
% A couple of shorthand forms.
% \begin{macrocode}
\let\@xp=\expandafter \let\@nx=\noexpand
% \end{macrocode}
+% \end{macro}
+% \end{macro}
%
+% \begin{macro}{\str@cmp}
+% \begin{macro}{\str@equal}
% A function to compare two strings and return FT or TT (for use with
% \cs{if}).
% \begin{macrocode}
@@ -382,6 +399,8 @@
\str@cmp#1\relax\str@cmp#2{\relax\@gobbletwo}\@nil TT%
}
% \end{macrocode}
+% \end{macro}
+% \end{macro}
%
% \begin{macro}{\RequireVersions}
%
@@ -390,86 +409,219 @@
% \tex/ inputs path.
% \begin{macrocode}
\newcommand{\RequireVersions}[2][]{}%
+
\renewcommand{\RequireVersions}[1][]{%
- \def\snap@check{\snap@compare@versions}%
- \toks@{#1}\afterassignment\snap@storem
- \let\@let@token=
+ \def\snap@check{\snap@compare@versions}%
+ \toks@{#1}%
+ \afterassignment\snap@storem
+ \let\@let@token=
}
+
+\@onlypreamble\RequireVersions
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\snap@storem}
+% \begin{macrocode}
\def\snap@storem{%
- \ifx\@let@token\bgroup
- \else
- \PackageError{snapshot}{Expected a `\@charlb' character here}\@ehc
- \@xp\@gobblefour
- \fi
- \futurelet\@let@token\snap@branch
+ \ifx\@let@token\bgroup \else
+ \PackageError{snapshot}{Expected a `\@charlb' character here}\@ehc
+ \@xp\@gobblefour
+ \fi
+ \futurelet\@let@token\snap@branch
}
-\@onlypreamble\RequireVersions
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@check}
% \begin{macrocode}
\let\snap@check\@gobble
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@finish}
% \begin{macrocode}
\def\snap@finish{\toks@\bgroup}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@branch}
% \begin{macrocode}
\def\snap@branch{%
- \ifx\@let@token\egroup
- \@xp\snap@finish
- \else\ifx\@let@token *%
- \let\reserved@c\snap@store@version
- \else\ifx\@let@token\@sptoken
- \lowercase{\def\reserved@c} {\futurelet\@let@token\snap@branch}%
- \else
- \let\reserved@c\snap@store@error
- \fi\fi\fi
- \reserved@c
+ \ifx\@let@token\egroup
+ \@xp\snap@finish
+ \else\ifx\@let@token *%
+ \let\reserved@c\snap@store@version
+ \else\ifx\@let@token\@sptoken
+ \lowercase{\def\reserved@c} {\futurelet\@let@token\snap@branch}%
+ \else
+ \let\reserved@c\snap@store@error
+ \fi\fi\fi
+ \reserved@c
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@store@error}
% \begin{macrocode}
\def\snap@store@error#1{%
- \PackageError{snapshot}{Expected '*' here, not '#1'}\@ehc
+ \PackageError{snapshot}{Expected '*' here, not '#1'}\@ehc
}
+
\@onlypreamble\snap@store@error
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@store@version}
% \begin{macrocode}
\def\snap@store@version #1#2#3#4{%
- \@xp\snap@store@b\csname snapx@#2\endcsname{#2}{#3}{#4}%
+ \@xp\snap@store@b\csname snapx@#2\endcsname{#2}{#3}{#4}%
}
+
\@onlypreamble\snap@store@version
% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Determining the engine}
+%
+% \begin{macro}{\snapshotApplication}
+
+% Check for the engines that are active in \TeX Live 2020. Note
+% that in in modern versions of \TeX Live, there is no distinction
+% between \fn{etex}, \fn{pdfetex}, and \fn{pdftex}. I believe this
+% code will distinguish between distinct legacy binaries, but I
+% have not tested this thoroughly. Similar remarks apply to the
+% p\TeX\ family.
%
-% Detection of e-\LaTeX{}, pdf\LaTeX{}, pdfe\LaTeX{}, and Lambda
-% [Omega]:
% \begin{macrocode}
-\ifx\OmegaVersion\@@undefined
-\else
- \edef\snapshotApplication{%
- {Omega}\space\space\space
- {0000/00/00 v\OmegaVersion}%
- }%
-\fi
-\ifx\eTeXversion\@@undefined
-\else
- \edef\snapshotApplication{%
- {eTeX}\space\space\space\space
- {0000/00/00 v\number\eTeXversion\eTeXrevision}%
- }%
+\let\snapshotApplication\@empty
+
+\ifx\OmegaVersion\@@undefined \else
+ \edef\snapshotApplication{%
+ \ifx\AlephVersion\@@undefined
+ {Omega}\space\space\space
+ {0000/00/00 v\OmegaVersion}%
+ \else
+ {Aleph}\space\space\space
+% \end{macrocode}
+% \cs{AlephVersion} appears to be incorrectly set to 0.0, so
+% include the Omega version as well.
+% \begin{macrocode}
+ {0000/00/00 v\OmegaVersion-\AlephVersion}%
+ \fi
+ }%
\fi
-\ifx\pdftexversion\@@undefined
-\else
- \edef\snapshotApplication{%
- \ifx\eTeXversion\@@undefined
- {pdfTeX}\space\space
+
+\ifx\ptexversion\@@undefined\else
+ \edef\snapshotApplication{%
+ {pTeX}\space\space\space\space
+ {0000/00/00 v\number\ptexversion
+ \ifx\ptexminorversion\undefined \u \else.\number\ptexminorversion\fi
+ \ifx\ptexrevision\undefined \u \else\ptexrevision\fi}%
+ }%
+ \ifx\uptexversion\@@undefined
+ \ifx\epTeXversion\@@undefined\else
+ \edef\snapshotApplication{%
+ {epTeX}\space\space\space
+ {0000/00/00 v\number\epTeXversion}%
+ }%
+ \fi
\else
- {pdfeTeX}\space
+ \ifx\epTeXversion\@@undefined
+ \edef\snapshotApplication{%
+ {upTeX}\space\space\space
+ {0000/00/00 v\number\uptexversion
+ \ifx\uptexrevision\undefined \u \else\uptexrevision\fi}%
+ }%
+ \else
+% \end{macrocode}
+% There is no separate \cs{euptexversion}, so use a combination of
+% the underlying up\TeX\ and ep\TeX\ versions.
+% \begin{macrocode}
+ \edef\snapshotApplication{%
+ {eupTeX}\space\space
+ {0000/00/00 v\number\uptexversion
+ \ifx\uptexrevision\undefined \u \else\uptexrevision\fi
+ --\number\epTeXversion}%
+ }%
+ \fi
+ \fi
+\fi
+
+\ifx\snapshotApplication\@empty
+ \ifx\XeTeXversion\@@undefined\else
+ \edef\snapshotApplication{%
+ {XeTeX}\space\space\space
+ {0000/00/00 v\number\XeTeXversion
+ \ifx\XeTeXrevision\undefined\else\XeTeXrevision\fi}%
+ }%
+ \fi
+\fi
+
+\ifx\snapshotApplication\@empty
+ \ifx\luatexversion\@@undefined\else
+ \begingroup
+ \@tempcnta\luatexversion
+ \divide\@tempcnta by 100
+ \edef\@tempa{\the\@tempcnta}%
+ \multiply\@tempcnta by 100
+ \@tempcntb\luatexversion
+ \advance\@tempcntb by -\@tempcnta
+ \edef\@tempa{\@tempa.\the\@tempcntb.\luatexrevision}%
+ \xdef\snapshotApplication{%
+ {luaTeX}\space\space
+ {0000/00/00 v\@tempa}%
+ }%
+ \endgroup
+ \fi
+\fi
+
+\ifx\snapshotApplication\@empty
+ \ifx\pdftexversion\@@undefined \else
+ \begingroup
+ \ifx\eTeXversion\@@undefined
+ \@tempswafalse
+ \else
+ \@tempswatrue
+ \fi
+ \@tempcnta\pdftexversion
+ \divide\@tempcnta by 100
+ \edef\@tempa{\the\@tempcnta}%
+ \multiply\@tempcnta by 100
+ \@tempcntb\pdftexversion
+ \advance\@tempcntb by -\@tempcnta
+% \end{macrocode}
+% e\TeX\ was folded into pdf\TeX\ as of version 1.40.
+% \begin{macrocode}
+ \ifnum\@tempcntb > 39
+ \@tempswafalse
+ \fi
+ \edef\@tempa{\@tempa.\the\@tempcntb.\pdftexrevision}%
+ \xdef\snapshotApplication{%
+ \if@tempswa
+ {pdfeTeX}\space
+ \else
+ {pdfTeX}\space\space
+ \fi
+ {0000/00/00 v\@tempa}%
+ }%
+ \endgroup
+ \fi
+\fi
+
+\ifx\snapshotApplication\@empty
+ \ifx\eTeXversion\@@undefined \else
+ \edef\snapshotApplication{%
+ {eTeX}\space\space\space\space
+ {0000/00/00 v\number\eTeXversion
+ \ifx\eTeXrevision\undefined
+ \ifx\eTeXminorversion\undefined\else.\number\eTeXminorversion\fi
+ \else
+ \eTeXrevision
+ \fi
+ }%
+ }%
\fi
- {0000/00/00 v0.\number\pdftexversion\pdftexrevision}%
- }%
\fi
% \end{macrocode}
% If none of the above information is available, the exact version
@@ -477,13 +629,14 @@
% fall back to using a nominal date of 1990/03/25, which is when
% version 3.0 of \fn{tex.web} was released by Knuth.
% \begin{macrocode}
-\@ifundefined{snapshotApplication}{%
- \edef\snapshotApplication{%
- {TeX}\space\space\space\space\space
- {1990/03/25 v3.x}%
- }%
-}{}
+\ifx\snapshotApplication\@empty
+ \edef\snapshotApplication{%
+ {TeX}\space\space\space\space\space
+ {1990/03/25 v3.x}%
+ }%
+\fi
% \end{macrocode}
+% \end{macro}
%
% \begin{macrocode}
\def\@fmtextension{fmt}
@@ -499,57 +652,62 @@
\expandafter\let\csname snapx@-------\endcsname\snapx@end
% \end{macrocode}
%
+% \begin{macro}{\snap@store@b}
% For a package named \fn{foo.sty}, this function defines
% \cs{rqv@foo.sty} to hold the date and version information.
% \begin{macrocode}
\def\snap@store@b#1#2#3#4{%
- \ifx#1\snapx@end
- \@xp\snap@finish
- \else
- \ifx#1\relax \let#1\@empty\fi
- \def\@tempa##1 ##2 ##3\@nil{##1 ##2}%
+ \ifx#1\snapx@end
+ \@xp\snap@finish
+ \else
+ \ifx#1\relax \let#1\@empty\fi
+ \def\@tempa##1 ##2 ##3\@nil{##1 ##2}%
% \end{macrocode}
%
% \begin{macrocode}
- \ifx#1\snapx@application
- \@xp\xdef\csname rqv@#3#1\endcsname{\@tempa#4 v?.? ? \relax\@nil}%
- \else
- \xdef\rqv@list{\rqv@list{#3#1}}%
- \@xp\xdef\csname rqv@#3#1\endcsname{\@tempa#4 v?.? ? \relax\@nil}%
- \snap@intest{#3}{#1}%
- \ifx#1\snapx@format \snap@check{#3.fmt}%
+ \ifx#1\snapx@application
+ \@xp\xdef\csname rqv@#3#1\endcsname{\@tempa#4 v?.? ? \relax\@nil}%
+ \else
+ \xdef\rqv@list{\rqv@list{#3#1}}%
+ \@xp\xdef\csname rqv@#3#1\endcsname{\@tempa#4 v?.? ? \relax\@nil}%
+ \snap@intest{#3}{#1}%
+ \ifx#1\snapx@format \snap@check{#3.fmt}\else
% \end{macrocode}
% Test if current file is \fn{snapshot.sty}. Need to pre-expand the
% extension part to ensure the test is correct.
% \begin{macrocode}
- \else
- \edef\@tempa{\@nx\string@equal{snapshot.sty}{#3#1}}%
- \if\@tempa \snap@selfcheck \fi
- \fi
+ \edef\@tempa{\@nx\string@equal{snapshot.sty}{#3#1}}%
+ \if\@tempa \snap@selfcheck \fi
+ \fi
+ \fi
\fi
- \fi
- \futurelet\@let@token\snap@branch
+ \futurelet\@let@token\snap@branch
}
+
\@onlypreamble\snap@store@b
% \end{macrocode}
-% \end{macro}
+% \end{macro}
%
+% \begin{macro}{\snap@write}
% Default setup is geared to write the dependency list to a \fn{.dep}
% file. The option \opt{log} means write it to the \tex/ log instead.
% \begin{macrocode}
\def\snap@write{\immediate\write\snap@out}
\let\snap@out\sixt@@n % fallback, probably never used
% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Package options}
%
% \begin{macrocode}
\DeclareOption{dep}{%
- \def\snap@write{\immediate\write\snap@out}%
+ \def\snap@write{\immediate\write\snap@out}%
}
% \end{macrocode}
%
% \begin{macrocode}
\DeclareOption{log}{%
- \let\snap@write\typeout
+ \let\snap@write\typeout
}
% \end{macrocode}
%
@@ -577,32 +735,39 @@
% in the \fn{.dvi} file.
% \begin{macrocode}
\DeclareOption{tfm}{%
- \typeout{Option 'tfm' not implemented yet [1999/09/23]}%
+ \typeout{Option 'tfm' not implemented yet [1999/09/23]}%
}
% \end{macrocode}
%
-% Warnings and errors.
+% \subsubsection{Warnings and errors}
+% \begin{macro}{\snap@mismatch@warning}
+% \begin{macro}{\snap@mismatch}
% \begin{macrocode}
\def\snap@mismatch@warning#1#2#3{\PackageWarningNoLine{#1}{#2}}
\def\snap@mismatch{\snap@mismatch@warning}
% \end{macrocode}
+% \end{macro}
+% \end{macro}
%
% \begin{macrocode}
\DeclareOption{error}{%
- \def\snap@mismatch{\PackageError}%
- \def\snap@selfcheck{\snap@selfcheck@a}%
- \ifx\snap@select\@empty \let\snap@select\snap@select@all \fi
+ \def\snap@mismatch{\PackageError}%
+ \def\snap@selfcheck{\snap@selfcheck@a}%
+ \ifx\snap@select\@empty \let\snap@select\snap@select@all \fi
}
% \end{macrocode}
%
% \begin{macrocode}
\DeclareOption{warning}{%
- \def\snap@mismatch{\snap@mismatch@warning}%
- \def\snap@selfcheck{\snap@selfcheck@a}%
- \ifx\snap@select\@empty \let\snap@select\snap@select@all \fi
+ \def\snap@mismatch{\snap@mismatch@warning}%
+ \def\snap@selfcheck{\snap@selfcheck@a}%
+ \ifx\snap@select\@empty \let\snap@select\snap@select@all \fi
}
% \end{macrocode}
%
+%
+% \begin{macro}{\snap@select@all}
+% \begin{macro}{\snap@select}
% Because the exact form of the version number is not mandated by
% \LaTeX{}, just take the first two ``words'' delimited by spaces.
% And take a little extra care to properly handle multiple spaces
@@ -611,7 +776,12 @@
\def\snap@select@all#1#2 #3#4 #5\@nil{#1#2 #3#4}
\let\snap@select\@empty
% \end{macrocode}
+% \end{macro}
+% \end{macro}
%
+% \begin{macro}{\snap@seldate}
+% \begin{macro}{\snap@selversion}
+% \begin{macro}{\snap@selmajor}
% If the naming conventions seem a little peculiar here, it's because
% I had to add some pieces later that I didn't think of initially,
% and I wanted to minimize the chances of compatibility problems for
@@ -621,21 +791,31 @@
\def\snap@selversion#1#2 #3{\snap@select@version #3}%
\def\snap@selmajor#1#2 #3{\snap@select@major #3}%
% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \begin{macrocode}
\DeclareOption{date}{\let\snap@select=\snap@seldate}
% \end{macrocode}
%
+% \begin{macro}{\snap@select@version}
% \begin{macrocode}
\def\snap@select@version#1{%
\ifodd 0#11 \@xp\snap@sva\@xp#1\else\@xp\snap@select@version\fi
}
\def\snap@sva#1.#2 #3\@nil{#1.#2}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\snap@select@major}
+% \begin{macrocode}
\def\snap@select@major#1{%
\ifodd 0#11 \@xp\snap@svm\@xp#1\else\@xp\snap@select@major\fi
}
\def\snap@svm#1.#2\@nil{#1}
% \end{macrocode}
+% \end{macro}
%
% \begin{macrocode}
\DeclareOption{version}{\let\snap@select\snap@selversion}
@@ -647,30 +827,34 @@
\DeclareOption{bbinfo}{\def\snap@bbinfo{00}}
% \end{macrocode}
%
+% \begin{macro}{\snap@splitter}
% Give this an inert definition, for the time being, until we are
% ready to do the split.
% \begin{macrocode}
\let\snap@splitter=?
\AtBeginDocument{%
- \xdef\@filelist{\@filelist\snap@splitter}%
+ \xdef\@filelist{\@filelist\snap@splitter}%
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@selfcheck}
% \begin{macrocode}
\let\snap@selfcheck\@empty
\let\snap@selfcheck@a\@empty
% \end{macrocode}
+% \end{macro}
%
% The \opt{self-warning} option would normally be used in conjunction
% with the \opt{error} option.
% \begin{macrocode}
\DeclareOption{self-warning}{%
- \def\snap@selfcheck{%
- \begingroup
- \def\snap@mismatch{\snap@mismatch@warning}%
- \snap@selfcheck@a
- \endgroup
- }
+ \def\snap@selfcheck{%
+ \begingroup
+ \def\snap@mismatch{\snap@mismatch@warning}%
+ \snap@selfcheck@a
+ \endgroup
+ }
}
% \end{macrocode}
%
@@ -679,16 +863,19 @@
\ProcessOptions\relax
% \end{macrocode}
%
+% \begin{macro}{\snap@restore@extensions}
% We need the following patch to make up for the fact that
% \cs{@pkgextension} and \cs{@clsextension} are marked in the \latex/
% kernel as \qq{only preamble}.
% \begin{macrocode}
\edef\snap@restore@extensions{%
- \def\@nx\@pkgextension{\@pkgextension}%
- \def\@nx\@clsextension{\@clsextension}%
+ \def\@nx\@pkgextension{\@pkgextension}%
+ \def\@nx\@clsextension{\@clsextension}%
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@pad}
% Pad filename strings out to 8+3 length so that the list will look
% pretty.
% \begin{macrocode}
@@ -696,7 +883,9 @@
\def\snap@pad@a#1#2#3#4#5\@nil{\snap@pad@b#1#2#3#4\space\@nil}
\def\snap@pad@b#1\space#2\@nil#3{\def#3{#2}}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@trim@version}
% First stage: discard leading spaces before the first and second
% nonspace strings in the argument. Take the first nonspace string as
% the date. Since we only do equal/not-equal testing on dates, it
@@ -716,6 +905,7 @@
% \begin{macrocode}
\def\snap@trim@c#1#2 #3\@nil{#2}
% \end{macrocode}
+% \end{macro}
%
% \begin{macrocode}
\let\rqv@list=\@empty
@@ -726,13 +916,14 @@
\edef\@tempc#1\fmtname{#1\fmtname}\@tempc
\def\@tempa#1,\fmtname.fmt,#2#3\@nil{#2}
\edef\@tempb{\@nx\@tempa,\@filelist,\fmtname.fmt,}
+
\if ?\@tempb?\@nil
- \edef\@filelist{\fmtname.fmt,\@filelist}%
- \def\@tempc{LaTeX2e}%
- \@xp\edef\csname ver@\fmtname.fmt\endcsname{%
- \fmtversion\space
- v\ifx\@tempc\fmtname 2.e\else ?.?\fi
- }%
+ \edef\@filelist{\fmtname.fmt,\@filelist}%
+ \def\@tempc{LaTeX2e}%
+ \@xp\edef\csname ver@\fmtname.fmt\endcsname{%
+ \fmtversion\space
+ v\ifx\@tempc\fmtname 2.e\else ?.?\fi
+ }%
\fi
% \end{macrocode}
% Ensure that files get recorded.
@@ -740,81 +931,100 @@
\listfiles
% \end{macrocode}
%
+% \begin{macro}{\snap@doit}
% \begin{macrocode}
\def\snap@doit#1{%
- \begingroup
- \ifx\delimiter#1\delimiter
- \else
- \filename@parse{#1}%
- \let\@tempd\@empty
- \ifx\filename@ext\relax
- \def\@tempa{file}\def\@tempb{~~~}%
- \else\ifx\filename@ext\@pkgextension
- \def\@tempa{package}\let\@tempb\@empty
- \else\ifx\filename@ext\@clsextension
- \def\@tempa{class}\def\@tempb{~~}%
- \else\ifx\filename@ext\@fmtextension
- \def\@tempa{format}\def\@tempb{~}%
- \else\ifx\filename@ext\@tfmextension
- \def\@tempa{tfm}\def\@tempb{~~~~}%
- \else
- \def\@tempa{file}\edef\@tempd{.\filename@ext}%
- \def\@tempb{~~~}%
- \fi\fi\fi\fi\fi
- \@xp\let\@xp\@tempe
- \csname ver@\filename@base %
- \ifx\filename@ext\relax\else.\filename@ext\fi\endcsname
- \ifx\@tempe\@empty \let\@tempe\relax \fi
- \edef\@tempe{%
- \ifx\@tempe\relax 0000/00/00 v0.0%
- \else
- \@xp\@xp\@xp\snap@trim@version\@xp\@tempe\space v0.0 v0.0 \@nil
- \fi
- }%
- \edef\@tempc{\filename@area\filename@base\@tempd}% full file name
- \@xp\snap@pad\@tempc\space~~~~~~~~~~~~~~~~\@nil\@tempd
- \let~\space
- \snap@write{\space\space *{\@tempa}\@tempb{\@tempc}\@tempd{\@tempe}}%
- \fi
- \aftergroup\snap@doit
- \endgroup
-}%
+ \begingroup
+ \ifx\delimiter#1\delimiter \else
+ \filename@parse{#1}%
+ \let\@tempd\@empty
+ \ifx\filename@ext\relax
+ \def\@tempa{file}\def\@tempb{~~~}%
+ \else\ifx\filename@ext\@pkgextension
+ \def\@tempa{package}\let\@tempb\@empty
+ \else\ifx\filename@ext\@clsextension
+ \def\@tempa{class}\def\@tempb{~~}%
+ \else\ifx\filename@ext\@fmtextension
+ \def\@tempa{format}\def\@tempb{~}%
+ \else\ifx\filename@ext\@tfmextension
+ \def\@tempa{tfm}\def\@tempb{~~~~}%
+ \else
+ \def\@tempa{file}%
+ \edef\@tempd{.\filename@ext}%
+ \def\@tempb{~~~}%
+ \fi\fi\fi\fi\fi
+ \@xp\let\@xp\@tempe
+ \csname ver@\filename@base %
+ \ifx\filename@ext\relax\else.\filename@ext\fi\endcsname
+ \ifx\@tempe\@empty \let\@tempe\relax \fi
+ \edef\@tempe{%
+ \ifx\@tempe\relax 0000/00/00 v0.0%
+ \else
+ \@xp\@xp\@xp\snap@trim@version\@xp\@tempe\space v0.0 v0.0 \@nil
+ \fi
+ }%
+ \edef\@tempc{\filename@area\filename@base\@tempd}% full file name
+ \@xp\snap@pad\@tempc\space~~~~~~~~~~~~~~~~\@nil\@tempd
+ \let~\space
+ \snap@write{\space\space *{\@tempa}\@tempb{\@tempc}\@tempd{\@tempe}}%
+ \fi
+ \aftergroup\snap@doit
+ \endgroup
+}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@bracify}
% \begin{macrocode}
\def\snap@bracify#1#2,{%
\ifx\@empty#1\expandafter\@gobble\else {#1#2}\fi \snap@bracify
}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\snap@splitter@a}
+% \begin{macrocode}
\def\snap@splitter@a{%
- \iffalse{{\fi }}% close current file name, end definition
- \xdef\specific@files{%
- \iffalse}\fi
- \specific@files
- \expandafter\@gobble\string % discard one closing brace
+ \iffalse{{\fi }}% close current file name, end definition
+ \xdef\specific@files{%
+ \iffalse}\fi
+ \specific@files
+ \expandafter\@gobble\string % discard one closing brace
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@fdcheck}
% \begin{macrocode}
\def\snap@fdcheck#1{%
- \ifx\delimiter#1\@xp\@gobble
- \else\snap@fda#1\@empty.fd\@empty ?\@nil
- \fi
- \snap@fdcheck
+ \ifx\delimiter#1%
+ \@xp\@gobble
+ \else
+ \snap@fda#1\@empty.fd\@empty ?\@nil
+ \fi
+ \snap@fdcheck
}
+
\def\snap@fda#1.fd\@empty#2#3\@nil{%
- \if ?#2%
- \xdef\specific@files{\specific@files {#1}}%
- \else
- \xdef\general@files{\general@files {#1.fd}}%
- \fi
+ \if ?#2%
+ \xdef\specific@files{\specific@files {#1}}%
+ \else
+ \xdef\general@files{\general@files {#1.fd}}%
+ \fi
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\general@files}
+% \begin{macro}{\specific@files}
% \begin{macrocode}
\let\general@files\@empty
\let\specific@files\@empty
% \end{macrocode}
+% \end{macro}
+% \end{macro}
%
+% \begin{macro}{\SpecialInput}
% The \cn{SpecialInput} command is related to the \opt{packages-only}
% option. Apart from some ad hoc handling for \fn{.fd} files that get
% loaded on demand, all files that are input after
@@ -826,128 +1036,149 @@
% go in the specific-files list.
% \begin{macrocode}
\newcommand{\SpecialInput}[1]{%
- \xdef\specific@files{\specific@files{#1}}%
- \@@input#1\relax
+ \xdef\specific@files{\specific@files{#1}}%
+ \@@input#1\relax
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\@dofilelist}
% Our definition of \cs{@dofilelist} does not retain much resemblance
% to the original in the \LaTeX{} kernel.
% \begin{macrocode}
\def\@dofilelist{%
- \snap@restore@extensions
- \xdef\general@files{\@xp\snap@bracify \@filelist \@empty,\@empty,}%
- \let\snap@splitter\snap@splitter@a
- \xdef\general@files{\general@files}%
- \let\@tempa\specific@files \global\let\specific@files\@empty
- \@xp\snap@fdcheck\@tempa{\delimiter}%
- \ifx\rqv@list\@empty
- \else \rqv@compare@lists
- \fi
- \ifx\snap@write\typeout
- \else
- \newwrite\snap@out
- \immediate\openout\snap@out=\jobname.dep \relax
- \fi
- \snap@write{\string\RequireVersions\@charlb}%
- \snap@write{\space\space *{application}%
- \snapshotApplication
- }%
- \@xp\snap@doit\general@files{\delimiter\aftergroup\@gobble\@gobble}%
- \ifx\specific@files\@empty
- \else
- \snap@specific
- \fi
- \snap@write{\@charrb}%
- \ifx\snap@write\typeout
- \else \immediate\closeout\snap@out
- \typeout{Dependency list written on \jobname.dep.}%
- \fi
-}%
+ \snap@restore@extensions
+ \xdef\general@files{\@xp\snap@bracify \@filelist \@empty,\@empty,}%
+ \let\snap@splitter\snap@splitter@a
+ \xdef\general@files{\general@files}%
+ \let\@tempa\specific@files
+ \global\let\specific@files\@empty
+ \@xp\snap@fdcheck\@tempa{\delimiter}%
+ \ifx\rqv@list\@empty \else
+ \rqv@compare@lists
+ \fi
+ \ifx\snap@write\typeout \else
+ \newwrite\snap@out
+ \immediate\openout\snap@out=\jobname.dep \relax
+ \fi
+ \snap@write{\string\RequireVersions\@charlb}%
+ \snap@write{\space\space *{application}%
+ \snapshotApplication
+ }%
+ \@xp\snap@doit\general@files{\delimiter\aftergroup\@gobble\@gobble}%
+ \ifx\specific@files\@empty \else
+ \snap@specific
+ \fi
+ \snap@write{\@charrb}%
+ \ifx\snap@write\typeout \else
+ \immediate\closeout\snap@out
+ \typeout{Dependency list written on \jobname.dep.}%
+ \fi
+}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@specific}
% \begin{macrocode}
\def\snap@specific{%
- \snap@write{ \space *{-------}{Document-specific files:}{----}}%
- \@xp\snap@doit\specific@files{\delimiter\aftergroup\@gobble\@gobble}%
+ \snap@write{ \space *{-------}{Document-specific files:}{----}}%
+ \@xp\snap@doit\specific@files{\delimiter\aftergroup\@gobble\@gobble}%
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\rqv@condense}
% The \cs{rqv@compare@lists} function checks to see if any files
% are found only in the RequireVersions list or only in the
% \cs{general@files} list.
% \begin{macrocode}
\def\rqv@condense#1{%
- \@xp\ifx\csname ver@#1\endcsname\N
- \else
- \edef\L{\L{#1}}%
- \@xp\let\csname ver@#1\endcsname=\N
- \fi
- \rqv@condense
+ \@xp\ifx\csname ver@#1\endcsname\N \else
+ \edef\L{\L{#1}}%
+ \@xp\let\csname ver@#1\endcsname=\N
+ \fi
+ \rqv@condense
}
+
\def\rqv@condend{\endcsname ?\fi
- \@xp\@xp\@xp\@gobbletwo\csname @xp\iftrue}
+ \@xp\@xp\@xp\@gobbletwo\csname @xp\iftrue}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\rqv@overloaded}
% \begin{macrocode}
\def\rqv@overloaded#1{%
- \snap@mismatch{snapshot}{^^J%
- File #1 loaded though not in \noexpand\RequireVersions list%
- }\@ehc
+ \snap@mismatch{snapshot}{^^J%
+ File #1 loaded though not in \noexpand\RequireVersions list%
+ }\@ehc
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\rqv@notloaded}
% \begin{macrocode}
\def\rqv@notloaded#1{%
- \snap@mismatch{snapshot}{^^J%
- File #1 [\csname rqv@#1\endcsname] required but not loaded%
- }\@ehc
+ \snap@mismatch{snapshot}{^^J%
+ File #1 [\csname rqv@#1\endcsname] required but not loaded%
+ }\@ehc
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\rqv@set}
+% \begin{macro}{\rqv@test}
% \begin{macrocode}
\def\rqv@set#1{\@xp\let\csname ver@#1\endcsname\N \rqv@set}
\def\rqv@test#1{\csname ver@#1\endcsname{#1}\rqv@test}
% \end{macrocode}
+% \end{macro}
+% \end{macro}
%
+% \begin{macro}{\rqv@compare@lists}
% \begin{macrocode}
\def\rqv@compare@lists{%
- \begingroup
+ \begingroup
% \end{macrocode}
% Clear up duplicate file names (just in case) to avoid redundant
% warning messages. This should seldom be necessary in practice.
% \begin{macrocode}
- \def\N{1}\let\L\@empty
- \@xp\rqv@condense\rqv@list\rqv@condend
- \global\let\rqv@list=\L
- \def\N{2}\let\L\@empty
- \@xp\rqv@condense\general@files\rqv@condend
- \global\let\general@files=\L
+ \def\N{1}%
+ \let\L\@empty
+ \@xp\rqv@condense\rqv@list\rqv@condend
+ \global\let\rqv@list=\L
+ \def\N{2}%
+ \let\L\@empty
+ \@xp\rqv@condense\general@files\rqv@condend
+ \global\let\general@files=\L
% \end{macrocode}
% Let's make a shorthand for the code that terminates our recursion.
% \begin{macrocode}
- \def\T{\@firstoftwo{\endcsname\@empty\@gobbletwo}}%
+ \def\T{\@firstoftwo{\endcsname\@empty\@gobbletwo}}%
% \end{macrocode}
% Set all the loaded general files to an error function.
% \begin{macrocode}
- \let\N\rqv@overloaded \@xp\rqv@set\general@files \T
+ \let\N\rqv@overloaded \@xp\rqv@set\general@files \T
% \end{macrocode}
% Set all the required files to an ignore function.
% \begin{macrocode}
- \let\N\@gobble \@xp\rqv@set\rqv@list \T
+ \let\N\@gobble
+ \@xp\rqv@set\rqv@list \T
% \end{macrocode}
% Execute all the general files.
% \begin{macrocode}
- \@xp\rqv@test\general@files{\endcsname\csname @gobbletwo}%
+ \@xp\rqv@test\general@files{\endcsname\csname @gobbletwo}%
% \end{macrocode}
% And now do essentially the same thing in the reverse direction.
% \begin{macrocode}
- \let\N\rqv@notloaded \@xp\rqv@set\rqv@list \T
- \let\N\@gobble \@xp\rqv@set\general@files \T
- \@xp\rqv@test\rqv@list{\endcsname\csname @gobbletwo}%
- \endgroup
+ \let\N\rqv@notloaded
+ \@xp\rqv@set\rqv@list \T
+ \let\N\@gobble
+ \@xp\rqv@set\general@files \T
+ \@xp\rqv@test\rqv@list{\endcsname\csname @gobbletwo}%
+ \endgroup
}
% \end{macrocode}
+% \end{macro}
%
% Compensate for a bug in old versions of \fn{amsgen.sty}. This is a
% little tricky.
@@ -958,13 +1189,14 @@
% \begin{macrocode}
%\@namedef{ver@amsgen.sty}{1996/10/29 v1.2b}
\AtBeginDocument{%
- \@ifundefined{ver@amsgen}{}{%
- \@xp\let\csname ver@amsgen.sty\@xp\endcsname
- \csname ver@amsgen\endcsname
- }%
+ \@ifundefined{ver@amsgen}{}{%
+ \@xp\let\csname ver@amsgen.sty\@xp\endcsname
+ \csname ver@amsgen\endcsname
+ }%
}
% \end{macrocode}
%
+% \begin{macro}{\ProvidesFile}
% Because \cs{ProvidesFile} is used in \fn{.fd} files which are
% normally read with special catcodes, there tend to
% be problems with whitespace characters being erroneously lost from
@@ -973,10 +1205,10 @@
% affected some older versions of \latex/.
% \begin{macrocode}
\def\ProvidesFile#1{%
- \def\snap@checker{\snap@check{#1}}%
- \begingroup
- \aftergroup\snap@checker
- \catcode`\ 10
+ \def\snap@checker{\snap@check{#1}}%
+ \begingroup
+ \aftergroup\snap@checker
+ \catcode`\ 10
% \end{macrocode}
% Added guards from 2001/06/01 version of \latex/. These are
% necessary because, for example, \pkg{inputenc} sets
@@ -984,17 +1216,19 @@
% reading input encoding files. The guards prevent an ``invalid
% character'' error.
% \begin{macrocode}
- \ifnum\endlinechar < 256
- \ifnum \endlinechar>\m@ne
- \catcode\endlinechar 10
+ \ifnum\endlinechar < 256
+ \ifnum \endlinechar>\m@ne
+ \catcode\endlinechar 10
+ \fi
\fi
- \fi
- \@makeother\/%
- \@makeother\&%
- \kernel@ifnextchar[{\snap@providesfile{#1}}{\snap@providesfile{#1}[]}%
+ \@makeother\/%
+ \@makeother\&%
+ \kernel@ifnextchar[{\snap@providesfile{#1}}{\snap@providesfile{#1}[]}%
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@graphic@test}
% Normally the string found in the second arg of \cs{ProvidesFile}
% (for a nongraphics file) would begin with the usual date string.
% The \cs{includegraphics} command, however, begins the second arg
@@ -1005,18 +1239,29 @@
% \begin{macrocode}
\def\snap@graphic@test#1#2#3\@nil{r\if G#1#2\else X\fi}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@providesfile}
% \begin{macrocode}
\def\snap@providesfile#1[#2]{%
- \wlog{File: #1 #2}%
- \if\snap@graphic@test#2@@\@nil
- \snap@record@graphic#1\relax #2 (type ??)\@nil
- \else
- \expandafter\xdef\csname ver@#1\endcsname{#2}%
- \fi
- \endgroup
+ \wlog{File: #1 #2}%
+% \end{macrocode}
+% Adopt a suggestion made by user egrep on the \TeX\ stack exchange
+% (\url{https://tex.stackexchange.com/questions/508985}) but
+% without the use of the \cs{expanded} extension. This makes it
+% more likely that \pkg{snapshot} can deal with macros inside the
+% optional arguments of \cs{Provides...} commands.
+% \begin{macrocode}
+ \edef\@tempa{#2}%
+ \if\@xp\snap@graphic@test\@tempa @@\@nil
+ \snap@record@graphic#1\relax #2 (type ??)\@nil
+ \else
+ \@xp\xdef\csname ver@#1\endcsname{#2}%
+ \fi
+ \endgroup
}
% \end{macrocode}
+% \end{macro}
%
% This is what \cn{includegraphics} does to record graphic file
% information.
@@ -1028,77 +1273,90 @@
%#2<-Graphic file (type eps)
%\end{verbatim}
%
+% \begin{macro}{\snap@record@graphic}
% Check the graphics info.
% \begin{macrocode}
\def\snap@record@graphic#1\relax #2(type #3)#4\@nil{%
- \expandafter\xdef\csname ver@#1\endcsname{%
- Graphic%
- \if\snap@bbinfo :bb=\Gin@llx/\Gin@lly/\Gin@urx/\Gin@ury\fi
- \space v0.0%
- }%
+ \expandafter\xdef\csname ver@#1\endcsname{%
+ Graphic%
+ \if\snap@bbinfo :bb=\Gin@llx/\Gin@lly/\Gin@urx/\Gin@ury\fi
+ \space v0.0%
+ }%
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\@pr@videpackage}
% \begin{macrocode}
\def\@pr@videpackage [#1]{%
- \expandafter\xdef\csname ver@\@currname.\@currext\endcsname{#1}%
- \ifx\@currext\@clsextension
- \typeout{Document Class: \@gtempa\space#1}%
- \else
- \wlog{Package: \@gtempa\space#1}%
- \fi
- \snap@check{\@currname.\@currext}%
+ \expandafter\xdef\csname ver@\@currname.\@currext\endcsname{#1}%
+ \ifx\@currext\@clsextension
+ \typeout{Document Class: \@gtempa\space#1}%
+ \else
+ \wlog{Package: \@gtempa\space#1}%
+ \fi
+ \snap@check{\@currname.\@currext}%
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@selfcheck@a}
% \begin{macrocode}
\def\snap@selfcheck@a{\snap@check{snapshot.sty}}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\@nofmt}
% \begin{macrocode}
\def\@nofmt#1.fmt.#2 {#1 }
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@mismatch@a}
% \begin{macrocode}
\def\snap@mismatch@a#1#2#3{%
- \snap@mismatch{snapshot}{^^J%
- \space\space Required version #2 of \@nofmt#1.fmt. and^^J%
- \space\space provided version #3 do not match%
- }\@ehc
+ \snap@mismatch{snapshot}{^^J%
+ \space\space Required version #2 of \@nofmt#1.fmt. and^^J%
+ \space\space provided version #3 do not match%
+ }\@ehc
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@compare@versions}
% When comparing \cs{rqv@foo.sty} (information from a previous
% \latex/ run) with \cs{ver@foo.sty} (information from current run),
% we first call \cs{snap@trim@version} on the latter to clear away
% any idiosyncrasies in the contents.
% \begin{macrocode}
\def\snap@compare@versions#1{%
- \begingroup
- \@ifundefined{rqv@#1}{}{%
- \edef\0{\csname rqv@#1\endcsname}%
- \edef\1{\csname ver@#1\endcsname}%
- \edef\1{\@xp\snap@trim@version\1 v0.0 v0.0 \@nil}%
- \edef\@tempa{\@xp\snap@select\0 v0.0 v0.0 \@nil}%
- \edef\@tempb{\@xp\snap@select\1 v0.0 v0.0 \@nil}%
- \ifx\@tempa\@tempb
- \else
- \edef\@tempd{\@nx\snap@mismatch@a{#1}{\@tempa}{\@tempb}}%
- \@xp\@tempd
- \fi
- }%
- \endgroup
+ \begingroup
+ \@ifundefined{rqv@#1}{}{%
+ \edef\0{\csname rqv@#1\endcsname}%
+ \edef\1{\csname ver@#1\endcsname}%
+ \edef\1{\@xp\snap@trim@version\1 v0.0 v0.0 \@nil}%
+ \edef\@tempa{\@xp\snap@select\0 v0.0 v0.0 \@nil}%
+ \edef\@tempb{\@xp\snap@select\1 v0.0 v0.0 \@nil}%
+ \ifx\@tempa\@tempb \else
+ \edef\@tempd{\@nx\snap@mismatch@a{#1}{\@tempa}{\@tempb}}%
+ \@xp\@tempd
+ \fi
+ }%
+ \endgroup
% \end{macrocode}
% When the \opt{test} option is in effect, jump out of the current
% file instead of continuing.
% \begin{macrocode}
- \snap@test@abort
+ \snap@test@abort
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@test@abort}
% \begin{macrocode}
\let\snap@test@abort=\@empty
% \end{macrocode}
+% \end{macro}
%
% \section{Compatibility}
%
@@ -1122,8 +1380,8 @@
%
% \begin{macrocode}
\ifx\snap@select\@empty
- \let\snap@compare@versions\@gobble
- \let\snap@check\@gobble
+ \let\snap@compare@versions\@gobble
+ \let\snap@check\@gobble
\fi
% \end{macrocode}
%
@@ -1155,13 +1413,13 @@
% \begin{macrocode}
\def\restore@some@catcodes{}
\def\save@some@catcodes{%
- \edef\restore@some@catcodes{%
- \catcode\number`\@=\number\catcode`\@
- \catcode\number`\"=\number\catcode`\"
- \catcode\number`\^=\number\catcode`\^
- \catcode\number`\_=\number\catcode`\_
- \relax
- }%
+ \edef\restore@some@catcodes{%
+ \catcode\number`\@=\number\catcode`\@
+ \catcode\number`\"=\number\catcode`\"
+ \catcode\number`\^=\number\catcode`\^
+ \catcode\number`\_=\number\catcode`\_
+ \relax
+ }%
}
% \end{macrocode}
%
@@ -1187,82 +1445,99 @@
% executed and that the \cs{if@compatibility} switch got set
% accordingly.
%
+% \begin{macro}{\snap@intest}
% \begin{macrocode}
\def\snap@intest#1#2{%
- \message{^^J}%
- \begingroup \edef\0{#1#2}\def\9{latex209.def}%
- \ifx\0\9\global\@compatibilitytrue \fi
- \ifx#2\snapx@format
+ \message{^^J}%
+ \begingroup
+ \edef\0{#1#2}%
+ \def\9{latex209.def}%
+ \ifx\0\9\global\@compatibilitytrue \fi
+ \ifx#2\snapx@format
% \end{macrocode}
% If arg1 + arg2 = ``LaTeX2e.fmt'', the calling function
% \cs{snap@storeb} will run \cs{snap@check} separately.
% This is a crude way of making things work in that case without
% much extra trouble.
% \begin{macrocode}
- \def\snap@test@abort{\endgroup}%
- \else
- \edef\N{%
- \noexpand\snap@intest@b{#1#2}%
- {#1}{\@xp\@gobble#2\@empty}%
- {\csname rqv@#1#2\endcsname}}%
- \expandafter\endgroup\N
- \fi
+ \def\snap@test@abort{\endgroup}%
+ \else
+ \edef\N{%
+ \noexpand\snap@intest@b{#1#2}%
+ {#1}{\@xp\@gobble#2\@empty}%
+ {\csname rqv@#1#2\endcsname}}%
+ \expandafter\endgroup\N
+ \fi
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@intest@b}
% \begin{macrocode}
\def\snap@intest@b#1#2#3#4{%
- \def\@currname{#2}\def\@currext{#3}%
- \begingroup \lccode`\/=`\0\relax\lowercase{\endgroup
- \ifnum\snap@seldate#4 00 0\@nil>\z@
- }% matches \lowercase
- \save@some@catcodes
- \@@input #1 \relax
- \restore@some@catcodes
- \else
- \snap@specialtest{#1}{#4}%
- \fi
+ \def\@currname{#2}%
+ \def\@currext{#3}%
+ \begingroup
+ \lccode`\/=`\0\relax\lowercase{\endgroup
+ \ifnum\snap@seldate#4 00 0\@nil>\z@
+ }% matches \lowercase
+ \save@some@catcodes
+ \@@input #1 \relax
+ \restore@some@catcodes
+ \else
+ \snap@specialtest{#1}{#4}%
+ \fi
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@specialtest}
% \begin{macrocode}
\def\snap@specialtest#1#2{%
- \fake@input{#1}%
+ \fake@input{#1}%
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\fake@input}
% \begin{macrocode}
\def\fake@input#1{%
- \begingroup
- % Ensure that outer \foo or unmatched braces don't trip us up
- \catcode`\\=12 \catcode`\{=12 \catcode`\}=12
- \endinput
+ \begingroup
+ % Ensure that outer \foo or unmatched braces don't trip us up
+ \catcode`\\=12
+ \catcode`\{=12
+ \catcode`\}=12
+ \endinput
% \end{macrocode}
% Note that these definitions of \cs{G} and \cs{?} are local, and
% recall that one-letter cs names don't use up hash table entries.
% \begin{macrocode}
- \def\G{\@car\endgroup}%
- \expandafter\futurelet\expandafter\?\expandafter\G\@@input#1 \relax\@nil
+ \def\G{\@car\endgroup}%
+ \expandafter\futurelet\expandafter\?\expandafter\G\@@input#1 \relax\@nil
}
% \end{macrocode}
+% \end{macro}
%
% \begin{macrocode}
\let\snap@test@abort=\endinput
\let\snap@selfcheck=\@empty
% \end{macrocode}
%
+% \begin{macro}{\snap@finish}
% There's an extra close-brace left hanging around at the end, but I
% guess we don't care.
% \begin{macrocode}
\def\snap@finish{%%
- \endgroup \message{^^J}%
- \def\X##1{##1,\X}%
- \edef\@filelist{\@xp\X\rqv@list{\@gobbletwo}}%
- \def\X##1,?{##1}\edef\@filelist{\@xp\X\@filelist ?}%
- \@dofilelist
- \@@end
-}%
+ \endgroup
+ \message{^^J}%
+ \def\X##1{##1,\X}%
+ \edef\@filelist{\@xp\X\rqv@list{\@gobbletwo}}%
+ \def\X##1,?{##1}\edef\@filelist{\@xp\X\@filelist ?}%
+ \@dofilelist
+ \@@end
+}
% \end{macrocode}
+% \end{macro}
%
% \begin{macrocode}
\def\snap@mismatch#1#2#3{}
@@ -1273,25 +1548,24 @@
% \cs{ProvidesFile} at all.
% \begin{macrocode}
\renewcommand{\RequireVersions}[2][]{%
- \begingroup
- \makeatletter
- \def\snap@check{\snap@compare@versions}%%
- \let\snapx@tfm=\snap@ignore
+ \begingroup
+ \makeatletter
+ \def\snap@check{\snap@compare@versions}%%
+ \let\snapx@tfm=\snap@ignore
% \end{macrocode}
% This seems to help, with english.ldf for example, to prevent an
% endless loop when attempting to load babel.def.
% \begin{macrocode}
- \def\ProvidesLanguage##1{\ProvidesFile{##1.ldf}}%
- \iffalse{\fi \futurelet\@let@token\snap@branch #2}%
- \endgroup
+ \def\ProvidesLanguage##1{\ProvidesFile{##1.ldf}}%
+ \iffalse{\fi \futurelet\@let@token\snap@branch #2}%
+ \endgroup
}
% \end{macrocode}
%
+% \section{Finale}
+%
% The usual \cs{endinput} to ensure that random garbage at the end of
% the file doesn't get copied by \fn{docstrip}.
% \begin{macrocode}
\endinput
% \end{macrocode}
-%
-% \CheckSum{1209}
-% \Finale
diff --git a/macros/latex/contrib/snapshot/snapshot.ins b/macros/latex/contrib/snapshot/snapshot.ins
index 262760e4c9..289c09b82c 100644
--- a/macros/latex/contrib/snapshot/snapshot.ins
+++ b/macros/latex/contrib/snapshot/snapshot.ins
@@ -1,6 +1,6 @@
%% filename: snapshot.ins
-%% version: 1.00
-%% date: 2010/08/13
+%% version: 1.01
+%% date: 2020/06/16
%%
%% American Mathematical Society
%% Technical Support
@@ -13,7 +13,7 @@
%% fax: (401) 331-3842
%% email: tech-support@ams.org
%%
-%% Copyright 2010 American Mathematical Society.
+%% Copyright 2010, 2020 American Mathematical Society.
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3c
@@ -38,7 +38,7 @@
\preamble
-Copyright 2001, 2004, 2006, 2007, 2010, 2012 American Mathematical Society.
+Copyright 1999-2003, 2004, 2010, 2012, 2020 American Mathematical Society.
American Mathematical Society
Technical Support
diff --git a/macros/latex/contrib/snapshot/snapshot.pdf b/macros/latex/contrib/snapshot/snapshot.pdf
index 0dfa0f13f6..45cc249e31 100644
--- a/macros/latex/contrib/snapshot/snapshot.pdf
+++ b/macros/latex/contrib/snapshot/snapshot.pdf
Binary files differ
diff --git a/support/ltx2mathml/COPYING b/support/ltx2mathml/COPYING
new file mode 100644
index 0000000000..e72bfddabc
--- /dev/null
+++ b/support/ltx2mathml/COPYING
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<https://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<https://www.gnu.org/licenses/why-not-lgpl.html>. \ No newline at end of file
diff --git a/support/ltx2mathml/README b/support/ltx2mathml/README
new file mode 100644
index 0000000000..735d5bf8b5
--- /dev/null
+++ b/support/ltx2mathml/README
@@ -0,0 +1,42 @@
+LTX2MathML v. 1.0
+
+About
+=====
+
+LTX2MathML converts a subset of LaTeX math to MathML.
+
+I wrote this over a decade ago (my coding style has changed since then :). As the original sources did not compile correctly with Visual Studio 2019, I had to make some modifications to them. Only compilation errors were addressed. The rest of the source codes have largely remained unchanged since I last wrote them.
+
+
+Usage
+=====
+
+1. Include the file 'ltx2mathml.h' and the 3 CPP files (ltx2mathmlclasses.cpp, ltx2mathmlparser.cpp, and ltx2mathmltables.cpp) in your project.
+
+2. Call the function 'convertFormula'.
+
+3. If that function succeeds, call 'getMathMLOutput' (overloaded) to retrieve the results. Otherwise, call 'getLastError' to retrieve the error message.
+
+
+See the header 'ltx2mathml.h' for a description of these functions. See the file 'test.cpp' for the usage.
+
+
+LaTeX Commands/Symbols Supported
+========================
+
+The most common LaTeX commands and symbols are supported. See the file 'ltx2mathmltables.cpp' for the complete list.
+
+
+Copying
+=======
+
+This program is released under the GNU General Public License
+version 3 or newer. See the COPYING file included with this distribution or <http://www.gnu.org/licenses/>.
+
+ Copyright (C) 2020 Peter Frane Jr.
+
+
+Contact
+=======
+
+Please send any inquries to pfranejr@hotmail.com
diff --git a/support/ltx2mathml/src/ltx2mathml.h b/support/ltx2mathml/src/ltx2mathml.h
new file mode 100644
index 0000000000..4bbd227245
--- /dev/null
+++ b/support/ltx2mathml/src/ltx2mathml.h
@@ -0,0 +1,22 @@
+#pragma once
+
+#include <string>
+
+using namespace std;
+
+// 'input': the latex formula to convert
+// 'len' : the length of 'input'; use a value <0 to indicate that 'input' is null terminated
+// 'errorIndex': on error, this gives the location in 'input' where the error was found
+
+bool convertFormula( const char *input, int len, int *errorIndex );
+
+// raw copy, i.e., without the '<math>' tag
+const char *getMathMLOutput();
+
+// 'buf': the buffer where the output will be written to
+// 'display: flag indicating whether the output is either an inline or a display equation
+bool getMathMLOutput(string &buf, bool display);
+
+// function for obtaining the error message
+
+const char *getLastError();
diff --git a/support/ltx2mathml/src/ltx2mathmlclasses.cpp b/support/ltx2mathml/src/ltx2mathmlclasses.cpp
new file mode 100644
index 0000000000..81dbc603dd
--- /dev/null
+++ b/support/ltx2mathml/src/ltx2mathmlclasses.cpp
@@ -0,0 +1,185 @@
+
+#include "ltx2mathmlclasses.h"
+#include <stdio.h>
+
+Buffer::Buffer()
+{
+ m_buf = NULL;
+ m_index = 0;
+ m_size = 0;
+}
+
+Buffer::~Buffer()
+{
+ destroy();
+}
+
+void Buffer::destroy()
+{
+ if( m_buf != NULL )
+ free( m_buf );
+
+ m_buf = NULL;
+ m_index = 0;
+}
+
+void Buffer::setlength( size_t len )
+{
+ char *tmp = (char *) realloc( m_buf, len + 1 );
+
+ if( tmp != NULL )
+ {
+ m_buf = tmp;
+
+ m_size = len;
+ if( m_index > len ) // truncated
+ {
+ m_index = len;
+ }
+ else
+ {
+ ZeroMemory( &m_buf[ m_index ], ( len - m_index ) );
+ }
+ }
+ else
+ throw ex_out_of_memory;
+}
+
+size_t Buffer::length()
+{
+ return m_index;
+}
+
+void Buffer::format( const char *fmt, ... )
+{
+ va_list list;
+ size_t len;
+ char s[256];
+
+ va_start( list, fmt );
+ //len = vsprintf_s( s, sizeof( s ) - 1, fmt, list );
+ len = vsprintf( s, fmt, list );
+ va_end( list );
+ _write( m_index, s, len );
+}
+
+
+void Buffer::_write( size_t index, const char *s, size_t len )
+{
+ if( !s || ( len <= 0 ) )
+ {
+ return;
+ }
+
+ if( ( m_size - m_index ) <= len )
+ {
+ setlength( m_size + len + 1);
+
+ }
+
+ memcpy( &m_buf[ index ], s, len );
+
+
+ m_index += len;
+}
+
+
+void Buffer::write( const char *s, size_t len )
+{
+ _write( m_index, s, len );
+}
+
+void Buffer::write( const char *s )
+{
+ _write( m_index, s, strlen( s ) );
+}
+
+char *Buffer::data( size_t *len )
+{
+ if( len != NULL )
+ {
+ *len = m_index;
+ }
+
+ return m_buf;
+}
+
+
+void Buffer::append( Buffer &buf, bool transfer )
+{
+ if( transfer && m_index == 0 )
+ {
+ BufferStruct temp;
+
+ buf.releaseBuffer( temp );
+
+ m_buf = temp.m_buf;
+ m_index = temp.m_index;
+ m_size = temp.m_size;
+ }
+ else
+ {
+ _write( m_index, buf.m_buf, buf.m_index );
+ }
+}
+
+void Buffer::releaseBuffer( BufferStruct &buf )
+{
+ buf.m_buf = m_buf;
+ buf.m_index = m_index;
+ buf.m_size = m_size;
+
+ m_size = 0;
+ m_index = 0;
+ m_buf = NULL;
+}
+
+void Buffer::reset()
+{
+ ZeroMemory( m_buf, m_index );
+ m_index = 0;
+}
+
+char *Buffer::release()
+{
+ char *temp;
+
+ temp = m_buf;
+ m_size = 0;
+ m_index = 0;
+ m_buf = NULL;
+
+ return temp;
+}
+
+void Buffer::insertAt( size_t index, const char *s )
+{
+ size_t len, count;
+ char *src, *dest;
+
+ len = strlen( s );
+
+ if( len == 0 )
+ return;
+
+ if( index >= m_index )
+ {
+ _write( index, s, len );
+ return;
+ }
+
+ if( ( m_size - m_index ) <= len )
+ {
+ setlength( m_size + len + 1);
+ }
+ src = m_buf + index;
+ dest = src + len;
+
+ count = m_index - index;
+
+ //memmove_s( dest, m_size, src, count );
+
+ memmove( dest, src, count );
+ memcpy( m_buf + index, s, len );
+ m_index += len;
+}
diff --git a/support/ltx2mathml/src/ltx2mathmlclasses.h b/support/ltx2mathml/src/ltx2mathmlclasses.h
new file mode 100644
index 0000000000..4e3eed5dfe
--- /dev/null
+++ b/support/ltx2mathml/src/ltx2mathmlclasses.h
@@ -0,0 +1,40 @@
+#pragma once
+
+#include <memory.h>
+#include <stdarg.h>
+#include <malloc.h>
+#include <string.h>
+#include "ltx2mathmlexceptions.h"
+
+#ifndef ZeroMemory
+#define ZeroMemory(p,n) memset( (p), 0, (n) )
+#endif
+
+
+
+struct BufferStruct {
+ char *m_buf;
+ size_t m_index, m_size;
+};
+
+struct Buffer {
+ char *m_buf;
+ size_t m_index, m_size;
+ Buffer();
+ ~Buffer();
+ void setlength( size_t len );
+ void write( const char *s, size_t len );
+ void write( const char *s );
+ size_t length();
+ void append( Buffer &buf, bool transfer = false );
+ char *data( size_t *len = NULL );
+ void insertAt( size_t index, const char *s );
+ void format( const char *fmt, ... );
+ void releaseBuffer( BufferStruct &buf );
+ void reset();
+ char *release();
+ void destroy();
+private:
+ void _write( size_t index, const char *s, size_t len );
+};
+
diff --git a/support/ltx2mathml/src/ltx2mathmlexceptions.h b/support/ltx2mathml/src/ltx2mathmlexceptions.h
new file mode 100644
index 0000000000..5131c5dec3
--- /dev/null
+++ b/support/ltx2mathml/src/ltx2mathmlexceptions.h
@@ -0,0 +1,51 @@
+#ifndef __exception
+#define __exception
+
+
+enum ex_exception {
+ ex_syntax_error,
+ ex_out_of_memory, //"Out of memory"},
+ ex_missing_lbrace, //"Missing '{'"},
+ ex_prefix_superscript, //"Illegal prefix superscript: use the '\\lsup' command"},
+ ex_prefix_subscript, //"Illegal prefix superscript: use the '\\lsub' command"},
+ ex_misplaced_column_separator, //"Misplaced column separator"},
+ ex_more_rbrace_than_lbrace, //"Syntax error: more '}' than '{'"},
+ ex_control_name_too_long, //"Control name too long: maximum is 32"},
+ ex_misplaced_row_separator, //"Misplaced row separator"},
+ ex_illegal_subscript, //"Illegal subscript"},
+ ex_illegal_superscript, //"Illegal superscript"},
+ ex_undefined_control_sequence, //"Undefined control sequence"},
+ ex_misplaced_inline_formula, //"Misplaced inline formula"},
+ ex_missing_parameter, //"Missing parameter"},
+ ex_more_lbrace_than_rbrace, //"Syntax error: more '{' than '}'"},
+ ex_double_superscript, //"Double superscript"},
+ ex_double_subscript, //"Double subscript"},
+ ex_use_subscript_before_superscript, //"Use subscript first as the element is <msubsup>"},
+ ex_internal_error, //"Internal error"},
+ ex_missing_end_tag, //"Missing end tag"},
+ ex_undefined_environment_type, //"Undefined environment type"},
+ ex_unknown_alignment_character, //"Unknown alignment character"},
+ ex_missing_begin, //"Missing \\begin"},
+ ex_missing_end, //"Missing \\end"},
+ ex_mismatched_environment_type, //"Mismatched environment type"}
+ ex_too_many_columns,
+ ex_unknown_attribute,
+ ex_misplaced_limits,
+ ex_misplaced_nolimits,
+ ex_no_command_allowed,
+ ex_missing_fence_parameter,
+ ex_not_math_mode,
+ ex_missing_right_sq_bracket,
+ ex_missing_dollar_symbol,
+ ex_missing_left_fence,
+ ex_missing_right_fence,
+ ex_ambiguous_script,
+ ex_misplaced_eqno,
+ ex_duplicate_eqno,
+ ex_missing_column_alignment,
+ ex_missing_subsup_base,
+ ex_unknown_character,
+ ex_unhandled_mathtype
+};
+
+#endif \ No newline at end of file
diff --git a/support/ltx2mathml/src/ltx2mathmlparser.cpp b/support/ltx2mathml/src/ltx2mathmlparser.cpp
new file mode 100644
index 0000000000..a9a2ded9ee
--- /dev/null
+++ b/support/ltx2mathml/src/ltx2mathmlparser.cpp
@@ -0,0 +1,2367 @@
+
+#include "ltx2mathmlclasses.h"
+#include "ltx2mathmltables.h"
+#include "ltx2mathmlexceptions.h"
+#include <ctype.h>
+#include <string>
+
+using namespace std;
+// GLOBALS
+
+
+enum sub_expression { se_none, se_use_default, se_braced, se_optional_param, se_inline_math, se_fence,
+ se_matrix };//, se_eqalign, se_array, se_eqnarray };
+
+enum element_type { et_unknown, et_tag_off, et_tag_on, et_tag_open, et_tag_on_open };
+
+
+enum skip_input { sp_skip_all, sp_skip_once, sp_no_skip };
+
+enum { MAX_CONTROL_NAME = 32, EXTRA_BUF = 8 };
+
+
+#define char_null '\0'
+#define char_backslash '\\'
+#define char_prime '\''
+
+
+struct ArrayStruct {
+ short maxColumn, columnCount;
+ //sub_expression subType;
+ command_id id;
+};
+
+struct ErrorMessage {
+ const char *msg;
+ int index;
+ int code;
+ string msg2;
+};
+
+struct InputStream {
+ token_type token;
+ char buffer[MAX_CONTROL_NAME+EXTRA_BUF+1];
+ char *start;
+ char nextChar;
+};
+
+
+static SymbolTable limits[] = {
+ { "<munder>", "</munder>" },
+ { "<mover>", "</mover>" },
+ { "<munderover>", "</munderover>" }
+};
+
+static SymbolTable nolimits[] = {
+ { "<msub>", "</msub>" },
+ { "<msup>", "</msup>" },
+ { "<msubsup>", "</msubsup>" }
+};
+
+static SymbolTable limitsMovable[] = {
+ { "<msub movablelimits='true'>", "</msub>" },
+ { "<msup movablelimits='true'>", "</msup>" },
+ { "<msubsup movablelimits='true'>", "</msubsup>" }
+};
+
+static char *pStart = NULL;
+static char *pCur = NULL;
+static char *pEnd = NULL;
+static bool isNumberedFormula = false;
+static Buffer globalBuf, eqNumber;
+static ErrorMessage errMsg;
+
+
+void onDigit( Buffer &prevBuf );
+void onAlpha( Buffer &prevBuf );
+void onSymbol( Buffer &prevBuf, InputStream &input, bool checkSubSup = true );
+void onSubscript( Buffer &prevBuf );
+void onSuperscript( Buffer &prevBuf );
+void onControlName( Buffer &prevBuf, InputStream &input, bool &quit );
+void onEntity( Buffer &prevBuf, EntityStruct *entity, bool checkLimits = true, bool checkSubSup = true );
+void onFunction( Buffer &prevBuf, FunctionStruct *function, bool checkLimits = true );
+bool onCommand( Buffer &prevBuf, ControlStruct &control, sub_expression subType, void *paramExtra );
+void getCommandParam( Buffer &prevBuf, sub_expression subType );
+bool followedBy( char **p, const char *pattern, skip_input skip );
+bool parseExpression(const char *input, int len, int *errorIndex );
+void runLoop( Buffer &prevBuf, sub_expression subType, void *paramExtra = NULL );
+EnvironmentStruct *getEnvironmentType();
+void onBeginEnvironment( Buffer &prevBuf );
+bool onEndEnvironment( sub_expression subType, void *paramExtra );
+void precondition( char **p );
+void skipSpaces( char **p );
+void skipChar( char **p );
+bool getInput( InputStream &input, skip_input white_space );
+bool scriptNext( char *p );
+int getLastTagIndex(const char *p, size_t length, element_type element );
+token_type getControlTypeEx( InputStream &input, ControlStruct &control );
+void onColumn( Buffer &prevBuf, const char *pos, ArrayStruct &ar );
+void onRow( Buffer &prevBuf, ArrayStruct &ar );
+bool needsMrow(const char *p );
+void onMathFont( Buffer &prevBuf, const char *tagOn, const char *tagOff );
+void onTextFont( Buffer &prevBuf, const char *tagOn, const char *tagOff, command_id id, bool allowInline = true );
+bool onFence( Buffer &prevBuf, command_id id, sub_expression subType, const char *tagOn, const char *tagOff );
+void onEndExpression( sub_expression subType, token_type token, CommandStruct *command );
+void getPrime( char **p, char *buf );
+void onPrime( Buffer &prevBuf );
+
+bool convertFormula(const char *input, int len, int *errorIndex )
+{
+
+ if( len < 0 )
+ {
+ len = (int) strlen( input );
+ }
+
+ if( len == 0 )
+ {
+ return false;
+ }
+
+ return parseExpression( input, len, errorIndex );
+}
+
+bool parseExpression( const char *input, int len, int *errorIndex )
+{
+
+ bool result;
+
+ pStart = (char *)input;
+ pCur = pStart;
+ pEnd = pStart + len;
+
+ ZeroMemory( &errMsg, sizeof( errMsg ) );
+
+ globalBuf.destroy();
+ eqNumber.destroy();
+ isNumberedFormula = false;
+
+ result = true;
+ try
+ {
+ precondition( &pCur );
+ runLoop( globalBuf, se_use_default );
+ if( needsMrow( globalBuf.data() ) )
+ {
+ globalBuf.insertAt( 0, "<mrow>" );
+ globalBuf.write( "</mrow>" );
+ }
+ if( isNumberedFormula )
+ {
+ globalBuf.insertAt( 0, eqNumber.data() );
+ globalBuf.write( "</mtd></mlabeledtr></mtable>" );
+ }
+ }
+ catch( const ErrorMessage &err )
+ {
+ result = false;
+ *errorIndex = err.index;
+ }
+
+ return result;
+}
+
+
+const char *getMathMLOutput()
+{
+ if( globalBuf.length() != 0 )
+ {
+ return globalBuf.data();
+ }
+
+ return NULL;
+}
+
+bool getMathMLOutput(string& buf, bool display)
+{
+ if (globalBuf.length() != 0)
+ {
+ const char *data = globalBuf.data();
+
+ buf = display ? "<math display=\"block\" xmlns=\"http://www.w3.org/1998/Math/MathML\">" : "<math xmlns=\"http://www.w3.org/1998/Math/MathML\">";
+
+ buf.append(data);
+
+ buf.append("</math>");
+
+ return true;
+ }
+ return false;
+}
+
+static void getControlName(const char* start, string& name)
+{
+ char* p = (char*)(start+1);
+
+ name.push_back('\\');
+
+ if (!isalpha(*p))
+ {
+ name.push_back(*p);
+ return;
+ }
+ while (*p && isalnum(*p))
+ {
+ name.push_back(*p);
+ ++p;
+ }
+}
+
+ErrorMessage &error(const char *index, ex_exception code )
+{
+ errMsg.code = (int) code;
+ errMsg.index = (int) (index - pStart);
+
+ if (ex_undefined_control_sequence == code)
+ {
+ string name;
+
+ errMsg.msg2 = getErrorMsg(code);
+ errMsg.msg2.append(": ");
+
+ getControlName(index, name);
+
+ errMsg.msg2.append(name);
+
+ errMsg.msg = errMsg.msg2.c_str();
+ }
+ else
+ {
+ errMsg.msg = getErrorMsg(code);
+ }
+ return errMsg;
+}
+
+ErrorMessage& error(const char* index, ex_exception code, const string &msg)
+{
+ errMsg.code = (int)code;
+ errMsg.index = (int)(index - pStart);
+ errMsg.msg = getErrorMsg(code);
+
+ return errMsg;
+}
+
+
+const char *getLastError()
+{
+ return errMsg.msg;
+}
+
+/*
+
+ PRECONDITION traps as many errors as possible
+
+*/
+
+
+static void precondition( char **p )
+{
+ int braces;
+ char *s, *lastLeftBrace;
+
+ skipSpaces( p );
+
+ // these chars can't start an equation
+
+ //lastPos = *p;
+
+ s = *p;
+
+ switch( *s )
+ {
+ case '}':
+ throw error( s, ex_missing_lbrace );
+ case '^':
+ throw error( s, ex_prefix_superscript );
+ case '_':
+ throw error( s, ex_prefix_subscript );
+ case '&':
+ throw error( s, ex_misplaced_column_separator );
+ }
+
+ braces = 0;
+ lastLeftBrace = NULL;
+
+ while( *s )
+ {
+ if( *s == '{' )
+ {
+ lastLeftBrace = s;
+ ++braces;
+ skipChar( &s );
+ if( *s == '}' )
+ {
+ skipChar( &s );
+ --braces;
+ }
+ switch( *s )
+ {
+ case '^':
+ throw error( s, ex_prefix_superscript );
+ case '_':
+ throw error( s, ex_prefix_subscript );
+ }
+ }
+ else if( *s == '}' )
+ {
+ --braces;
+ if( braces < 0 )
+ {
+ throw error( s, ex_more_rbrace_than_lbrace );
+ }
+ ++s;
+ }
+ else if( *s == char_backslash )
+ {
+ ++s;
+ if( isdigit( *s ) )
+ {
+ throw error( s-1, ex_undefined_control_sequence );
+ }
+ else if( isalpha( *s ) )
+ {
+ char *start;
+
+ start = s;
+
+ // compute the length of the control name
+ do
+ {
+ ++s;
+ }
+ while( isalpha( *s ) );
+
+ if( ( s - start ) > MAX_CONTROL_NAME )
+ {
+ throw error( start - 1, ex_control_name_too_long );
+ }
+ }
+ else
+ {
+ // only the following chars can be escaped
+
+ switch( *s )
+ {
+ case '}':
+ case '{':
+ case '&':
+ case '^':
+ case '_':
+ case '-':
+ case '$':
+ case '#':
+ case '!':
+ case ';':
+ case '>':
+ case ':': // check
+ case ',':
+ case '|':
+ case ' ':
+ ++s;
+ break;
+ case char_backslash:
+ skipChar( &s );
+ if( scriptNext( s ) )
+ {
+ if( *s == '_' )
+ {
+ throw error( s, ex_prefix_subscript );
+ }
+ else
+ {
+ throw error( s, ex_prefix_superscript );
+ }
+ }
+ break;
+ default:
+ throw error( s-1, ex_undefined_control_sequence );
+ }
+ }
+ }
+ else if( *s == '&' )
+ {
+ skipChar( &s );
+ if( scriptNext( s ) )
+ {
+ if( *s == '_' )
+ {
+ throw error( s, ex_prefix_subscript );
+ }
+ else
+ {
+ throw error( s, ex_prefix_superscript );
+ }
+ }
+ }
+ else if( *s == '$' )
+ {
+ if( braces == 0 )
+ {
+ throw error( s, ex_misplaced_inline_formula );
+ }
+
+ skipChar( &s );
+ if( scriptNext( s ) )
+ {
+ if( *s == '_' )
+ {
+ throw error( s, ex_prefix_subscript );
+ }
+ else
+ {
+ throw error( s, ex_prefix_superscript );
+ }
+ }
+ }
+ else if( scriptNext( s ) )
+ {
+ char *pos;
+
+ pos = s;
+ skipChar( &s );
+ switch( *s )
+ {
+ case char_null:
+ case '}':
+ case '$':
+ case '&':
+ throw error( pos, ex_missing_parameter );
+ case char_backslash:
+ if( s[1] == char_backslash ) // row separator
+ {
+ throw error( pos, ex_missing_parameter );
+ }
+ }
+ }
+ else
+ {
+ ++s;
+ }
+
+ }
+
+ if( braces != 0 )
+ {
+ throw error( lastLeftBrace, ex_more_lbrace_than_rbrace );
+ }
+ // check backwards
+
+ do {
+ --s;
+ }
+ while( (s > *p ) && isspace( *s ) );
+
+ pEnd = s+1;
+}
+
+static void skipSpaces( char **p )
+{
+ char *s;
+
+ if( p == NULL )
+ {
+ return;
+ }
+
+ s = *p;
+
+ while( (*s) && isspace( *s ) )
+ {
+ ++s;
+ }
+
+ *p = s;
+}
+
+static void skipChar( char **p )
+{
+ char *s;
+
+ if( p == NULL )
+ {
+ return;
+ }
+
+ s = *p;
+
+ ++s; // skip one char, then spaces
+
+ while( (*s) && isspace( *s ) )
+ {
+ ++s;
+ }
+
+ *p = s;
+}
+
+
+static bool followedBy( char **p, const char *pattern, skip_input skip )
+{
+ char *s;
+
+ if( p == NULL )
+ {
+ return false;
+ }
+
+ s = *p;
+
+ do {
+ if( *s == *pattern )
+ {
+ ++s;
+ ++pattern;
+ }
+ else
+ {
+ return false;
+ }
+ } while( *s && *pattern );
+
+ if( ( *pattern == char_null ) && !isalpha( *s ) )
+ {
+ if( skip != sp_no_skip )
+ {
+ if( isspace( *s ) )
+ {
+ skipSpaces( &s );
+ }
+ *p = s;
+ }
+ return true;
+ }
+
+ return false;
+}
+
+
+static bool scriptNext( char *p )
+{
+ return ( *p == '_' ) || ( *p == '^' );
+}
+
+static int getLastTagIndex( char *p, size_t length, element_type element )
+{
+ int inside; // inside a tag
+ element_type current;
+ size_t i;
+
+ if( ( p == NULL ) || (length == 0) )
+ {
+ return -1;
+ }
+
+ i = length-1;
+ inside = 0;
+ current = et_unknown;
+
+ while( i >= 0 )
+ {
+ if( p[i] == '>' )
+ {
+ if( p[i-1] == '/' )
+ {
+ current = et_tag_open;
+ --i; // to skip twice
+ }
+ }
+ else if( p[i] == '<' )
+ {
+ if( p[i+1] == '/' )
+ {
+ current = et_tag_off;
+ if( element == current )
+ {
+ return (int) i;
+ }
+ inside++;
+ }
+ else
+ {
+ --inside;
+ if( inside == 0 )
+ {
+ return (int) i;
+ }
+ }
+ }
+ if( i == 0 )
+ {
+ break;
+ }
+ --i;
+ }
+
+ return -1;
+}
+
+static bool getInput( InputStream &input, skip_input white_space )
+{
+
+ ZeroMemory( &input, sizeof( input ) );
+
+ if( white_space == sp_skip_all )
+ {
+ if( isspace( *pCur ) )
+ {
+ skipSpaces( &pCur );
+ }
+ }
+
+ if( *pCur == char_null )
+ {
+ input.token = token_eof;
+ return false;
+ }
+
+
+ while( *pCur )
+ {
+ input.start = pCur;
+ if( isalpha( *pCur ) )
+ {
+ input.token = token_alpha;
+ break;
+ }
+ else if( isdigit( *pCur ) )
+ {
+ input.token = token_digit;
+ break;
+ }
+ else if( *pCur == '&' )
+ {
+ input.token = token_column_sep;
+ skipChar( &pCur );
+ break;
+ }
+ else if( *pCur == '{' )
+ {
+ input.token = token_left_brace;
+ skipChar( &pCur );
+ break;
+ }
+ else if( *pCur == '}' )
+ {
+ input.token = token_right_brace;
+ skipChar( &pCur );
+ break;
+ }
+ else if( *pCur == '^' )
+ {
+ input.token = token_superscript;
+ skipChar( &pCur );
+ break;
+ }
+ else if( *pCur == '_' )
+ {
+ input.token = token_subscript;
+ skipChar( &pCur );
+ break;
+ }
+ else if( isspace( *pCur ) )
+ {
+ if( *pCur == ' ' )
+ {
+ if( white_space == sp_skip_all )
+ {
+ skipSpaces( &pCur );
+ }
+ else if ( white_space == sp_skip_once )
+ {
+
+ input.token = token_white_space;
+ ++pCur;
+ break;
+ }
+ else
+ {
+ //input.token = token_white_space;
+ skipSpaces( &pCur );
+ }
+ }
+ else // other spaces \n\r
+ {
+ skipSpaces( &pCur );
+ }
+ }
+ else if( *pCur == char_backslash )
+ {
+ ++pCur;
+ if( isalpha( *pCur ) )
+ {
+ input.token = token_control_name;
+ for( int i = 0; i < MAX_CONTROL_NAME; ++i )
+ {
+ input.buffer[i] = *pCur;
+ ++pCur;
+ if( !isalpha( *pCur ) )
+ {
+ break;
+ }
+ }
+ // use this to determine whether control name
+ // is followed IMMEDIATELY by digits
+ // cf. \abc123 vs.\abc 123
+ input.nextChar = *pCur;
+ if( isspace( *pCur ) )
+ {
+ skipSpaces( &pCur );
+ }
+ }
+ else
+ {
+ if( *pCur == char_backslash )
+ {
+ input.token = token_row_sep;
+ }
+ else
+ {
+ input.token = token_control_symbol;
+ }
+ input.buffer[0] = char_backslash;
+ input.buffer[1] = *pCur;
+ skipChar( &pCur );
+ input.nextChar = *pCur;
+ }
+ break;
+ }
+ else if( *pCur == ']' )
+ {
+ input.token = token_right_sq_bracket;
+ input.buffer[0] = *pCur;
+ skipChar( &pCur );
+ input.nextChar = *pCur;
+ break;
+ }
+ else if( *pCur == '$' )
+ {
+ input.token = token_inline_math;
+ input.buffer[0] = *pCur;
+ //skipChar( &pCur ); don't skip
+ input.nextChar = *pCur;
+ break;
+ }
+ else if( *pCur == char_prime )
+ {
+ input.token = token_prime;
+ input.buffer[0] = *pCur;
+ input.nextChar = pCur[1];
+ // don't skip
+ break;
+ }
+ else // symbols
+ {
+ input.token = token_symbol;
+ input.buffer[0] = *pCur;
+ skipChar( &pCur );
+ input.nextChar = *pCur;
+ break;
+ }
+ }
+
+ return true;
+}
+
+static void onPrime( Buffer &prevBuf )
+{
+ SymbolStruct *sym;
+ char buf[5];
+
+ getPrime( &pCur, buf );
+
+ sym = getSymbol( buf );
+
+ prevBuf.write( sym->element );
+}
+
+static void getPrime( char **p, char *buf )
+{
+ int i = 0;
+ do {
+ *buf = **p;
+ ++buf;
+ ++(*p);
+ ++i;
+ if( i == 3 )
+ {
+ break;
+ }
+ } while( **p == char_prime );
+
+ *buf = char_null;
+
+ if( isspace( *pCur ) )
+ {
+ skipSpaces( &pCur );
+ }
+}
+
+static token_type getControlTypeEx( InputStream &input, ControlStruct &control )
+{
+ Buffer buf;
+
+ control.start = input.start;
+ input.token = getControlType( input.buffer, control );
+
+ if( input.token != token_unknown )
+ {
+ return input.token;
+ }
+
+ if( isdigit( input.nextChar ) )
+ {
+ buf.write( input.buffer );
+ buf.write( pCur, 1 ); // write the next digit
+ ++pCur;
+ }
+ else
+ {
+ return input.token;
+ }
+
+ while( ( input.token = getControlType( buf.data(), control ) ) == token_unknown )
+ {
+ if( isdigit( *pCur ) )
+ {
+ buf.write( pCur, 1 );
+ ++pCur;
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ return input.token;
+}
+
+static void runLoop( Buffer &prevBuf, sub_expression subType, void *paramExtra )
+{
+ InputStream input;
+ ControlStruct control;
+ Buffer str;
+ bool quitLoop;
+
+ ZeroMemory( &control, sizeof( control ) );
+
+ quitLoop = false;
+
+ while( getInput( input, sp_skip_all ) )
+ {
+ switch( input.token )
+ {
+ case token_alpha:
+ onAlpha( str );
+ break;
+
+ case token_digit:
+ onDigit( str );
+ break;
+
+ case token_prime:
+ onPrime( str );
+ break;
+ case token_symbol:
+ case token_control_symbol:
+ onSymbol( str, input );
+ break;
+ /*
+ case token_white_space:
+ onWhiteSpace( str );
+ break;
+ */
+ case token_inline_math:
+
+ if( subType != se_inline_math )
+ {
+ throw error( pCur, ex_misplaced_inline_formula );
+ }
+ quitLoop = true;
+ break;
+ case token_left_brace:
+ runLoop( str, se_braced );
+ break;
+ case token_right_brace:
+ quitLoop = true;
+ break;
+ case token_right_sq_bracket:
+ if( subType == se_optional_param )
+ {
+ quitLoop = true;
+ }
+ else
+ {
+ onSymbol( str, input );
+ }
+ break;
+ case token_superscript:
+ onSuperscript( str );
+ break;
+
+ case token_subscript:
+ onSubscript( str );
+ break;
+
+ case token_column_sep:
+ if( subType < se_matrix )
+ {
+ throw error( input.start, ex_misplaced_column_separator );
+ }
+ else
+ {
+ onColumn( str, input.start, *((ArrayStruct *)paramExtra) );
+ }
+ break;
+ case token_row_sep:
+ if( subType < se_matrix )
+ {
+ throw error( input.start, ex_misplaced_row_separator );
+ }
+ else
+ {
+ onRow( str, *((ArrayStruct *)paramExtra) );
+ }
+ break;
+ case token_control_name:
+ //onControlName( str, input, quit );
+
+ input.token = getControlTypeEx( input, control );
+
+ switch( input.token )
+ {
+ case token_control_entity:
+ onEntity( str, control.entity );
+ break;
+ case token_control_command:
+ quitLoop = onCommand( str, control, subType, paramExtra );
+ break;
+ case token_control_function:
+ onFunction( str, control.function );
+ break;
+ //case token_unknown:
+ default:
+ throw error( input.start, ex_undefined_control_sequence );
+ }
+
+ break;
+ }
+
+ if( quitLoop )
+ {
+ break;
+ }
+ }
+
+ onEndExpression( subType, input.token, control.command );
+
+ prevBuf.append( str, true );
+}
+
+//se_optional_param, se_inline_math, se_fence,
+// se_matrix
+static void onEndExpression( sub_expression subType, token_type token, CommandStruct *command )
+{
+ switch( subType )
+ {
+ case se_optional_param:
+ if( token != token_right_sq_bracket )
+ {
+ throw error( pCur, ex_missing_right_sq_bracket );
+ }
+ break;
+ case se_inline_math:
+ if( token != token_inline_math )
+ {
+ throw error( pCur, ex_missing_dollar_symbol );
+ }
+ break;
+ case se_matrix:
+ if( token != token_control_command )
+ {
+ throw error( pCur, ex_missing_end );
+ }
+ else if( command->id != ci_end )
+ {
+ throw error( pCur, ex_missing_end );
+ }
+ break;
+ case se_fence:
+ if( token != token_control_command )
+ {
+ throw error( pCur, ex_missing_right_fence );
+ }
+ else if( command->id != ci_right )
+ {
+ throw error( pCur, ex_missing_right_fence );
+ }
+ }
+
+}
+
+
+static void onAlpha( Buffer &prevBuf )
+{
+ char tag[] = "<mi>?</mi>";
+ char *p;
+ Buffer str;
+
+
+ str.setlength( 50 );
+
+ p = strchr( tag, '?' );
+
+ do {
+ *p = *pCur;
+ str.write( tag, sizeof( tag ) - 1 );
+ ++pCur;
+ }
+ while( isalpha( *pCur ) );
+
+ prevBuf.append( str, true );
+
+}
+
+static void onDigit( Buffer &prevBuf )
+{
+ char tagOn[] = "<mn>";
+ char tagOff[] = "</mn>";
+
+ Buffer str;
+ char *start;
+
+
+ str.setlength( 50 );
+
+
+ str.write(tagOn, sizeof( tagOn ) - 1 );
+
+
+ start = pCur;
+
+ do {
+ ++pCur;
+ }
+ while( isdigit( *pCur ) );
+
+ str.write( start, (pCur - start) );
+
+ str.write(tagOff, sizeof( tagOff ) - 1 );
+
+ prevBuf.append( str, true );
+
+}
+
+static void onSymbol( Buffer &prevBuf, InputStream &input, bool checkSubSup )
+{
+ SymbolStruct *symbol;
+
+ symbol = getSymbol( input.buffer );
+
+ if( symbol == NULL )
+ {
+ throw error( pCur, ex_unknown_character );
+ }
+
+
+ switch( symbol->mathType )
+ {
+ case mt_fence:
+ case mt_left_fence:
+ case mt_right_fence:
+ if( checkSubSup && scriptNext( pCur ) )
+ {
+ throw error( pCur, ex_ambiguous_script );
+ }
+ break;
+ }
+
+ prevBuf.write( symbol->element );
+}
+
+static bool needsMrow( const char *p )
+{
+ element_type et;
+ short inside, count;
+
+ if( p == NULL )
+ {
+ return false;
+ }
+
+ inside = count = 0;
+ et = et_unknown;
+
+ while( *p )
+ {
+ if( *p == '<' )
+ {
+ if( p[1] == '/' )
+ {
+ et = et_tag_off;
+ ++p;
+ }
+ else
+ {
+ et = et_tag_on;
+ }
+ }
+ else if( *p == '>' )
+ {
+ if( *(p-1) == '/' ) // tag open
+ {
+ if( inside == 0 )
+ {
+ ++count;
+ }
+ }
+ else if( et == et_tag_off )
+ {
+ --inside;
+ }
+ else
+ {
+ if( inside == 0 )
+ {
+ ++count;
+ }
+ ++inside;
+ }
+ if( count > 1 )
+ {
+ return true;
+ }
+ }
+ ++p;
+ }
+
+ return false;
+}
+
+static void getCommandParam( Buffer &prevBuf, sub_expression subType )
+{
+ InputStream input;
+ Buffer str;
+ ControlStruct control;
+
+ getInput( input, sp_skip_all );
+
+ switch( input.token )
+ {
+ case token_alpha:
+ prevBuf.format( "<mi>%c</mi>", *pCur );
+ skipChar( &pCur );
+ break;
+
+ case token_digit:
+ prevBuf.format( "<mn>%c</mn>", *pCur );
+ skipChar( &pCur );
+ break;
+ case token_prime:
+ prevBuf.write( "<mo>&#x02032;</mo>" );
+ skipChar( &pCur );
+ break;
+ case token_symbol:
+ case token_control_symbol:
+ onSymbol( prevBuf, input, false ); // ignore subscript/superscript
+ break;
+
+ case token_left_brace:
+ if( subType == se_use_default )
+ {
+ runLoop( str, se_braced );
+ }
+ else
+ {
+ runLoop( str, subType );
+ }
+ if( needsMrow( str.data() ) )
+ {
+ str.insertAt( 0, "<mrow>" );
+ str.write( "</mrow>" );
+ }
+ prevBuf.append( str, true );
+ break;
+
+ case token_right_brace:
+ case token_superscript:
+ case token_subscript:
+ case token_column_sep:
+ case token_row_sep:
+ case token_eof:
+ throw error( pCur, ex_missing_parameter );
+
+ case token_control_name:
+ //onControlName( str, input, quit );
+
+ input.token = getControlTypeEx( input, control );
+
+ switch( input.token )
+ {
+ case token_control_entity:
+ // don't check limits and subscript
+ onEntity( prevBuf, control.entity, false, false );
+ break;
+ case token_control_command:
+ if( control.command->id == ci_frac )
+ {
+ onCommand( str, control, se_use_default, NULL );
+ prevBuf.append( str, true );
+ }
+ else
+ {
+ throw error( input.start, ex_no_command_allowed );
+ }
+ break;
+ case token_control_function:
+ onFunction( prevBuf, control.function, false );
+ break;
+ //case token_unknown:
+ default:
+ throw error( input.start, ex_undefined_control_sequence );
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+static void getSuperscript( Buffer &prevBuf, bool subsup )
+{
+ if( *pCur == char_prime )
+ {
+ throw error( pCur, ex_missing_lbrace );
+ }
+
+ getCommandParam( prevBuf, se_use_default );
+
+ if( ( *pCur == '^' ) || ( *pCur == char_prime ) )
+ {
+ throw error( pCur, ex_double_superscript );
+ }
+ else if( *pCur == '_' )
+ {
+ if( subsup )
+ {
+ throw error( pCur, ex_double_subscript );
+ }
+ else
+ {
+ throw error( pCur, ex_use_subscript_before_superscript );
+ }
+ }
+}
+
+static void onSuperscript( Buffer &prevBuf )
+{
+ Buffer str;
+ int index;
+ SymbolTable *sup;
+
+ sup = &nolimits[1];
+
+
+ index = getLastTagIndex( prevBuf.data(), prevBuf.length(), et_tag_on_open );
+
+ if( index < 0 )
+ {
+ throw error( pCur, ex_missing_subsup_base );
+ }
+
+ str.setlength( 50 );
+
+ prevBuf.insertAt( index, sup->tagOn );
+
+ getSuperscript( str, false );
+
+ str.write( sup->tagOff );
+
+ prevBuf.append( str, true );
+}
+
+static void getSubscript( Buffer &prevBuf, command_id &which )
+{
+
+ if( *pCur == char_prime )
+ {
+ throw error( pCur, ex_missing_lbrace );
+ }
+
+ getCommandParam( prevBuf, se_use_default );
+
+ if( *pCur == '^' )
+ {
+ skipChar( &pCur );
+ getSuperscript( prevBuf, true );
+
+ which = ci_msubsup;
+ }
+ else if( *pCur == char_prime )
+ {
+ onPrime( prevBuf );
+ which = ci_msubsup;
+ }
+ else
+ {
+ which = ci_msub;
+ }
+}
+
+static void onSubscript( Buffer &prevBuf )
+{
+ Buffer str;
+ int index;
+ command_id which;
+ SymbolTable *sub;
+
+ index = getLastTagIndex( prevBuf.data(), prevBuf.length(), et_tag_on_open );
+
+ if( index < 0 )
+ {
+ throw error( pCur, ex_missing_subsup_base );
+ }
+
+ str.setlength( 50 );
+
+ getSubscript( str, which );
+
+ if( which == ci_msub )
+ {
+ sub = &nolimits[0];
+ }
+ else
+ {
+ sub = &nolimits[2];
+ }
+
+ prevBuf.insertAt( index, sub->tagOn );
+ str.write( sub->tagOff );
+
+ prevBuf.append( str, true );
+}
+
+
+
+enum limits_type { lt_default, lt_subsup, lt_underover };
+
+static void onLimits( Buffer &prevBuf, math_type mathType )
+{
+ limits_type useLimits;
+
+ useLimits = lt_default;
+
+ do {
+ if( followedBy( &pCur, "\\limits", sp_skip_all ) )
+ {
+ useLimits = lt_underover;
+ }
+ else if( followedBy( &pCur, "\\nolimits", sp_skip_all ) )
+ {
+ useLimits = lt_subsup;
+ }
+ else
+ {
+ break;
+ }
+ } while( 1 );
+
+ if( *pCur == char_null )
+ {
+ return;
+ }
+ else if( scriptNext( pCur ) || *pCur == char_prime )
+ {
+ Buffer str;
+ command_id which;
+ //char *nextChar;
+ int index;
+ SymbolTable *lim;
+
+ index = getLastTagIndex( prevBuf.data(), prevBuf.length(), et_tag_on_open );
+
+ if( index < 0 )
+ {
+ index = 0;
+ }
+
+
+ if( *pCur == '_' )
+ {
+ skipChar( &pCur );
+ getSubscript( str, which );
+ }
+ else if( *pCur == '^' )
+ {
+ skipChar( &pCur );
+ getSuperscript( str, false );
+ which = ci_msup;
+ }
+ else // prime/////
+ {
+ onPrime( str );
+ which = ci_msup;
+
+ if( *pCur == '^' || *pCur == char_prime )
+ {
+ throw error( pCur, ex_double_superscript );
+ }
+ else if( *pCur == '_' )
+ {
+ throw error( pCur, ex_use_subscript_before_superscript );
+ }
+ }
+
+ if( useLimits == lt_underover )
+ {
+ lim = limits;
+ }
+ else if( useLimits == lt_subsup )
+ {
+ lim = nolimits;
+ }
+ else
+ {
+ if( mathType == mt_limits )
+ {
+ lim = nolimits;
+ }
+ else
+ {
+ lim = limitsMovable;
+ }
+ }
+
+ switch( which )
+ {
+ case ci_msub:
+ prevBuf.insertAt( index, lim[0].tagOn );
+ str.write( lim[0].tagOff );
+ break;
+ case ci_msup:
+ prevBuf.insertAt( index, lim[1].tagOn );
+ str.write( lim[1].tagOff );
+ break;
+ case ci_msubsup:
+ prevBuf.insertAt( index, lim[2].tagOn );
+ str.write( lim[2].tagOff );
+ break;
+ }
+ prevBuf.append( str, true );
+ }
+}
+
+static void onEntity( Buffer &prevBuf, EntityStruct *entity, bool checkLimits, bool checkSubSup )
+{
+
+ switch( entity->mathType )
+ {
+ case mt_ident:
+ prevBuf.format( "<mi>&#x%x;</mi>", entity->code );
+ break;
+ case mt_digit:
+ prevBuf.format( "<mn>&#x%x;</mn>", entity->code );
+ break;
+ case mt_ord:
+ case mt_punct:
+ prevBuf.format( "<mo>&#x%x;</mo>", entity->code );
+ break;
+ case mt_limits:
+ case mt_mov_limits:
+
+ prevBuf.format( "<mo>&#x%x;</mo>", entity->code );
+
+ if( checkLimits )
+ {
+ onLimits( prevBuf, entity->mathType );
+ }
+ break;
+ case mt_left_fence:
+ case mt_right_fence:
+ case mt_fence:
+ if( checkSubSup && scriptNext( pCur ) )
+ {
+ throw error( pCur, ex_ambiguous_script );
+ }
+ prevBuf.format( "<mo mathsize='1'>&#x%x;</mo>", entity->code );
+ break;
+ case mt_text:
+ prevBuf.format( "<mtext>&#x%x;</mtext>", entity->code );
+ break;
+ case mt_rel:
+ case mt_bin:
+ case mt_unary:
+ case mt_bin_unary:
+ prevBuf.format( "<mo>&#x%x;</mo>", entity->code );
+ break;
+ default:
+ throw error( pCur, ex_unhandled_mathtype );
+ }
+}
+
+static void onFunction( Buffer &prevBuf, FunctionStruct *function, bool checkLimits )
+{
+ prevBuf.format( "<mi>%s</mi>", function->output );
+
+ if( ( function->mathType == mt_func_limits ) && checkLimits )
+ {
+ onLimits( prevBuf, function->mathType );
+ }
+}
+/*
+enum param_type { pt_unknown, pt_none, pt_one, pt_two, pt_three, pt_table, pt_others,
+ pt_especial };
+*/
+
+static void onSqrt( Buffer &prevBuf, const char *tagOn, const char *tagOff )
+{
+
+ if( *pCur == char_prime )
+ {
+ throw error( pCur, ex_missing_lbrace );
+ }
+ else if( *pCur == '[' )
+ {
+ Buffer str, radix;
+
+ skipChar( &pCur );
+ runLoop( radix, se_optional_param );
+ if( radix.length() != 0 )
+ {
+ str.write( "<mroot>" );
+ getCommandParam( str, se_use_default );
+ if( needsMrow( radix.data() ) )
+ {
+ radix.insertAt( 0, "<mrow>" );
+ radix.write( "</mrow>" );
+ }
+ str.append( radix, true );
+ str.write( "</mroot>" );
+ }
+ else
+ {
+ prevBuf.write( tagOn );
+ getCommandParam( str, se_use_default );
+ str.write( tagOff );
+ }
+
+ prevBuf.append( str, true );
+ }
+ else
+ {
+ prevBuf.write( tagOn );
+ getCommandParam( prevBuf, se_use_default );
+ prevBuf.write( tagOff );
+ }
+}
+
+static void getAttribute( Buffer &prevBuf, char lastChar )
+{
+ char *start, *end;
+
+ start = pCur;
+
+ while( *pCur && ( *pCur != lastChar ) )
+ {
+ ++pCur;
+ }
+
+ if( *pCur != lastChar )
+ {
+ throw error( pCur, ex_missing_end_tag );
+ }
+
+ end = pCur - 1;
+
+
+ while( isspace( *end ) )
+ {
+ --end;
+ }
+
+ if( *end == char_backslash )
+ {
+ end += 2;
+ }
+ else
+ {
+ end++;
+ }
+
+ prevBuf.write( start, (end - start ) );
+
+ skipChar( &pCur );
+
+}
+
+static void onMiMnMo( Buffer &prevBuf, const char *tagOn, const char *tagOff )
+{
+ Buffer str;
+ const char* attrib;
+ char *start;
+
+ if( *pCur == '[' )
+ {
+ start = pCur+1;
+ skipChar( &pCur );
+ getAttribute( str, ']' );
+
+ attrib = getMathVariant( str.data() );
+
+ if( attrib == NULL )
+ {
+ throw error( start, ex_unknown_attribute );
+ }
+
+ str.destroy();
+ str.write( tagOn, strlen(tagOn) - 1 ); // don't include '>'
+ str.format( " mathvariant='%s'>", attrib );
+ }
+ else
+ {
+ str.write( tagOn );
+ }
+ onMathFont( prevBuf, str.data(), tagOff );
+ //prevBuf.write( tagOff );
+}
+
+
+static EnvironmentStruct *getEnvironmentType()
+{
+ Buffer str;
+ char *curPos;
+ EnvironmentStruct *environment;
+
+ if( *pCur != '{' )
+ {
+ throw error( pCur, ex_missing_lbrace );
+ }
+
+ skipChar( &pCur);
+
+ curPos = pCur;
+
+ getAttribute( str, '}' );
+
+ environment = getEnvironmentType( str.data() );
+
+ if( environment != NULL )
+ {
+ return environment;
+ }
+ else
+ {
+ throw error( curPos, ex_undefined_environment_type );
+ }
+}
+
+static void getColumnAlignment( Buffer &align, short &maxColumn, const char *tagOn )
+{
+ char *curPos, *p, *attrib;
+ Buffer str;
+
+ if( *pCur != '{' )
+ {
+ throw error( pCur, ex_missing_lbrace );
+ }
+
+ skipChar( &pCur );
+
+ curPos = pCur;
+
+ getAttribute( str, '}' );
+
+ if( str.length() == 0 )
+ {
+ throw error( pCur, ex_missing_column_alignment );
+ }
+
+ p = str.data();
+
+ maxColumn = 0;
+
+ attrib = (char *)strchr( tagOn, '>' );
+
+ align.write( tagOn, size_t( attrib - tagOn ) );
+
+ align.write( " columnalign='" );
+
+ while( *p )
+ {
+ switch( *p )
+ {
+ case 'l':
+ align.write( "left" );
+ break;
+ case 'c':
+ align.write( "center" );
+ break;
+ case 'r':
+ align.write( "right" );
+ break;
+ default:
+ if( isspace( *p ) )
+ {
+ ++p;
+ continue;
+ }
+ throw error( curPos, ex_unknown_alignment_character );
+ }
+
+ ++maxColumn;
+ ++p;
+ if( *p )
+ {
+ align.write( " " );
+ }
+ }
+ align.format( "'%s", attrib );
+}
+
+static void onBeginEnvironment( Buffer &prevBuf )
+{
+ ArrayStruct ar;
+ Buffer str, align;
+ EnvironmentStruct *environment;
+
+ environment = getEnvironmentType();
+
+ ar.id = environment->id;
+ ar.columnCount = 1;
+ ar.maxColumn = 5000; // arbitrary
+
+
+
+ switch( environment->id )
+ {
+ case ci_array:
+ getColumnAlignment( align, ar.maxColumn, environment->tagOn );
+ prevBuf.append( align, true );
+ runLoop( str, se_matrix, &ar );
+ break;
+ case ci_eqnarray:
+ ar.maxColumn = 3;
+ // fall through
+ default:
+ prevBuf.write( environment->tagOn );
+ runLoop( str, se_matrix, &ar );
+ break;
+ }
+ str.write( environment->tagOff );
+ prevBuf.append( str, true );
+}
+
+static bool onEndEnvironment( sub_expression subType, void *paramExtra )
+{
+ command_id id;
+ char *temp;
+ EnvironmentStruct *environment;
+
+ temp = pCur;
+ if( subType == se_matrix )
+ {
+ id = ((ArrayStruct *)paramExtra)->id;
+ }
+ else
+ {
+ throw error( temp, ex_missing_begin );
+ }
+
+ environment = getEnvironmentType();
+
+ if( environment->id != id )
+ {
+ throw error( temp, ex_mismatched_environment_type );
+ }
+ return true;
+}
+
+static void onColumn( Buffer &prevBuf, const char *pos, ArrayStruct &ar )
+{
+ ++ar.columnCount;
+
+ if( ar.columnCount > ar.maxColumn )
+ {
+ throw error( pos, ex_too_many_columns );
+ }
+
+ prevBuf.write( "</mtd><mtd>" );
+}
+
+static void onRow( Buffer &prevBuf, ArrayStruct &ar )
+{
+ if( (*pCur == char_backslash ) && (pCur[1] == 'e' ) ) // \end?
+ {
+ if( followedBy( &pCur, "\\end", sp_no_skip ) )
+ {
+ return; // do nothing
+ }
+ }
+
+ prevBuf.write( "</mtd></mtr><mtr><mtd>" );
+ ar.columnCount = 1; // reset columns
+}
+
+
+static void onHfill( Buffer &prevBuf, sub_expression subType, void *paramExtra )
+{
+ if( scriptNext( pCur ) )
+ {
+ if( *pCur == '^' )
+ {
+ throw error( pCur, ex_prefix_superscript );
+ }
+ else
+ {
+ throw error( pCur, ex_prefix_subscript );
+ }
+ }
+ if( subType < se_matrix ) // not in a table
+ {
+ return;
+ }
+}
+
+static void onArrows( Buffer &prevBuf, const char *tagOn, const char *tagOff )
+{
+ Buffer str;
+
+ //tagOn is the base
+ if( *pCur == '[' )
+ {
+ Buffer underscript;
+
+ skipChar( &pCur );
+ runLoop( underscript, se_optional_param );
+ if( underscript.length() != 0 )
+ {
+ if( needsMrow( underscript.data() ) )
+ {
+ underscript.insertAt( 0, "<mrow>" );
+ underscript.write( "</mrow>" );
+ }
+ str.format( "<munderover>%s", tagOn );
+
+ str.append( underscript, true );
+
+ getCommandParam( str, se_use_default );
+
+ str.write( "</munderover>" );
+ prevBuf.append( str, true );
+ return;
+ }
+ }
+
+ // fall through
+ //prevBuf.write( tagOn );
+ str.format( "<mover>%s", tagOn );
+ getCommandParam( str, se_use_default );
+ str.write( tagOff );
+ prevBuf.append( str, true );
+}
+
+static void onCfrac( Buffer &prevBuf, const char *tagOn, const char *tagOff )
+{
+ Buffer str;
+ const char *extra = "<mstyle displaystyle='true' scriptlevel='0'>";
+
+ str.format( "%s%s", tagOn, extra );
+ getCommandParam( str, se_use_default );
+ str.format( "</mstyle>%s", extra );
+ getCommandParam( str, se_use_default );
+ str.write( tagOff );
+ prevBuf.append( str, true );
+}
+
+
+static bool onCommand( Buffer &prevBuf, ControlStruct &control, sub_expression subType, void *paramExtra )
+{
+ Buffer str, str2;
+ CommandStruct *command;
+
+ command = control.command;
+
+ switch( command->param )
+ {
+ case pt_plain:
+ switch( command->id )
+ {
+ case ci_mn:
+ case ci_mo:
+ onMiMnMo( prevBuf, command->tagOn, command->tagOff );
+ break;
+ case ci_mathop:
+ onMathFont( str, command->tagOn, command->tagOff );
+ //str.write( command->tagOff );
+ onLimits(str, mt_limits );
+ prevBuf.append( str, true );
+ break;
+ /*
+ case ci_mathrm:
+ case ci_mathit:
+ case ci_mathbf:
+ case ci_mathbi:
+
+ case ci_mathord,
+ case ci_func:
+ */
+ case ci_mathfont:
+ case ci_mathord:
+ case ci_mathbin:
+ case ci_mathrel:
+ //str.write( command->tagOn );
+ onMathFont( str, command->tagOn, command->tagOff );
+ //str.write( command->tagOff );
+ prevBuf.append( str, true );
+ }
+ break;
+ case pt_especial:
+ switch( command->id )
+ {
+ //case ci_mi:
+
+ case ci_sqrt:
+ onSqrt( prevBuf, command->tagOn, command->tagOff );
+ break;
+ case ci_begin:
+ onBeginEnvironment( prevBuf );
+ break;
+ case ci_end:
+ return onEndEnvironment( subType, paramExtra );
+ case ci_stackrel:
+ str.write( command->tagOn );
+ getCommandParam( str2, se_use_default );
+ getCommandParam( str, se_use_default );
+ str.append( str2, true );
+ str.write( command->tagOff );
+ prevBuf.append( str, true );
+ break;
+ case ci_hfill:
+ onHfill( prevBuf, subType, paramExtra );
+ break;
+ case ci_strut:
+ prevBuf.write( command->tagOn );
+ break;
+ case ci_limits:
+ case ci_nolimits:
+ throw error( control.start, ex_misplaced_limits );
+ case ci_mathstring:
+ onTextFont( prevBuf, command->tagOn, command->tagOff, command->id, false );
+ break;
+ case ci_text:
+ onTextFont( prevBuf, command->tagOn, command->tagOff, command->id );
+ break;
+ case ci_eqno:
+ case ci_leqno:
+ if( subType != se_use_default )
+ {
+ throw error( pCur, ex_misplaced_eqno );
+ }
+ else if ( isNumberedFormula )
+ {
+ throw error( pCur, ex_duplicate_eqno );
+ }
+ isNumberedFormula = true;
+ onTextFont( eqNumber, command->tagOn, command->tagOff, ci_eqno, false );
+ break;
+ case ci_left:
+ case ci_right:
+ return onFence( prevBuf, command->id, subType, command->tagOn, command->tagOff );
+ case ci_ext_arrows:
+ onArrows( prevBuf, command->tagOn, command->tagOff );
+ break;
+ case ci_cfrac:
+ onCfrac( prevBuf, command->tagOn, command->tagOff );
+ break;
+ case ci_underoverbrace:
+ str.write( command->tagOn );
+ getCommandParam( str, se_use_default );
+ str.write( command->tagOff );
+ onLimits( str, mt_mov_limits );
+ prevBuf.append( str, true );
+ break;
+ case ci_lsub:
+ str.write( command->tagOn );
+ getCommandParam( str, se_use_default );
+ str.write( "<mprescripts/>" );
+ getCommandParam( str, se_use_default );
+ str.write( "<none/>" );
+ str.write( command->tagOff );
+ prevBuf.append( str, true );
+ break;
+ case ci_lsup:
+ str.write( command->tagOn );
+ getCommandParam( str, se_use_default );
+ str.write( "<mprescripts/><none/>" );
+ getCommandParam( str, se_use_default );
+ str.write( command->tagOff );
+ prevBuf.append( str, true );
+ break;
+ case ci_lsubsup:
+ str.write( command->tagOn );
+ getCommandParam( str, se_use_default );
+ str.write( "<mprescripts/>" );
+ getCommandParam( str, se_use_default );
+ getCommandParam( str, se_use_default );
+ str.write( command->tagOff );
+ prevBuf.append( str, true );
+ break;
+ default:
+ break;
+ }
+ break;
+
+ case pt_one:
+ prevBuf.write( command->tagOn );
+ getCommandParam( prevBuf, se_use_default );
+ prevBuf.write( command->tagOff );
+ break;
+
+ case pt_two:
+ prevBuf.write( command->tagOn );
+ getCommandParam( prevBuf, se_use_default );
+ getCommandParam( prevBuf, se_use_default );
+ prevBuf.write( command->tagOff );
+ break;
+
+ case pt_three:
+ break;
+
+ case pt_table:
+ break;
+
+ case pt_none:
+ break;
+
+ case pt_others:
+ default:
+ break;
+ }
+
+ return false;
+}
+
+static void onMathFont( Buffer &prevBuf, const char *tagOn, const char *tagOff )
+{
+ InputStream input;
+ ControlStruct control;
+ SymbolStruct *symbol;
+ Buffer str;
+ int brace;
+ bool quitLoop;
+
+ brace = 0;
+
+ if( *pCur == '{' )
+ {
+ quitLoop = false; // loop
+ }
+ else
+ {
+ quitLoop = true; // read only one char
+ }
+
+
+ while( getInput( input, sp_skip_all ) )
+ {
+ switch( input.token )
+ {
+ case token_alpha:
+ case token_digit:
+ str.write( pCur, 1 );
+ ++pCur;
+ break;
+ case token_prime:
+ {
+ SymbolStruct *sym;
+ char buf[5];
+
+ getPrime( &pCur, buf );
+
+ sym = getSymbol( buf );
+ str.write( sym->literal );
+ }
+ break;
+ case token_symbol:
+ case token_control_symbol:
+ case token_right_sq_bracket:
+ symbol = getSymbol( input.buffer );
+ str.write( symbol->literal );
+ break;
+
+ case token_white_space:
+ str.write( "&#x00A0;" );
+ if( isspace( *pCur ) )
+ {
+ skipSpaces( &pCur );
+ }
+ break;
+ case token_left_brace:
+ ++brace;
+ break;
+ case token_right_brace:
+ --brace;
+ if( brace < 0 )
+ {
+ throw error( input.start, ex_missing_parameter );
+ }
+ quitLoop = true;
+ break;
+ case token_inline_math:
+ throw error( input.start, ex_misplaced_inline_formula );
+
+ case token_superscript:
+ case token_subscript:
+ throw error( input.start, ex_no_command_allowed );
+ case token_column_sep:
+ throw error( input.start, ex_misplaced_column_separator );
+ case token_row_sep:
+ throw error( input.start, ex_misplaced_row_separator );
+
+ case token_control_name:
+
+ switch( getControlTypeEx( input, control ) )
+ {
+ case token_control_entity:
+ str.format( "&#x%x;", control.entity->code );
+ break;
+ case token_control_function:
+ str.write( control.function->output );
+ break;
+ case token_control_command:
+ throw error( input.start, ex_no_command_allowed );
+ break;
+ //case token_unknown:
+ default:
+ throw error( input.start, ex_undefined_control_sequence );
+ }
+ break;
+ default:
+ break;
+ }
+ if( quitLoop )
+ {
+ break;
+ }
+ }
+
+ prevBuf.write( tagOn );
+ str.write( tagOff );
+ prevBuf.append( str, true );
+}
+
+
+static void onTextFont( Buffer &prevBuf, const char *tagOn, const char *tagOff, command_id id, bool allowInline )
+{
+ InputStream input;
+ ControlStruct control;
+ SymbolStruct *symbol;
+ Buffer str, temp;
+ int brace;
+ bool quitLoop;
+
+ brace = 0;
+
+ if( ( id != ci_eqno ) && ( id != ci_leqno ) )
+ {
+ if( *pCur != '{' )
+ {
+ throw error( pCur, ex_missing_lbrace );
+ }
+ }
+
+ quitLoop = false;
+
+ while( getInput( input, sp_skip_once ) )
+ {
+ switch( input.token )
+ {
+ case token_alpha:
+ case token_digit:
+ str.write( pCur, 1 );
+ ++pCur;
+ break;
+
+ case token_symbol:
+ case token_control_symbol:
+ case token_right_sq_bracket:
+ symbol = getSymbol( input.buffer );
+ str.write( symbol->literal );
+ break;
+ case token_prime:
+ if( pCur[1] == char_prime )
+ {
+ str.write( "&#x201D;" );
+ pCur += 2;
+ }
+ else
+ {
+ str.write( "&#x2019;" );
+ ++pCur;
+ }
+ break;
+ case token_inline_math:
+ if( !allowInline )
+ {
+ throw error( input.start, ex_misplaced_inline_formula );
+ }
+ if( str.length() > 0 )
+ {
+ temp.write( tagOn );
+ str.write( tagOff );
+ temp.append( str, true );
+ str.reset();
+ }
+
+ skipChar( &pCur );
+ runLoop( str, se_inline_math, NULL );
+ // skip end $
+ ++pCur;
+
+ if( needsMrow( str.data() ) )
+ {
+ str.insertAt( 0, "<mrow>" );
+ str.write( "</mrow>" );
+ }
+ temp.append( str, true );
+ str.reset();
+ break;
+
+ case token_white_space:
+ str.write( "&#x00A0;" );
+ if( isspace( *pCur ) )
+ {
+ skipSpaces( &pCur );
+ }
+ break;
+ case token_left_brace:
+ ++brace;
+ break;
+ case token_right_brace:
+ --brace;
+ if( brace < 0 )
+ {
+ throw error( input.start, ex_missing_parameter );
+ }
+ quitLoop = true;
+ break;
+ case token_superscript:
+ case token_subscript:
+ throw error( input.start, ex_no_command_allowed );
+ case token_column_sep:
+ throw error( input.start, ex_misplaced_column_separator );
+ case token_row_sep:
+ throw error( input.start, ex_misplaced_row_separator );
+
+ case token_control_name:
+
+ switch( getControlTypeEx( input, control ) )
+ {
+ case token_control_entity:
+ str.format( "&#x%x;", control.entity->code );
+ break;
+ case token_control_function:
+ throw error( input.start, ex_not_math_mode );
+ case token_control_command:
+ throw error( input.start, ex_no_command_allowed );
+ //case token_unknown:
+ default:
+ throw error( input.start, ex_undefined_control_sequence );
+ }
+ break;
+ default:
+ break;
+ }
+ if( quitLoop )
+ {
+ break;
+ }
+ }
+
+
+ if( str.length() )
+ {
+ temp.write( tagOn );
+ str.write( tagOff );
+ }
+ temp.append( str, true );
+
+ if( needsMrow( temp.data() ) )
+ {
+ temp.insertAt( 0, "<mrow>" );
+ temp.write( "</mrow>" );
+ }
+ prevBuf.append( temp, true );
+}
+
+static void getFence( Buffer &prevBuf, const char *tagOn, command_id id )
+{
+ InputStream input;
+ FenceStruct fence;
+ size_t len;
+
+
+ len = strlen( tagOn );
+
+ getInput( input, sp_skip_all );
+
+ switch( input.token )
+ {
+ case token_control_symbol:
+ case token_symbol:
+ case token_control_name:
+ if( !getFenceType( input.buffer, fence ) )
+ {
+ throw error( input.start, ex_missing_fence_parameter );
+ }
+
+ if ( id == ci_left )
+ {
+ if( *input.start == '(' )
+ {
+ prevBuf.write( tagOn, len );
+ }
+ else
+ {
+ prevBuf.write( tagOn, len - 1 ); // don't write >
+ prevBuf.format( " left='%s'", fence.output );
+ }
+ }
+ else
+ {
+ if( *input.start == ')' )
+ {
+ prevBuf.write( "><mrow>" );
+ }
+ else
+ {
+ prevBuf.format( " right='%s'><mrow>", fence.output );
+ }
+ }
+ break;
+ default:
+ throw error( input.start, ex_missing_fence_parameter );
+ }
+}
+
+static bool onFence( Buffer &prevBuf, command_id id, sub_expression subType, const char *tagOn, const char *tagOff )
+{
+ Buffer str, fence;
+
+ if( id == ci_right )
+ {
+ if( subType == se_fence )
+ {
+ return true;
+ }
+ throw error( pCur, ex_missing_left_fence );
+ }
+
+ getFence( fence, tagOn, ci_left );
+ runLoop( str, se_fence, NULL );
+ getFence( fence, tagOn, ci_right );
+
+ str.write( tagOff );
+ prevBuf.append( fence, true );
+ prevBuf.append( str, true );
+ return false;
+}
+
diff --git a/support/ltx2mathml/src/ltx2mathmltables.cpp b/support/ltx2mathml/src/ltx2mathmltables.cpp
new file mode 100644
index 0000000000..b41016ad08
--- /dev/null
+++ b/support/ltx2mathml/src/ltx2mathmltables.cpp
@@ -0,0 +1,672 @@
+#include "ltx2mathmltables.h"
+#include <stdio.h>
+
+static CommandStruct commandTable[] = {
+{"Overleftarrow", ci_accent,pt_one, "<mover accent='true'>", "<mo stretchy='true'>&#x21D0;</mo></mover>" },
+{"Overleftrightarrow", ci_accent,pt_one, "<mover accent='true'>", "<mo stretchy='true'>&#x21D4;</mo></mover>" },
+{"Overrightarrow", ci_accent,pt_one, "<mover accent='true'>", "<mo stretchy='true'>&#x21D2;</mo></mover>" },
+{"actuarial", ci_menclose, pt_one,"<menclose notation='actuarial'>", "</menclose>" },
+{"acute", ci_accent,pt_one, "<mover accent='true'>", "<mo>&#x00B4;</mo></mover>" },
+{"bar", ci_accent,pt_one, "<mover accent='true'>", "<mo stretchy='false'>&#x00AF;</mo></mover>" },
+{"begin", ci_begin,pt_especial,"", "" },
+{"binom", ci_binom,pt_two, "<mfenced><mrow><mfrac linethickness='0'>","</mfrac></mrow></mfenced>" },
+{"breve", ci_accent,pt_one, "<mover accent='true'>", "<mo>&#x02D8;</mo></mover>" },
+{"cfrac", ci_cfrac,pt_especial, "<mfrac>", "</mstyle></mfrac>" },
+{"check", ci_accent,pt_one, "<mover accent='true'>", "<mo>&#x02C7;</mo></mover>" },
+{"ddddot", ci_accent,pt_one, "<mover accent='true'>", "<mo>&#x00A8;&#x00A8;</mo></mover>" },
+{"dddot", ci_accent, pt_one, "<mover accent='true'>", "<mo>&#x20DB;</mo></mover>" },
+{"ddot", ci_accent, pt_one, "<mover accent='true'>", "<mo>&#x00A8;</mo></mover>" },
+{"dfrac", ci_mfrac, pt_two, "<mstyle displaystyle='true' scriptlevel='0'><mfrac>", "</mfrac></mstyle>" },
+{"dot", ci_accent, pt_one, "<mover accent='true'>", "<mo>&#x02D9;</mo></mover>" },
+{"end", ci_end, pt_especial, "","" },
+{"eqno", ci_eqno, pt_especial, "<mtable><mlabeledtr><mtd><mtext>", "</mtext></mtd><mtd>" },
+{"frac", ci_frac, pt_two, "<mfrac>", "</mfrac>" },
+{"func", ci_func, pt_plain, "<mi>", "</mi>" },
+{"grave", ci_accent, pt_one, "<mover accent='true'>", "<mo>&#x0300;</mo></mover>" },
+{"hat", ci_accent, pt_one, "<mover accent='true'>", "<mo>&#x02c6;</mo></mover>" },
+{"hfill", ci_hfill, pt_especial, "","" },
+{"hphantom", ci_phantom, pt_one, "<mphantom><mpadded height='0%' depth='0'>", "</mpadded></mphantom>" },
+{"hungarumlaut", ci_accent, pt_one, "<mover accent='true'>", "<mo>&#x02DD;</mo></mover>" },
+{"left", ci_left, pt_especial, "<mfenced>", "</mrow></mfenced>" },
+{"leqno", ci_eqno, pt_especial, "<mtable side='left'><mlabeledtr><mtd><mtext>", "</mtext></mtd><mtd>" },
+{"limits", ci_limits, pt_especial, "","" },
+{"longdiv", ci_menclose, pt_one, "<menclose notation='longdiv'>", "</menclose>" },
+{"lsub", ci_lsub, pt_especial, "<mmultiscripts>", "</mmultiscripts>" },
+{"lsubsup", ci_lsubsup, pt_especial, "<mmultiscripts>", "</mmultiscripts>" },
+{"lsup", ci_lsup, pt_especial, "<mmultiscripts>", "</mmultiscripts>" },
+{"mathbb", ci_mathfont, pt_plain, "<mi mathvariant='double-struck'>", "</mi>" },
+{"mathbf", ci_mathfont, pt_plain, "<mi mathvariant='bold'>", "</mi>" },
+{"mathbfrak", ci_mathfont, pt_plain, "<mi mathvariant='bold-fraktur'>", "</mi>" },
+{"mathbi", ci_mathfont, pt_plain, "<mi mathvariant='bold-italic'>", "</mi>" },
+{"mathbin", ci_mathbin, pt_plain, "<mo lspace='.222222em' rspace='.222222em'>", "</mo>" },
+{"mathbsc", ci_mathfont, pt_plain, "<mi mathvariant='bold-script'>", "</mi>" },
+{"mathbss", ci_mathfont, pt_plain, "<mi mathvariant='bold-sans-serif'>", "</mi>" },
+{"mathfrak", ci_mathfont, pt_plain, "<mi mathvariant='fraktur'>", "</mi>" },
+{"mathit", ci_mathfont, pt_plain, "<mi mathvariant='italic'>", "</mi>" },
+{"mathop", ci_mathop, pt_plain, "<mo>", "</mo>" },
+{"mathord", ci_mathord, pt_plain, "<mo lspace='0' rspace='0'>", "</mo>" },
+{"mathord", ci_mathord, pt_plain, "<mo lspace='0' rspace='0'>", "</mo>"},
+{"mathrel", ci_mathrel, pt_plain, "<mo lspace='.27777em' rspace='.27777em'>", "</mo>" },
+{"mathring", ci_accent, pt_one, "<mover accent='true'>", "<mo>&#x02DA;</mo></mover>" },
+{"mathrm", ci_mathfont, pt_plain, "<mi mathvariant='normal'>", "</mi>" },
+{"mathsc", ci_mathfont, pt_plain, "<mi mathvariant='script'>", "</mi>" },
+{"mathss", ci_mathfont, pt_plain, "<mi mathvariant='sans-serif'>", "</mi>" },
+{"mathssbi", ci_mathfont, pt_plain, "<mi mathvariant='sans-serif-bold-italic'>", "</mi>" },
+{"mathssi", ci_mathfont, pt_plain, "<mi mathvariant='sans-serif-italic'>", "</mi>" },
+{"mathstrut", ci_strut, pt_especial, "<mphantom><mpadded width='0%' lspace='0'><mo>(</mo></mpadded></mphantom>","" },
+{"mathtt", ci_mathfont, pt_plain, "<mi mathvariant='monospace'>", "</mi>" },
+{"mn", ci_mn, pt_plain, "<mn>", "</mn>" },
+{"mo", ci_mo, pt_plain, "<mo>", "</mo>" },
+{"ms", ci_mathstring, pt_especial, "<ms>", "</ms>" },
+{"nolimits", ci_limits, pt_especial, "","" },
+{"overbrace", ci_underoverbrace, pt_especial, "<mover accent='false'>", "<mo stretchy='true'>&#xFE37;</mo></mover>" },
+{"overbrack", ci_accent, pt_one, "<mover accent='false'>", "<mo stretchy='true'>&#x23B4;</mo></mover>" },
+{"overleftarrow", ci_accent, pt_one, "<mover accent='true'>", "<mo stretchy='true'>&#x2190;</mo></mover>" },
+{"overleftrightarrow", ci_accent, pt_one, "<mover accent='true'>", "<mo stretchy='true'>&#x2194;</mo></mover>" },
+{"overline", ci_accent, pt_one, "<mover accent='false'>", "<mo stretchy='true'>&#x00AF;</mo></mover>" },
+{"overparen", ci_accent, pt_one, "<mover accent='false'>", "<mo stretchy='true'>&#x2322;</mo></mover>" },
+{"overrightarrow", ci_accent, pt_one, "<mover accent='true'>", "<mo stretchy='true'>&#x2192;</mo></mover>" },
+{"phantom", ci_phantom, pt_one, "<mphantom>", "</mphantom>" },
+{"qdot", ci_accent, pt_one, "<mover accent='true'>", "<mo>&#x00A8;&#x00A8;</mo></mover>" },
+{"right", ci_right, pt_especial, "","" },
+{"sqrt", ci_sqrt, pt_especial, "<msqrt>", "</msqrt>" },
+{"stack", ci_stack, pt_two, "<mfrac linethickness='0'>", "</mfrac>" },
+{"stackrel", ci_stackrel, pt_especial, "<mover>", "</mover>" },
+{"strut", ci_strut, pt_especial, "<mspace width='0pt' height='8.5pt' depth='3.5pt'/>","" },
+{"tbinom", ci_binom, pt_two, "<mstyle scriptlevel='1'><mfenced><mrow><mfrac linethickness='0'>", "</mfrac></mrow></mfenced></mstyle>" },
+{"tdot", ci_accent, pt_one, "<mover accent='true'>", "<mo>&#x20DB;</mo></mover>" },
+{"text", ci_text, pt_especial, "<mtext>", "</mtext>" },
+{"textbf", ci_text, pt_especial, "<mtext mathvariant='bold'>", "</mtext>" },
+{"textbi", ci_text, pt_especial, "<mtext mathvariant='bold-italic'>", "</mtext>" },
+{"textbsf", ci_text, pt_especial, "<mtext mathvariant='bold-sans-serif'>", "</mtext>" },
+{"textit", ci_text, pt_especial, "<mtext mathvariant='italic'>", "</mtext>" },
+{"textsf", ci_text, pt_especial, "<mtext mathvariant='sans-serif'>", "</mtext>" },
+{"textsfbi", ci_text, pt_especial, "<mtext mathvariant='sans-serif-bold-italic'>", "</mtext>" },
+{"textsfit", ci_text, pt_especial, "<mtext mathvariant='sans-serif-italic'>", "</mtext>" },
+{"texttt", ci_text, pt_especial, "<mtext mathvariant='monospace'>", "</mtext>" },
+{"tfrac", ci_mfrac, pt_two, "<mstyle displaystyle='false' scriptlevel='0'><mfrac>", "</mfrac></mstyle>" },
+{"tilde", ci_accent, pt_one, "<mover accent='true'>", "<mo stretchy='false'>&#x02DC;</mo></mover>" },
+{"underbrace", ci_underoverbrace, pt_especial, "<munder accentunder='false'>", "<mo stretchy='true'>&#xFE38;</mo></munder>" },
+{"underbrack", ci_accent, pt_one, "<munder accentunder='false'>", "<mo stretchy='true'>&#x23B5;</mo></munder>" },
+{"underleftarrow", ci_accent, pt_one, "<munder accentunder='true'>", "<mo stretchy='true'>&#x2190;</mo></munder>" },
+{"underleftrightarrow", ci_accent, pt_one, "<munder accentunder='true'>", "<mo stretchy='true'>&#x2194;</mo></munder>" },
+{"underline", ci_accent, pt_one, "<munder accentunder='false'>", "<mo stretchy='true'>&#x0332;</mo></munder>" },
+{"underparen", ci_accent, pt_one, "<munder accentunder='false'>", "<mo stretchy='true'>&#xF611;</mo></munder>" },
+{"underrightarrow", ci_accent, pt_one, "<munder accentunder='true'>", "<mo stretchy='true'>&#x2192;</mo></munder>" },
+{"undertilde", ci_accent, pt_one, "<munder accentunder='false'>", "<mo stretchy='true'>&#x02DC;</mo></munder>" },
+{"vec", ci_accent, pt_one, "<mover accent='true'>", "<mo stretchy='false'>&#x2192;</mo></mover>" },
+{"vphantom", ci_phantom, pt_one, "<mphantom><mpadded width='0%' lspace='0'>", "</mpadded></mphantom>" },
+{"widehat", ci_accent, pt_one, "<mover accent='true'>", "<mo stretchy='true'>&#x0302;</mo></mover>" },
+{"widetilde", ci_accent, pt_one, "<mover accent='true'>", "<mo stretchy='true'>&#x02DC;</mo></mover>" },
+{"widevec", ci_accent, pt_one, "<mover accent='true'>", "<mo stretchy='true'>&#x2192;</mo></mover>" },
+{"xleftarrow", ci_ext_arrows, pt_especial, "<mo stretchy='true'>&#x2190;</mo>", "</mover>" },
+{"xleftrightarrow", ci_ext_arrows, pt_especial, "<mo stretchy='true'>&#x2194;</mo>", "</mover>"},
+{"xrightarrow", ci_ext_arrows, pt_especial, "<mo stretchy='true'>&#x2192;</mo>", "</mover>" }
+};
+
+struct EnvironmentStruct environmentTable[] = {
+ { "array", ci_array, "<mtable><mtr><mtd>", "</mtd></mtr></mtable>" },
+ { "bmatrix", ci_bmatrix, "<mfenced open='[' close=']' separators=''><mtable><mtr><mtd>", "</mtd></mtr></mtable></mfenced>" },
+ { "cases", ci_cases, "<mfenced open='{' close='' separators=''><mtable><mtr><mtd>", "</mtd></mtr></mtable></mfenced>" },
+ { "eqnarray", ci_eqnarray, "<mtable columnalign='right center left' columnspacing='.222222em'><mtr><mtd>", "</mtd></mtr></mtable>" },
+ { "matrix", ci_matrix, "<mtable><mtr><mtd>", "</mtd></mtr></mtable>" },
+ { "pmatrix", ci_pmatrix, "<mfenced separators=''><mtable><mtr><mtd>", "</mtd></mtr></mtable></mfenced>" },
+ { "vmatrix", ci_vmatrix, "<mfenced open='|' close='|' separators=''><mtable><mtr><mtd>", "</mtd></mtr></mtable></mfenced>" },
+ { "Bmatrix", ci_Bmatrix, "<mfenced open='{' close='}' separators=''><mtable><mtr><mtd>", "</mtd></mtr></mtable></mfenced>" },
+ { "Vmatrix", ci_Vmatrix, "<mfenced open='&#x2016;' close='&#x2016;' separators=''><mtable><mtr><mtd>", "</mtd></mtr></mtable></mfenced>" }
+
+};
+
+static FunctionStruct functionTable[] = {
+ { "Pr", "Pr", mt_func_limits},
+ { "arccos", "arccos", mt_func},
+ { "arcsin", "arcsin", mt_func},
+ { "arctan", "arctan", mt_func},
+ { "arg", "arg", mt_func},
+ { "cos", "cos", mt_func},
+ { "cosh", "cosh", mt_func},
+ { "cot", "cot", mt_func},
+ { "coth", "coth", mt_func},
+ { "csc", "csc", mt_func},
+ { "deg", "deg", mt_func},
+ { "det", "det", mt_func_limits},
+ { "dim", "dim", mt_func},
+ { "exp", "exp", mt_func},
+ { "gcd", "gcd", mt_func_limits},
+ { "hom", "hom", mt_func},
+ { "inf", "inf", mt_func_limits},
+ { "ker", "ker", mt_func},
+ { "lg", "lg", mt_func},
+ { "lim", "lim", mt_func_limits},
+ { "liminf", "lim&#x2009;sup", mt_func_limits},
+ { "limsup", "lim&#x2009;sup", mt_func_limits},
+ { "ln", "ln", mt_func},
+ { "log", "log", mt_func},
+ { "max", "max", mt_func_limits},
+ { "min", "min", mt_func_limits},
+ { "sec", "sec", mt_func},
+ { "sin", "sin", mt_func},
+ { "sinh", "sinh", mt_func},
+ { "sup", "sup", mt_func_limits},
+ { "tan", "tan", mt_func},
+ { "tanh", "tanh", mt_func}
+};
+
+
+static EntityStruct entityTable[] = {
+
+{ "Delta", 0x394, mt_ident },
+{ "Gamma", 0x393, mt_ident },
+{ "Lambda", 0x39B, mt_ident },
+{ "Omega", 0x3A9, mt_ident },
+{ "Phi", 0x3A6, mt_ident },
+{ "Psi", 0x3A8, mt_ident },
+{ "Sigma", 0x3A3, mt_ident },
+{ "Xi", 0x39E, mt_ident },
+{ "alpha", 0x3B1, mt_ident },
+{ "ast", 0x2A, mt_bin },
+{ "beta", 0x3B2, mt_ident },
+{ "bigcap", 0x22C2, mt_mov_limits },
+
+{ "bigcup", 0x22C3, mt_mov_limits },
+
+{ "bigodot", 0x2299, mt_mov_limits },
+
+{ "bigoplus", 0x2295, mt_mov_limits },
+
+{ "bigotimes", 0x2297, mt_mov_limits },
+
+{ "bigsqcup", 0x2A06, mt_mov_limits },
+
+{ "biguplus", 0x2A04, mt_mov_limits },
+
+{ "bigvee", 0x22C1, mt_mov_limits },
+
+{ "bigwedge", 0x22C0, mt_mov_limits },
+
+{ "cdot", 0xB7, mt_bin },
+{ "cdots", 0x22EF, mt_ord },
+{ "centerdot", 0xB7, mt_bin },
+{ "chi", 0x3C7, mt_ident },
+{ "coprod", 0x2210, mt_mov_limits },
+
+{ "ddots", 0x22F1, mt_ord },
+{ "delta", 0x3B4, mt_ident },
+{ "div", 0xF7, mt_bin },
+{ "epsilon", 0x3B5, mt_ident },
+{ "gamma", 0x3B3, mt_ident },
+{ "ge", 0x2265, mt_rel },
+{ "iiiint", 0x2A0C, mt_limits },
+
+{ "iiint", 0x222D, mt_limits },
+
+{ "iint", 0x222C, mt_limits },
+
+{ "infinity", 0x221E, mt_rel },
+{ "int", 0x222B, mt_limits },
+
+{ "kappa", 0x3BA, mt_ident },
+{ "lambda", 0x3BB, mt_ident },
+{ "ldots", 0x2026, mt_ord },
+{ "le", 0x2264, mt_rel },
+{ "leftarrow", 0x2190, mt_rel },
+
+
+
+{ "mu", 0x3BC, mt_ident },
+
+{ "nabla", 0x2207, mt_ident },
+{ "nu", 0x3BD, mt_ident },
+{ "oint", 0x222E, mt_limits },
+
+
+{ "omega", 0x3C9, mt_ident },
+{ "partial", 0x2202, mt_ord },
+{ "phi", 0x3C6, mt_ident },
+{ "pi", 0x3C0, mt_ident },
+{ "pm", 0xB1, mt_rel },
+
+{ "prod", 0x220f, mt_mov_limits },
+{ "psi", 0x3C8, mt_ident },
+
+{ "rho", 0x3C1, mt_ident },
+{ "rightarrow", 0x2192, mt_rel },
+{ "sigma", 0x3C3, mt_ident },
+{ "sim", 0x223C, mt_rel },
+{ "sum", 0x2211, mt_mov_limits },
+
+{ "tau", 0x3C4, mt_ident },
+{ "theta", 0x3B8, mt_ident },
+{ "times", 0xD7, mt_bin },
+{ "to", 0x2192, mt_rel },
+{ "upsilon", 0x3C5, mt_ident },
+{ "varepsilon", 0x3B5, mt_ident },
+{ "vdots", 0x22EE, mt_ord },
+{ "xi", 0x3BE, mt_ident },
+{ "zeta", 0x3B6, mt_ident }
+
+
+};
+
+static ErrorTable errorTable[] = {
+ { ex_out_of_memory, "Out of memory" },
+ { ex_missing_lbrace, "Missing '{'" },
+ { ex_prefix_superscript, "Illegal prefix superscript: use the '\\lsup' command" },
+ { ex_prefix_subscript, "Illegal prefix subscript: use the '\\lsub' command" },
+ { ex_misplaced_column_separator, "Misplaced column separator" },
+ { ex_more_rbrace_than_lbrace, "Syntax error: more '}' than '{'" },
+ { ex_control_name_too_long, "Control name too long: maximum is 32" },
+ { ex_misplaced_row_separator, "Misplaced row separator" },
+ { ex_illegal_subscript, "Illegal subscript" },
+ { ex_illegal_superscript, "Illegal superscript" },
+ { ex_undefined_control_sequence, "Undefined control sequence" },
+ { ex_misplaced_inline_formula, "Misplaced inline formula" },
+ { ex_missing_parameter, "Missing parameter" },
+ { ex_more_lbrace_than_rbrace, "Syntax error: more '{' than '}'" },
+ { ex_double_superscript, "Double superscript" },
+ { ex_double_subscript, "Double subscript" },
+ { ex_use_subscript_before_superscript, "Use subscript first as the element is <msubsup>" },
+ { ex_internal_error, "Internal error" },
+ { ex_missing_end_tag, "Missing end tag" },
+ { ex_undefined_environment_type, "Undefined environment type" },
+ { ex_unknown_alignment_character, "Unknown alignment character" },
+ { ex_missing_begin, "Missing \\begin" },
+ { ex_missing_end, "Missing \\end" },
+ { ex_mismatched_environment_type, "Mismatched environment type"},
+ { ex_too_many_columns, "Too many columns" },
+ { ex_unknown_attribute, "Unknown attribute" },
+ { ex_no_command_allowed, "Command not allowed here" },
+ { ex_misplaced_limits, "Limit controls must follow a math operator" },
+ { ex_missing_fence_parameter, "Missing fence parameter" },
+ { ex_not_math_mode, "Not in math mode" },
+ { ex_missing_right_sq_bracket, "Missing ']'" },
+ { ex_missing_dollar_symbol, "Missing '$'" },
+ { ex_missing_left_fence, "Missing \\left" },
+ { ex_missing_right_fence, "Missing \\right" },
+ { ex_ambiguous_script, "Ambiguous script; use \\left and \\right" },
+ { ex_misplaced_eqno, "Equation number not allowed here" },
+ { ex_duplicate_eqno, "Duplicate equation number" },
+ { ex_missing_column_alignment, "Missing column alignment" },
+ { ex_missing_subsup_base, "Missing subscript/superscript base" },
+ { ex_unknown_character, "Internal error: Unknown character" },
+ { ex_unhandled_mathtype, "Internal error: unhandled math type" }
+ //{ ex_misplaced_nolimits, "Nolimits control must follow a math operator" }
+};
+
+SymbolTable mathvariant[]= {
+ {"bb", "double-struck"},
+ {"bf", "bold"},
+ {"bfrak", "bold-fraktur"},
+ {"bi", "bold-italic"},
+ {"bsc", "bold-script"},
+ {"bss", "bold-sans-serif"},
+ {"frak", "fraktur"},
+ {"it", "italic"},
+ {"rm", "normal"},
+ {"sc", "script"},
+ {"ss", "sans-serif"},
+ {"ssbi", "sans-serif-bold-italic"},
+ {"ssi", "sans-serif-italic"},
+ {"tt", "monospace"}
+};
+
+static EntityStruct fenceTable[] = {
+
+ { "[", '[', mt_left_fence },
+ { "]", ']', mt_right_fence },
+ { "\\{", '{', mt_left_fence },
+ { "\\}", '}', mt_right_fence },
+ { "/", '/', mt_ord },
+ { "(", '(', mt_left_fence },
+ { ")", ')', mt_right_fence },
+ { "|", 0x007C, mt_ord },
+ { "\\|", 0x2016, mt_ord },
+ { "<", 0x2329, mt_left_fence },
+ { ">", 0x232A, mt_right_fence },
+ { ".", 0, mt_ord }, //see function below
+ { "lgroup", '(', mt_left_fence },
+ { "rgroup", ')', mt_right_fence },
+ { "langle", 0x2329, mt_left_fence },
+ { "rangle", 0x232A, mt_right_fence },
+ { "lAngle", 0x300A, mt_left_fence },
+ { "rAngle", 0x300B, mt_right_fence },
+ { "lfloor", 0x230A, mt_left_fence },//'&lfloor}, //0x230A},
+ { "rfloor", 0x230B, mt_right_fence },//'&rfloor}, //0x230B},
+ { "lceil", 0x2308, mt_left_fence },//'&lceil}, // 0x2308},
+ { "rceil", 0x2309, mt_right_fence },//'&rceil}, // 0x2309},
+ { "lbrack", '[', mt_left_fence },
+ { "rbrack", ']', mt_right_fence },
+ { "lBrack", 0x301A, mt_left_fence },
+ { "rBrack", 0x301B, mt_right_fence },
+ { "lbrace", '{', mt_left_fence },
+ { "rbrace", '}', mt_right_fence },
+ { "backslash", '\\', mt_ord },
+ { "vert", 0x007C, mt_ord },
+ { "Vert", 0x2016, mt_ord },
+ { "uparrow", 0x2191, mt_ord },
+ { "Uparrow", 0x21D1, mt_ord },
+ { "downarrow", 0x2193, mt_ord },
+ { "Downarrow", 0x21D3, mt_ord },
+ { "updownarrow", 0x2195, mt_ord },
+ { "Updownarrow", 0x21D5, mt_ord },
+ { "lmoustache", 0x23B0, mt_left_fence }, //0x23B0},
+ { "rmoustache", 0x23B1, mt_right_fence }, //0x23B1},
+ { "lmoust", 0x23B0, mt_left_fence },
+ { "rmoust", 0x23B1, mt_right_fence }
+};
+
+// thickspace .27777
+// medspace .222222em
+// thinspace .16667em
+static SymbolStruct symbols[]= {
+ {"\\ ", "&#x00a0;", "<mspace width='.25em'/>", mt_ord },
+ {"\\,", "&#x2006;", "<mspace width='.16667em'/>", mt_ord },
+ {"\\:", "&#x205f;", "<mspace width='.222222em'/>", mt_ord },
+ {"\\>", "&#x205f;", "<mspace width='.222222em'/>", mt_ord },
+ {"\\;", "&#x2005;", "<mspace width='.27777em'/>", mt_ord },
+ {"\\!", "&#x200a;", "<mspace width='-.16667em'/>", mt_ord },
+ {"\\~", "&#x00a0;", "<mo>&#x00A0;</mo>", mt_ord },
+ {"\\|", "&#x2016;", "<mo mathsize='1'>&#x2016;</mo>", mt_fence },
+ {"\\{", "{", "<mo mathsize='1'>{</mo>", mt_left_fence },
+ {"\\}", "}", "<mo mathsize='1'>}</mo>", mt_right_fence },
+ //{"|", "|", "<mo mathsize='1'>&#x0007C;</mo>", mt_ord },
+ {"|", "|", "<mo mathsize='1'>|</mo>", mt_ord },
+ {"[", "[", "<mo mathsize='1'>[</mo>", mt_left_fence },
+ {"]", "]", "<mo mathsize='1'>]</mo>", mt_right_fence },
+ {"(", "(", "<mo mathsize='1'>(</mo>", mt_left_fence },
+ {")", ")", "<mo mathsize='1'>)</mo>", mt_right_fence },
+ {"<", "<", "<mo mathsize='1'>&lt;</mo>", mt_left_fence },
+ {">", ">", "<mo mathsize='1'>&gt;</mo>", mt_right_fence },
+ {"-", "-", "<mo>&#x2212;</mo>", mt_bin_unary },
+ {"`", "&#x0300;", "<mo>&#x0300;</mo>", mt_ord },
+ {"@", "&#x0040;", "<mo>&#x0040;</mo>", mt_ord },
+ {"*", "*", "<mo>*</mo>", mt_ord },
+ {"'", "&#x02032;", "<mo>&#x02032;</mo>", mt_ord },
+ {"''", "&#x02033;", "<mo>&#x02033;</mo>", mt_ord },
+ {"'''", "&#x02034;", "<mo>&#x02034;</mo>", mt_ord },
+ {"\"", "&#x0201D;", "<mo>&#x0201D;</mo>", mt_ord },
+ {"/", "/", "<mtext>/</mtext>", mt_ord },
+ {"\\/", "&#x200b;", "<mo>&#x200b;</mo>", mt_ord },
+ {"\\%", "%", "<mo>%</mo>", mt_ord },
+ {"\\#", "&#x00023;", "<mo>&#x00023;</mo>", mt_ord },
+ {"\\$", "$", "<mtext>$</mtext>", mt_ord },
+ {"\\^", "&#x02C6;", "<mo>&#x02C6;</mo>", mt_ord },
+ {"\\&", "&amp;", "<mo>&amp;</mo>", mt_ord },
+ {"\\_", "&#x0005F;", "<mo>&#x0005F;</mo>", mt_ord },
+ {"\\-", "&#x200b;", "<mo>&#x200b;</mo>", mt_ord },
+ {"!", "!", "<mo>!</mo>", mt_ord },
+ {"+", "+", "<mo>+</mo>", mt_bin_unary },
+ {"=", "=", "<mo>=</mo>", mt_bin },
+ {":", ":", "<mo>:</mo>", mt_bin },
+ {";", ";", "<mo>;</mo>", mt_ord },
+ {",", ",", "<mo>,</mo>", mt_punct },
+ {".", ".", "<mo>.</mo>", mt_ord },
+ {"?", "?", "<mo>?</mo>", mt_ord }
+};
+
+#define TABLE_SIZE(x) ( sizeof( (x) )/sizeof( (x)[0] ))
+
+
+inline int fastCompare( const char *s1, const char *s2 )
+{
+ return ( ( *s1 == *s2 ) ? strcmp( s1, s2 ) : *s1 - *s2 );
+}
+
+
+CommandStruct *isCommand( const char *name )
+{
+ const int size = TABLE_SIZE( commandTable );
+
+ int result, low, mid, high;
+
+ low = 0;
+ high = size - 1;
+
+ while( low <= high )
+ {
+ mid = ( low + high )/2;
+
+ result = fastCompare( name, commandTable[mid].name );
+
+ if( result < 0 )
+ {
+ high = mid - 1;
+ }
+ else if( result > 0 )
+ {
+ low = mid + 1;
+ }
+ else
+ {
+ return &commandTable[mid];
+ }
+ }
+
+ return NULL;
+}
+
+
+EntityStruct *isEntity( const char *name )
+{
+ const int size = TABLE_SIZE( entityTable );
+
+ int result, low, mid, high;
+
+ low = 0;
+ high = size - 1;
+
+ while( low <= high )
+ {
+ mid = ( low + high )/2;
+
+ result = fastCompare( name, entityTable[mid].name );
+
+ if( result < 0 )
+ {
+ high = mid - 1;
+ }
+ else if( result > 0 )
+ {
+ low = mid + 1;
+ }
+ else
+ {
+ return &entityTable[mid];
+ }
+ }
+
+ return NULL;
+
+}
+
+
+FunctionStruct *isFunction( const char *name )
+{
+ const int size = TABLE_SIZE( functionTable );
+
+ int result, low, mid, high;
+
+ low = 0;
+ high = size - 1;
+
+ while( low <= high )
+ {
+ mid = ( low + high )/2;
+
+ result = fastCompare( name, functionTable[mid].name );
+
+ if( result < 0 )
+ {
+ high = mid - 1;
+ }
+ else if( result > 0 )
+ {
+ low = mid + 1;
+ }
+ else
+ {
+ return &functionTable[mid];
+ }
+ }
+
+ return NULL;
+}
+
+token_type getControlType( const char *name, ControlStruct &control )
+{
+
+ if( ( control.command = isCommand( name ) ) != NULL )
+ {
+ control.token = token_control_command;
+ }
+ else if( ( control.entity = isEntity( name ) ) != NULL )
+ {
+ control.token = token_control_entity;
+ }
+ else if( ( control.function = isFunction( name ) ) != NULL )
+ {
+ control.token = token_control_function;
+ }
+ else
+ {
+ control.token = token_unknown;
+ }
+
+ return control.token;
+}
+
+/*
+
+enum math_type { mt_unknown, mt_ident, mt_digit, mt_ord, mt_bin, mt_unary, mt_rel, mt_fence,
+ mt_mov_limits, mt_limits, mt_func, mt_func_limits, mt_text };
+*/
+
+const char *getErrorMsg( ex_exception code )
+{
+ const int size = TABLE_SIZE( errorTable );
+
+ for( int i = 0; i < size; ++i )
+ {
+ if( code == errorTable[i].code )
+ {
+ return errorTable[i].msg;
+ }
+ }
+
+ return NULL;
+}
+
+const char *getMathVariant( const char *attrib )
+{
+ const int size = TABLE_SIZE( mathvariant );
+
+ int result, low, mid, high;
+
+ low = 0;
+ high = size - 1;
+
+ while( low <= high )
+ {
+ mid = ( low + high )/2;
+
+ result = fastCompare( attrib, mathvariant[mid].key );
+
+ if( result < 0 )
+ {
+ high = mid - 1;
+ }
+ else if( result > 0 )
+ {
+ low = mid + 1;
+ }
+ else
+ {
+ return mathvariant[mid].value;
+ }
+ }
+
+ return NULL;
+}
+
+
+bool getFenceType( const char *name, FenceStruct &fence )
+{
+ const int size = TABLE_SIZE( fenceTable );
+
+ for( int i = 0; i < size; ++i )
+ {
+ if( strcmp( name, fenceTable[i].name ) == 0 )
+ {
+ fence.entity = &fenceTable[i];
+
+
+ if( fence.entity->code < 256 ) // ascii
+ {
+ fence.output[0] = (char)fence.entity->code;
+ fence.output[1] = '\0';
+ }
+ else
+ {
+ //sprintf_s( fence.output, sizeof( fence.output ) - 1, "&#x%x;", fence.entity->code );
+ sprintf( fence.output, "&#x%x;", fence.entity->code );
+ }
+ return true;
+ }
+ }
+
+ fence.entity = NULL;
+ return false;
+}
+
+
+
+EnvironmentStruct *getEnvironmentType( const char *name )
+{
+ const int size = TABLE_SIZE( environmentTable );
+
+ int result, low, mid, high;
+
+ low = 0;
+ high = size - 1;
+
+ while( low <= high )
+ {
+ mid = ( low + high )/2;
+
+ result = fastCompare( name, environmentTable[mid].name );
+
+ if( result < 0 )
+ {
+ high = mid - 1;
+ }
+ else if( result > 0 )
+ {
+ low = mid + 1;
+ }
+ else
+ {
+ return &environmentTable[mid];
+ }
+ }
+
+
+ return NULL;
+}
+
+
+SymbolStruct *getSymbol( const char *name )
+{
+ const int size = TABLE_SIZE( symbols );
+
+ for( int i = 0; i < size; ++i )
+ {
+ if( strcmp( name, symbols[i].name ) == 0 )
+ {
+ return &symbols[i];
+ }
+ }
+
+ return NULL;
+}
+
+
diff --git a/support/ltx2mathml/src/ltx2mathmltables.h b/support/ltx2mathml/src/ltx2mathmltables.h
new file mode 100644
index 0000000000..ebc9baef24
--- /dev/null
+++ b/support/ltx2mathml/src/ltx2mathmltables.h
@@ -0,0 +1,125 @@
+#pragma once
+
+#include <string.h>
+#include "ltx2mathmlexceptions.h"
+
+enum command_id {
+ ci_unknown, ci_msub, ci_msup, ci_msubsup, ci_munder, ci_mover, ci_munderover,
+
+ ci_mi, ci_mn, ci_mo, ci_text, ci_cfrac, ci_mfrac, ci_frac, ci_mathfont, ci_sqrt, ci_begin, ci_end,
+ ci_array, ci_eqnarray, ci_cases, ci_matrix, ci_bmatrix, ci_Bmatrix, ci_pmatrix, ci_vmatrix,
+ ci_Vmatrix, ci_mathop, ci_accent, ci_ext_arrows,
+ ci_func, ci_binom, ci_stack, ci_stackrel, ci_hfill, ci_limits, ci_nolimits,
+ ci_menclose, ci_strut, ci_phantom, ci_left, ci_right, ci_underoverbrace,
+ ci_mathstring, ci_lsub, ci_lsup, ci_lsubsup, ci_eqno, ci_leqno, ci_mathord, ci_mathbin, ci_mathrel
+};
+
+enum math_type { mt_unknown, mt_ident, mt_digit, mt_ord,
+ mt_bin, mt_unary, mt_bin_unary, mt_rel,
+ mt_left_fence, mt_right_fence, mt_fence,
+ mt_mov_limits, mt_limits, mt_func, mt_func_limits,
+ mt_text, mt_punct };
+
+enum param_type { pt_unknown, pt_none, pt_plain, pt_one, pt_two, pt_three, pt_table, pt_others,
+ pt_especial };
+
+enum token_type {
+ token_eof = -1,
+ token_unknown = 0,
+ token_alpha,
+ token_digit,
+ token_symbol,
+ token_white_space,
+ token_left_brace,
+ token_right_brace,
+ token_right_sq_bracket,
+ token_superscript,
+ token_subscript,
+ token_column_sep,
+ token_row_sep,
+ token_control_symbol,
+ token_control_name,
+ token_control_command,
+ token_control_entity,
+ token_control_function,
+ token_inline_math,
+ token_prime
+};
+
+struct SymbolTable {
+ union {
+ char const *tagOn;
+ char const*key;
+ char const*name;
+ //exception code;
+ };
+ union {
+ char const*tagOff;
+ char const*value;
+ math_type mathType;
+ //char *errorMsg;
+ };
+};
+
+struct ErrorTable {
+ ex_exception code;
+ char const *msg;
+};
+
+struct EntityStruct {
+ char const *name;
+ unsigned int code;
+ math_type mathType;
+};
+
+struct FunctionStruct {
+ char const *name;
+ char const *output;
+ math_type mathType;
+};
+
+struct FenceStruct {
+ EntityStruct *entity;
+ char output[20];
+};
+
+struct CommandStruct {
+ char const *name;
+ command_id id;
+ param_type param;
+ char const *tagOn;
+ char const *tagOff;
+};
+
+struct EnvironmentStruct {
+ char const *name;
+ command_id id;
+ char const *tagOn;
+ char const*tagOff;
+};
+
+struct SymbolStruct {
+ char const* name;
+ char const* literal;
+ char const* element;
+ math_type mathType;
+};
+
+struct ControlStruct {
+ CommandStruct *command;
+ token_type token;
+ char *start;
+ union {
+ EntityStruct *entity;
+ FunctionStruct *function;
+ };
+};
+
+
+token_type getControlType(const char *name, ControlStruct &control );
+const char *getErrorMsg( ex_exception code );
+const char *getMathVariant(const char *attrib );
+bool getFenceType(const char *name, FenceStruct &fence );
+EnvironmentStruct *getEnvironmentType(const char *name );
+SymbolStruct *getSymbol(const char *name );
+
diff --git a/support/ltx2mathml/src/test.cpp b/support/ltx2mathml/src/test.cpp
new file mode 100644
index 0000000000..99b68a5d58
--- /dev/null
+++ b/support/ltx2mathml/src/test.cpp
@@ -0,0 +1,41 @@
+// testtex.cpp : This file contains the 'main' function. Program execution begins and ends there.
+//
+
+#include <iostream>
+#include "ltx2mathml.h"
+
+
+int main()
+{
+ int index;
+ char input[256];
+
+ while (true)
+ {
+ printf("> ");
+
+ if( !fgets(input, 255, stdin) || ('\n' == input[0]))
+ break;
+ else
+ {
+ if (convertFormula(input, -1, &index))// -1 indicates 'input' is null terminated
+ {
+ string result;
+
+ if (getMathMLOutput(result, true))
+ {
+ std::cout << result << std::endl;
+ }
+ else
+ {
+ std::cout << "Input produced no output\n";
+ }
+ }
+ else
+ {
+ std::cout << "[Index: " << index << "] " << getLastError() << std::endl;
+ }
+ }
+ }
+ return 0;
+}
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb b/systems/texlive/tlnet/tlpkg/texlive.tlpdb
index 3fc55ae45d..c788c6408d 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/56726
+depend revision/56736
name 00texlive.image
category TLCore
-revision 56716
+revision 56734
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
@@ -3525,6 +3525,7 @@ runfiles size=13578
tlpkg/tlpsrc/skdoc.tlpsrc
tlpkg/tlpsrc/skeycommand.tlpsrc
tlpkg/tlpsrc/skeyval.tlpsrc
+ tlpkg/tlpsrc/skills.tlpsrc
tlpkg/tlpsrc/skmath.tlpsrc
tlpkg/tlpsrc/skrapport.tlpsrc
tlpkg/tlpsrc/skull.tlpsrc
@@ -23213,29 +23214,30 @@ catalogue-version 2.7
name askmaps
category Package
-revision 32320
+revision 56730
shortdesc Typeset American style Karnaugh maps
relocated 1
-longdesc The package provides 2, 3, 4 and 5 variable Karnaugh maps, in
-longdesc the style used in numerous textbooks on digital design. The
-longdesc package draws K-maps where the most significant input variables
-longdesc are placed on top of the columns and the least significant
-longdesc variables are placed left of the rows.
-containersize 2436
-containerchecksum d07dc2e9b3cd0dc7d46576fcf9f08c5a628bcc701a95d8d934e322666c93f649054b9dbfe38f7d9577ce3d27344e9e5a99ec8b1e710c45f4a609a5a2dfadd126
-doccontainersize 313504
-doccontainerchecksum a170144d18c4a90b166c8a315e9d1f0d86cc5f2a53ef69381652c3f8307b85d8b70dc610bcb98be6eee1bdbedc02b7cbf097a13133da78d492c71db33d94b04d
-docfiles size=82
+longdesc The package provides 1, 2, 3, 4 and 5 variable Karnaugh maps,
+longdesc in the style used in numerous American textbooks on digital
+longdesc design. The package draws K-maps where the most significant
+longdesc input variables are placed on top of the columns and the least
+longdesc significant variables are placed left of the rows.
+containersize 3312
+containerchecksum 0f4d91a15053d40d329744c429540075c33e2098f6d9d07eccc5ad16c5696233dd01de89c61a7090dc127c3730ef04e24f8d56845919cd268ec8c0bc68d9c09f
+doccontainersize 384640
+doccontainerchecksum 268915d685c8bea4388055487ca0d30418557babd01547457449085e58d639bb17787b6b5c97fa99301555afa9d9d11754196cd2b1dbf48b642b05a835b383b0
+docfiles size=104
RELOC/doc/latex/askmaps/README details="Readme"
RELOC/doc/latex/askmaps/askmaps.pdf details="Package documentation"
RELOC/doc/latex/askmaps/askmaps.tex
-runfiles size=4
+runfiles size=6
RELOC/tex/latex/askmaps/askmaps.sty
catalogue-also karnaugh
+catalogue-contact-repository https://github.com/jesseopdenbrouw/askmaps
catalogue-ctan /macros/latex/contrib/askmaps
catalogue-license lppl
catalogue-topics engineering maths
-catalogue-version 0.1
+catalogue-version 0.2
name asmeconf
category Package
@@ -64806,7 +64808,7 @@ containerchecksum 493b72a28c23a194126feafd9e60dc6e4203e8c8db803f80e0015a20c5318f
name collection-latexextra
category Collection
-revision 56707
+revision 56734
shortdesc LaTeX additional packages
relocated 1
longdesc A very large collection of add-on packages for LaTeX.
@@ -65893,6 +65895,7 @@ depend skb
depend skdoc
depend skeycommand
depend skeyval
+depend skills
depend skrapport
depend slantsc
depend smalltableof
@@ -66141,8 +66144,8 @@ depend ziffer
depend zref
depend zwgetfdate
depend zwpagelayout
-containersize 6176
-containerchecksum a5f917000a3260409d202ea6b13b31d9cc2da73142158f571ebd40df9d494f0f162285563bf4f8df7f9becded76d6a43eb075eb2fef2583e8d98bae27f4c21b6
+containersize 6184
+containerchecksum 36ef3097f21d5e9e37f792710e245ffed787d6f6053e4aebf697c5f6b6d91734093997c1fa9b594c16cfdbdae9d30ea8c1113b5195d3509b7e43e166c69ba371
name collection-latexrecommended
category Collection
@@ -100148,7 +100151,7 @@ catalogue-topics collection
name ejpecp
category Package
-revision 56188
+revision 56728
shortdesc Class for EJP and ECP
relocated 1
longdesc The class is designed for typesetting articles for the
@@ -100157,19 +100160,19 @@ longdesc Probability (EJP) and Electronic Communications in Probability
longdesc (ECP). It depends on amsmath, amsfonts, amsthm, bera, dsfont,
longdesc geometry, graphicx, hyperref, lastpage, latexsym, mathtools,
longdesc microtype, and afterpackage.
-containersize 5056
-containerchecksum 599c97be880d075dd814ce080c408d3f42e4f1b4a2b218d843ac4e955429076e306b25f829d999ea48f4b6e2dc0ece9fd80601048bab4cff84254f5cff9aab32
-doccontainersize 351308
-doccontainerchecksum 88f646457e9e6e711a3b4c874b9986c5f8ed92f109237a2c77eb7ac4dc4df457f07f394e441f27ee28343cfa6126bde8ff501c99ee15b4367478baeff7028264
-docfiles size=100
+containersize 5228
+containerchecksum ba16daaacf8b7d2b6d9f1bdaf6680b474715ab423959bf1e8fef43c7e823becdba5d6a6e3a094f47cd71c23ee00917cf9bd3b72fcbf1f091d42425535bca6b39
+doccontainersize 362512
+doccontainerchecksum f44c075fc341b3ef334a8675fb0c2ea3ccdae25cc81fa9df7ba39ebc9ec6ababd3a6657734336539d64a6f8b9ff4380993dba312b58cdd83ef5f0f923196b310
+docfiles size=112
RELOC/doc/latex/ejpecp/LPPL
RELOC/doc/latex/ejpecp/README.md details="Readme"
RELOC/doc/latex/ejpecp/ejpecp.pdf details="Package documentation"
- RELOC/doc/latex/ejpecp/mgetmref.py
+ RELOC/doc/latex/ejpecp/getmref.py
RELOC/doc/latex/ejpecp/sample.pdf details="Introduction, as a paper"
RELOC/doc/latex/ejpecp/sample.tex
-srccontainersize 6724
-srccontainerchecksum 763efe6fa376b9d6d82495823c888bd804c04478530811e8ad60ecb6956ed37261a9e98a6d3247532ddb76475fe339e7e7c16c88f78ced2fe64dea244be8a504
+srccontainersize 6904
+srccontainerchecksum 6325f999c4a435b7d2a4aff7b3bc1cf21d7eb0e806f9e7bfe2482e79689617bce54b274cc690f2435fe0c416bf32b2a76c911b793bc1ac0bfe408b9f773758ea
srcfiles size=6
RELOC/source/latex/ejpecp/ejpecp.dtx
RELOC/source/latex/ejpecp/ejpecp.ins
@@ -100178,7 +100181,7 @@ runfiles size=4
catalogue-ctan /macros/latex/contrib/ejpecp
catalogue-license lppl1.2
catalogue-topics journalpub class
-catalogue-version 1.8.3
+catalogue-version 1.9.0
name ekaia
category Package
@@ -112586,7 +112589,7 @@ catalogue-version 1.25
name fgruler
category Package
-revision 42966
+revision 56731
shortdesc Draw rulers on the foreground or in the text
relocated 1
longdesc The fgruler is an abbreviation for the foreground ruler. This
@@ -112596,15 +112599,15 @@ longdesc this way, you can check the page layout dimensions. Besides,
longdesc you can draw various rulers in the text, too. The fgruler
longdesc package requires the services of the following packages:
longdesc kvoptions, etoolbox, xcolor, graphicx, eso-pic.
-containersize 5020
-containerchecksum d189eafb4b2f7788d42614f87684bb3cc36d8e022c9c98f8f7f44babd5f95d3462ff25d2d9ab541384d35ad4daa39b09e28dadae1fbd0f7fa25d0f8ae217c34e
-doccontainersize 250388
-doccontainerchecksum 16e5f5be432e338788ea78c5e41091eac616a3ad779c3c40bff723fda2646d5205599857f0e23f1b2774fb56a2ac795c61babe21cc4de5ecc2fadb7b6d33eb2d
-docfiles size=63
+containersize 4956
+containerchecksum 543870c5e3da401ff404552116157299ebb7799646eb108e3d01b684150ddf78b3528e1a015531891267fb751e7792c48f998ff1549c346f61868a0da1414215
+doccontainersize 256936
+doccontainerchecksum 583637b996866249fb503c0fbc84c9abb8fd9df90f847375e0f816fa58d2e800682cd5ab48a834fba9738be735c3ab16ddbfc08ff7ae27611b442fad3565d484
+docfiles size=65
RELOC/doc/latex/fgruler/README details="Readme"
RELOC/doc/latex/fgruler/fgruler.pdf details="Package documentation"
-srccontainersize 9492
-srccontainerchecksum 789c6383611f55e5efa878efc1ba229794a888a26bb4174fe263c5cb2ea678e67422a47520410bf83b90ebc32a4c9584a7f24bb66f4175d6b71ff0ccabdb3de0
+srccontainersize 9484
+srccontainerchecksum 8abf3db892b0f9cb1b05e94fd87eb5a1264b1c9d26150e3f7ffcf7cb7a2f028ec4a413a85ecee925b59a0205fbecbf9a52fd7e3bfc948a1f78b2f7bae4b88beb
srcfiles size=20
RELOC/source/latex/fgruler/fgruler.dtx
RELOC/source/latex/fgruler/fgruler.ins
@@ -112614,7 +112617,7 @@ catalogue-also ruler
catalogue-ctan /macros/latex/contrib/fgruler
catalogue-license lppl1.3
catalogue-topics misc-support
-catalogue-version 1.0
+catalogue-version 1.1
name fibeamer
category Package
@@ -133163,7 +133166,7 @@ catalogue-version 0.23
name hu-berlin-bundle
category Package
-revision 54938
+revision 56732
shortdesc LaTeX classes for the Humboldt-Universitat zu Berlin
relocated 1
longdesc This package provides files according to the corporate design
@@ -133175,11 +133178,11 @@ longdesc https://www.hu-berlin.de/de/hu-intern/design. At present, the
longdesc bundle contains a letter class based on scrlttr2 and a package
longdesc hu-berlin-base.sty which contains all relevant code for
longdesc documents and documentclasses of the bundle.
-containersize 7900
-containerchecksum ebf45ed546b7fbe9c35d36b4b025baa6e554074261b73e0bfb754ed3de72b8f39653960717510e13fcef040326bd11ac344eaad894acd625642ab2ee2ade9e66
-doccontainersize 238008
-doccontainerchecksum ce8fc4199cb94937e94e66688f0111150bb20e81f653ead053f0bdcec33945c96ab2f6cf4465420f19bba98d4e05565167055dd1c689585c7a80743f26ee0268
-docfiles size=97
+containersize 7928
+containerchecksum 1206fbdaf39cbbeb445247a99a9701c1340990e1aed9b650cdc1992a05192f8ccfc8435270e86492c9307f8cb275add1f20a069e99842d748a2cd0a6b699891e
+doccontainersize 240916
+doccontainerchecksum 08535413d6eec156db4835055b6ad69463c25512806087122ba6a614290f427b719efae9cfea6d6c54fd6f8fc0fccc0bdb0832e6f261f50e5abf45122edcf962
+docfiles size=112
RELOC/doc/latex/hu-berlin-bundle/README.md details="Readme"
RELOC/doc/latex/hu-berlin-bundle/hu-berlin-bundle-bibliography.bib
RELOC/doc/latex/hu-berlin-bundle/hu-berlin-bundle.pdf details="Package documentation"
@@ -133190,8 +133193,8 @@ docfiles size=97
RELOC/doc/latex/hu-berlin-bundle/img/hu-berlin-logo.pdf
RELOC/doc/latex/hu-berlin-bundle/img/texografie-logo.pdf
RELOC/doc/latex/hu-berlin-bundle/makefile
-srccontainersize 16800
-srccontainerchecksum ca75f32cc9a4eadbd5bd32c4ffb3aa86f882638e67470d2da6ba6be98460df4b38606763cc72efdfa1cb43651efe5068ca4f2e06eaef5b93bd431c837acada94
+srccontainersize 16940
+srccontainerchecksum e7f29b34ac538de6bd4bfa11baf13d5826209784c072f31c4de7d94332a1f8ad9a59efb21ed9e7cb184d67776e3fb66c064992336b8ba06bc9a15ee7e25136f1
srcfiles size=16
RELOC/source/latex/hu-berlin-bundle/hu-berlin-bundle.dtx
runfiles size=7
@@ -133203,7 +133206,7 @@ catalogue-contact-repository https://github.com/LukasCBossert/hu-berlin-bundle
catalogue-ctan /macros/latex/contrib/hu-berlin-bundle
catalogue-license lppl1.3c gpl2 bsd3
catalogue-topics class letter
-catalogue-version 1.0.5
+catalogue-version 1.0.6
name hulipsum
category Package
@@ -230552,7 +230555,7 @@ catalogue-version 1.6.3
name pdfxup
category Package
-revision 55656
+revision 56736
shortdesc Create n-up PDF pages with minimal margins
longdesc pdfxup is a Unix/Linux shell script that creates a PDF document
longdesc where each page is obtained by combining several pages of a PDF
@@ -230561,10 +230564,10 @@ longdesc maximal bounding box of (some of) the pages of the document,
longdesc and then uses pdflatex (with the graphicx package) in order to
longdesc produce the new document.
depend pdfxup.ARCH
-containersize 11568
-containerchecksum 95571c2914ccbc305331dbb0ad6f0deb6a393f22ed56c55da9936f4c39054c076b8136237d8f2479d7522b68e9c47978de950c4133370a3feff6f2f45b2992dd
-doccontainersize 110752
-doccontainerchecksum 4c532ca5731b8515c73a0bdc5355e9c1286a6e52f9c14b964454bb4331f22446ec0d189976d85b8df024441cf5cd21d74c77aaaccd94758a415cce1bcbc1cc6d
+containersize 11524
+containerchecksum 80b373815ccf7795a1be5d9a3c85f3a0f8bb83cb24b0bc0c5518b8d93526c900e6cca903304057dd9c3f64200afff6b9458770d82627b937870daab484fccf8b
+doccontainersize 110512
+doccontainerchecksum 5444de5bd0c8cd44d4675ee3d2eafa54fd44e022356060fd3495e6a3bc091dbb41acf88116431e7212c115546cc882d36ae70168ddbd239cbb9fbe870f2751e4
docfiles size=32
texmf-dist/doc/man/man1/pdfxup.1
texmf-dist/doc/man/man1/pdfxup.man1.pdf
@@ -230576,7 +230579,7 @@ runfiles size=11
catalogue-ctan /support/pdfxup
catalogue-license lppl1.3
catalogue-topics pdfprocess
-catalogue-version 1.60
+catalogue-version 1.61
name pdfxup.aarch64-linux
category Package
@@ -261789,17 +261792,17 @@ catalogue-version 0.1
name scrlttr2copy
category Package
-revision 56718
+revision 56733
shortdesc A letter class option file for the automatic creation of copies
relocated 1
longdesc The file copy.lco provides the new class option "copy" for the
longdesc KOMA-Script letter class scrlttr2. If the option "copy" is
longdesc given, all pages of a specific letter are duplicated with
longdesc background text marking as copies.
-containersize 1848
-containerchecksum 13fe60edfca2d7c08f5b3d0b9fcc3a738aad9e810edf721592cf8fce10713ac6876e9b50610e6c62419ab7d41c91988b274675f8846cba3ebafcaf51a0f200d0
-doccontainersize 88232
-doccontainerchecksum 054287ddc4409cabdb48d38ee8c85a9be8c091538dffb15c6ff8e2bfa6cc36869ad98aedbdf110328d00a8a4566109bfbaa1fc0b58c97ecb1a6aebbd1c20e945
+containersize 1876
+containerchecksum 5b2f1c1c86a8b3df5bb4d5edfc002ff80449d2cdcf6ec7aea3732d0ba8e6bcaa105675f9f37dd5280d3b9061400d8edc0c67460ac9f1541159484aa51b851fc2
+doccontainersize 88404
+doccontainerchecksum 04728375909e27e0814f9c2dee14697711ceba7b132ee6de63f257e2a6c3eff11a8e808d7929bbd0c9346b459afec57dd62d523314381c0c19a5e2b8b3650f20
docfiles size=24
RELOC/doc/latex/scrlttr2copy/README.md details="Readme"
RELOC/doc/latex/scrlttr2copy/letter-copy-test.pdf details="Example document"
@@ -261808,10 +261811,11 @@ runfiles size=1
RELOC/tex/latex/scrlttr2copy/copy.lco
catalogue-contact-bugs https://github.com/rolfn/scrlttr2copy/issues
catalogue-contact-home https://github.com/rolfn/scrlttr2copy
+catalogue-contact-repository https://github.com/rolfn/scrlttr2copy
catalogue-ctan /macros/latex/contrib/scrlttr2copy
catalogue-license lppl1.3
catalogue-topics letter
-catalogue-version 0.2a
+catalogue-version 0.3a
name scsnowman
category Package
@@ -265288,6 +265292,38 @@ catalogue-license lppl1.3
catalogue-topics keyval
catalogue-version 1.3
+name skills
+category Package
+revision 56734
+shortdesc Create proficiency tests
+relocated 1
+longdesc This package attempts to make it easy for even a LaTeX novice
+longdesc to prepare proficiency tests, especially in combination with
+longdesc the exam document class. Thus, almost all command names are
+longdesc very similar. After defining skills in the preamble or in an
+longdesc external file, they are declared using labels, and can
+longdesc optionally be set as global skills. A skills table is generated
+longdesc to summarize the evaluated competencies and to allow for
+longdesc writing down the resulting proficiency level. A user's guide
+longdesc attempts to explain all of the possibilities in a readable way,
+longdesc with many examples.
+containersize 3564
+containerchecksum 0719d385343a79a261409a07d659c0fba4f861e69b082278b1442a12408bc3601de789575fdf566ce280a2699dc10b28aada80d490396498fa9a6bbc8d064eb9
+doccontainersize 75196
+doccontainerchecksum 9b2339a50fbc759d9e5bc907a4d8dca2f06293d5a5f38602213a859dfc34da1715105b2b5a46e82a23f71b741e4db713b0044f345767a1f87c32526b57fb0103
+docfiles size=26
+ RELOC/doc/latex/skills/README.md details="Readme"
+ RELOC/doc/latex/skills/skillsdoc.pdf details="User guide"
+ RELOC/doc/latex/skills/skillsdoc.tex
+runfiles size=3
+ RELOC/tex/latex/skills/skills.sty
+catalogue-contact-bugs https://framagit.org/pagiraud/skills/-/issues
+catalogue-contact-repository https://framagit.org/pagiraud/skills
+catalogue-ctan /macros/latex/contrib/skills
+catalogue-license lppl1.3
+catalogue-topics exam
+catalogue-version 1.0.0
+
name skmath
category Package
revision 52411
@@ -265546,7 +265582,7 @@ catalogue-version 1.2
name snapshot
category Package
-revision 55064
+revision 56735
shortdesc List the external dependencies of a LaTeX document
relocated 1
longdesc The snapshot package helps the owner of a LaTeX document obtain
@@ -265562,26 +265598,26 @@ longdesc LaTeX document on hand and consistently reproduce an identical
longdesc DVI file from it, on the fly; or for someone wanting to shield
longdesc a document during the final stages of its production cycle from
longdesc unexpected side effects of routine upgrades to the TeX system.
-containersize 5028
-containerchecksum ca5986d7b5a2a69693d6796d1b10ff767814a9405465beb09bf2954800b7b01adabb8944e623cb028372d64462099af345cbba3471005fe35ea6e542f0952596
-doccontainersize 193656
-doccontainerchecksum a7c5ba3f2acbfd07cc2eff958ccf0788b0f87654ae102fccd1ec908c2b0b72eb2a90158704f5cecf1e8921c97f5d3f8b97f75328aaeec5d15b480fde6861c13c
-docfiles size=49
+containersize 5496
+containerchecksum 2b9bba924070f81319758c4b8a8e85533ff5099e901598248d5a645aba249e7158587e7d90072d3e8fa4d544d09f800b94aa415117683a8bb8c6d7ff642c313d
+doccontainersize 237516
+doccontainerchecksum b1dda7b3fa9195e5d0e425a4b7facc75f8737446b65b29cd5f3c954dad348055c8544968b3c68f9b2256e8d827ae73b54b765d23b958abc383bef072d9eacfe7
+docfiles size=60
RELOC/doc/latex/snapshot/README
RELOC/doc/latex/snapshot/snapshot.pdf details="Package documentation"
-srccontainersize 13744
-srccontainerchecksum 04e6a3c06250c4fa70f3dab1f740338e164467f3ca9d3f094a4b281487bf8df3141704d6f9ffa32f22fc8913068bad11f3b98fbd3d50b13fd6ac403c0d362d13
-srcfiles size=12
+srccontainersize 14884
+srccontainerchecksum ae57330c3c69e82c638e07ca7d2d011838a85ae79f3f16fcb8909076f375da51f2b1d3487aadf55cf93306c035099397fa826a7bd9654e6756cde66d2138b15b
+srcfiles size=15
RELOC/source/latex/snapshot/snapshot.dtx
RELOC/source/latex/snapshot/snapshot.ins
-runfiles size=4
+runfiles size=5
RELOC/tex/latex/snapshot/snapshot.sty
catalogue-also bundledoc
catalogue-contact-home https://www.ams.org/arc/resources/snapshot-about.html
catalogue-ctan /macros/latex/contrib/snapshot
catalogue-license lppl1.3c
catalogue-topics file-mgmt archival
-catalogue-version 2.13
+catalogue-version 2.14
name snotez
category Package
@@ -313711,17 +313747,17 @@ catalogue-topics format
name utfsym
category Package
-revision 56702
+revision 56729
shortdesc Provides various Unicode symbols
relocated 1
longdesc This package provides various symbols from the Unicode in order
longdesc to be able to use them originally in a school setting such as
longdesc on worksheets.
-containersize 1891624
-containerchecksum 68c78b707294ce4c6529902ae0d4e308af966181ec52b606660d47c16644aa3073fbe3dbf33a6d3d5ebba43e5efcc3cb4818601b038e2d3d7d50ed17c8364379
-doccontainersize 2974868
-doccontainerchecksum 8460abb62d3d632b2ca2230c9bfe7b5e83150fd665e3f9b111d559a3ff31b49dd4e34cdfc8bc875745718eecda5db99858ac0fa45b8f760be13fc8a37ed4ee36
-docfiles size=877
+containersize 1890332
+containerchecksum cbc9203663a121f2c421d07bf630831db438aa74c6d6ca95d3d7d7f5a5736db351e0fea5fb269ed2b02eaaec5d85de52f2f9ca90d753d41ca9da7328c6af2326
+doccontainersize 2979868
+doccontainerchecksum 3b90dd9075fa3b4602e76593b90603ff4022a003599d12297bcb482fc28995ac204de1908baef9e4506a0bba82edf09dbf6314dd7034808aaf7aa38af3bee6d7
+docfiles size=879
RELOC/doc/latex/utfsym/README details="Readme"
RELOC/doc/latex/utfsym/symbole.tex
RELOC/doc/latex/utfsym/utfsym.pdf details="Package documentation" language="de"
@@ -315410,9 +315446,9 @@ runfiles size=4522
RELOC/tex/latex/utfsym/utfsym.sty
catalogue-also schule
catalogue-ctan /graphics/pgf/contrib/utfsym
-catalogue-license lppl1.3
+catalogue-license cc0
catalogue-topics pgf-tikz symbol-supp
-catalogue-version 0.8.2
+catalogue-version 0.8.3
name utopia
category Package
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
index 81378158a1..06e5158d10 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
@@ -1 +1 @@
-b911c46bd87378e152b34ed190f12244 texlive.tlpdb
+106e0187c41913db016b3dc163bb47ee texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
index 819abe77e5..58791ab410 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
@@ -1 +1 @@
-8670f0fb014b82eb2ddf1e378d98d7451eb6dfa44c11e18802062fece66abfe815b0c6e817daceef15201c2f8a5ef8168ce0239271d5f8fddcd64be9a5b359f0 texlive.tlpdb
+a5427b6a14c96179392159ac3475306b7ec0cb45f4c3ad76d8d1a333a35a529300c9aaa0af8ae75823d6d3ccdb7d472ca394ccca1c66b0792cc900e44b927797 texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
index 27101514a0..9af1cd19b0 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-----
-iQEcBAEBCgAGBQJfkMq/AAoJEEzhh34ZQ4xwElcIAIsh6Tw3KlpLjTtUmwG0GcnH
-c0QgsdiPZrj1YEHEkjcriByjK4UYYNZsCk9dm/TQ22FOwfp4tFivBN1L39VzGx4P
-y0vQywPI4bDKNZAd8tLiDYEhzot98Q1ggIZ5pb3oIv2bMw7j0PgCRraRi/wwtQ/A
-iHoL4i3xVjEtKKGWchW/9d+oXYEBUQgTxwO5euzh6JxxX6KmF7gC4P3tFOs0B7Ml
-7QU8u4B0a9TPhzyPppGdzinpq4bIcY9Jli7xorTueY9qNS86ssFBDT4I4h3xk9M4
-i6pYdHkygpy4PL18hkkh16CaL4TWGM9J+5OPbWw4Fm8XGJZC6XS6JmUjxckmNw8=
-=dBjT
+iQEcBAEBCgAGBQJfkhxlAAoJEEzhh34ZQ4xwPjIH/imyPvYE+7bHKAz5jSoDVoPn
+eKRm7LHMZRXv274s0302EOZyXTWfdfogcvLwD4eyKOg0g3kXVMaT2v7PSodOLmDg
+IbjiDdVbKgA1iN/C+i4nRg6qtPeUFsZusjS+cWp5pZANfHKlmwJ8tm556ZcRUBqz
+aWqs+JisNQawGT9bfLUQG5y5JuMvwjvVTzbQgqF2nnZlyJ1ZvRrvtu43SaBhrctJ
+zL1AUupBuQf5IZ1a7CCfE7ZjK/jGi6nie07Fk63o8rxGsvyZtjo0JptfrVs2SLpS
+vY59CPmVOf/A71mCjBBEXLaVv1+FWEF5AN9lmjXqDoLYJtVCSW2cqlh5WCZZb0M=
+=+8n1
-----END PGP SIGNATURE-----
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
index 1f6b552089..fc4454eaae 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 182b0f53e6..94638c7901 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=1603311352
+date=1603397734
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=94e466340bcd4d768d3bcdd68131a9ac
+lstdigest=0f0eb673efc5642be5fbad8e8a982927
numpkg=3994
relstate=next
-version=7599
+version=7600
;;;;This configuration file is signed by a MiKTeX maintainer. The signature follows.
;;;;-----BEGIN MIKTEX SIGNATURE-----
-;;;; signature/miktex: JZXrh+yqVK4vwI6E29o9UMzprLeSe26c8FTwWjCJd2yfvdq/4WSYZtpf/5TBxJPAlagw3T030dQaE2EvRobc65TfVLusf/ghRCNnXRtmtH/o4E5YbEJC3LXrrCGIrMyV7ec6l+BJaehb2QUpCsoGYCxPNbKsYjURQEysV3/zKYZazSKZ2YQqevVAUq2/7W+AMITpIvnygEpjVUoeK+34RhRgnMqcU4ACdFgNq0L0iQTvhdIiaLgZM1DAVUdAMArpqTV5Lk0I+Jjo87d52i2PaMigqFDD0v2z/jcsJU7n+EJJCAgAv74KaHf8hOkq7aszINAMpDlySb93N7A8vumpxA==
+;;;; signature/miktex: Ou6K/RCcDCjLEr9txyCoEP1vbIEfpP6UaYAJVLYdpkjpMOXa6LCJYvRhWUgff1qzqy4rXgMEIuzy+ZYY74jh1FXpzG5ymqYlnMcjJIE33VpubnnUu7aIhKRdouyI4/b+uUeEVSoOVyE7EDiyPPOEQ1I/h+sr7cK4rq20U+AZbsZ6Y4VSlLkD6Eddr2UGl1lsyXi8QWhNRdb1Pg6OLb7+bXs6S5xLW0bRQKs4laxWzhONTLnhGndhdUk3vPdcR4UHeAhnwlmh/zveqfuFTZ0hf1NuTkUxnVAnpI6WJE96OzXpLT6s7dEokfMAQA1gqSSgIgWbCqO7PN7hBpao6QnbaQ==
;;;;-----END MIKTEX SIGNATURE-----
diff --git a/systems/win32/miktex/tm/packages/pr.ini b/systems/win32/miktex/tm/packages/pr.ini
index db8085a432..08a61c849c 100644
--- a/systems/win32/miktex/tm/packages/pr.ini
+++ b/systems/win32/miktex/tm/packages/pr.ini
@@ -1,13 +1,13 @@
[repository]
-date=1603311120
+date=1603397508
lastupd=biblatex-oxref color-edits ctex erewhon-math everypage expkv-cs flippdf frimurer optex preview step swfigure xcharter xecjk xpinyin bxjscls quran sagetex schule syntaxdi
-lstdigest=327bb95f052932139a4468a4e8ebb9ff
+lstdigest=c5fd8bedb7cc38f18ce9289a7616f39c
numpkg=3994
relstate=stable
-version=7599
+version=7600
;;;;This configuration file is signed by a MiKTeX maintainer. The signature follows.
;;;;-----BEGIN MIKTEX SIGNATURE-----
-;;;; signature/miktex: Zj5F4eqeOkvM7xvFZcm+I+ya/2ey6OWudEHNibSbXjPc3V/fCWGrxm3pMBzZU4Moa461dq+rKLOFAK3103vZekARvVx39KxytcxE0FXN0fRyQcfqYt3btd75PFz/xrJ8wTgoAKoKylf1uRI718jQWcJ1H7QXRt9RlQInY8wwj5mmqms0rthgaoSeuc0gOtO36hP8XL29r0XgiwxdA/ZgCwKOE4DdAqJabhxRqEMfPD3yIbBtN2SPXcqQ338W4h+Z5zRY7SKgbVuq59fAIzRF0Qd4CHZpiLiP9eF0k2H+S5w4DlwuoZaH/Vi+S0ydAwKoK5pUQpE0kwhUWRI9ReMe0A==
+;;;; signature/miktex: VTWdtw72ex42YspYEPAwDjKlqeYqYDC6lyUVMyMjg13QkAJyMvfHbIS0ih3PjjTiJOv4kS7UtZreUYTFJvotNXC6I4dRq2Gt6N9Pj2Y9WVZ3yEvSKHLdFn3Jio1JS4IDuqe0w+OpAUz67SMwkYh9TmRbysak+PmgW8PiR/r0jUmf+bENa8eu/wwI2R99wBQNzJ4Y6G2GeNX2aPQSDmJy/ZEFCAj/y7E2Jc1keQyhOLm5GwcFFsjPl6swlh/bjQiIwoPVHpCInFSh2PuSW9QleMpH8vEq56dqjK7+9p5hZpaeWca0kufURrcx7s1V6xo2CpX1SNrXRwWd8imlamEDrg==
;;;;-----END MIKTEX SIGNATURE-----
diff --git a/systems/win32/w32tex/ChangeLog b/systems/win32/w32tex/ChangeLog
index 5b759ca647..ac4a8de597 100644
--- a/systems/win32/w32tex/ChangeLog
+++ b/systems/win32/w32tex/ChangeLog
@@ -1,5 +1,9 @@
W32TeX (x86 & x64) ChangeLog
+[2020/10/22]
+(01) platex.tar.xz
+ Update plautopatch.
+
[2020/10/21]
(01) dvitools-w32.tar.xz
Update freetype (2.10.4) in dvipng.exe, and dvisvgm.exe.
diff --git a/timestamp b/timestamp
index 6d55a8a63e..0a779222b7 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-10-22-02-02
+2020-10-23-02-02