summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2021-09-18 03:00:49 +0000
committerNorbert Preining <norbert@preining.info>2021-09-18 03:00:49 +0000
commitfb07ccd098248248795fb851a3a6479ecafaaa47 (patch)
treee71e612d8d6e10042e2186172639dd7f8228f9c9
parentaefe346b16163823efeac108a7da42e91e53e5c7 (diff)
CTAN sync 202109180300
-rw-r--r--FILES.byname496
-rw-r--r--FILES.byname.gzbin2387109 -> 2387094 bytes
-rw-r--r--FILES.last07days492
-rw-r--r--graphics/pstricks/contrib/luapstricks/README.md59
-rw-r--r--graphics/pstricks/contrib/luapstricks/luapstricks.lua3946
-rw-r--r--macros/latex/contrib/zref-check/CHANGELOG.md15
-rw-r--r--macros/latex/contrib/zref-check/zref-check-code.pdfbin710511 -> 739197 bytes
-rw-r--r--macros/latex/contrib/zref-check/zref-check.dtx500
-rw-r--r--macros/latex/contrib/zref-check/zref-check.pdfbin455030 -> 457730 bytes
-rw-r--r--macros/unicodetex/latex/njuthesis/README.md9
-rw-r--r--macros/unicodetex/latex/njuthesis/README_ZH_CN.md77
-rw-r--r--macros/unicodetex/latex/njuthesis/figure/njuname-large.jpgbin817068 -> 0 bytes
-rw-r--r--macros/unicodetex/latex/njuthesis/figure/njuname-large.pdfbin0 -> 84739 bytes
-rw-r--r--macros/unicodetex/latex/njuthesis/njuthesis.cls96
-rw-r--r--macros/unicodetex/latex/njuthesis/njuthesis.dtx2266
-rw-r--r--macros/unicodetex/latex/njuthesis/njuthesis.pdfbin1468177 -> 638180 bytes
-rw-r--r--macros/unicodetex/latex/njuthesis/profile/abstract.sty136
-rw-r--r--macros/unicodetex/latex/njuthesis/profile/components.sty173
-rw-r--r--macros/unicodetex/latex/njuthesis/profile/cover.sty251
-rw-r--r--macros/unicodetex/latex/njuthesis/profile/font.sty219
-rw-r--r--macros/unicodetex/latex/njuthesis/profile/packages.sty71
-rw-r--r--macros/unicodetex/latex/njuthesis/profile/page.sty54
-rw-r--r--macros/unicodetex/latex/njuthesis/profile/reference.sty68
-rw-r--r--support/TeX4ht/source/ChangeLog7
-rw-r--r--support/TeX4ht/source/tex4ht-html4.tex10
-rw-r--r--support/TeX4ht/source/tex4ht-ooffice.tex32
-rw-r--r--support/latex2nemeth/README75
-rw-r--r--support/latex2nemeth/contrib/nemeth2odt30
-rw-r--r--support/latex2nemeth/encodings/nemeth.json (renamed from support/latex2nemeth/examples/nemeth.json)644
-rw-r--r--support/latex2nemeth/encodings/polytonic.json10
-rwxr-xr-xsupport/latex2nemeth/latex2nemeth2
-rw-r--r--systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl2
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb129
-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.xzbin2310484 -> 2311652 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--timestamp2
40 files changed, 7948 insertions, 1957 deletions
diff --git a/FILES.byname b/FILES.byname
index d544cb355c..2798d9369e 100644
--- a/FILES.byname
+++ b/FILES.byname
@@ -5105,7 +5105,7 @@
1990/10/02 | 5440 | dviware/vutex/vaxvms.hlp
1990/10/02 | 812 | dviware/vutex/vaxvms.ins
1990/10/02 | 127576 | dviware/vutex/vutex.web
-2021/09/16 | 61347 | FILES.last07days
+2021/09/17 | 66565 | FILES.last07days
2021/07/24 | 1139410 | fonts/aboensis/Aboensis.glyphs
2021/07/24 | 18907382 | fonts/aboensis/aboensis.pdf
2021/07/24 | 137860 | fonts/aboensis/Aboensis-Regular.otf
@@ -156352,6 +156352,9 @@
2014/07/24 | 36126 | graphics/pstricks/contrib/dsptricks/dsptricks.sty
2014/07/25 | 606 | graphics/pstricks/contrib/dsptricks/README
2014/07/25 | 186879 | graphics/pstricks/contrib/dsptricks.zip
+2021/09/17 | 122165 | graphics/pstricks/contrib/luapstricks/luapstricks.lua
+2021/09/17 | 3356 | graphics/pstricks/contrib/luapstricks/README.md
+2021/09/17 | 25311 | graphics/pstricks/contrib/luapstricks.zip
2009/08/26 | 42811 | graphics/pstricks/contrib/makeplot/makeplot.dtx
2009/08/26 | 2006 | graphics/pstricks/contrib/makeplot/makeplot.ins
2009/08/26 | 147019 | graphics/pstricks/contrib/makeplot/makeplot.pdf
@@ -232276,16 +232279,16 @@
2013/11/26 | 524 | macros/latex/contrib/ziffer/README
2013/11/26 | 3959 | macros/latex/contrib/ziffer/ziffer.sty
2013/11/30 | 2049 | macros/latex/contrib/ziffer.zip
-2021/08/17 | 845 | macros/latex/contrib/zref-check/CHANGELOG.md
-2021/08/17 | 38 | macros/latex/contrib/zref-check/DEPENDS.txt
-2021/08/17 | 1002 | macros/latex/contrib/zref-check/README.md
-2021/08/17 | 1151830 | macros/latex/contrib/zref-check.zip
-2021/08/17 | 710511 | macros/latex/contrib/zref-check/zref-check-code.pdf
-2021/08/17 | 2273 | macros/latex/contrib/zref-check/zref-check-code.tex
-2021/08/17 | 86693 | macros/latex/contrib/zref-check/zref-check.dtx
-2021/08/17 | 2791 | macros/latex/contrib/zref-check/zref-check.ins
-2021/08/17 | 455030 | macros/latex/contrib/zref-check/zref-check.pdf
-2021/08/17 | 2607 | macros/latex/contrib/zref-check/zref-check.tex
+2021/09/16 | 1382 | macros/latex/contrib/zref-check/CHANGELOG.md
+2021/09/16 | 38 | macros/latex/contrib/zref-check/DEPENDS.txt
+2021/09/16 | 1002 | macros/latex/contrib/zref-check/README.md
+2021/09/17 | 1183078 | macros/latex/contrib/zref-check.zip
+2021/09/16 | 739197 | macros/latex/contrib/zref-check/zref-check-code.pdf
+2021/09/16 | 2273 | macros/latex/contrib/zref-check/zref-check-code.tex
+2021/09/16 | 88851 | macros/latex/contrib/zref-check/zref-check.dtx
+2021/09/16 | 2791 | macros/latex/contrib/zref-check/zref-check.ins
+2021/09/16 | 457730 | macros/latex/contrib/zref-check/zref-check.pdf
+2021/09/16 | 2607 | macros/latex/contrib/zref-check/zref-check.tex
2020/10/09 | 581 | macros/latex/contrib/zref/README.md
2020/10/09 | 690321 | macros/latex/contrib/zref.zip
2020/10/09 | 195694 | macros/latex/contrib/zref/zref.dtx
@@ -242363,21 +242366,15 @@
2020/09/29 | 211 | macros/unicodetex/latex/lilyglyphs/tex/README-tex
2020/09/29 | 49 | macros/unicodetex/latex/lilyglyphs/VERSION
2020/09/29 | 2283370 | macros/unicodetex/latex/lilyglyphs.zip
-2021/09/11 | 21738 | macros/unicodetex/latex/njuthesis/figure/njulogo.pdf
-2021/09/11 | 817068 | macros/unicodetex/latex/njuthesis/figure/njuname-large.jpg
-2021/09/11 | 12747 | macros/unicodetex/latex/njuthesis/figure/njuname.pdf
-2021/09/11 | 19105 | macros/unicodetex/latex/njuthesis/LICENSE
-2021/09/11 | 3047 | macros/unicodetex/latex/njuthesis/njuthesis.cls
-2021/09/11 | 1468177 | macros/unicodetex/latex/njuthesis/njuthesis.pdf
-2021/09/11 | 4083 | macros/unicodetex/latex/njuthesis/profile/abstract.sty
-2021/09/11 | 4185 | macros/unicodetex/latex/njuthesis/profile/components.sty
-2021/09/11 | 7287 | macros/unicodetex/latex/njuthesis/profile/cover.sty
-2021/09/11 | 7505 | macros/unicodetex/latex/njuthesis/profile/font.sty
-2021/09/11 | 2953 | macros/unicodetex/latex/njuthesis/profile/packages.sty
-2021/09/11 | 1833 | macros/unicodetex/latex/njuthesis/profile/page.sty
-2021/09/11 | 2143 | macros/unicodetex/latex/njuthesis/profile/reference.sty
-2021/09/11 | 823 | macros/unicodetex/latex/njuthesis/README.md
-2021/09/11 | 1802308 | macros/unicodetex/latex/njuthesis.zip
+2021/09/17 | 21738 | macros/unicodetex/latex/njuthesis/figure/njulogo.pdf
+2021/09/17 | 84739 | macros/unicodetex/latex/njuthesis/figure/njuname-large.pdf
+2021/09/17 | 12747 | macros/unicodetex/latex/njuthesis/figure/njuname.pdf
+2021/09/17 | 19105 | macros/unicodetex/latex/njuthesis/LICENSE
+2021/09/17 | 72250 | macros/unicodetex/latex/njuthesis/njuthesis.dtx
+2021/09/17 | 638180 | macros/unicodetex/latex/njuthesis/njuthesis.pdf
+2021/09/17 | 745 | macros/unicodetex/latex/njuthesis/README.md
+2021/09/17 | 3938 | macros/unicodetex/latex/njuthesis/README_ZH_CN.md
+2021/09/17 | 725848 | macros/unicodetex/latex/njuthesis.zip
2021/08/05 | 269 | macros/unicodetex/latex/nwafuthesis/build.sh
2021/08/05 | 263 | macros/unicodetex/latex/nwafuthesis/build-win.bat
2021/08/05 | 218987 | macros/unicodetex/latex/nwafuthesis/logo/building.jpg
@@ -269693,15 +269690,17 @@
2018/11/25 | 1101 | support/latex2man/README
2018/11/25 | 29 | support/latex2man/THIS-IS-VERSION-1.29
2018/11/25 | 358895 | support/latex2man.zip
-2017/11/15 | 54487 | support/latex2nemeth/encodings/polytonic.json
+2021/08/27 | 741 | support/latex2nemeth/contrib/nemeth2odt
+2021/07/30 | 55190 | support/latex2nemeth/encodings/nemeth.json
+2021/07/30 | 54662 | support/latex2nemeth/encodings/polytonic.json
2016/09/29 | 2775 | support/latex2nemeth/examples/mathpics.tex
2016/09/30 | 13560 | support/latex2nemeth/examples/mathtest.tex
-2016/07/18 | 45110 | support/latex2nemeth/examples/nemeth.json
2016/09/29 | 35147 | support/latex2nemeth/gpl-3.0.txt
-2020/03/18 | 131 | support/latex2nemeth/latex2nemeth
-2020/03/18 | 7967051 | support/latex2nemeth/latex2nemeth-v1.0.2.jar
-2020/03/18 | 5750 | support/latex2nemeth/README
-2020/03/18 | 7229594 | support/latex2nemeth.zip
+2021/07/30 | 124 | support/latex2nemeth/latex2nemeth
+2021/07/30 | 8092843 | support/latex2nemeth/latex2nemeth.jar
+2021/08/27 | 5844 | support/latex2nemeth/README
+2021/09/17 | 149177 | support/latex2nemeth/source.zip
+2021/09/17 | 7493000 | support/latex2nemeth.zip
2014/06/16 | 1579721 | support/latex2rtf/latex2rtf-2.3.8.tar.gz
2014/06/16 | 3277975 | support/latex2rtf/latex2rtf-2.3.8_win.exe
2015/12/08 | 3942 | support/latex2rtf/README
@@ -282817,15 +282816,15 @@
2019/02/28 | 344 | systems/texlive/tlnet/archive/latexindent.amd64-freebsd.r32150.tar.xz
2019/02/28 | 344 | systems/texlive/tlnet/archive/latexindent.amd64-netbsd.r32150.tar.xz
2019/02/28 | 344 | systems/texlive/tlnet/archive/latexindent.armhf-linux.r32150.tar.xz
-2021/08/02 | 1034864 | systems/texlive/tlnet/archive/latexindent.doc.r60132.tar.xz
+2021/09/17 | 1084236 | systems/texlive/tlnet/archive/latexindent.doc.r60522.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/latexindent.i386-cygwin.r32150.tar.xz
2019/02/28 | 344 | systems/texlive/tlnet/archive/latexindent.i386-freebsd.r32150.tar.xz
2019/02/28 | 344 | systems/texlive/tlnet/archive/latexindent.i386-linux.r32150.tar.xz
2019/02/28 | 344 | systems/texlive/tlnet/archive/latexindent.i386-netbsd.r32150.tar.xz
2019/02/28 | 344 | systems/texlive/tlnet/archive/latexindent.i386-solaris.r32150.tar.xz
-2021/08/02 | 64260 | systems/texlive/tlnet/archive/latexindent.r60132.tar.xz
+2021/09/17 | 67528 | systems/texlive/tlnet/archive/latexindent.r60522.tar.xz
2021/02/25 | 344 | systems/texlive/tlnet/archive/latexindent.universal-darwin.r57908.tar.xz
-2021/08/02 | 4054156 | systems/texlive/tlnet/archive/latexindent.win32.r60132.tar.xz
+2021/09/17 | 4060720 | systems/texlive/tlnet/archive/latexindent.win32.r60522.tar.xz
2019/02/28 | 344 | systems/texlive/tlnet/archive/latexindent.x86_64-cygwin.r33557.tar.xz
2019/02/28 | 352 | systems/texlive/tlnet/archive/latexindent.x86_64-darwinlegacy.r43871.tar.xz
2019/02/28 | 348 | systems/texlive/tlnet/archive/latexindent.x86_64-linuxmusl.r46840.tar.xz
@@ -283454,9 +283453,9 @@
2021/05/22 | 8560 | systems/texlive/tlnet/archive/lualibs.source.r59298.tar.xz
2020/06/08 | 226344 | systems/texlive/tlnet/archive/luamesh.doc.r55475.tar.xz
2020/06/08 | 12096 | systems/texlive/tlnet/archive/luamesh.r55475.tar.xz
-2021/08/09 | 153676 | systems/texlive/tlnet/archive/luamplib.doc.r60197.tar.xz
-2021/08/09 | 11896 | systems/texlive/tlnet/archive/luamplib.r60197.tar.xz
-2021/08/09 | 26824 | systems/texlive/tlnet/archive/luamplib.source.r60197.tar.xz
+2021/09/17 | 153712 | systems/texlive/tlnet/archive/luamplib.doc.r60521.tar.xz
+2021/09/17 | 11892 | systems/texlive/tlnet/archive/luamplib.r60521.tar.xz
+2021/09/17 | 26832 | systems/texlive/tlnet/archive/luamplib.source.r60521.tar.xz
2019/02/28 | 348 | systems/texlive/tlnet/archive/luaotfload.aarch64-linux.r46208.tar.xz
2019/02/28 | 352 | systems/texlive/tlnet/archive/luaotfload.amd64-freebsd.r34647.tar.xz
2019/02/28 | 348 | systems/texlive/tlnet/archive/luaotfload.amd64-netbsd.r34647.tar.xz
@@ -283525,8 +283524,9 @@
2021/06/04 | 214628 | systems/texlive/tlnet/archive/lua-typo.doc.r59457.tar.xz
2021/06/04 | 8804 | systems/texlive/tlnet/archive/lua-typo.r59457.tar.xz
2021/06/04 | 22768 | systems/texlive/tlnet/archive/lua-typo.source.r59457.tar.xz
-2020/09/24 | 58416 | systems/texlive/tlnet/archive/lua-uca.doc.r56414.tar.xz
-2020/09/24 | 70984 | systems/texlive/tlnet/archive/lua-uca.r56414.tar.xz
+2021/09/17 | 75268 | systems/texlive/tlnet/archive/lua-uca.doc.r60523.tar.xz
+2021/09/17 | 74132 | systems/texlive/tlnet/archive/lua-uca.r60523.tar.xz
+2021/09/17 | 1132 | systems/texlive/tlnet/archive/lua-uca.source.r60523.tar.xz
2021/05/14 | 100604 | systems/texlive/tlnet/archive/lua-ul.doc.r59186.tar.xz
2021/05/14 | 6676 | systems/texlive/tlnet/archive/lua-ul.r59186.tar.xz
2021/05/14 | 10640 | systems/texlive/tlnet/archive/lua-ul.source.r59186.tar.xz
@@ -284085,9 +284085,9 @@
2019/02/28 | 3124 | systems/texlive/tlnet/archive/milog.r41610.tar.xz
2020/03/17 | 1565768 | systems/texlive/tlnet/archive/milsymb.doc.r54361.tar.xz
2020/03/17 | 22172 | systems/texlive/tlnet/archive/milsymb.r54361.tar.xz
-2021/09/13 | 213208 | systems/texlive/tlnet/archive/mindflow.doc.r60485.tar.xz
-2021/09/13 | 2664 | systems/texlive/tlnet/archive/mindflow.r60485.tar.xz
-2021/09/13 | 6368 | systems/texlive/tlnet/archive/mindflow.source.r60485.tar.xz
+2021/09/17 | 213608 | systems/texlive/tlnet/archive/mindflow.doc.r60520.tar.xz
+2021/09/17 | 2704 | systems/texlive/tlnet/archive/mindflow.r60520.tar.xz
+2021/09/17 | 6416 | systems/texlive/tlnet/archive/mindflow.source.r60520.tar.xz
2019/02/28 | 281540 | systems/texlive/tlnet/archive/minibox.doc.r30914.tar.xz
2019/02/28 | 1052 | systems/texlive/tlnet/archive/minibox.r30914.tar.xz
2019/02/28 | 3056 | systems/texlive/tlnet/archive/minibox.source.r30914.tar.xz
@@ -287828,7 +287828,7 @@
2020/05/17 | 592 | systems/texlive/tlnet/archive/texlive-scripts.amd64-freebsd.r55172.tar.xz
2020/05/17 | 588 | systems/texlive/tlnet/archive/texlive-scripts.amd64-netbsd.r55172.tar.xz
2020/05/17 | 592 | systems/texlive/tlnet/archive/texlive-scripts.armhf-linux.r55172.tar.xz
-2021/09/16 | 400148 | systems/texlive/tlnet/archive/texlive-scripts.doc.r60514.tar.xz
+2021/09/17 | 400152 | systems/texlive/tlnet/archive/texlive-scripts.doc.r60518.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
@@ -287852,7 +287852,7 @@
2020/05/17 | 588 | systems/texlive/tlnet/archive/texlive-scripts.i386-linux.r55172.tar.xz
2020/05/17 | 592 | systems/texlive/tlnet/archive/texlive-scripts.i386-netbsd.r55172.tar.xz
2020/05/17 | 588 | systems/texlive/tlnet/archive/texlive-scripts.i386-solaris.r55172.tar.xz
-2021/09/16 | 108300 | systems/texlive/tlnet/archive/texlive-scripts.r60514.tar.xz
+2021/09/17 | 108308 | systems/texlive/tlnet/archive/texlive-scripts.r60518.tar.xz
2021/02/25 | 572 | systems/texlive/tlnet/archive/texlive-scripts.universal-darwin.r57908.tar.xz
2021/04/12 | 36308 | systems/texlive/tlnet/archive/texlive-scripts.win32.r58829.tar.xz
2020/05/17 | 588 | systems/texlive/tlnet/archive/texlive-scripts.x86_64-cygwin.r55172.tar.xz
@@ -289582,16 +289582,16 @@
2020/07/18 | 47816 | systems/texlive/tlnet/archive/zztex.doc.r55862.tar.xz
2020/07/18 | 101724 | systems/texlive/tlnet/archive/zztex.r55862.tar.xz
2021/05/02 | 105152 | systems/texlive/tlnet/install-tl
-2021/09/16 | 6811636 | systems/texlive/tlnet/install-tl-unx.tar.gz
-2021/09/16 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
-2021/09/16 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2021/09/17 | 6811196 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2021/09/17 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2021/09/17 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
2021/04/11 | 4945 | systems/texlive/tlnet/install-tl-windows.bat
-2021/09/16 | 20872882 | systems/texlive/tlnet/install-tl-windows.exe
-2021/09/16 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
-2021/09/16 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2021/09/16 | 25629536 | systems/texlive/tlnet/install-tl.zip
-2021/09/16 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
-2021/09/16 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2021/09/17 | 20870598 | systems/texlive/tlnet/install-tl-windows.exe
+2021/09/17 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2021/09/17 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2021/09/17 | 25629542 | systems/texlive/tlnet/install-tl.zip
+2021/09/17 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2021/09/17 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
2021/04/01 | 1229 | systems/texlive/tlnet/README.md
2021/04/01 | 0 | systems/texlive/tlnet/TEXLIVE_2021
2021/07/03 | 7181 | systems/texlive/tlnet/tlpkg/gpg/pubring.gpg
@@ -289601,7 +289601,7 @@
2021/07/03 | 1280 | systems/texlive/tlnet/tlpkg/gpg/trustdb.gpg
2021/07/02 | 49348 | systems/texlive/tlnet/tlpkg/installer/config.guess
2010/11/11 | 11651 | systems/texlive/tlnet/tlpkg/installer/COPYING.MinGW-runtime.txt
-2021/09/15 | 6879 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+2021/09/16 | 6928 | 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
2017/04/16 | 2629 | systems/texlive/tlnet/tlpkg/installer/installer-options.txt
@@ -289643,12 +289643,12 @@
2021/05/16 | 20371 | systems/texlive/tlnet/tlpkg/TeXLive/TLCrypto.pm
2021/05/16 | 5402 | systems/texlive/tlnet/tlpkg/TeXLive/TLDownload.pm
2021/05/16 | 27555 | systems/texlive/tlnet/tlpkg/TeXLive/TLPaper.pm
-2021/09/16 | 16883112 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
-2021/09/16 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2021/09/17 | 16883547 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2021/09/17 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
2021/05/16 | 86511 | systems/texlive/tlnet/tlpkg/TeXLive/TLPDB.pm
-2021/09/16 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
-2021/09/16 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2021/09/16 | 2308392 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2021/09/17 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2021/09/17 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2021/09/17 | 2310484 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
2021/05/16 | 58801 | systems/texlive/tlnet/tlpkg/TeXLive/TLPOBJ.pm
2021/05/16 | 42084 | systems/texlive/tlnet/tlpkg/TeXLive/TLPSRC.pm
2021/05/16 | 16103 | systems/texlive/tlnet/tlpkg/TeXLive/TLTREE.pm
@@ -294566,7 +294566,7 @@
2020/10/03 | 318630 | systems/win32/miktex/tm/packages/filehook.tar.lzma
2012/12/04 | 924573 | systems/win32/miktex/tm/packages/fileinfo.tar.lzma
2011/09/21 | 281409 | systems/win32/miktex/tm/packages/filemod.tar.lzma
-2021/09/16 | 615978 | systems/win32/miktex/tm/packages/files.csv.lzma
+2021/09/17 | 615978 | 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
@@ -295950,9 +295950,9 @@
2018/01/12 | 157226 | systems/win32/miktex/tm/packages/miktex-zip-bin-x64.tar.lzma
2021/08/07 | 39000 | systems/win32/miktex/tm/packages/miktex-zlib-bin-2.9.tar.lzma
2021/08/07 | 43393 | systems/win32/miktex/tm/packages/miktex-zlib-bin-x64-2.9.tar.lzma
-2021/09/16 | 240461 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
-2021/09/16 | 1357114 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
-2021/09/16 | 1259727 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
+2021/09/17 | 240421 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
+2021/09/17 | 1356205 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
+2021/09/17 | 1260245 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
2021/08/07 | 13446 | systems/win32/miktex/tm/packages/miktex-zzip-bin-2.9.tar.lzma
2021/08/07 | 14327 | 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
@@ -296160,189 +296160,189 @@
2018/04/09 | 400132 | systems/win32/miktex/tm/packages/newunicodechar.tar.lzma
2011/09/19 | 101312 | systems/win32/miktex/tm/packages/newvbtm.tar.lzma
2021/03/17 | 232249 | systems/win32/miktex/tm/packages/newverbs.tar.lzma
-2021/09/16 | 615727 | systems/win32/miktex/tm/packages/next/files.csv.lzma
-2021/09/16 | 51112 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
-2021/09/16 | 56476 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
-2021/09/16 | 975020 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
-2021/09/16 | 1077989 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
-2021/09/16 | 29037 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
-2021/09/16 | 31350 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
-2021/09/16 | 29841 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
-2021/09/16 | 34666 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
-2021/09/16 | 50151 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
-2021/09/16 | 57547 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
-2021/09/16 | 83540 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
-2021/09/16 | 95403 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
-2021/09/16 | 67818 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
-2021/09/16 | 75792 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
-2021/09/16 | 27199 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
-2021/09/16 | 30824 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
-2021/09/16 | 330787 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
-2021/09/16 | 392793 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
-2021/09/16 | 32673 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
-2021/09/16 | 36628 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
-2021/09/16 | 51309 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
-2021/09/16 | 56684 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
-2021/09/16 | 241810 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
-2021/09/16 | 263959 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
-2021/09/16 | 180009 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
-2021/09/16 | 195636 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
-2021/09/16 | 54631 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
-2021/09/16 | 61812 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
-2021/09/16 | 21224 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
-2021/09/16 | 23365 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
-2021/09/16 | 461813 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
-2021/09/16 | 45905 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
-2021/09/16 | 51202 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
-2021/09/16 | 284581 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
-2021/09/16 | 325042 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
-2021/09/16 | 41194 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
-2021/09/16 | 45311 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
-2021/09/16 | 119818 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
-2021/09/16 | 133862 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
-2021/09/16 | 1291299 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
-2021/09/16 | 1421868 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
-2021/09/16 | 100624 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
-2021/09/16 | 112982 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
-2021/09/16 | 43027 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
-2021/09/16 | 48252 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
-2021/09/16 | 25020 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
-2021/09/16 | 28179 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
-2021/09/16 | 56317 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
-2021/09/16 | 62785 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
-2021/09/16 | 136812 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
-2021/09/16 | 154427 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
-2021/09/16 | 73195 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
-2021/09/16 | 77951 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
-2021/09/16 | 71668 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
-2021/09/16 | 80447 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
-2021/09/16 | 258880 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
-2021/09/16 | 295203 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
-2021/09/16 | 22048 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
-2021/09/16 | 24995 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
-2021/09/16 | 97338 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
-2021/09/16 | 112087 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
-2021/09/16 | 64428 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
-2021/09/16 | 73147 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
-2021/09/16 | 96632 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
-2021/09/16 | 115349 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
-2021/09/16 | 38140 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
-2021/09/16 | 43003 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
-2021/09/16 | 483653 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
-2021/09/16 | 566525 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
-2021/09/16 | 147372 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
-2021/09/16 | 159578 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
-2021/09/16 | 94799 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
-2021/09/16 | 109031 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
-2021/09/16 | 16357 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
-2021/09/16 | 17980 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
-2021/09/16 | 28390 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
-2021/09/16 | 30058 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
-2021/09/16 | 629399 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
-2021/09/16 | 681252 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
-2021/09/16 | 531852 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
-2021/09/16 | 596929 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
-2021/09/16 | 476919 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
-2021/09/16 | 510587 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
-2021/09/16 | 94310 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
-2021/09/16 | 103400 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
-2021/09/16 | 1713893 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
-2021/09/16 | 2009905 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
-2021/09/16 | 67618 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
-2021/09/16 | 74209 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
-2021/09/16 | 27357 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
-2021/09/16 | 31619 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
-2021/09/16 | 7721 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
-2021/09/16 | 8766 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
-2021/09/16 | 196872 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
-2021/09/16 | 215248 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
-2021/09/16 | 250263 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
-2021/09/16 | 284022 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
-2021/09/16 | 98380 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
-2021/09/16 | 103203 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
-2021/09/16 | 60637 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
-2021/09/16 | 68022 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
-2021/09/16 | 124281 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
-2021/09/16 | 136821 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
-2021/09/16 | 178353 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
-2021/09/16 | 196740 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
-2021/09/16 | 199732 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
-2021/09/16 | 180121 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
-2021/09/16 | 67484 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
-2021/09/16 | 76825 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
-2021/09/16 | 31231 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
-2021/09/16 | 35087 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
-2021/09/16 | 37805 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
-2021/09/16 | 42711 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
-2021/09/16 | 42890 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
-2021/09/16 | 46906 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
-2021/09/16 | 45969 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
-2021/09/16 | 52522 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
-2021/09/16 | 194382 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
-2021/09/16 | 206605 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
-2021/09/16 | 35691 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
-2021/09/16 | 40229 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
-2021/09/16 | 744117 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
-2021/09/16 | 815242 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
-2021/09/16 | 198169 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
-2021/09/16 | 202796 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
-2021/09/16 | 208049 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
-2021/09/16 | 243426 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
-2021/09/16 | 78774 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
-2021/09/16 | 87777 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
-2021/09/16 | 1169717 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
-2021/09/16 | 1301191 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
-2021/09/16 | 20137 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
-2021/09/16 | 23902 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
-2021/09/16 | 31537 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
-2021/09/16 | 37242 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
-2021/09/16 | 64185 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
-2021/09/16 | 72205 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
-2021/09/16 | 50394 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
-2021/09/16 | 57728 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
-2021/09/16 | 1340930 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
-2021/09/16 | 1464201 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
-2021/09/16 | 42385 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
-2021/09/16 | 51750 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
-2021/09/16 | 56513 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
-2021/09/16 | 60039 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
-2021/09/16 | 25290 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
-2021/09/16 | 27390 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
-2021/09/16 | 16412 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
-2021/09/16 | 18176 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
-2021/09/16 | 63778 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
-2021/09/16 | 69914 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
-2021/09/16 | 154805 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
-2021/09/16 | 169241 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
-2021/09/16 | 57011 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
-2021/09/16 | 65786 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
-2021/09/16 | 98260 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
-2021/09/16 | 105221 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
-2021/09/16 | 2672609 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
-2021/09/16 | 2796725 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
-2021/09/16 | 56355 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
-2021/09/16 | 62229 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
-2021/09/16 | 33545 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
-2021/09/16 | 37359 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
-2021/09/16 | 27727 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
-2021/09/16 | 33633 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
-2021/09/16 | 65619 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
-2021/09/16 | 70648 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
-2021/09/16 | 312107 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
-2021/09/16 | 345739 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
-2021/09/16 | 55498 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin.tar.lzma
-2021/09/16 | 57139 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin-x64.tar.lzma
-2021/09/16 | 589842 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
-2021/09/16 | 624652 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
-2021/09/16 | 39128 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
-2021/09/16 | 43426 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
-2021/09/16 | 240477 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
-2021/09/16 | 1356285 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
-2021/09/16 | 1261068 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
-2021/09/16 | 13465 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
-2021/09/16 | 14348 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
+2021/09/17 | 615727 | systems/win32/miktex/tm/packages/next/files.csv.lzma
+2021/09/17 | 51112 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
+2021/09/17 | 56475 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
+2021/09/17 | 975022 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
+2021/09/17 | 1077990 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
+2021/09/17 | 29038 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
+2021/09/17 | 31353 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
+2021/09/17 | 29842 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
+2021/09/17 | 34667 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
+2021/09/17 | 50152 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
+2021/09/17 | 57547 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
+2021/09/17 | 83540 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
+2021/09/17 | 95402 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
+2021/09/17 | 67819 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
+2021/09/17 | 75792 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
+2021/09/17 | 27199 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
+2021/09/17 | 30824 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
+2021/09/17 | 330788 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
+2021/09/17 | 392793 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
+2021/09/17 | 32673 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
+2021/09/17 | 36628 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
+2021/09/17 | 51310 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
+2021/09/17 | 56685 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
+2021/09/17 | 241812 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
+2021/09/17 | 263959 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
+2021/09/17 | 180010 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
+2021/09/17 | 195636 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
+2021/09/17 | 54633 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
+2021/09/17 | 61813 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
+2021/09/17 | 21226 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
+2021/09/17 | 23365 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
+2021/09/17 | 461807 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
+2021/09/17 | 45905 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
+2021/09/17 | 51203 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
+2021/09/17 | 284581 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
+2021/09/17 | 325044 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
+2021/09/17 | 41194 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
+2021/09/17 | 45312 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
+2021/09/17 | 119820 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
+2021/09/17 | 133863 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
+2021/09/17 | 1291299 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
+2021/09/17 | 1421868 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
+2021/09/17 | 100625 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
+2021/09/17 | 112982 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
+2021/09/17 | 43029 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
+2021/09/17 | 48252 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
+2021/09/17 | 25020 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
+2021/09/17 | 28181 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
+2021/09/17 | 56318 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
+2021/09/17 | 62787 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
+2021/09/17 | 136817 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
+2021/09/17 | 154426 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
+2021/09/17 | 73196 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
+2021/09/17 | 77951 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
+2021/09/17 | 71670 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
+2021/09/17 | 80450 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
+2021/09/17 | 258882 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
+2021/09/17 | 295204 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
+2021/09/17 | 22048 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
+2021/09/17 | 24996 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
+2021/09/17 | 97339 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
+2021/09/17 | 112088 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
+2021/09/17 | 64427 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
+2021/09/17 | 73147 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
+2021/09/17 | 96633 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
+2021/09/17 | 115351 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
+2021/09/17 | 38141 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
+2021/09/17 | 43003 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
+2021/09/17 | 483654 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
+2021/09/17 | 566529 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
+2021/09/17 | 147373 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
+2021/09/17 | 159579 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
+2021/09/17 | 94800 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
+2021/09/17 | 109033 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
+2021/09/17 | 16357 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
+2021/09/17 | 17980 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
+2021/09/17 | 28390 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
+2021/09/17 | 30058 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
+2021/09/17 | 629398 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
+2021/09/17 | 681252 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
+2021/09/17 | 531854 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
+2021/09/17 | 596929 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
+2021/09/17 | 476922 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
+2021/09/17 | 510586 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
+2021/09/17 | 94311 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
+2021/09/17 | 103400 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
+2021/09/17 | 1713894 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
+2021/09/17 | 2009903 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
+2021/09/17 | 67618 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
+2021/09/17 | 74210 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
+2021/09/17 | 27357 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
+2021/09/17 | 31620 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
+2021/09/17 | 7723 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
+2021/09/17 | 8768 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
+2021/09/17 | 196872 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
+2021/09/17 | 215249 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
+2021/09/17 | 250264 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
+2021/09/17 | 284024 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
+2021/09/17 | 98379 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
+2021/09/17 | 103205 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
+2021/09/17 | 60637 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
+2021/09/17 | 68024 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
+2021/09/17 | 124282 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
+2021/09/17 | 136821 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
+2021/09/17 | 178354 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
+2021/09/17 | 196741 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
+2021/09/17 | 199732 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
+2021/09/17 | 180121 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
+2021/09/17 | 67484 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
+2021/09/17 | 76826 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
+2021/09/17 | 31231 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
+2021/09/17 | 35086 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
+2021/09/17 | 37806 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
+2021/09/17 | 42711 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
+2021/09/17 | 42891 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
+2021/09/17 | 46907 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
+2021/09/17 | 45970 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
+2021/09/17 | 52523 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
+2021/09/17 | 194384 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
+2021/09/17 | 206604 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
+2021/09/17 | 35692 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
+2021/09/17 | 40229 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
+2021/09/17 | 744118 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
+2021/09/17 | 815242 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
+2021/09/17 | 198170 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
+2021/09/17 | 202798 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
+2021/09/17 | 208049 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
+2021/09/17 | 243427 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
+2021/09/17 | 78774 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
+2021/09/17 | 87777 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
+2021/09/17 | 1169715 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
+2021/09/17 | 1301192 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
+2021/09/17 | 20137 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
+2021/09/17 | 23902 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
+2021/09/17 | 31538 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
+2021/09/17 | 37241 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
+2021/09/17 | 64185 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
+2021/09/17 | 72206 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
+2021/09/17 | 50392 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
+2021/09/17 | 57727 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
+2021/09/17 | 1340931 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
+2021/09/17 | 1464203 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
+2021/09/17 | 42386 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
+2021/09/17 | 51750 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
+2021/09/17 | 56515 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
+2021/09/17 | 60039 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
+2021/09/17 | 25291 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
+2021/09/17 | 27391 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
+2021/09/17 | 16413 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
+2021/09/17 | 18176 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
+2021/09/17 | 63777 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
+2021/09/17 | 69916 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
+2021/09/17 | 154805 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
+2021/09/17 | 169242 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
+2021/09/17 | 57014 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
+2021/09/17 | 65787 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
+2021/09/17 | 98262 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
+2021/09/17 | 105223 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
+2021/09/17 | 2672610 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
+2021/09/17 | 2796726 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
+2021/09/17 | 56358 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
+2021/09/17 | 62230 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
+2021/09/17 | 33546 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
+2021/09/17 | 37360 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
+2021/09/17 | 27725 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
+2021/09/17 | 33632 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
+2021/09/17 | 65619 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
+2021/09/17 | 70649 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
+2021/09/17 | 312109 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
+2021/09/17 | 345738 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
+2021/09/17 | 55499 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin.tar.lzma
+2021/09/17 | 57139 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin-x64.tar.lzma
+2021/09/17 | 589844 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
+2021/09/17 | 624656 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
+2021/09/17 | 39128 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
+2021/09/17 | 43426 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
+2021/09/17 | 240549 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
+2021/09/17 | 1356203 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
+2021/09/17 | 1259494 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
+2021/09/17 | 13464 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
+2021/09/17 | 14348 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
2019/03/12 | 1412 | systems/win32/miktex/tm/packages/nextpage.tar.lzma
-2021/09/16 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini
+2021/09/17 | 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
@@ -296731,7 +296731,7 @@
2020/10/20 | 342254 | systems/win32/miktex/tm/packages/preview.tar.lzma
2019/06/20 | 375963 | systems/win32/miktex/tm/packages/prftree.tar.lzma
2021/04/23 | 274028 | systems/win32/miktex/tm/packages/principia.tar.lzma
-2021/09/16 | 976 | systems/win32/miktex/tm/packages/pr.ini
+2021/09/17 | 976 | 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
@@ -298330,7 +298330,7 @@
2004/06/04 | 404 | tds/tds.sed
2004/06/23 | 65418 | tds/tds.tex
2019/05/29 | 304264 | tds.zip
-2021/09/17 | 186 | timestamp
+2021/09/18 | 186 | timestamp
2002/08/26 | 61898 | usergrps/dante/antrag.pdf
2002/08/26 | 118217 | usergrps/dante/antrag.ps
2021/08/04 | 917 | usergrps/dante/dtk/doc/beispiel.bib
diff --git a/FILES.byname.gz b/FILES.byname.gz
index 46688b2ae4..a07d998147 100644
--- a/FILES.byname.gz
+++ b/FILES.byname.gz
Binary files differ
diff --git a/FILES.last07days b/FILES.last07days
index 03c4302585..1965c5a453 100644
--- a/FILES.last07days
+++ b/FILES.last07days
@@ -1,235 +1,316 @@
-2021/09/16 | 98380 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
-2021/09/16 | 98260 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
+2021/09/17 | 98379 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
+2021/09/17 | 98262 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
+2021/09/17 | 976 | systems/win32/miktex/tm/packages/pr.ini
+2021/09/17 | 975022 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
+2021/09/17 | 97339 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
+2021/09/17 | 96633 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
+2021/09/17 | 95402 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
+2021/09/17 | 94800 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
+2021/09/17 | 94311 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
+2021/09/17 | 87777 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
+2021/09/17 | 8768 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
+2021/09/17 | 84739 | macros/unicodetex/latex/njuthesis/figure/njuname-large.pdf
+2021/09/17 | 83540 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
+2021/09/17 | 815242 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
+2021/09/17 | 80450 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
+2021/09/17 | 78774 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
+2021/09/17 | 77951 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
+2021/09/17 | 7723 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
+2021/09/17 | 76826 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
+2021/09/17 | 75792 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
+2021/09/17 | 75268 | systems/texlive/tlnet/archive/lua-uca.doc.r60523.tar.xz
+2021/09/17 | 7493000 | support/latex2nemeth.zip
+2021/09/17 | 745 | macros/unicodetex/latex/njuthesis/README.md
+2021/09/17 | 744118 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
+2021/09/17 | 74210 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
+2021/09/17 | 74132 | systems/texlive/tlnet/archive/lua-uca.r60523.tar.xz
+2021/09/17 | 73196 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
+2021/09/17 | 73147 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
+2021/09/17 | 725848 | macros/unicodetex/latex/njuthesis.zip
+2021/09/17 | 72250 | macros/unicodetex/latex/njuthesis/njuthesis.dtx
+2021/09/17 | 72206 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
+2021/09/17 | 71670 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
+2021/09/17 | 70649 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
+2021/09/17 | 69916 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
+2021/09/17 | 681252 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
+2021/09/17 | 6811196 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2021/09/17 | 68024 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
+2021/09/17 | 67819 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
+2021/09/17 | 67618 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
+2021/09/17 | 67528 | systems/texlive/tlnet/archive/latexindent.r60522.tar.xz
+2021/09/17 | 67484 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
+2021/09/17 | 65787 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
+2021/09/17 | 65619 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
+2021/09/17 | 64427 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
+2021/09/17 | 64185 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
+2021/09/17 | 6416 | systems/texlive/tlnet/archive/mindflow.source.r60520.tar.xz
+2021/09/17 | 638180 | macros/unicodetex/latex/njuthesis/njuthesis.pdf
+2021/09/17 | 63777 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
+2021/09/17 | 629398 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
+2021/09/17 | 62787 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
+2021/09/17 | 624656 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
+2021/09/17 | 62230 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
+2021/09/17 | 61813 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
+2021/09/17 | 615978 | systems/win32/miktex/tm/packages/files.csv.lzma
+2021/09/17 | 615727 | systems/win32/miktex/tm/packages/next/files.csv.lzma
+2021/09/17 | 60637 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
+2021/09/17 | 60039 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
+2021/09/17 | 596929 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
+2021/09/17 | 589844 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
+2021/09/17 | 57727 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
+2021/09/17 | 57547 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
+2021/09/17 | 57139 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin-x64.tar.lzma
+2021/09/17 | 57014 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
+2021/09/17 | 56685 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
+2021/09/17 | 566529 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
+2021/09/17 | 56515 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
+2021/09/17 | 56475 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
+2021/09/17 | 56358 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
+2021/09/17 | 56318 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
+2021/09/17 | 55499 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin.tar.lzma
+2021/09/17 | 54633 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
+2021/09/17 | 531854 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
+2021/09/17 | 52523 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
+2021/09/17 | 51750 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
+2021/09/17 | 51310 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
+2021/09/17 | 51203 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
+2021/09/17 | 51112 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
+2021/09/17 | 510586 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
+2021/09/17 | 50392 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
+2021/09/17 | 50152 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
+2021/09/17 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2021/09/17 | 483654 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
+2021/09/17 | 48252 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
+2021/09/17 | 476922 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
+2021/09/17 | 46907 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
+2021/09/17 | 461807 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
+2021/09/17 | 45970 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
+2021/09/17 | 45905 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
+2021/09/17 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2021/09/17 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2021/09/17 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2021/09/17 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2021/09/17 | 45312 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
+2021/09/17 | 43426 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
+2021/09/17 | 43029 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
+2021/09/17 | 43003 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
+2021/09/17 | 42891 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
+2021/09/17 | 42711 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
+2021/09/17 | 42386 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
+2021/09/17 | 41194 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
+2021/09/17 | 4060720 | systems/texlive/tlnet/archive/latexindent.win32.r60522.tar.xz
+2021/09/17 | 40229 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
+2021/09/17 | 400152 | systems/texlive/tlnet/archive/texlive-scripts.doc.r60518.tar.xz
+2021/09/17 | 3938 | macros/unicodetex/latex/njuthesis/README_ZH_CN.md
+2021/09/17 | 392793 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
+2021/09/17 | 39128 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
+2021/09/17 | 38141 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
+2021/09/17 | 37806 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
+2021/09/17 | 37360 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
+2021/09/17 | 37241 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
+2021/09/17 | 36628 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
+2021/09/17 | 35692 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
+2021/09/17 | 35086 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
+2021/09/17 | 34667 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
+2021/09/17 | 345738 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
+2021/09/17 | 33632 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
+2021/09/17 | 3356 | graphics/pstricks/contrib/luapstricks/README.md
+2021/09/17 | 33546 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
+2021/09/17 | 330788 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
+2021/09/17 | 32673 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
+2021/09/17 | 325044 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
+2021/09/17 | 31620 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
+2021/09/17 | 31538 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
+2021/09/17 | 31353 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
+2021/09/17 | 31231 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
+2021/09/17 | 312109 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
+2021/09/17 | 30824 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
+2021/09/17 | 30058 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
+2021/09/17 | 29842 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
+2021/09/17 | 295204 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
+2021/09/17 | 29038 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
+2021/09/17 | 284581 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
+2021/09/17 | 284024 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
+2021/09/17 | 28390 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
+2021/09/17 | 28181 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
+2021/09/17 | 2796726 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
+2021/09/17 | 27725 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
+2021/09/17 | 27391 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
+2021/09/17 | 27357 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
+2021/09/17 | 27199 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
+2021/09/17 | 2704 | systems/texlive/tlnet/archive/mindflow.r60520.tar.xz
+2021/09/17 | 26832 | systems/texlive/tlnet/archive/luamplib.source.r60521.tar.xz
+2021/09/17 | 2672610 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
+2021/09/17 | 263959 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
+2021/09/17 | 258882 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
+2021/09/17 | 25629542 | systems/texlive/tlnet/install-tl.zip
+2021/09/17 | 25311 | graphics/pstricks/contrib/luapstricks.zip
+2021/09/17 | 25291 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
+2021/09/17 | 250264 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
+2021/09/17 | 25020 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
+2021/09/17 | 24996 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
+2021/09/17 | 243427 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
+2021/09/17 | 241812 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
+2021/09/17 | 240549 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
+2021/09/17 | 240421 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
+2021/09/17 | 23902 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
+2021/09/17 | 23365 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
+2021/09/17 | 2310484 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2021/09/17 | 22048 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
+2021/09/17 | 21738 | macros/unicodetex/latex/njuthesis/figure/njulogo.pdf
+2021/09/17 | 215249 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
+2021/09/17 | 213608 | systems/texlive/tlnet/archive/mindflow.doc.r60520.tar.xz
+2021/09/17 | 21226 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
+2021/09/17 | 20870598 | systems/texlive/tlnet/install-tl-windows.exe
+2021/09/17 | 208049 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
+2021/09/17 | 206604 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
+2021/09/17 | 202798 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
+2021/09/17 | 20137 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
+2021/09/17 | 2009903 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
+2021/09/17 | 199732 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
+2021/09/17 | 198170 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
+2021/09/17 | 196872 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
+2021/09/17 | 196741 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
+2021/09/17 | 195636 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
+2021/09/17 | 194384 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
+2021/09/17 | 19105 | macros/unicodetex/latex/njuthesis/LICENSE
+2021/09/17 | 18176 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
+2021/09/17 | 180121 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
+2021/09/17 | 180010 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
+2021/09/17 | 17980 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
+2021/09/17 | 178354 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
+2021/09/17 | 1713894 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
+2021/09/17 | 169242 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
+2021/09/17 | 16883547 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2021/09/17 | 16413 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
+2021/09/17 | 16357 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
+2021/09/17 | 159579 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
+2021/09/17 | 154805 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
+2021/09/17 | 154426 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
+2021/09/17 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2021/09/17 | 153712 | systems/texlive/tlnet/archive/luamplib.doc.r60521.tar.xz
+2021/09/17 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2021/09/17 | 149177 | support/latex2nemeth/source.zip
+2021/09/17 | 147373 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
+2021/09/17 | 1464203 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
+2021/09/17 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2021/09/17 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2021/09/17 | 14348 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
+2021/09/17 | 1421868 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
+2021/09/17 | 136821 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
+2021/09/17 | 136817 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
+2021/09/17 | 1356205 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
+2021/09/17 | 1356203 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
+2021/09/17 | 13464 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
+2021/09/17 | 1340931 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
+2021/09/17 | 133863 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
+2021/09/17 | 1301192 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
+2021/09/17 | 1291299 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
+2021/09/17 | 12747 | macros/unicodetex/latex/njuthesis/figure/njuname.pdf
+2021/09/17 | 1260245 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
+2021/09/17 | 1259494 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
+2021/09/17 | 124282 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
+2021/09/17 | 122165 | graphics/pstricks/contrib/luapstricks/luapstricks.lua
+2021/09/17 | 119820 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
+2021/09/17 | 11892 | systems/texlive/tlnet/archive/luamplib.r60521.tar.xz
+2021/09/17 | 1183078 | macros/latex/contrib/zref-check.zip
+2021/09/17 | 1169715 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
+2021/09/17 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini
+2021/09/17 | 115351 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
+2021/09/17 | 1132 | systems/texlive/tlnet/archive/lua-uca.source.r60523.tar.xz
+2021/09/17 | 112982 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
+2021/09/17 | 112088 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
+2021/09/17 | 109033 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
+2021/09/17 | 1084236 | systems/texlive/tlnet/archive/latexindent.doc.r60522.tar.xz
+2021/09/17 | 108308 | systems/texlive/tlnet/archive/texlive-scripts.r60518.tar.xz
+2021/09/17 | 1077990 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
+2021/09/17 | 105223 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
+2021/09/17 | 103400 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
+2021/09/17 | 103205 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
+2021/09/17 | 100625 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
2021/09/16 | 9809944 | support/latexindent/latexindent.exe
-2021/09/16 | 976 | systems/win32/miktex/tm/packages/pr.ini
-2021/09/16 | 975020 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
-2021/09/16 | 97338 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
-2021/09/16 | 96632 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
-2021/09/16 | 95403 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
2021/09/16 | 9537 | support/latexindent/LatexIndent/IfElseFi.pm
-2021/09/16 | 94799 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
-2021/09/16 | 94310 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
2021/09/16 | 93702 | macros/luatex/generic/luamplib/luamplib.dtx
2021/09/16 | 9243 | support/latexindent/LatexIndent/Lines.pm
2021/09/16 | 9048 | macros/luatex/generic/luamplib/NEWS
-2021/09/16 | 87777 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
+2021/09/16 | 88851 | macros/latex/contrib/zref-check/zref-check.dtx
2021/09/16 | 8776 | support/latexindent/LatexIndent/LogFile.pm
-2021/09/16 | 8766 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
-2021/09/16 | 83540 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
2021/09/16 | 833 | support/latexindent/LatexIndent/Version.pm
-2021/09/16 | 815242 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
-2021/09/16 | 80447 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
2021/09/16 | 8035 | support/latexindent/documentation/sec-the-line-switch.tex
2021/09/16 | 7969 | support/latexindent/documentation/sec-introduction.tex
-2021/09/16 | 78774 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
-2021/09/16 | 77951 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
-2021/09/16 | 7721 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
-2021/09/16 | 76825 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
-2021/09/16 | 75792 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
-2021/09/16 | 744117 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
-2021/09/16 | 74209 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
-2021/09/16 | 73195 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
-2021/09/16 | 73147 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
+2021/09/16 | 739197 | macros/latex/contrib/zref-check/zref-check-code.pdf
2021/09/16 | 7234 | support/latexindent/documentation/subsubsec-no-add-remaining-code-blocks.tex
-2021/09/16 | 72205 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
2021/09/16 | 72038 | support/lualibs/lua-uca/lua-uca-doc.pdf
-2021/09/16 | 71668 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
2021/09/16 | 7161 | support/latexindent/documentation/figure-schematic.png
-2021/09/16 | 70648 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
-2021/09/16 | 69914 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
2021/09/16 | 6984 | support/latexindent/LatexIndent/FileExtension.pm
+2021/09/16 | 6928 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2021/09/16 | 68771 | support/latexindent/documentation/sec-default-user-local.tex
-2021/09/16 | 681252 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
-2021/09/16 | 6811636 | systems/texlive/tlnet/install-tl-unx.tar.gz
-2021/09/16 | 68022 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
2021/09/16 | 6793 | support/latexindent/LatexIndent/MandatoryArgument.pm
-2021/09/16 | 67818 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
-2021/09/16 | 67618 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
-2021/09/16 | 67484 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
2021/09/16 | 6645 | support/latexindent/LatexIndent/BackUpFileProcedure.pm
2021/09/16 | 66280 | support/latexindent/documentation/subsec-poly-switches.tex
-2021/09/16 | 65786 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
-2021/09/16 | 65619 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
-2021/09/16 | 64428 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
-2021/09/16 | 64185 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
2021/09/16 | 6402 | support/latexindent/LatexIndent/Item.pm
-2021/09/16 | 63778 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
2021/09/16 | 6373 | support/latexindent/LatexIndent/TrailingComments.pm
2021/09/16 | 633 | support/latexindent/documentation/cmhlistings.tex
2021/09/16 | 6329 | support/latexindent/LatexIndent/Environment.pm
-2021/09/16 | 629399 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
-2021/09/16 | 62785 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
-2021/09/16 | 624652 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
-2021/09/16 | 62229 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
-2021/09/16 | 61812 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
2021/09/16 | 61604 | support/latexindent/LatexIndent/AlignmentAtAmpersand.pm
-2021/09/16 | 615978 | systems/win32/miktex/tm/packages/files.csv.lzma
-2021/09/16 | 615727 | systems/win32/miktex/tm/packages/next/files.csv.lzma
-2021/09/16 | 60637 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
2021/09/16 | 6062 | support/latexindent/LatexIndent/OptionalArgument.pm
2021/09/16 | 6061 | support/lualibs/lua-uca/lua-uca/lua-uca-tailoring.lua
2021/09/16 | 6053672 | support/latexindent.zip
2021/09/16 | 6005 | support/lualibs/lua-uca/lua-uca/lua-uca-reordering-table.lua
-2021/09/16 | 60039 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
2021/09/16 | 5979 | support/latexindent/documentation/subsubsec-commands-with-arguments.tex
2021/09/16 | 5969 | support/latexindent/LatexIndent/Else.pm
-2021/09/16 | 596929 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
-2021/09/16 | 589842 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
-2021/09/16 | 57728 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
2021/09/16 | 5771 | support/latexindent/LatexIndent/UnNamedGroupingBracesBrackets.pm
-2021/09/16 | 57547 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
2021/09/16 | 5728 | support/latexindent/documentation/subsec-combine-text-wrap-para-line-breaks.tex
-2021/09/16 | 57139 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin-x64.tar.lzma
-2021/09/16 | 57011 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
-2021/09/16 | 56684 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
-2021/09/16 | 566525 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
-2021/09/16 | 56513 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
-2021/09/16 | 56476 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
-2021/09/16 | 56355 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
-2021/09/16 | 56317 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
2021/09/16 | 55980 | support/latexindent/LatexIndent/GetYamlSettings.pm
-2021/09/16 | 55498 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin.tar.lzma
-2021/09/16 | 54631 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
-2021/09/16 | 531852 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
2021/09/16 | 5306 | support/latexindent/LatexIndent/KeyEqualsValuesBraces.pm
2021/09/16 | 5286 | support/latexindent/documentation/subsubsec-headings.tex
-2021/09/16 | 52522 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
-2021/09/16 | 51750 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
-2021/09/16 | 51309 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
-2021/09/16 | 51202 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
-2021/09/16 | 51112 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
-2021/09/16 | 510587 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
-2021/09/16 | 50394 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
-2021/09/16 | 50151 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
2021/09/16 | 5011 | support/latexindent/LatexIndent/Check.pm
-2021/09/16 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
2021/09/16 | 4873 | support/latexindent/documentation/subsubsec-ifelsefi.tex
-2021/09/16 | 483653 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
-2021/09/16 | 48252 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
-2021/09/16 | 476919 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
-2021/09/16 | 46906 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
-2021/09/16 | 461813 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
-2021/09/16 | 45969 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
-2021/09/16 | 45905 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
-2021/09/16 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2021/09/16 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
-2021/09/16 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2021/09/16 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
-2021/09/16 | 45311 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
+2021/09/16 | 457730 | macros/latex/contrib/zref-check/zref-check.pdf
2021/09/16 | 4503 | support/latexindent/LatexIndent/BlankLines.pm
2021/09/16 | 4446 | support/latexindent/LatexIndent/Preamble.pm
2021/09/16 | 44096 | support/latexindent/documentation/logo.png
2021/09/16 | 4355 | support/latexindent/LatexIndent/RoundBrackets.pm
-2021/09/16 | 43426 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
-2021/09/16 | 43027 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
-2021/09/16 | 43003 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
-2021/09/16 | 42890 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
-2021/09/16 | 42711 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
2021/09/16 | 4270 | support/latexindent/LatexIndent/NamedGroupingBracesBrackets.pm
-2021/09/16 | 42385 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
-2021/09/16 | 41194 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
-2021/09/16 | 40229 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
2021/09/16 | 4016 | macros/luatex/generic/luamplib/test-luamplib-latex.tex
-2021/09/16 | 400148 | systems/texlive/tlnet/archive/texlive-scripts.doc.r60514.tar.xz
-2021/09/16 | 392793 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
-2021/09/16 | 39128 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
+2021/09/16 | 38 | macros/latex/contrib/zref-check/DEPENDS.txt
2021/09/16 | 3872 | macros/luatex/generic/luamplib/test-luamplib-plain.tex
2021/09/16 | 3860 | support/lualibs/lua-uca/README.md
2021/09/16 | 3850 | support/latexindent/documentation/subsubsec-special.tex
2021/09/16 | 3832 | systems/texlive/tlnet/archive/unicode-data.doc.r60516.tar.xz
-2021/09/16 | 38140 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
-2021/09/16 | 37805 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
-2021/09/16 | 37359 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
-2021/09/16 | 37242 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
-2021/09/16 | 36628 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
2021/09/16 | 3614 | support/latexindent/LatexIndent/Replacement.pm
-2021/09/16 | 35691 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
-2021/09/16 | 35087 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
-2021/09/16 | 34666 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
-2021/09/16 | 345739 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
2021/09/16 | 3450 | support/latexindent/documentation/subsubsec-environments-with-items.tex
2021/09/16 | 3378 | support/latexindent/LatexIndent/HorizontalWhiteSpace.pm
-2021/09/16 | 33633 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
-2021/09/16 | 33545 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
-2021/09/16 | 330787 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
2021/09/16 | 32808 | support/lualibs/lua-uca/lua-uca/lua-uca-languages.lua
2021/09/16 | 3273 | support/latexindent/LatexIndent/Tokens.pm
-2021/09/16 | 32673 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
-2021/09/16 | 325042 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
-2021/09/16 | 31619 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
2021/09/16 | 3158 | support/lualibs/lua-uca/HACKING.md
-2021/09/16 | 31537 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
-2021/09/16 | 31350 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
2021/09/16 | 312 | support/lualibs/lua-uca/CHANGELOG.md
-2021/09/16 | 31231 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
-2021/09/16 | 312107 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
-2021/09/16 | 30824 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
2021/09/16 | 305540 | systems/texlive/tlnet/archive/unicode-data.r60516.tar.xz
2021/09/16 | 3021 | support/latexindent/documentation/sec-the-m-switch.tex
-2021/09/16 | 30058 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
-2021/09/16 | 29841 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
-2021/09/16 | 295203 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
-2021/09/16 | 29037 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
2021/09/16 | 287597 | support/lualibs/lua-uca.zip
-2021/09/16 | 284581 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
-2021/09/16 | 284022 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
-2021/09/16 | 28390 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
-2021/09/16 | 28179 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
-2021/09/16 | 2796725 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
-2021/09/16 | 27727 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
+2021/09/16 | 2791 | macros/latex/contrib/zref-check/zref-check.ins
2021/09/16 | 2754 | support/latexindent/latexindent.pl
2021/09/16 | 2752 | macros/luatex/generic/luamplib/Makefile
-2021/09/16 | 27390 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
-2021/09/16 | 27357 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
-2021/09/16 | 27199 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
-2021/09/16 | 2672609 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
-2021/09/16 | 263959 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
-2021/09/16 | 258880 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
-2021/09/16 | 25629536 | systems/texlive/tlnet/install-tl.zip
-2021/09/16 | 25290 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
-2021/09/16 | 250263 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
-2021/09/16 | 25020 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
-2021/09/16 | 24995 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
+2021/09/16 | 2607 | macros/latex/contrib/zref-check/zref-check.tex
2021/09/16 | 246 | support/latexindent/documentation/references.tex
2021/09/16 | 24467 | support/latexindent/documentation/latexindent.tex
-2021/09/16 | 243426 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
-2021/09/16 | 241810 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
2021/09/16 | 2412 | support/latexindent/LatexIndent/Switches.pm
-2021/09/16 | 240477 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
-2021/09/16 | 240461 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
-2021/09/16 | 23902 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
2021/09/16 | 23589 | support/latexindent/LatexIndent/Verbatim.pm
2021/09/16 | 23584 | support/latexindent/LatexIndent/Arguments.pm
-2021/09/16 | 23365 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
-2021/09/16 | 2308392 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
2021/09/16 | 22888 | support/latexindent/LatexIndent/ModifyLineBreaks.pm
+2021/09/16 | 2273 | macros/latex/contrib/zref-check/zref-check-code.tex
2021/09/16 | 22507 | support/latexindent/documentation/sec-how-to-use.tex
2021/09/16 | 22107 | support/latexindent/documentation/subsec-one-sentence-per-line.tex
-2021/09/16 | 22048 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
2021/09/16 | 219853 | macros/latex/contrib/mindflow.zip
2021/09/16 | 2188 | support/latexindent/LatexIndent/Logger.pm
2021/09/16 | 21779 | support/latexindent/LatexIndent/Document.pm
2021/09/16 | 21650 | support/latexindent/documentation/sec-replacements.tex
-2021/09/16 | 215248 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
-2021/09/16 | 21224 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
2021/09/16 | 2120 | support/latexindent/documentation/sec-demonstration.tex
2021/09/16 | 2104448 | systems/texlive/tlnet/archive/kpfonts-otf.doc.r60515.tar.xz
-2021/09/16 | 20872882 | systems/texlive/tlnet/install-tl-windows.exe
-2021/09/16 | 208049 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
-2021/09/16 | 206605 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
2021/09/16 | 20565 | support/latexindent/LatexIndent/Indent.pm
-2021/09/16 | 202796 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
-2021/09/16 | 20137 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
-2021/09/16 | 2009905 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
-2021/09/16 | 199732 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
2021/09/16 | 1996 | macros/luatex/generic/luamplib/README
2021/09/16 | 19822 | support/latexindent/LatexIndent/Sentence.pm
2021/09/16 | 198183 | install/macros/luatex/generic/luamplib.tds.zip
-2021/09/16 | 198169 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
-2021/09/16 | 196872 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
-2021/09/16 | 196740 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
-2021/09/16 | 195636 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
-2021/09/16 | 194382 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
2021/09/16 | 1909 | support/latexindent/documentation/subsec-noAdditionalIndent-indentRules.tex
2021/09/16 | 1879 | support/latexindent/documentation/figure-schematic.tex
2021/09/16 | 18756 | support/latexindent/defaultSettings.yaml
@@ -238,75 +319,31 @@
2021/09/16 | 18435 | support/latexindent/documentation/subsec-text-wrap.tex
2021/09/16 | 183790 | macros/luatex/generic/luamplib.zip
2021/09/16 | 1834704 | support/lualibs/lua-uca/lua-uca/lua-uca-ducet.lua
-2021/09/16 | 18176 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
-2021/09/16 | 180121 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
-2021/09/16 | 180009 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
-2021/09/16 | 17980 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
-2021/09/16 | 178353 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
-2021/09/16 | 1713893 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
-2021/09/16 | 169241 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
2021/09/16 | 1688 | support/latexindent/documentation/sec-conclusions-know-limitations.tex
-2021/09/16 | 16883112 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
2021/09/16 | 1664 | support/latexindent/documentation/logo.tex
2021/09/16 | 16597 | support/latexindent/documentation/subsubsec-environments-and-their-arguments.tex
-2021/09/16 | 16412 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
-2021/09/16 | 16357 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
-2021/09/16 | 159578 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
2021/09/16 | 1581 | support/lualibs/lua-uca/lua-uca-doc.tex
2021/09/16 | 1558 | support/latexindent/latexindent-module-installer.pl
-2021/09/16 | 154805 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
-2021/09/16 | 154427 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
-2021/09/16 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
-2021/09/16 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
2021/09/16 | 151188 | macros/luatex/generic/luamplib/luamplib.pdf
2021/09/16 | 1483 | support/latexindent/LatexIndent/DoubleBackSlash.pm
2021/09/16 | 1477 | support/latexindent/documentation/title.tex
-2021/09/16 | 147372 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
-2021/09/16 | 1464201 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
-2021/09/16 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
-2021/09/16 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
2021/09/16 | 1441 | support/latexindent/documentation/subsec-text-wrap-summary.tex
-2021/09/16 | 14348 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
-2021/09/16 | 1421868 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
2021/09/16 | 14050 | support/latexindent/documentation/subsec-commands-and-their-options.tex
-2021/09/16 | 136821 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
-2021/09/16 | 136812 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
+2021/09/16 | 1382 | macros/latex/contrib/zref-check/CHANGELOG.md
2021/09/16 | 13605 | support/latexindent/documentation/appendices.tex
-2021/09/16 | 1357114 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
-2021/09/16 | 1356285 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
2021/09/16 | 13548 | support/latexindent/LatexIndent/Special.pm
-2021/09/16 | 13465 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
-2021/09/16 | 1340930 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
-2021/09/16 | 133862 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
-2021/09/16 | 1301191 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
-2021/09/16 | 1291299 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
2021/09/16 | 12881 | support/latexindent/LatexIndent/FileContents.pm
2021/09/16 | 12661 | support/latexindent/LatexIndent/Braces.pm
-2021/09/16 | 1261068 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
-2021/09/16 | 1259727 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
-2021/09/16 | 124281 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
2021/09/16 | 12302 | support/latexindent/LatexIndent/HiddenChildren.pm
2021/09/16 | 12024 | support/latexindent/documentation/sec-fine-tuning.tex
-2021/09/16 | 119818 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
2021/09/16 | 11976 | support/latexindent/documentation/subsec-remove-para-line-breaks.tex
-2021/09/16 | 1169717 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
-2021/09/16 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini
-2021/09/16 | 115349 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
-2021/09/16 | 112982 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
-2021/09/16 | 112087 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
-2021/09/16 | 109031 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
2021/09/16 | 10859 | support/latexindent/documentation/sec-indent-config-and-settings.tex
-2021/09/16 | 108300 | systems/texlive/tlnet/archive/texlive-scripts.r60514.tar.xz
2021/09/16 | 1082224 | systems/texlive/tlnet/archive/kpfonts-otf.r60515.tar.xz
2021/09/16 | 10802 | support/latexindent/LatexIndent/Heading.pm
-2021/09/16 | 1077989 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
2021/09/16 | 1054 | support/lualibs/lua-uca/LICENSE
-2021/09/16 | 105221 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
2021/09/16 | 10407 | support/lualibs/lua-uca/lua-uca/lua-uca-collator.lua
2021/09/16 | 10347 | support/latexindent/LatexIndent/Command.pm
-2021/09/16 | 103400 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
-2021/09/16 | 103203 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
-2021/09/16 | 100624 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
+2021/09/16 | 1002 | macros/latex/contrib/zref-check/README.md
2021/09/16 | 1001116 | support/latexindent/documentation/latexindent.pdf
2021/09/15 | 95663 | macros/generic/unicode-data/GraphemeBreakProperty.txt
2021/09/15 | 9264 | macros/generic/unicode-data/README.md
@@ -315,7 +352,6 @@
2021/09/15 | 84688 | macros/generic/unicode-data/CaseFolding.txt
2021/09/15 | 7139 | macros/generic/unicode-data/load-unicode-xetex-classes.tex
2021/09/15 | 7054 | macros/generic/unicode-data/load-unicode-data.tex
-2021/09/15 | 6879 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2021/09/15 | 6784012 | systems/texlive/tlnet/archive/pst-mirror.doc.r60506.tar.xz
2021/09/15 | 6701 | fonts/kpfonts-otf/README.md
2021/09/15 | 66440 | fonts/kpfonts-otf/fonts/KpMono-Italic.otf
@@ -496,7 +532,6 @@
2021/09/13 | 72858 | systems/win32/miktex/tm/packages/pstricks.tar.lzma
2021/09/13 | 6993 | systems/win32/miktex/tm/packages/uwa-letterhead__source.tar.lzma
2021/09/13 | 6709 | systems/win32/miktex/tm/packages/mindflow__source.tar.lzma
-2021/09/13 | 6368 | systems/texlive/tlnet/archive/mindflow.source.r60485.tar.xz
2021/09/13 | 6246 | systems/win32/miktex/tm/packages/bithesis.tar.lzma
2021/09/13 | 61517 | systems/win32/miktex/tm/packages/siunitx.tar.lzma
2021/09/13 | 608772 | support/TeX4ht/source/tex4ht-html4.tex
@@ -551,7 +586,6 @@
2021/09/13 | 2781 | systems/win32/miktex/tm/packages/crumbs__source.tar.lzma
2021/09/13 | 2717 | macros/latex/contrib/clicks/clicks.tex
2021/09/13 | 266763 | systems/win32/miktex/tm/packages/ejpecp__doc.tar.lzma
-2021/09/13 | 2664 | systems/texlive/tlnet/archive/mindflow.r60485.tar.xz
2021/09/13 | 26607576 | systems/texlive/tlnet/archive/noto.r60482.tar.xz
2021/09/13 | 26433751 | systems/win32/miktex/tm/packages/noto.tar.lzma
2021/09/13 | 261728 | systems/win32/miktex/tm/packages/huawei.tar.lzma
@@ -570,7 +604,6 @@
2021/09/13 | 2176954 | systems/win32/miktex/tm/packages/newpx.tar.lzma
2021/09/13 | 2160 | macros/latex/contrib/clicks/clicks.sty
2021/09/13 | 214595 | systems/win32/miktex/tm/packages/mindflow__doc.tar.lzma
-2021/09/13 | 213208 | systems/texlive/tlnet/archive/mindflow.doc.r60485.tar.xz
2021/09/13 | 2114 | macros/latex/contrib/huawei/samples/huawei-cfp.tex
2021/09/13 | 2108 | macros/latex/contrib/huawei/samples/huawei-charter.tex
2021/09/13 | 2056168 | systems/win32/miktex/tm/packages/xcharter.tar.lzma
@@ -765,14 +798,10 @@
2021/09/11 | 949 | graphics/pstricks/contrib/pst-dart/README.md
2021/09/11 | 872 | systems/texlive/tlcontrib/packages.txt
2021/09/11 | 824 | systems/texlive/tlcontrib/archive/collection-contrib.r344.tar.xz
-2021/09/11 | 823 | macros/unicodetex/latex/njuthesis/README.md
-2021/09/11 | 817068 | macros/unicodetex/latex/njuthesis/figure/njuname-large.jpg
2021/09/11 | 78680 | systems/texlive/tlnet/archive/pstricks.r60466.tar.xz
2021/09/11 | 7757792 | systems/texlive/tlnet/archive/pstricks-add.doc.r60465.tar.xz
2021/09/11 | 7526580 | systems/texlive/tlnet/archive/pstricks.doc.r60466.tar.xz
-2021/09/11 | 7505 | macros/unicodetex/latex/njuthesis/profile/font.sty
2021/09/11 | 73577 | macros/latex/contrib/biblatex-contrib/biblatex-gb7714-2015/README.md
-2021/09/11 | 7287 | macros/unicodetex/latex/njuthesis/profile/cover.sty
2021/09/11 | 6416 | systems/texlive/tlnet/archive/uwa-letterhead.source.r60468.tar.xz
2021/09/11 | 6412 | graphics/pstricks/contrib/pst-calendar/doc/pst-calendar-doc.tex
2021/09/11 | 574764 | systems/texlive/tlnet/archive/pst-circ.doc.r60464.tar.xz
@@ -783,22 +812,13 @@
2021/09/11 | 4539 | graphics/pstricks/contrib/pst-dart/tex/pst-dart.tex
2021/09/11 | 4276 | graphics/pstricks/contrib/pst-dart/doc/pst-dart-doc.tex
2021/09/11 | 421175 | graphics/pstricks/contrib/pst-dart/doc/pst-dart-doc.pdf
-2021/09/11 | 4185 | macros/unicodetex/latex/njuthesis/profile/components.sty
-2021/09/11 | 4083 | macros/unicodetex/latex/njuthesis/profile/abstract.sty
2021/09/11 | 354988 | graphics/pstricks/contrib/pst-dart.zip
2021/09/11 | 3300 | systems/texlive/tlnet/archive/uwa-letterhead.r60468.tar.xz
-2021/09/11 | 3047 | macros/unicodetex/latex/njuthesis/njuthesis.cls
-2021/09/11 | 2953 | macros/unicodetex/latex/njuthesis/profile/packages.sty
2021/09/11 | 289 | graphics/pstricks/contrib/pst-dart/Changes
2021/09/11 | 24900 | systems/texlive/tlnet/archive/pst-circ.r60464.tar.xz
-2021/09/11 | 21738 | macros/unicodetex/latex/njuthesis/figure/njulogo.pdf
-2021/09/11 | 2143 | macros/unicodetex/latex/njuthesis/profile/reference.sty
2021/09/11 | 21260 | systems/texlive/tlnet/archive/pstricks-add.r60465.tar.xz
2021/09/11 | 192822 | macros/latex/contrib/biblatex-contrib/biblatex-gb7714-2015/biblatex-gb7714-2015.tex
-2021/09/11 | 19105 | macros/unicodetex/latex/njuthesis/LICENSE
2021/09/11 | 19057 | graphics/pstricks/contrib/pst-calendar/latex/pst-calendar.sty
-2021/09/11 | 1833 | macros/unicodetex/latex/njuthesis/profile/page.sty
-2021/09/11 | 1802308 | macros/unicodetex/latex/njuthesis.zip
2021/09/11 | 1751563 | macros/latex/contrib/biblatex-contrib/biblatex-gb7714-2015.zip
2021/09/11 | 174 | graphics/pstricks/contrib/pst-calendar/Changes
2021/09/11 | 166512 | macros/latex/contrib/biblatex-contrib/biblatex-gb7714-2015/gb7714-2015.bbx
@@ -807,41 +827,9 @@
2021/09/11 | 1637976 | systems/texlive/tlnet/archive/csvsimple.doc.r60470.tar.xz
2021/09/11 | 15733 | macros/latex/contrib/biblatex-contrib/biblatex-gb7714-2015/gb7714-2015.cbx
2021/09/11 | 15473 | macros/latex/contrib/biblatex-contrib/biblatex-gb7714-2015/gb7714-2015mx.cbx
-2021/09/11 | 1468177 | macros/unicodetex/latex/njuthesis/njuthesis.pdf
2021/09/11 | 146752 | graphics/pstricks/contrib/pst-calendar.zip
2021/09/11 | 14319 | macros/latex/contrib/biblatex-contrib/biblatex-gb7714-2015/gb7714-2015ay.cbx
2021/09/11 | 142568 | graphics/pstricks/contrib/pst-calendar/doc/pst-calendar-doc.pdf
2021/09/11 | 138702 | macros/latex/contrib/biblatex-contrib/biblatex-gb7714-2015/gb7714-2015mx.bbx
-2021/09/11 | 12747 | macros/unicodetex/latex/njuthesis/figure/njuname.pdf
2021/09/11 | 118237 | macros/latex/contrib/biblatex-contrib/biblatex-gb7714-2015/gb7714-2015ms.bbx
2021/09/11 | 11244 | systems/texlive/tlnet/archive/csvsimple.r60470.tar.xz
-2021/09/10 | 88049 | graphics/pstricks/contrib/pstricks-add/tex/pstricks-add.tex
-2021/09/10 | 8679 | graphics/pstricks/base/doc/pst-news21.tex
-2021/09/10 | 802 | graphics/pstricks/contrib/pst-circ/dvips/pst-circ.pro
-2021/09/10 | 8019179 | graphics/pstricks/base.zip
-2021/09/10 | 64473 | macros/unicodetex/latex/uwa-letterhead.zip
-2021/09/10 | 639 | graphics/pstricks/contrib/pstricks-add/latex/pstricks-add.sty
-2021/09/10 | 610626 | graphics/pstricks/contrib/pst-circ.zip
-2021/09/10 | 58265 | macros/unicodetex/latex/uwa-letterhead/uwa-letterhead.pdf
-2021/09/10 | 568373 | graphics/pstricks/contrib/pst-circ/doc/pst-circ-doc.pdf
-2021/09/10 | 5069 | graphics/pstricks/contrib/pstricks-add/dvips/pstricks-add.pro
-2021/09/10 | 4746 | graphics/pstricks/contrib/pst-circ/Changes
-2021/09/10 | 468 | graphics/pstricks/contrib/pst-circ/latex/pst-circ.sty
-2021/09/10 | 4630 | graphics/pstricks/base/generic/pstricks-color.tex
-2021/09/10 | 4255 | graphics/pstricks/base/Changes
-2021/09/10 | 37089 | graphics/pstricks/base/dvips/pstricks.pro
-2021/09/10 | 330084 | support/TeX4ht/source/tex4ht-ooffice.tex
-2021/09/10 | 26440 | macros/unicodetex/latex/uwa-letterhead/uwa-letterhead.dtx
-2021/09/10 | 25082 | graphics/pstricks/base/History
-2021/09/10 | 224270 | graphics/pstricks/contrib/pst-circ/tex/pst-circ.tex
-2021/09/10 | 2183 | macros/unicodetex/latex/uwa-letterhead/uwa-letterhead.ins
-2021/09/10 | 193899 | graphics/pstricks/contrib/pstricks-add/doc/pstricks-add-doc.tex
-2021/09/10 | 16985 | graphics/pstricks/contrib/pstricks-add/Changes
-2021/09/10 | 1328 | graphics/pstricks/contrib/pst-circ/README
-2021/09/10 | 130909 | graphics/pstricks/base/generic/pstricks.tex
-2021/09/10 | 129583 | graphics/pstricks/base/doc/pst-news21.pdf
-2021/09/10 | 12909993 | graphics/pstricks/contrib/pstricks-add/doc/pstricks-add-doc.pdf
-2021/09/10 | 126672 | graphics/pstricks/contrib/pst-circ/doc/pst-circ-doc.tex
-2021/09/10 | 11484795 | graphics/pstricks/contrib/pstricks-add.zip
-2021/09/10 | 1115 | macros/unicodetex/latex/uwa-letterhead/example.tex
-2021/09/10 | 1041 | macros/unicodetex/latex/uwa-letterhead/README
diff --git a/graphics/pstricks/contrib/luapstricks/README.md b/graphics/pstricks/contrib/luapstricks/README.md
new file mode 100644
index 0000000000..d7c3278983
--- /dev/null
+++ b/graphics/pstricks/contrib/luapstricks/README.md
@@ -0,0 +1,59 @@
+# `luapstricks` -- A PSTricks backend for LuaTeX
+Support PSTricks directly in LuaTeX, without requiring external processes, special environments or similar.
+
+Since recent PSTricks versions load `luapstricks` automatically when LuaLaTeX is used, this does not require changes to the document.
+Some advanced features require the `pdfmanagement-testphase` package to be loaded and activated.
+
+## Usage
+ 1. Make sure that you have the latest pstricks version installed.
+ 2. Run `l3build install` *or* copy `luapstricks.lua` from this repository into the directory of your TeX files or another directory in your TeX search path.
+ 3. Compile your document with `lualatex`.
+ 4. Given the current state of development of this project, the previous stage probably failed. Write a bug report to the author. Otherwise go to step 7.
+ 5. Wait for a fix.
+ 6. Go back to step 2 and try again.
+ 7. It worked? That's great. Feel free to inform the author anyway and share the awesome images you created.
+
+## Issues and feature requests
+Should you find a bug or want to request a feature, please report it using the [issue tracker](https://github.com/zauguin/luapstricks/issues).
+
+## License
+This code is licensed under the LaTeX Project Public License 1.3.
+
+## Acknowledgments
+This project would never have reached a usable state without all the testing and suggestions by Pablo Gonz├бlez Luengo.
+Also many thanks to Herbert Vo├Я for adapting PSTricks and related packages to work with luapstricks.
+
+## Demos
+Documentation of PSTricks packages, created by `lualatex` and `luapstricks.lua`:
+
+- [pst-user](https://hvoss.org/PSTexa/pst-user.pdf) Main (historical) documentation without overlay stuff (is now in pst-ovl)
+- [pstricks-add](https://hvoss.org/PSTexa/pstricks-add-doc.pdf)
+
+
+- [pst-3d](https://hvoss.org/PSTexa/pst-3d-doc.pdf)
+- [pst-3dplot](https://hvoss.org/PSTexa/pst-3dplot-doc.pdf)
+- [pst-am](https://hvoss.org/PSTexa/pst-am-doc.pdf)
+- [pst-antiprism](https://hvoss.org/PSTexa/pst-antiprism-doc.pdf)
+- [pst-barcode](https://hvoss.org/PSTexa/pst-barcode-doc.pdf)
+- [pst-bezier](https://hvoss.org/PSTexa/pst-bezier-doc.pdf)
+- [pst-cie](https://hvoss.org/PSTexa/pst-cie-doc.pdf)
+- [pst-circ](https://hvoss.org/PSTexa/pst-circ-doc.pdf)
+- [pst-coil](https://hvoss.org/PSTexa/pst-coil-doc.pdf)
+- [pst-dart](https://hvoss.org/PSTexa/pst-dart-doc.pdf)
+- [pst-eucl](https://hvoss.org/PSTexa/pst-eucl-doc.pdf)
+- [pst-func](https://hvoss.org/PSTexa/pst-func-doc.pdf)
+- [pst-knot](https://hvoss.org/PSTexa/pst-knot-doc.pdf)
+- [pst-node](https://hvoss.org/PSTexa/pst-node-doc.pdf)
+- [pst-ovl](https://hvoss.org/PSTexa/pst-ovl-doc.pdf)
+- [pst-platon](https://hvoss.org/PSTexa/pst-platon-doc.pdf)
+- [pst-plot](https://hvoss.org/PSTexa/pst-plot-doc.pdf)
+- [pst-poly](https://hvoss.org/PSTexa/pst-poly-doc.pdf)
+- [pst-solarsystem](https://hvoss.org/PSTexa/pst-solarsystem-doc.pdf)
+- [pst-soroban](https://hvoss.org/PSTexa/pst-soroban-doc.pdf)
+- [pst-spinner](https://hvoss.org/PSTexa/pst-spinner-doc.pdf)
+- [pst-stru](https://hvoss.org/PSTexa/pst-stru-doc.pdf)
+- [pst-tools](https://hvoss.org/PSTexa/pst-tools-doc.pdf)
+- [pst-tree](https://hvoss.org/PSTexa/pst-tree-doc.pdf)
+- [pst-turtle](https://hvoss.org/PSTexa/pst-turtle-doc.pdf)
+- [pst-vehicle](https://hvoss.org/PSTexa/pst-vehicle-doc.pdf)
+- [pst-venn](https://hvoss.org/PSTexa/pst-venn-doc.pdf)
diff --git a/graphics/pstricks/contrib/luapstricks/luapstricks.lua b/graphics/pstricks/contrib/luapstricks/luapstricks.lua
new file mode 100644
index 0000000000..eebca86801
--- /dev/null
+++ b/graphics/pstricks/contrib/luapstricks/luapstricks.lua
@@ -0,0 +1,3946 @@
+---- luapstricks.lua
+-- Copyright 2021 Marcel Kr├╝ger <tex@2krueger.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 has the LPPL maintenance status `maintained'.
+--
+-- The Current Maintainer of this work is M. Kr├╝ger
+--
+-- This work consists of the file luapstricks.lua.
+
+if luatexbase then
+ luatexbase.provides_module {
+ name = 'luapstricks',
+ version = 'v0.1',
+ date = '2021-09-16',
+ description = 'PSTricks backend for LuaLaTeX',
+ }
+end
+
+local pdfprint = vf.pdf -- Set later to have the right mode
+local function gobble() end
+
+local pi = math.pi
+local two_pi = 2*pi
+local pi2_inv = 2/pi
+local pi3_inv = 3/pi
+
+local sin_table = {0, 1, 0, -1}
+
+local l = lpeg
+
+local whitespace = (l.S'\0\t\n\r\f ' + '%' * (1-l.P'\n')^0 * (l.P'\n' + -1))^1
+
+local regular = 1 - l.S'\0\t\n\r\f %()<>[]{}/'
+
+local exitmarker = {}
+local lookup
+
+-- local integer = l.S'+-'^-1 * l.R'09'^1 / tonumber
+local real = l.S'+-'^-1 * (l.R'09'^1 * ('.' * l.R'09'^0)^-1 + '.' * l.R'09'^1) * (l.S'Ee' * l.S'+-'^-1 * l.R'09'^1)^-1 / tonumber
+local radix_scanner = setmetatable({}, {__index = function(t, b)
+ local digit
+ if b < 10 then
+ digit = l.R('0' .. string.char(string.byte'0' + b - 1))
+ else
+ digit = l.R'09'
+ if b > 10 then
+ digit = digit + l.R('A' .. string.char(string.byte'A' + b - 11))
+ digit = digit + l.R('a' .. string.char(string.byte'a' + b - 11))
+ end
+ end
+ digit = l.C(digit^1) * l.Cp()
+ t[b] = digit
+ return digit
+end})
+local radix = l.Cmt(l.R'09' * l.R'09'^-1 / tonumber * '#', function(subj, pos, radix)
+ if radix < 2 or radix > 36 then return end
+ local digits, pos = radix_scanner[radix]:match(subj, pos)
+ if not digits then return end
+ digits = tonumber(digits, radix)
+ return pos, digits
+end)
+local number = radix + real -- + integer -- Every integer is also a real
+
+local str_view do
+ local meta = {
+ __index = function(s, k)
+ if k == 'value' then
+ return string.sub(s.base.value, s.offset, s.last)
+ end
+ end,
+ __newindex = function(s, k, v)
+ if k == 'value' then
+ s.base.value = string.sub(s.base.value, 1, s.offset-1) .. v .. string.sub(s.base.value, s.last+1)
+ return
+ end
+ -- We could do rawset here, but there is no reason for setting keys anyway
+ assert(false)
+ end,
+ }
+ function str_view(base, offset, length)
+ if getmetatable(base) == meta then
+ offset = offset + base.offset - 1
+ base = base.base
+ end
+ return setmetatable({
+ kind = 'string',
+ base = base,
+ offset = offset,
+ last = offset + length - 1,
+ }, meta)
+ end
+end
+
+local string_patt do
+ local literal = '(' * l.Cs(l.P{(
+ l.Cg('\\' * (
+ 'n' * l.Cc'\n'
+ + 'r' * l.Cc'\r'
+ + 't' * l.Cc'\t'
+ + 'b' * l.Cc'\b'
+ + 'f' * l.Cc'\f'
+ + '\\' * l.Cc'\\'
+ + '(' * l.Cc'('
+ + ')' * l.Cc')'
+ + l.R'07' * l.R'07'^-2 / function(s) return string.char(tonumber(s, 8) % 0x100) end
+ + ('\r' * l.P'\n'^-1 + '\n')^-1 * l.Cc''
+ ))
+ + l.Cg('\r' * l.P'\n'^-1 * l.Cc'\n')
+ + (1-l.S'()')
+ + '(' * l.V(1) * ')'
+ )^0}) * ')'
+ local hexchar = l.R('09', 'af', 'AF')
+ local hexbyte = hexchar * hexchar^-1 / function(s)
+ local b = tonumber(s, 16)
+ return #s == 1 and 16*b or b
+ end
+ local hex = '<' * (hexbyte^0 / string.char) * '>'
+ string_patt = literal + hex -- TODO: Base85 is not implemented
+end
+
+local name = l.C(regular^1 + l.S'[]' + '<<' + '>>')
+local literal_name = '/' * l.C(regular^0)
+local imm_name = '//' * l.C(regular^0)
+
+-- All objects are literal by default, except names represented as direct strings and operators
+local any_object = l.P{whitespace^-1 * (
+ number * -regular
+ + l.Ct(l.Cg(string_patt, 'value') * l.Cg(l.Cc'string', 'kind'))
+ + imm_name / function(name) return lookup(name) end
+ + l.Ct(l.Cg(literal_name, 'value') * l.Cg(l.Cc'name', 'kind'))
+ + name
+ + l.Ct(l.Cg(l.Ct(l.Cg('{' * l.Ct(l.V(1)^0) * whitespace^-1 * '}', 'value') * l.Cg(l.Cc'array', 'kind')), 'value') * l.Cg(l.Cc'executable', 'kind'))
+)}
+local object_list = l.Ct(any_object^0) * whitespace^-1 * (-1 + l.Cp())
+
+local function parse_ps(s)
+ local tokens, fail_offset = object_list:match(s)
+ if fail_offset then
+ error(string.format('Failed to parse PS tokens at `%s\'', s:sub(fail_offset)))
+ end
+ return tokens
+end
+
+local serialize_pdf do
+ function serialize_pdf(obj)
+ local t = type(obj)
+ if t == 'number' then
+ return string.format(math.type(obj) == 'float' and '%.5f' or '%i', obj)
+ elseif t == 'boolean' then
+ return obj and 'true' or 'false'
+ elseif t == 'string' then
+ return '/' .. obj
+ elseif t == 'table' then
+ t = obj.kind
+ if t == 'name' then
+ return '/' .. obj.value
+ elseif t == 'string' then
+ return '(' .. obj.value .. ')' -- TODO: Escaping
+ elseif t == 'dict' then
+ local helper = {}
+ for k, v in next, obj.value do
+ helper[#helper+1] = serialize_pdf(k)
+ helper[#helper+1] = serialize_pdf(v)
+ end
+ return '<<' .. table.concat(helper, ' ') .. '>>'
+ elseif t == 'array' then
+ local helper = {}
+ for i, v in ipairs(obj.value) do
+ helper[i] = serialize_pdf(v)
+ end
+ return '[' .. table.concat(helper, ' ') .. ']'
+ else
+ error'Unable to serialize object'
+ end
+ end
+ error'Unable to serialize object'
+ end
+end
+
+local srand, rrand, rand do
+ local state
+ function srand(s)
+ state = s//1
+ if state < 1 then
+ state = -(state % 0x7ffffffe) + 1
+ elseif state > 0x7ffffffe then
+ state = 0x7ffffffe
+ end
+ end
+ function rrand()
+ return state
+ end
+ function rand()
+ state = (16807 * state) % 0x7fffffff
+ -- if state <= 0 then
+ -- state = state + 0x7fffffff
+ -- end
+ return state
+ end
+ srand(math.random(1, 0x7ffffffe))
+end
+
+local maybe_decompress do
+ local compressed_pattern = '%!PS\n\z
+ currentfile<</Predictor 1' * l.R'05' * '/Columns ' * (l.R'09'^1/tonumber) * '>>/FlateDecode filter cvx exec\n'
+ * l.C(l.P(1)^1)
+
+ local stacklimit = 999000
+
+ function maybe_decompress(data)
+ local columns, compressed = compressed_pattern:match(data)
+ if not columns then return data end
+
+ data = zlib.decompress(compressed)
+ local bytes do
+ local size = #data
+ if size < stacklimit then
+ bytes = {data:byte(1, -1)}
+ else
+ bytes = {}
+ local off = 1
+ for i = 1, size, stacklimit do
+ table.move({data:byte(i, i+stacklimit-1)}, 1, stacklimit, i, bytes)
+ end
+ end
+ end
+ local new_data = {}
+ local start_row = 1
+ local out_row = 1
+ while true do
+ local control = bytes[start_row]
+ if not control then break end
+ if control == 0 or (control == 2 and start_row == 1) then
+ table.move(bytes, start_row + 1, start_row + columns, out_row, new_data)
+ elseif control == 1 then
+ local last = bytes[start_row + 1]
+ new_data[out_row] = last
+ for i = 2, columns do
+ last = (bytes[start_row + i] + last) & 0xFF
+ new_data[out_row + i - 1] = last
+ end
+ elseif control == 2 then
+ for i = 1, columns do
+ new_data[out_row + i - 1] = (bytes[start_row + i] + new_data[out_row - columns - 1 + i]) & 0xFF
+ end
+ else
+ error'Unimplemented'
+ end
+ start_row = start_row + columns + 1
+ out_row = out_row + columns
+ end
+ local result = ''
+ local size = #new_data
+ for i = 1, size, stacklimit do
+ result = result .. string.char(table.unpack(new_data, i, i + stacklimit > size and size or i + stacklimit - 1))
+ end
+ return result
+ end
+end
+
+local font_aliases = {
+ -- First add some help to find the TeX Gyre names under the corresponding URW font names
+ ['NimbusRoman-Regular'] = 'kpse:texgyretermes-regular.otf',
+ ['NimbusRoman-Italic'] = 'kpse:texgyretermes-italic.otf',
+ ['NimbusRoman-Bold'] = 'kpse:texgyretermes-bold.otf',
+ ['NimbusRoman-BoldItalic'] = 'kpse:texgyretermes-bolditalic.otf',
+
+ ['NimbusSans-Regular'] = 'kpse:texgyreheros-regular.otf',
+ ['NimbusSans-Italic'] = 'kpse:texgyreheros-italic.otf',
+ ['NimbusSans-Bold'] = 'kpse:texgyreheros-bold.otf',
+ ['NimbusSans-BoldItalic'] = 'kpse:texgyreheros-bolditalic.otf',
+
+ ['NimbusSansNarrow-Regular'] = 'kpse:texgyreheroscn-regular.otf',
+ ['NimbusSansNarrow-Oblique'] = 'kpse:texgyreheroscn-italic.otf',
+ ['NimbusSansNarrow-Bold'] = 'kpse:texgyreheroscn-bold.otf',
+ ['NimbusSansNarrow-BoldOblique'] = 'kpse:texgyreheroscn-bolditalic.otf',
+
+ ['NimbusMonoPS-Regular'] = 'kpse:texgyrecursor-regular.otf',
+ ['NimbusMonoPS-Italic'] = 'kpse:texgyrecursor-italic.otf',
+ ['NimbusMonoPS-Bold'] = 'kpse:texgyrecursor-bold.otf',
+ ['NimbusMonoPS-BoldItalic'] = 'kpse:texgyrecursor-bolditalic.otf',
+
+ ['URWBookman-Light'] = 'kpse:texgyrebonum-regular.otf',
+ ['URWBookman-LightItalic'] = 'kpse:texgyrebonum-italic.otf',
+ ['URWBookman-Demi'] = 'kpse:texgyrebonum-bold.otf',
+ ['URWBookman-DemiItalic'] = 'kpse:texgyrebonum-bolditalic.otf',
+
+ ['URWGothic-Book'] = 'kpse:texgyreadventor-regular.otf',
+ ['URWGothic-BookOblique'] = 'kpse:texgyreadventor-italic.otf',
+ ['URWGothic-Demi'] = 'kpse:texgyreadventor-bold.otf',
+ ['URWGothic-DemiOblique'] = 'kpse:texgyreadventor-bolditalic.otf',
+
+ -- These fonts have weird names in their URW variant, so we use the standard font names directly instead.
+ ['NewCenturySchlbk-Roman'] = 'kpse:texgyreschola-regular.otf',
+ ['NewCenturySchlbk-Italic'] = 'kpse:texgyreschola-italic.otf',
+ ['NewCenturySchlbk-Bold'] = 'kpse:texgyreschola-bold.otf',
+ ['NewCenturySchlbk-BoldItalic'] = 'kpse:texgyreschola-bolditalic.otf',
+
+ ['Palatino-Roman'] = 'kpse:texgyrepagella-regular.otf',
+ ['Palatino-Italic'] = 'kpse:texgyrepagella-italic.otf',
+ ['Palatino-Bold'] = 'kpse:texgyrepagella-bold.otf',
+ ['Palatino-BoldItalic'] = 'kpse:texgyrepagella-bolditalic.otf',
+
+ ['ZapfChancery-MediumItalic'] = 'kpse:texgyrechorus-mediumitalic.otf',
+
+ -- The two symbol fonts don't have OpenType equivalents in TeX Live
+ -- so we use TFM based fonts instead
+ ['StandardSymbolsPS'] = 'usyr',
+ ['Dingbats'] = 'uzdr',
+}
+-- Then map the standard 35 font names to the URW names as done by GhostScript
+-- (Except for New Century Schoolbook which got mapped directly before.
+for psname, remapped in next, {
+ ['Times-Roman'] = 'NimbusRoman-Regular',
+ ['Times-Italic'] = 'NimbusRoman-Italic',
+ ['Times-Bold'] = 'NimbusRoman-Bold',
+ ['Times-BoldItalic'] = 'NimbusRoman-BoldItalic',
+
+ ['Helvetica'] = 'NimbusSans-Regular',
+ ['Helvetica-Oblique'] = 'NimbusSans-Italic',
+ ['Helvetica-Bold'] = 'NimbusSans-Bold',
+ ['Helvetica-BoldOblique'] = 'NimbusSans-BoldItalic',
+
+ ['Helvetica-Narrow'] = 'NimbusSansNarrow-Regular',
+ ['Helvetica-Narrow-Oblique'] = 'NimbusSansNarrow-Oblique',
+ ['Helvetica-Narrow-Bold'] = 'NimbusSansNarrow-Bold',
+ ['Helvetica-Narrow-BoldOblique'] = 'NimbusSansNarrow-BoldOblique',
+
+ ['Courier'] = 'NimbusMonoPS-Regular',
+ ['Courier-Oblique'] = 'NimbusMonoPS-Italic',
+ ['Courier-Bold'] = 'NimbusMonoPS-Bold',
+ ['Courier-BoldOblique'] = 'NimbusMonoPS-BoldItalic',
+
+ ['Bookman-Light'] = 'URWBookman-Light',
+ ['Bookman-LightItalic'] = 'URWBookman-LightItalic',
+ ['Bookman-Demi'] = 'URWBookman-Demi',
+ ['Bookman-DemiItalic'] = 'URWBookman-DemiItalic',
+
+ ['AvantGarde-Book'] = 'URWGothic-Book',
+ ['AvantGarde-BookOblique'] = 'URWGothic-BookOblique',
+ ['AvantGarde-Demi'] = 'URWGothic-Demi',
+ ['AvantGarde-DemiOblique'] = 'URWGothic-DemiOblique',
+
+ ['Symbol'] = 'StandardSymbolsPS',
+ ['StandardSymL'] = 'StandardSymbolsPS',
+
+ ['ZapfDingbats'] = 'Dingbats',
+
+ -- Some additional names needed for PSTricks
+ ['NimbusRomNo9L-Regu'] = 'NimbusRoman-Regular',
+ ['NimbusRomNo9L-ReguItal'] = 'NimbusRoman-Italic',
+ ['NimbusRomNo9L-Medi'] = 'NimbusRoman-Bold',
+ ['NimbusRomNo9L-MediItal'] = 'NimbusRoman-BoldItalic',
+ ['NimbusRomNo9L-Bold'] = 'NimbusRoman-Bold',
+
+ ['NimbusSanL-Regu'] = 'NimbusSans-Regular',
+ ['NimbusSanL-ReguItal'] = 'NimbusSans-Italic',
+ ['NimbusSanL-Bold'] = 'NimbusSans-Bold',
+ ['NimbusSanL-BoldItal'] = 'NimbusSans-BoldItalic',
+
+ ['NimbusSanL-BoldCond'] = 'NimbusSansNarrow-Bold',
+ ['NimbusSanL-BoldCondItal'] = 'NimbusSansNarrow-BoldOblique',
+ ['NimbusSanL-ReguCond'] = 'NimbusSansNarrow-Regular',
+ ['NimbusSanL-ReguCondItal'] = 'NimbusSansNarrow-Oblique',
+
+ ['NimbusMonL-Regu'] = 'NimbusMonoPS-Regular',
+ ['NimbusMonL-ReguObli'] = 'NimbusMonoPS-Italic',
+ ['NimbusMonL-Bold'] = 'NimbusMonoPS-Bold',
+ ['NimbusMonL-BoldObli'] = 'NimbusMonoPS-BoldItalic',
+
+ ['URWBookmanL-DemiBoldItal'] = 'URWBookman-DemiItalic',
+ ['URWBookmanL-DemiBold'] = 'URWBookman-Demi',
+ ['URWBookmanL-LighItal'] = 'URWBookman-LightItalic',
+ ['URWBookmanL-Ligh'] = 'URWBookman-Light',
+
+ ['URWGothicL-BookObli'] = 'URWGothic-BookOblique',
+ ['URWGothicL-Book'] = 'URWGothic-Book',
+ ['URWGothicL-DemiObli'] = 'URWGothic-DemiOblique',
+ ['URWGothicL-Demi'] = 'URWGothic-Demi',
+
+ ['CenturySchL-Roma'] = 'NewCenturySchlbk-Roman',
+ ['CenturySchL-Ital'] = 'NewCenturySchlbk-Italic',
+ ['CenturySchL-Bold'] = 'NewCenturySchlbk-Bold',
+ ['CenturySchL-BoldItal'] = 'NewCenturySchlbk-BoldItalic',
+
+ ['URWPalladioL-Roma'] = 'Palatino-Roman',
+ ['URWPalladioL-Ital'] = 'Palatino-Italic',
+ ['URWPalladioL-Bold'] = 'Palatino-Bold',
+ ['URWPalladioL-BoldItal'] = 'Palatino-BoldItalic',
+
+ ['URWChanceryL-MediItal'] = 'ZapfChancery-MediumItalic',
+} do
+ font_aliases[psname] = font_aliases[remapped] or remapped
+end
+
+local operand_stack = {}
+
+local pushs do
+ local function helper(height, args, arg, ...)
+ if args == 0 then return end
+ height = height + 1
+ operand_stack[height] = arg
+ return helper(height, args - 1, ...)
+ end
+ function pushs(...)
+ return helper(#operand_stack, select('#', ...), ...)
+ end
+end
+local function push(value)
+ operand_stack[#operand_stack+1] = value
+end
+
+local function ps_error(kind, ...)
+ pushs(...)
+ return error{pserror = kind, trace = debug.traceback()}
+end
+
+local function pop(...)
+ local height = #operand_stack
+ if height == 0 then
+ return ps_error('stackunderflow', ...)
+ end
+ local v = operand_stack[height]
+ operand_stack[height] = nil
+ return v, v
+end
+local function pop_num(...)
+ local raw = pop(...)
+ local n = raw
+ local tn = type(n)
+ if tn == 'table' and n.kind == 'executable' then
+ n = n.value
+ tn = type(n)
+ end
+ if tn ~= 'number' then
+ ps_error('typecheck', raw, ...)
+ end
+ return n, raw
+end
+local pop_int = pop_num
+local function pop_proc(...)
+ local v = pop()
+ if type(v) ~= 'table' or v.kind ~= 'executable' or type(v.value) ~= 'table' or v.value.kind ~= 'array' then
+ ps_error('typecheck', v, ...)
+ end
+ return v.value.value, v
+end
+local pop_bool = pop
+local function pop_dict()
+ local orig = pop()
+ local dict = orig
+ if type(dict) ~= 'table' then
+ ps_error('typecheck', orig)
+ end
+ if dict.kind == 'executable' then
+ dict = dict.value
+ if type(dict) ~= 'table' then
+ ps_error('typecheck', orig)
+ end
+ end
+ if dict.kind ~= 'dict' then
+ ps_error('typecheck', orig)
+ end
+ return dict.value, orig, dict
+end
+local function pop_array()
+ local orig = pop()
+ local arr = orig
+ if type(arr) == 'table' and arr.kind == 'executable' then
+ arr = arr.value
+ end
+ if type(arr) ~= 'table' or arr.kind ~= 'array' then
+ ps_error('typecheck', orig)
+ end
+ return arr
+end
+local pop_string = pop
+local function pop_key()
+ local key = pop()
+ if type(key) == 'table' then
+ local kind = key.kind
+ if kind == 'executable' then
+ key = key.value
+ if type(key) ~= 'table' then return key end
+ kind = key.kind
+ end
+ if kind == 'string' or kind == 'name' or kind == 'operator' then
+ key = key.value
+ end
+ end
+ return key
+end
+
+local execute_ps, execute_tok
+
+local dictionary_stack
+local graphics_stack = {{
+ matrix = {10, 0, 0, 10, 0, 0}, -- Chosen for consistency with GhostScript's pdfwrite. Must be the same as defaultmatrix
+ linewidth = nil,
+ current_path = nil,
+ current_point = nil,
+ color = {},
+ fillconstantalpha = 1,
+ strokeconstantalpha = 1,
+ alphaisshape = nil,
+ blendmode = nil,
+ linejoin = nil,
+ linecap = nil,
+ strokeadjust = nil,
+ font = nil,
+ dash = nil,
+ saved_delayed = nil, -- nil if the `gsave` of this graphic state is not delayed
+ flatness = 1,
+ miterlimit = nil,
+}}
+
+local lua_node_lookup = setmetatable({}, {__mode = 'k'})
+local char_width_storage -- Non nil only at the beginning of a Type 3 glyph. Used to export the width.
+local ExtGStateCount = 0
+local pdfdict_gput = token.create'pdfdict_gput:nnn'
+if pdfdict_gput.cmdname == 'undefined_cs' then
+ pdfdict_gput = nil
+end
+local lbrace = token.create(string.byte'{')
+local rbrace = token.create(string.byte'}')
+local ExtGState = setmetatable({}, {__index = pdfdict_gput and function(t, k)
+ ExtGStateCount = ExtGStateCount + 1
+ local name = 'PSExtG' .. ExtGStateCount
+ tex.runtoks(function()
+ tex.write(pdfdict_gput, lbrace, 'g__pdf_Core/Page/Resources/ExtGState', rbrace, lbrace, name, rbrace, lbrace, k, rbrace)
+ end)
+ ltx.__pdf.Page.Resources.ExtGState = true
+ ltx.pdf.Page_Resources_gpush(tex.count.g_shipout_readonly_int)
+ name = '/' .. name .. ' gs'
+ t[k] = name
+ return name
+end or function()
+ texio.write_nl"Extended graphic state modifications dropped since `pdfmanagement-testphase' is not loaded."
+ return ''
+end})
+
+local write_shading do
+ local ShadingCount = 0
+ if pdfdict_gput then
+ function write_shading(attr, data)
+ local obj = pdf.obj{
+ type = 'stream',
+ immediate = false,
+ attr = attr,
+ string = data,
+ }
+ pdf.refobj(obj)
+ ShadingCount = ShadingCount + 1
+ local name = 'PSShad' .. ShadingCount
+ local k = obj .. ' 0 R'
+ tex.runtoks(function()
+ tex.write(pdfdict_gput, lbrace, 'g__pdf_Core/Page/Resources/Shading', rbrace, lbrace, name, rbrace, lbrace, k, rbrace)
+ end)
+ ltx.__pdf.Page.Resources.Shading = true
+ ltx.pdf.Page_Resources_gpush(tex.count.g_shipout_readonly_int)
+ name = '/' .. name
+ return name
+ end
+ else
+ function write_shading()
+ texio.write_nl"Extended graphic state modifications dropped since `pdfmanagement-testphase' is not loaded."
+ return ''
+ end
+ end
+end
+
+local function matrix_transform(x, y, xx, xy, yx, yy, dx, dy)
+ return x * xx + y * yx + dx, x * xy + y * yy + dy
+end
+local function matrix_invert(xx, xy, yx, yy, dx, dy)
+ local determinante = xx*yy - xy*yx
+ xx, xy, yx, yy = yy/determinante, -xy/determinante, -yx/determinante, xx/determinante
+ dx, dy = - dx * xx - dy * yx, - dx * xy - dy * yy
+ return xx, xy, yx, yy, dx, dy
+end
+local delayed = {
+ text = {},
+ matrix = {1, 0, 0, 1, 0, 0},
+}
+local function update_matrix(xx, xy, yx, yy, dx, dy)
+ local matrix = graphics_stack[#graphics_stack].matrix
+ matrix[1], matrix[2],
+ matrix[3], matrix[4],
+ matrix[5], matrix[6]
+ = xx * matrix[1] + xy * matrix[3], xx * matrix[2] + xy * matrix[4],
+ yx * matrix[1] + yy * matrix[3], yx * matrix[2] + yy * matrix[4],
+ dx * matrix[1] + dy * matrix[3] + matrix[5], dx * matrix[2] + dy * matrix[4] + matrix[6]
+
+ local delayed_matrix = delayed.matrix
+ delayed_matrix[1], delayed_matrix[2],
+ delayed_matrix[3], delayed_matrix[4],
+ delayed_matrix[5], delayed_matrix[6]
+ = xx * delayed_matrix[1] + xy * delayed_matrix[3], xx * delayed_matrix[2] + xy * delayed_matrix[4],
+ yx * delayed_matrix[1] + yy * delayed_matrix[3], yx * delayed_matrix[2] + yy * delayed_matrix[4],
+ dx * delayed_matrix[1] + dy * delayed_matrix[3] + delayed_matrix[5], dx * delayed_matrix[2] + dy * delayed_matrix[4] + delayed_matrix[6]
+
+ local current_path = graphics_stack[#graphics_stack].current_path
+ if not current_path then return end
+
+ local determinante = xx*yy - xy*yx
+ xx, xy, yx, yy, dx, dy = matrix_invert(xx, xy, yx, yy, dx, dy)
+ local i=1
+ while current_path[i] do
+ local entry = current_path[i]
+ if type(entry) == 'number' then
+ local after = current_path[i+1]
+ assert(type(after) == 'number')
+ current_path[i], current_path[i+1] = xx * entry + yx * after + dx, xy * entry + yy * after + dy
+ i = i+2
+ else
+ i = i+1
+ end
+ end
+ local current_point = graphics_stack[#graphics_stack].current_point
+ local x, y = current_point[1], current_point[2]
+ current_point[1], current_point[2] = xx * x + yx * y + dx, xy * x + yy * y + dy
+end
+
+local function delayed_print(str)
+ local delayed_text = delayed.text
+ delayed_text[#delayed_text + 1] = str
+end
+
+local function reset_delayed(delayed)
+ local delayed_matrix = delayed.matrix
+ local delayed_text = delayed.text
+ for i=1, #delayed_text do
+ delayed_text[i] = nil
+ end
+ delayed_matrix[1], delayed_matrix[2],
+ delayed_matrix[3], delayed_matrix[4],
+ delayed_matrix[5], delayed_matrix[6] = 1, 0, 0, 1, 0, 0
+end
+
+local function flush_delayed_table(delayed, state, force_start)
+ local delayed_matrix = delayed.matrix
+ local delayed_text = delayed.text
+
+ local cm_string = string.format('%.5f %.5f %.5f %.5f %.5f %.5f cm', delayed_matrix[1], delayed_matrix[2],
+ delayed_matrix[3], delayed_matrix[4],
+ delayed_matrix[5], delayed_matrix[6])
+ if cm_string == "1.00000 0.00000 0.00000 1.00000 0.00000 0.00000 cm" then
+ cm_string = nil
+ end
+
+ -- Before flushing, make sure that the current graphics state has started.
+ graphics_stack_height = graphics_stack_height or #graphics_stack
+ local saved_delayed = state.saved_delayed
+ if saved_delayed and(cm_string or delayed_text[1] or force_start) then
+ state.saved_delayed = nil
+ pdfprint'q'
+ end
+ for i=1, #delayed_text do
+ pdfprint(delayed_text[i])
+ end
+ if cm_string then
+ pdfprint((cm_string:gsub('%.?0+ ', ' ')))
+ end
+ return reset_delayed(delayed)
+end
+
+local function flush_delayed(force_start)
+ local pre_first_delayed_group
+ for i = #graphics_stack, 1, -1 do
+ if not graphics_stack[i].saved_delayed then
+ pre_first_delayed_group = i
+ break
+ end
+ end
+ for i = pre_first_delayed_group, #graphics_stack-1 do
+ flush_delayed_table(graphics_stack[i+1].saved_delayed, graphics_stack[i]) -- No need for force_start here
+ end
+ return flush_delayed_table(delayed, graphics_stack[#graphics_stack], force_start)
+end
+
+function drawarc(xc, yc, r, a1, a2)
+ a1, a2 = math.rad(a1), math.rad(a2)
+ local dx, dy = r*math.cos(a1), r*math.sin(a1)
+ local x, y = xc + dx, yc + dy
+ local segments = math.ceil(math.abs(a2-a1)*pi2_inv)
+ local da = (a2-a1)/segments
+ local state = graphics_stack[#graphics_stack]
+ local current_path = state.current_path
+ local i
+ if current_path then
+ i = #current_path + 1
+ current_path[i], current_path[i+1], current_path[i+2] = x, y, 'l'
+ i = i + 3
+ else
+ current_path = {x, y, 'm'}
+ i = 4
+ state.current_path = current_path
+ state.current_point = {}
+ end
+ local factor = 4*math.tan(da/4)/3
+ dx, dy = factor*dy, -factor*dx
+ for _=1, segments do
+ current_path[i], current_path[i+1] = x - dx, y - dy
+ a1 = a1 + da
+ dx, dy = r*math.cos(a1), r*math.sin(a1)
+ x, y = xc + dx, yc + dy
+ dx, dy = factor*dy, -factor*dx
+ current_path[i+2], current_path[i+3] = x + dx, y + dy
+ current_path[i+4], current_path[i+5] = x, y
+ current_path[i+6] = 'c'
+ i = i + 7
+ end
+ state.current_point[1], state.current_point[2] = x, y
+end
+
+local function try_lookup(name)
+ for i = #dictionary_stack, 1, -1 do
+ local dict = dictionary_stack[i]
+ local value = dict.value[name]
+ if value ~= nil then
+ return value
+ end
+ end
+end
+function lookup(name)
+ local result = try_lookup(name)
+ if result == nil then
+ return error(string.format('Unknown name %q', name))
+ end
+ return result
+end
+local function bind(proc)
+ for i=1, #proc do
+ local entry = proc[i]
+ local tentry = type(entry)
+ if tentry == 'table' and entry.kind == 'executable' and type(entry.value) == 'table' and entry.value.kind == 'array' then
+ bind(entry.value.value)
+ elseif tentry == 'string' then
+ local res = try_lookup(entry)
+ if type(res) == 'function' then
+ proc[i] = res
+ end
+ end
+ end
+end
+
+local subdivide, flatten do
+ function subdivide(t, x0, y0, x1, y1, x2, y2, x3, y3)
+ local mt = 1-t
+ local x01, y01 = mt * x0 + t * x1, mt * y0 + t * y1
+ local x12, y12 = mt * x1 + t * x2, mt * y1 + t * y2
+ local x23, y23 = mt * x2 + t * x3, mt * y2 + t * y3
+ local x012, y012 = mt * x01 + t * x12, mt * y01 + t * y12
+ local x123, y123 = mt * x12 + t * x23, mt * y12 + t * y23
+ local x0123, y0123 = mt * x012 + t * x123, mt * y012 + t * y123
+ return x01, y01, x012, y012, x0123, y0123, x123, y123, x23, y23, x3, y3
+ end
+ local function flatness(x0, y0, x1, y1, x2, y2, x3, y3)
+ local dx, dy = x3-x0, y3-y0
+ local dist = math.sqrt(dx*dx + dy*dy)
+ local d1 = math.abs(dx * (x0-x1) - dy * (y0-y1)) / dist
+ local d2 = math.abs(dx * (x0-x2) - dy * (y0-y2)) / dist
+ return d1 > d2 and d1 or d2
+ end
+ function flatten(out, target, x0, y0, x1, y1, x2, y2, x3, y3)
+ local current = flatness(x0, y0, x1, y1, x2, y2, x3, y3)
+ if current <= target then
+ local i = #out
+ -- out[i+1], out[i+2],
+ -- out[i+3], out[i+4],
+ -- out[i+5], out[i+6], out[i+7]
+ -- = x1, y1, x2, y2, x3, y3, 'c'
+ out[i+1], out[i+2], out[i+3]
+ = x3, y3, 'l'
+ return
+ end
+ local a, b, c, d, e, f, g, h, i, j, k, l = subdivide(.5, x0, y0, x1, y1, x2, y2, x3, y3)
+ flatten(out, target, x0, y0, a, b, c, d, e, f)
+ return flatten(out, target, e, f, g, h, i, j, k, l)
+ end
+end
+
+local function ps_to_string(a)
+ local ta = type(a)
+ if ta == 'table' and a.kind == 'executable' then
+ a = a.value
+ ta = type(a)
+ end
+ if ta == 'string' then
+ elseif ta == 'boolean' then
+ a = a and 'true' or 'false'
+ elseif ta == 'number' then
+ a = string.format(math.type(a) == 'float' and '%.6g' or '%i', a)
+ -- a = tostring(a)
+ elseif ta == 'function' then
+ texio.write_nl'Warning: cvs on operators is unsupported. Replaced by dummy.'
+ a = '--nostringval--'
+ elseif ta == 'table' then
+ local kind = a.kind
+ if kind == 'string' or kind == 'name' then
+ a = a.value
+ elseif kind == 'operator' then
+ texio.write_nl'Warning: cvs on operators is unsupported. Replaced by dummy.'
+ a = '--nostringval--'
+ else
+ a = '--nostringval--'
+ end
+ elseif ta == 'userdata' and a.read then
+ a = 'file'
+ else
+ assert(false)
+ end
+ return a
+end
+
+local mark = {kind = 'mark'}
+local null = {kind = 'null'}
+local globaldict = {kind = 'dict', value = {}}
+local userdict = {kind = 'dict', value = {
+ SDict = {kind = 'dict', value = {
+ normalscale = {kind = 'executable', value = {kind = 'array', value = {}}},
+ }},
+ ['@beginspecial'] = {kind = 'executable', value = {kind = 'array', value = {}}},
+ ['@setspecial'] = {kind = 'executable', value = {kind = 'array', value = {}}},
+ ['@endspecial'] = {kind = 'executable', value = {kind = 'array', value = {}}},
+}}
+local FontDirectory = {kind = 'dict', value = {}}
+local ResourceCategories = {kind = 'dict', value = {}}
+
+local function num_to_base(num, base, ...)
+ if num == 0 then return string.char(...) end
+ local remaining = num // base
+ local digit = num - base * remaining
+ if digit < 10 then
+ digit = digit + 0x30
+ else
+ digit = digit + 0x37
+ end
+ return num_to_base(remaining, base, digit, ...)
+end
+
+local systemdict
+local function generic_show(str, ax, ay)
+ local state = graphics_stack[#graphics_stack]
+ local current_point = state.current_point
+ if not current_point then return nil, 'nocurrentpoint' end
+ local rawpsfont = state.font
+ if not rawpsfont then return nil, 'invalidfont' end
+ local str = str.value
+ local psfont = rawpsfont.value
+ local fid = psfont.FID
+ local matrix = psfont.FontMatrix.value
+ local fonttype = psfont.FontType
+ if fonttype ~= 0x1CA and fonttype ~= 3 then
+ texio.write_nl'Font support is not implemented'
+ return true
+ end
+ local x0, y0 = current_point[1], current_point[2]
+ update_matrix(
+ matrix[1], matrix[2],
+ matrix[3], matrix[4],
+ matrix[5] + x0, matrix[6] + y0)
+ local w = 0
+ if fonttype == 0x1CA then
+ local characters = assert(font.getfont(fid)).characters
+ flush_delayed()
+ if pdfprint ~= gobble then
+ vf.push()
+ vf.fontid(fid)
+ end
+ for b in string.bytes(str) do
+ if pdfprint ~= gobble then
+ vf.char(b)
+ if ax then
+ vf.right(ax)
+ vf.down(-ay)
+ end
+ end
+ local char = characters[b]
+ w = w + (char and char.width or 0)
+ end
+ if pdfprint ~= gobble then
+ vf.pop()
+ end
+ w = w/65781.76
+ elseif fonttype == 3 then
+ for b in string.bytes(str) do
+ systemdict.value.gsave()
+ local state = graphics_stack[#graphics_stack]
+ state.current_point, state.current_path = nil
+ push(rawpsfont)
+ push(b)
+ local this_w
+ char_width_storage = function(width)
+ this_w = width
+ end
+ execute_tok(psfont.BuildChar) -- FIXME(maybe): Switch to BuildGlyph?
+ systemdict.value.grestore()
+ w = w + assert(this_w, 'Type 3 character failed to set width')
+ update_matrix(1, 0, 0, 1, this_w, 0)
+ if ax then
+ update_matrix(1, 0, 0, 1, ax, ay)
+ end
+ end
+ update_matrix(1, 0, 0, 1, -w, 0)
+ if ax then
+ local count = #str
+ update_matrix(1, 0, 0, 1, count * -ax, count * -ay)
+ end
+ else
+ assert(false)
+ end
+ if ax then
+ local count = #str
+ push(w + count * ax)
+ push(count * ay)
+ else
+ push(w)
+ push(0)
+ end
+ systemdict.value.rmoveto()
+ update_matrix(matrix_invert(
+ matrix[1], matrix[2],
+ matrix[3], matrix[4],
+ matrix[5] + x0, matrix[6] + y0))
+ return true
+end
+
+systemdict = {kind = 'dict', value = {
+ dup = function()
+ local v = pop()
+ push(v)
+ push(v)
+ end,
+ exch = function()
+ local b = pop()
+ local a = pop(b)
+ push(b)
+ push(a)
+ end,
+ pop = function()
+ pop()
+ end,
+ clear = function()
+ for i = 1, #operand_stack do
+ operand_stack[i] = nil
+ end
+ end,
+ copy = function()
+ local arg, orig = pop()
+ local exec
+ if type(arg) == 'table' and arg.kind == 'executable' then
+ exec = true
+ arg = arg.value
+ end
+ if type(arg) == 'number' then
+ local height = #operand_stack
+ if arg > height then
+ error'copy argument larger then stack'
+ end
+ table.move(operand_stack, height-arg+1, height, height+1)
+ elseif type(arg) == 'table' then
+ -- See remarks in getinterval about missing functionality
+ local kind = arg.kind
+ if kind == 'array' then
+ local src = pop_array().value
+ if #src ~= #arg.value then
+ error'copy with different sized arrays is not implemented yet'
+ end
+ table.move(src, 1, #src, 1, arg.value)
+ elseif kind == 'string' then
+ local src = pop_string().value
+ if #src == #arg.value then
+ elseif #src < #arg.value then
+ arg = str_view(arg, 1, #src)
+ else
+ ps_error'rangecheck'
+ end
+ arg.value = src
+ elseif kind == 'dict' then
+ local src = pop_dict()
+ if next(arg.value) then
+ error'Target dictionary must be empty'
+ end
+ for k, v in next, src do
+ arg.value[k] = v
+ end
+ else
+ ps_error'typecheck'
+ end
+ push(exec and {kind = 'executable', value = arg} or arg)
+ else
+ ps_error('typecheck', orig)
+ end
+ end,
+ roll = function()
+ local j, arg2 = pop_int()
+ local n, arg1 = pop_int(arg2)
+ if n < 0 then
+ ps_error('rangecheck', arg1, arg2)
+ end
+ if n == 0 or j == 0 then return end
+ local height = #operand_stack
+ if j < 0 then
+ j = (-j) % n
+ local temp = table.move(operand_stack, height-n+1, height-n+j, 1, {})
+ table.move(operand_stack, height-n+j+1, height, height-n+1)
+ table.move(temp, 1, j, height-j+1, operand_stack)
+ else
+ j = j % n
+ local temp = table.move(operand_stack, height-j+1, height, 1, {})
+ table.move(operand_stack, height-n+1, height-j, height-n+j+1)
+ table.move(temp, 1, j, height-n+1, operand_stack)
+ end
+ end,
+ index = function()
+ local i, arg1 = pop_int()
+ local height = #operand_stack
+ if i < 0 or height <= i then
+ ps_error('rangecheck', arg1)
+ end
+ push(operand_stack[height - i])
+ end,
+ null = function()
+ push(null)
+ end,
+ mark = function()
+ push(mark)
+ end,
+ ['['] = function()
+ push(mark)
+ end,
+ [']'] = function()
+ systemdict.value.counttomark()
+ systemdict.value.array()
+ systemdict.value.astore()
+ systemdict.value.exch()
+ systemdict.value.pop()
+ end,
+ ['<<'] = function()
+ push(mark)
+ end,
+ ['>>'] = function()
+ local mark_pos
+ for i = #operand_stack, 1, -1 do
+ if operand_stack[i] == mark then
+ mark_pos = i
+ break
+ end
+ end
+ if not mark_pos then error'Unmatched mark' end
+ local dict = lua.newtable(0, (#operand_stack-mark_pos) // 2)
+ for i = mark_pos + 1, #operand_stack - 1, 2 do
+ push(operand_stack[i])
+ local key = pop_key()
+ dict[key] = operand_stack[i+1]
+ end
+ for i = mark_pos, #operand_stack do
+ operand_stack[i] = nil
+ end
+ push{kind = 'dict', value = dict}
+ end,
+ count = function()
+ push(#operand_stack)
+ end,
+ counttomark = function()
+ local height = #operand_stack
+ for i=height, 1, -1 do
+ local entry = operand_stack[i]
+ if type(entry) == 'table' and entry.kind == 'mark' then
+ return push(height-i)
+ end
+ end
+ error'Unmatched mark'
+ end,
+ cleartomark = function()
+ local entry
+ repeat
+ entry = pop()
+ until (not entry) or type(entry) == 'table' and entry.kind == 'mark'
+ if not entry then error'Unmatched mark' end
+ end,
+
+ ['if'] = function()
+ local proc, arg2 = pop_proc()
+ local cond = pop_bool(arg2)
+ if cond then
+ execute_ps(proc)
+ end
+ end,
+ ifelse = function()
+ local proc_else, arg3 = pop_proc()
+ local proc_then, arg2 = pop_proc(arg3)
+ local cond = pop_bool(arg2, arg3)
+ if cond then
+ execute_ps(proc_then)
+ else
+ execute_ps(proc_else)
+ end
+ end,
+ ['for'] = function()
+ local proc, arg4 = pop_proc()
+ local limit, arg3 = pop_num(arg4)
+ local step, arg2 = pop_num(arg3, arg4)
+ local initial = pop_num(arg2, arg3, arg4)
+ local success, err = pcall(function()
+ for i=initial, limit, step do
+ push(i)
+ execute_ps(proc)
+ end
+ end)
+ if not success and err ~= exitmarker then
+ error(err, 0)
+ end
+ end,
+ forall = function()
+ local proc, arg2 = pop_proc()
+ local obj, arg1 = pop()
+ if type(obj) ~= 'table' then
+ ps_error('typecheck', arg1, arg2)
+ end
+ if obj.kind == 'executable' then
+ obj = obj.value
+ if type(obj) ~= 'table' then
+ ps_error('typecheck', arg1, arg2)
+ end
+ end
+ local success, err = pcall(
+ obj.kind == 'array' and function()
+ for i=1, #obj.value do
+ push(obj.value[i])
+ execute_ps(proc)
+ end
+ end
+ or obj.kind == 'string' and function()
+ for b in string.bytes(obj.value) do
+ push(b)
+ execute_ps(proc)
+ end
+ end
+ or obj.kind == 'dict' and function()
+ for k, v in next, obj.value do
+ pushs(k, v)
+ execute_ps(proc)
+ end
+ end
+ or ps_error('typecheck', arg1, arg2))
+ if not success and err ~= exitmarker then
+ error(err, 0)
+ end
+ end,
+ ['repeat'] = function()
+ local proc, arg2 = pop_proc()
+ local count = pop_int(arg2)
+ local success, err = pcall(function()
+ for i=1, count do
+ execute_ps(proc)
+ end
+ end)
+ if not success and err ~= exitmarker then
+ error(err, 0)
+ end
+ end,
+ loop = function()
+ local proc = pop_proc()
+ local success, err = pcall(function()
+ while true do
+ execute_ps(proc)
+ end
+ end)
+ if not success and err ~= exitmarker then
+ error(err, 0)
+ end
+ end,
+
+ pathforall = function()
+ local close = pop_proc()
+ local curve = pop_proc()
+ local line = pop_proc()
+ local move = pop_proc()
+ local state = graphics_stack[#graphics_stack]
+ local path = state.current_path
+ if not path then return end
+ path = table.move(path, 1, #path, 1, {}) -- We don't want to be affected by modifications
+ local success, err = pcall( function()
+ local i = 1
+ while true do
+ local entry = path[i]
+ if type(entry) == 'string' then
+ execute_ps(entry == 'm' and move or entry == 'l' and line or entry == 'c' and curve or entry == 'h' and close or error'Unexpected path operator')
+ elseif entry then
+ push(entry)
+ else
+ break
+ end
+ i = i + 1
+ end
+ end)
+ if not success and err ~= exitmarker then
+ error(err, 0)
+ end
+ end,
+
+ ['.texboxforall'] = function()
+ local proc, arg2 = pop_proc()
+ local boxop = pop()
+ local box = lua_node_lookup[boxop]
+ if not box then
+ -- push(boxop)
+ -- -- push(proc)
+ ps_error('typecheck', boxop, arg2)
+ end
+ if node.direct.getid(box.box) ~= node.id'hlist' then
+ -- push(boxop)
+ -- push(proc)
+ error'.texboxforall is currently only supported for hboxes'
+ end
+
+ local head = node.direct.getlist(box.box)
+ head = node.direct.flatten_discretionaries(head)
+ node.direct.setlist(box.box, head)
+ local success, err = pcall(function()
+ local x, y = 0, 0
+ local n = head
+ while n do
+ local after = node.direct.getnext(n)
+ local width = node.direct.rangedimensions(box.box, n, after)/65781.76
+ push(mark)
+ local id = node.type(node.direct.getid(n))
+ local subbox = {box = n, parent = box} -- parent is needed for lifetime reasons
+ local function op()
+ flush_delayed()
+ vf.push()
+ local n = subbox.box -- Same as the outer box, but this preserves the lifetime of subbox
+ local parent = subbox.parent.box
+ local after = node.direct.getnext(n)
+ local head = node.direct.getlist(parent)
+ node.direct.setnext(n, nil)
+ node.direct.setlist(parent, subbox.box)
+ vf.node(parent)
+ node.direct.setnext(n, after)
+ node.direct.setlist(parent, head)
+ vf.pop()
+ end
+ lua_node_lookup[subbox] = op
+ push(op)
+ push(x)
+ push(y)
+ push(width)
+ push(0)
+ push(id)
+ execute_ps(proc)
+ if width ~= 0 then
+ x = x + width
+ end
+ n = after
+ end
+ end)
+ if not success and err ~= exitmarker then
+ error(err, 0)
+ end
+ end,
+ pathbbox = function()
+ local current_path = assert(graphics_stack[#graphics_stack].current_path, 'nocurrentpoint')
+ local i=1
+ local llx, lly, urx, ury
+ while current_path[i] do
+ local entry = current_path[i]
+ if type(entry) == 'number' then
+ local after = current_path[i+1]
+ assert(type(after) == 'number')
+ llx = llx and llx < entry and llx or entry
+ lly = lly and lly < after and lly or after
+ urx = urx and urx > entry and urx or entry
+ ury = ury and ury > after and ury or after
+ i = i+2
+ else
+ i = i+1
+ end
+ end
+ push(llx)
+ push(lly)
+ push(urx)
+ push(ury)
+ end,
+
+ ['not'] = function()
+ local val, orig = pop()
+ local tval = type(val)
+ if tval == 'table' and val.kind == 'executable' then
+ val = val.value
+ local tval = type(val)
+ end
+ if tval == 'boolean' then
+ push(not val)
+ elseif tval == 'number' then
+ push(~val)
+ else
+ ps_error('typecheck', orig)
+ end
+ end,
+ ['and'] = function()
+ local val, orig = pop()
+ local tval = type(val)
+ if tval == 'table' and val.kind == 'executable' then
+ val = val.value
+ local tval = type(val)
+ end
+ if tval == 'boolean' then
+ push(pop_bool() and val)
+ elseif tval == 'number' then
+ push(val & pop_int())
+ else
+ ps_error('typecheck', orig)
+ end
+ end,
+ ['or'] = function()
+ local val, orig = pop()
+ local tval = type(val)
+ if tval == 'table' and val.kind == 'executable' then
+ val = val.value
+ local tval = type(val)
+ end
+ if tval == 'boolean' then
+ push(pop_bool() or val)
+ elseif tval == 'number' then
+ push(val | pop_int())
+ else
+ ps_error('typecheck', orig)
+ end
+ end,
+ ['xor'] = function()
+ local val, orig = pop()
+ local tval = type(val)
+ if tval == 'table' and val.kind == 'executable' then
+ val = val.value
+ local tval = type(val)
+ end
+ if tval == 'boolean' then
+ push(val ~= pop_bool())
+ elseif tval == 'number' then
+ push(val ~ pop_int())
+ else
+ ps_error('typecheck', orig)
+ end
+ end,
+ bitshift = function()
+ local shift, arg2 = pop_num()
+ local val = pop_num(arg2)
+ push(val << shift)
+ end,
+
+ eq = function()
+ local b = pop()
+ local a = pop(b)
+ if type(a) == 'table' and (a.kind == 'executable' or a.kind == 'name' or a.kind == 'operator') then
+ a = a.value
+ end
+ if type(a) == 'table' and a.kind == 'string' then
+ a = a.value
+ end
+ if type(b) == 'table' and (b.kind == 'executable' or b.kind == 'name' or b.kind == 'operator') then
+ b = b.value
+ end
+ if type(b) == 'table' and b.kind == 'string' then
+ b = b.value
+ end
+ push(a==b)
+ end,
+ ne = function()
+ local b = pop()
+ local a = pop(b)
+ if type(a) == 'table' and (a.kind == 'executable' or a.kind == 'name' or a.kind == 'operator') then
+ a = a.value
+ end
+ if type(a) == 'table' and a.kind == 'string' then
+ a = a.value
+ end
+ if type(b) == 'table' and (b.kind == 'executable' or b.kind == 'name' or b.kind == 'operator') then
+ b = b.value
+ end
+ if type(b) == 'table' and b.kind == 'string' then
+ b = b.value
+ end
+ push(a~=b)
+ end,
+ gt = function()
+ local b, arg2 = pop()
+ local a, arg1 = pop(arg2)
+ local ta, tb = type(a), type(b)
+ if ta == 'table' and a.kind == 'executable' then
+ a = a.value ta = type(a)
+ end
+ if tb == 'table' and b.kind == 'executable' then
+ b = b.value tb = type(b)
+ end
+ if ta == 'number' then
+ if tb ~= 'number' then
+ ps_error('typecheck', arg1, arg2)
+ end
+ elseif ta == 'table' and ta.kind == 'string' then
+ if tb ~= 'table' or tb.kind ~= 'string' then
+ ps_error('typecheck', arg1, arg2)
+ end
+ a, b = a.value, b.value
+ else
+ ps_error('typecheck', arg1, arg2)
+ end
+ push(a>b)
+ end,
+ ge = function()
+ local b, arg2 = pop()
+ local a, arg1 = pop(arg2)
+ local ta, tb = type(a), type(b)
+ if ta == 'table' and a.kind == 'executable' then
+ a = a.value ta = type(a)
+ end
+ if tb == 'table' and b.kind == 'executable' then
+ b = b.value tb = type(b)
+ end
+ if ta == 'number' then
+ if tb ~= 'number' then
+ ps_error('typecheck', arg1, arg2)
+ end
+ elseif ta == 'table' and ta.kind == 'string' then
+ if tb ~= 'table' or tb.kind ~= 'string' then
+ ps_error('typecheck', arg1, arg2)
+ end
+ a, b = a.value, b.value
+ else
+ ps_error('typecheck', arg1, arg2)
+ end
+ push(a>=b)
+ end,
+ le = function()
+ local b, arg2 = pop()
+ local a, arg1 = pop(arg2)
+ local ta, tb = type(a), type(b)
+ if ta == 'table' and a.kind == 'executable' then
+ a = a.value ta = type(a)
+ end
+ if tb == 'table' and b.kind == 'executable' then
+ b = b.value tb = type(b)
+ end
+ if ta == 'number' then
+ if tb ~= 'number' then
+ ps_error('typecheck', arg1, arg2)
+ end
+ elseif ta == 'table' and ta.kind == 'string' then
+ if tb ~= 'table' or tb.kind ~= 'string' then
+ ps_error('typecheck', arg1, arg2)
+ end
+ a, b = a.value, b.value
+ else
+ ps_error('typecheck', arg1, arg2)
+ end
+ push(a<=b)
+ end,
+ lt = function()
+ local b, arg2 = pop()
+ local a, arg1 = pop(arg2)
+ local ta, tb = type(a), type(b)
+ if ta == 'table' and a.kind == 'executable' then
+ a = a.value ta = type(a)
+ end
+ if tb == 'table' and b.kind == 'executable' then
+ b = b.value tb = type(b)
+ end
+ if ta == 'number' then
+ if tb ~= 'number' then
+ ps_error('typecheck', arg1, arg2)
+ end
+ elseif ta == 'table' and a.kind == 'string' then
+ if tb ~= 'table' or b.kind ~= 'string' then
+ ps_error('typecheck', arg1, arg2)
+ end
+ a, b = a.value, b.value
+ else
+ ps_error('typecheck', arg1, arg2)
+ end
+ push(a<b)
+ end,
+
+ add = function()
+ local b, arg2 = pop_num()
+ local a = pop_num(arg2)
+ push(a+b)
+ end,
+ sub = function()
+ local b, arg2 = pop_num()
+ local a = pop_num(arg2)
+ push(a-b)
+ end,
+ mul = function()
+ local b, arg2 = pop_num()
+ local a = pop_num(arg2)
+ push(a*b)
+ end,
+ div = function()
+ local b, arg2 = pop_num()
+ local a = pop_num(arg2)
+ push(a/b)
+ end,
+ idiv = function()
+ local b, arg2 = pop_num()
+ local a = pop_num(arg2)
+ push(a//b)
+ end,
+ mod = function()
+ local b, arg2 = pop_num()
+ local a = pop_num(arg2)
+ push(a%b)
+ end,
+ exp = function()
+ local b, arg2 = pop_num()
+ local a = pop_num(arg2)
+ push(a^b)
+ end,
+ sqrt = function()
+ push(math.sqrt(pop_num()))
+ end,
+ sin = function()
+ local x = pop_num()
+ local i, f = math.modf(x/90)
+ if f == 0 then
+ push(sin_table[i % 4 + 1])
+ else
+ push(math.sin(math.rad(x)))
+ end
+ end,
+ cos = function()
+ local x = pop_num()
+ local i, f = math.modf(x/90)
+ if f == 0 then
+ push(sin_table[(i+1) % 4 + 1])
+ else
+ push(math.cos(math.rad(x)))
+ end
+ end,
+ atan = function()
+ local b, arg2 = pop_num()
+ local a = pop_num(arg2)
+ local res = math.deg(math.atan(a, b))
+ if res < 0 then res = res + 360 end
+ push(res)
+ end,
+ arccos = function()
+ push(math.deg(math.acos(pop_num())))
+ end,
+ arcsin = function()
+ push(math.deg(math.asin(pop_num())))
+ end,
+ abs = function()
+ push(math.abs(pop_num()))
+ end,
+ neg = function()
+ push(-pop_num())
+ end,
+ round = function()
+ return push(math.floor(pop_num()+.5))
+ end,
+ ceiling = function()
+ return push(math.ceil(pop_num()))
+ end,
+ floor = function()
+ return push(math.floor(pop_num()))
+ end,
+ ln = function()
+ push(math.log((pop_num())))
+ end,
+ log = function()
+ push(math.log(pop_num(), 10))
+ end,
+ truncate = function()
+ push((math.modf(pop_num())))
+ end,
+ cvn = function()
+ local a, raw = pop()
+ if type(a) == 'table' and a.kind == 'executable' then
+ local val = a.value
+ if type(val) ~= 'table' or val.kind ~= 'string' then
+ ps_error('typecheck', raw)
+ end
+ push(val.value)
+ end
+ if type(a) ~= 'table' or a.kind ~= 'string' then
+ ps_error('typecheck', raw)
+ end
+ return push{kind = 'name', value = a.value}
+ end,
+ cvi = function()
+ local a, raw = pop()
+ if type(a) == 'table' and a.kind == 'executable' then
+ a = a.value
+ end
+ if type(a) == 'table' and a.kind == 'string' then
+ a = (number * -1):match(a.value)
+ if not a then
+ ps_error('syntaxerror', raw)
+ end
+ end
+ if type(a) ~= 'number' then ps_error('typecheck', raw) end
+ push(a//1)
+ end,
+ cvr = function()
+ local a, raw = pop()
+ if type(a) == 'table' and a.kind == 'executable' then
+ a = a.value
+ end
+ if type(a) == 'table' and a.kind == 'string' then
+ a = (number * -1):match(a.value)
+ if not a then
+ ps_error('syntaxerror', raw)
+ end
+ end
+ if type(a) ~= 'number' then ps_error('typecheck', raw) end
+ push(a*1.)
+ end,
+ cvs = function()
+ local old_str, arg2 = pop_string()
+ local a, arg1 = pop()
+ a = ps_to_string(a)
+ if #old_str.value < #a then ps_error('rangecheck', arg1, arg2) end
+ old_str.value = a .. string.sub(old_str.value, #a+1, -1)
+ return push{kind = 'string', value = a}
+ end,
+ cvrs = function()
+ local old_str, arg3 = pop_string()
+ local radix, arg2 = pop_num()
+ local num, arg1 = pop_num()
+ if radix == 10 then
+ num = string.format(math.type(num) == 'float' and '%.6g' or '%i', num)
+ else
+ num = num//1
+ if num < 0 and num >= -0x80000000 then
+ num = num + 0x100000000
+ end
+ if num < 0 then
+ ps_error('rangecheck', arg1, arg2, arg3)
+ end
+ num = num == 0 and '0' or num_to_base(num, radix)
+ end
+ if #old_str.value < #num then ps_error('rangecheck', arg1, arg2, arg3) end
+ old_str.value = num .. string.sub(old_str.value, #num+1, -1)
+ return push{kind = 'string', value = num}
+ end,
+
+ string = function()
+ push{kind = 'string', value = string.rep('\0', (pop_int()))}
+ end,
+ search = function()
+ local seek = pop_string()
+ local str = pop_string()
+ local start, stop = string.find(str.value, seek.value, 1, true)
+ if start then
+ push(str_view(str, stop + 1, #str.value - stop))
+ push(str_view(str, start, stop - start + 1))
+ push(str_view(str, 1, start - 1))
+ push(true)
+ else
+ push(str)
+ push(false)
+ end
+ end,
+
+ array = function()
+ local size = pop_int()
+ local arr = lua.newtable(size, 0)
+ for i=1, size do arr[i] = null end
+ push{kind = 'array', value = arr}
+ end,
+ astore = function()
+ local arr = pop_array()
+ local size = #arr.value
+ for i=size, 1, -1 do
+ arr.value[i] = pop()
+ end
+ push(arr)
+ end,
+ aload = function()
+ local arr = pop_array()
+ table.move(arr.value, 1, #arr.value, #operand_stack + 1, operand_stack)
+ push(arr)
+ end,
+ getinterval = function()
+ local count, arg3 = pop_int()
+ local index, arg2 = pop_int()
+ local arr, arg1 = pop()
+ if type(arr) ~= 'table' then ps_error('typecheck', arg1, arg2, arg3) end
+ if arr.kind == 'executable' then
+ arr = arr.value
+ if type(arr) ~= 'table' then ps_error('typecheck', arg1, arg2, arg3) end
+ end
+ if arr.kind == 'string' then
+ push(str_view(arr, index + 1, count))
+ elseif arr.kind == 'array' then
+ -- TODO: At least for the array case, we could use metamethods to make get element sharing behavior
+ push{kind = 'array', value = table.move(arr.value, index + 1, index + count, 1, {})}
+ else
+ ps_error('typecheck', arg1, arg2, arg3)
+ end
+ end,
+ putinterval = function()
+ local from, arg2 = pop()
+ local index, arg1 = pop_int()
+ if type(from) ~= 'table' then ps_error('typecheck', arg1, arg2) end
+ if from.kind == 'executable' then
+ from = from.value
+ if type(from) ~= 'table' then ps_error('typecheck', arg1, arg2) end
+ end
+ if from.kind == 'string' then
+ local to = pop_string()
+ from = from.value
+ to.value = string.sub(to.value, 1, index) .. from .. string.sub(to.value, index + 1 + #from)
+ elseif from.kind == 'array' then
+ local to = pop_array()
+ table.move(from.value, 1, #from.value, index + 1, to.value)
+ else
+ ps_error('typecheck', arg1, arg2)
+ end
+ end,
+
+ dict = function()
+ local size = pop_int()
+ push{kind = 'dict', value = lua.newtable(0, size)}
+ end,
+ begin = function()
+ local _
+ _, _, dictionary_stack[#dictionary_stack + 1] = pop_dict()
+ end,
+ ['end'] = function()
+ if #dictionary_stack <= 3 then
+ ps_error'dictstackunderflow'
+ end
+ dictionary_stack[#dictionary_stack] = nil
+ end,
+ currentdict = function()
+ push(dictionary_stack[#dictionary_stack])
+ end,
+ bind = function()
+ local d = pop()
+ push(d)
+ if type(d) ~= 'table' then ps_error'typecheck' end
+ if d.kind == 'executable' then
+ d = d.value
+ if type(d) ~= 'table' then ps_error'typecheck' end
+ end
+ if d.kind ~= 'array' then ps_error'typecheck' end
+ bind(d.value)
+ end,
+ def = function()
+ local value = pop()
+ local key = pop_key()
+ dictionary_stack[#dictionary_stack].value[key] = value
+ end,
+ store = function()
+ local value = pop()
+ local key = pop_key()
+ for i=#dictionary_stack, 1, -1 do
+ if dictionary_stack[i].value[key] ~= nil then
+ dictionary_stack[i].value[key] = value
+ return
+ end
+ end
+ dictionary_stack[#dictionary_stack].value[key] = value
+ end,
+ known = function()
+ local key = pop_key()
+ local dict = pop()
+ push(dict.value[key] ~= nil)
+ end,
+ where = function()
+ local key = pop_key()
+ for i = #dictionary_stack, 1, -1 do
+ local dict = dictionary_stack[i]
+ local value = dict.value[key]
+ if value ~= nil then
+ push(dict)
+ return push(true)
+ end
+ end
+ return push(false)
+ end,
+ load = function()
+ push(lookup(pop_key()))
+ end,
+ get = function()
+ local key = pop()
+ local obj = pop()
+ if type(obj) ~= 'table' then ps_error'typecheck' end
+ if obj.kind == 'executable' then
+ obj = obj.value
+ if type(obj) ~= 'table' then ps_error'typecheck' end
+ end
+ local val = obj.value
+ if obj.kind == 'string' then
+ push(key) key = pop_int()
+ if key < 0 or key >= #val then ps_error'rangecheck' end
+ push(string.byte(val, key+1))
+ elseif obj.kind == 'array' then
+ push(key) key = pop_int()
+ if key < 0 or key >= #val then ps_error'rangecheck' end
+ push(val[key+1])
+ elseif obj.kind == 'dict' then
+ push(key) key = pop_key()
+ push(val[key])
+ else
+ ps_error'typecheck'
+ end
+ end,
+ put = function()
+ local value = pop()
+ local key = pop()
+ local obj = pop()
+ if type(obj) ~= 'table' then ps_error'typecheck' end
+ if obj.kind == 'executable' then
+ obj = obj.value
+ if type(obj) ~= 'table' then ps_error'typecheck' end
+ end
+ local val = obj.value
+ if obj.kind == 'string' then
+ push(key) key = pop_int()
+ if key < 0 or key >= #val then ps_error'rangecheck' end
+ push(value) value = pop_int()
+ obj.value = string.sub(val, 1, key) .. string.char(value) .. string.sub(val, key+2, #val)
+ elseif obj.kind == 'array' then
+ push(key) key = pop_int()
+ if key < 0 or key >= #val then ps_error'rangecheck' end
+ val[key+1] = value
+ elseif obj.kind == 'dict' then
+ push(key) key = pop_key()
+ val[key] = value
+ else
+ ps_error'typecheck'
+ end
+ end,
+ undef = function()
+ local key = pop_key()
+ local dict = pop_dict()
+ dict[key] = nil
+ end,
+ length = function()
+ local obj = pop()
+ if type(obj) == 'string' then
+ return push(#obj)
+ elseif type(obj) ~= 'table' then
+ ps_error'typecheck'
+ end
+ if obj.kind == 'executable' then
+ obj = obj.value
+ if type(obj) ~= 'table' then ps_error'typecheck' end
+ end
+ local val = obj.value
+ if obj.kind == 'string' then
+ push(#val)
+ elseif obj.kind == 'name' then
+ push(#val)
+ elseif obj.kind == 'array' then
+ push(#val)
+ elseif obj.kind == 'dict' then
+ local length = 0
+ for _ in next, val do
+ length = length + 1
+ end
+ push(length)
+ else
+ ps_error'typecheck'
+ end
+ end,
+
+ matrix = function()
+ push{kind = 'array', value = {1, 0, 0, 1, 0, 0}}
+ end,
+ defaultmatrix = function()
+ local m = pop_array()
+ local mm = m.value
+ assert(#mm == 6)
+ mm[1], mm[2], mm[3], mm[4], mm[5], mm[6] = 10, 0, 0, 10, 0, 0
+ push(m)
+ end,
+ currentmatrix = function()
+ local m = pop_array()
+ assert(#m.value == 6)
+ table.move(graphics_stack[#graphics_stack].matrix, 1, 6, 1, m.value)
+ push(m)
+ end,
+ currentlinewidth = function()
+ push(assert(graphics_stack[#graphics_stack].linewidth, 'linewidth has to be set before it is queried'))
+ end,
+ currentmiterlimit = function()
+ push(assert(graphics_stack[#graphics_stack].miterlimit, 'miterlimit has to be set before it is queried'))
+ end,
+ currentflat = function()
+ push(graphics_stack[#graphics_stack].flatness)
+ end,
+ setlinewidth = function()
+ local lw = pop_num()
+ graphics_stack[#graphics_stack].linewidth = lw
+ delayed_print(string.format('%.3f w', lw))
+ end,
+ setlinejoin = function()
+ local linejoin = pop_int()
+ graphics_stack[#graphics_stack].linejoin = linejoin
+ delayed_print(string.format('%i j', linejoin))
+ end,
+ setlinecap = function()
+ local linecap = pop_int()
+ graphics_stack[#graphics_stack].linecap = linecap
+ delayed_print(string.format('%i J', linecap))
+ end,
+ setmiterlimit = function()
+ local ml = pop_int()
+ graphics_stack[#graphics_stack].miterlimit = ml
+ delayed_print(string.format('%.3f M', ml))
+ end,
+ setstrokeadjust = function()
+ local sa = pop_bool()
+ graphics_stack[#graphics_stack].strokeadjust = sa
+ delayed_print(ExtGState[sa and '<</SA true>>' or '<</SA false>>'])
+ end,
+ setdash = function()
+ local offset = pop_num()
+ local patt = pop_array().value
+ graphics_stack[#graphics_stack].dash = {offset = offset, pattern = patt}
+ local mypatt = {}
+ for i=1, #patt do
+ mypatt[i] = string.format('%.3f', patt[i])
+ end
+ delayed_print(string.format('[%s] %.3f d', table.concat(mypatt, ' '), offset))
+ end,
+ setflat = function()
+ local flatness = pop_num()
+ graphics_stack[#graphics_stack].flatness = flatness
+ delayed_print(string.format('%.3f i', flatness))
+ end,
+ currentpoint = function()
+ local current_point = assert(graphics_stack[#graphics_stack].current_point, 'nocurrentpoint')
+ push(current_point[1])
+ push(current_point[2])
+ end,
+
+ moveto = function()
+ local y = pop_num()
+ local x = pop_num()
+ local state = graphics_stack[#graphics_stack]
+ local current_path = state.current_path
+ if current_path then
+ local i = #current_path + 1
+ current_path[i], current_path[i+1], current_path[i+2] = x, y, 'm'
+ local current_point = state.current_point
+ current_point[1], current_point[2] = x, y
+ else
+ state.current_path = {x, y, 'm'}
+ state.current_point = {x, y}
+ end
+ end,
+ rmoveto = function()
+ local state = graphics_stack[#graphics_stack]
+ local current_path = assert(state.current_path, 'nocurrentpoint')
+ local y = pop_num()
+ local x = pop_num()
+ local current_point = state.current_point
+ x, y = current_point[1] + x, current_point[2] + y
+ local i = #current_path + 1
+ current_path[i], current_path[i+1], current_path[i+2] = x, y, 'm'
+ current_point[1], current_point[2] = x, y
+ end,
+ lineto = function()
+ local state = graphics_stack[#graphics_stack]
+ local current_path = assert(state.current_path, 'nocurrentpoint')
+ local y = pop_num()
+ local x = pop_num()
+ local i = #current_path + 1
+ current_path[i], current_path[i+1], current_path[i+2] = x, y, 'l'
+ local current_point = state.current_point
+ current_point[1], current_point[2] = x, y
+ end,
+ rlineto = function()
+ local state = graphics_stack[#graphics_stack]
+ local current_path = assert(state.current_path, 'nocurrentpoint')
+ local y = pop_num()
+ local x = pop_num()
+ local current_point = state.current_point
+ x, y = x + current_point[1], y + current_point[2]
+ local i = #current_path + 1
+ current_path[i], current_path[i+1], current_path[i+2] = x, y, 'l'
+ current_point[1], current_point[2] = x, y
+ end,
+ curveto = function()
+ local state = graphics_stack[#graphics_stack]
+ local current_path = assert(state.current_path, 'nocurrentpoint')
+ local y3 = pop_num()
+ local x3 = pop_num()
+ local y2 = pop_num()
+ local x2 = pop_num()
+ local y1 = pop_num()
+ local x1 = pop_num()
+ local i = #current_path + 1
+ current_path[i], current_path[i+1], current_path[i+2], current_path[i+3], current_path[i+4], current_path[i+5], current_path[i+6] = x1, y1, x2, y2, x3, y3, 'c'
+ local current_point = state.current_point
+ current_point[1], current_point[2] = x3, y3
+ end,
+ rcurveto = function()
+ local state = graphics_stack[#graphics_stack]
+ local current_path = assert(state.current_path, 'nocurrentpoint')
+ local current_point = state.current_point
+ local x0, y0 = current_point[1], current_point[2]
+ local y3 = pop_num() + y0
+ local x3 = pop_num() + x0
+ local y2 = pop_num() + y0
+ local x2 = pop_num() + x0
+ local y1 = pop_num() + y0
+ local x1 = pop_num() + x0
+ local i = #current_path + 1
+ current_path[i], current_path[i+1], current_path[i+2], current_path[i+3], current_path[i+4], current_path[i+5], current_path[i+6] = x1, y1, x2, y2, x3, y3, 'c'
+ local current_point = state.current_point
+ current_point[1], current_point[2] = x3, y3
+ end,
+ closepath = function()
+ local state = graphics_stack[#graphics_stack]
+ local current_path = state.current_path
+ local current_point = state.current_point
+ if not current_path then return end
+ local x, y
+ for i=#current_path, 1, -1 do
+ if current_path[i] == 'm' then
+ x, y = assert(tonumber(current_path[i-2])), assert(tonumber(current_path[i-1]))
+ end
+ end
+ current_point[1], current_point[2] = assert(x), y
+ current_path[#current_path + 1] = 'h'
+ end,
+
+ arc = function()
+ local a2 = pop_num()
+ local a1 = pop_num()
+ local r = pop_num()
+ local yc = pop_num()
+ local xc = pop_num()
+ while a2 < a1 do
+ a2 = a2 + 360
+ end
+ drawarc(xc, yc, r, a1, a2)
+ end,
+ arcn = function()
+ local a2 = pop_num()
+ local a1 = pop_num()
+ local r = pop_num()
+ local yc = pop_num()
+ local xc = pop_num()
+ while a1 < a2 do
+ a1 = a1 + 360
+ end
+ drawarc(xc, yc, r, a1, a2)
+ end,
+ arcto = function()
+ local state = graphics_stack[#graphics_stack]
+ local current_path = assert(state.current_path, 'nocurrentpoint')
+ local current_point = state.current_point
+ local x0, y0 = current_point[1], current_point[2]
+
+ local r = pop_num()
+ local y2 = pop_num()
+ local x2 = pop_num()
+ local y1 = pop_num()
+ local x1 = pop_num()
+
+ local dx1, dy1 = x1 - x0, y1 - y0
+ local dx2, dy2 = x2 - x1, y2 - y1
+
+ local a1 = math.atan(dy1, dx1)
+ local a2 = math.atan(dy2, dx2)
+
+ if a1 - pi > a2 then
+ a1 = a1 - two_pi
+ elseif a2 - pi > a1 then
+ a2 = a2 - two_pi
+ end
+
+ if a1 > a2 then
+ a1 = a1 + math.pi/2
+ a2 = a2 + math.pi/2
+ else
+ a1 = a1 - math.pi/2
+ a2 = a2 - math.pi/2
+ end
+
+ local ox1, oy1 = r * math.cos(a1), r * math.sin(a1)
+ local ox2, oy2 = r * math.cos(a2), r * math.sin(a2)
+ -- Now we need to calculate the intersection of the lines offset by o1/o2
+ -- to determine the center. We inlin eth ematix inverse for performance and better handling of edge cases.
+ -- local t1, t2 = matrix_transform(0, 0, matrix_invert(dx1, dy1, dx2, dy2, ox2-ox1, oy2-oy1))
+ local det = dx1*dy2 - dy1*dx2
+ if math.abs(det) < 0.0000001 then
+ -- Just draw a line
+ push(x1)
+ push(y1)
+ systemdict.value.lineto()
+ push(x1)
+ push(y1)
+ push(x1)
+ push(y1)
+ return
+ end
+ local t1 = (ox1 - ox2) * dy2/det + (oy2 - oy1) * dx2/det
+ local cx, cy = x1 - ox1 + t1 * dx1, y1 - oy1 + t1 * dy1
+ -- local ccx, ccy = x1 - ox2 - t2 * dx2, y1 - oy2 + t2 * dy2
+ drawarc(cx, cy, r, a1*180/pi, a2*180/pi)
+
+ push(cx + ox1)
+ push(cy + oy1)
+ push(cx + ox2)
+ push(cy + oy2)
+ end,
+ arct = function()
+ systemdict.value.arcto()
+ pop()
+ pop()
+ pop()
+ pop()
+ end,
+
+ eoclip = function()
+ local state = graphics_stack[#graphics_stack]
+ local current_path = state.current_path
+ if not current_path then return end
+ flush_delayed(true)
+ for i = 1, #current_path do
+ if type(current_path[i]) == 'number' then
+ pdfprint(string.format('%.5f', current_path[i]))
+ else
+ pdfprint(current_path[i])
+ end
+ end
+ pdfprint'W* n'
+ end,
+ clip = function()
+ local state = graphics_stack[#graphics_stack]
+ local current_path = state.current_path
+ if not current_path then return end
+ flush_delayed(true)
+ for i = 1, #current_path do
+ if type(current_path[i]) == 'number' then
+ pdfprint(string.format('%.5f', current_path[i]))
+ else
+ pdfprint(current_path[i])
+ end
+ end
+ pdfprint'W n'
+ end,
+ eofill = function()
+ local state = graphics_stack[#graphics_stack]
+ local current_path = state.current_path
+ if not current_path then return end
+ current_path[#current_path+1] = 'f*'
+ for i = 1, #current_path do
+ if type(current_path[i]) == 'number' then
+ current_path[i] = string.format('%.5f', current_path[i])
+ end
+ end
+ flush_delayed()
+ pdfprint((table.concat(current_path, ' '):gsub('%.?0+ ', ' ')))
+ state.current_path, state.current_point = nil
+ end,
+ fill = function()
+ local state = graphics_stack[#graphics_stack]
+ local current_path = state.current_path
+ if not current_path then return end
+ current_path[#current_path+1] = 'f'
+ for i = 1, #current_path do
+ if type(current_path[i]) == 'number' then
+ current_path[i] = string.format('%.5f', current_path[i])
+ end
+ end
+ flush_delayed()
+ pdfprint((table.concat(current_path, ' '):gsub('%.?0+ ', ' ')))
+ state.current_path, state.current_point = nil
+ end,
+ stroke = function()
+ local state = graphics_stack[#graphics_stack]
+ local current_path = state.current_path
+ if not current_path then return end
+ current_path[#current_path+1] = 'S'
+ for i = 1, #current_path do
+ if type(current_path[i]) == 'number' then
+ current_path[i] = string.format('%.5f', current_path[i])
+ end
+ end
+ flush_delayed()
+ pdfprint((table.concat(current_path, ' '):gsub('%.?0+ ', ' ')))
+ state.current_path, state.current_point = nil
+ end,
+ flattenpath = function()
+ local state = graphics_stack[#graphics_stack]
+ local old_path = state.current_path
+ if not old_path then return end
+ local new_path = {}
+ local last_x, last_y = nil, 0
+ local saved_x, saved_y
+ local subpath_x, subpath_y
+ local last_op = 1
+ local matrix = state.matrix
+ local tolerance = state.flatness / math.sqrt(matrix[1]*matrix[4]-matrix[2]*matrix[3])
+ for i=1, #old_path do
+ local entry = old_path[i]
+ if type(entry) == 'string' then
+ if entry == 'c' then
+ assert(i - last_op == 6)
+ flatten(new_path, tolerance, saved_x, saved_y, table.unpack(old_path, last_op, i-1))
+ table.move(old_path, last_op + 4, last_op + 5, #new_path + 1, new_path)
+ new_path[#new_path+1] = 'l'
+ else
+ if entry == 'm' then
+ subpath_x, subpath_y = last_x, last_y
+ elseif entry == 'h' then
+ last_x, last_y = subpath_x, subpath_y
+ end
+ table.move(old_path, last_op, i, #new_path + 1, new_path)
+ end
+ saved_x, saved_y = last_x, last_y
+ last_op = i + 1
+ else
+ if last_y then
+ last_x, last_y = entry
+ else
+ last_y = entry
+ end
+ end
+ end
+ assert(last_op == #old_path + 1)
+ state.current_path = new_path
+ end,
+
+ rectclip = function()
+ flush_delayed()
+ local top = pop()
+ if type(top) == 'table' and top.kind == 'executable' then
+ top = top.value
+ end
+ if type(top) == 'number' then
+ local h = top
+ local w = pop_num()
+ local y = pop_num()
+ local x = pop_num()
+ pdfprint((string.format('%.5f %.5f %.5f %.5f re W n', x, y, w, h):gsub('%.?0+ ', ' ')))
+ else
+ error'Unsupported rectclip variant'
+ end
+ end,
+ rectstroke = function()
+ flush_delayed()
+ local top = pop()
+ if type(top) == 'table' and top.kind == 'executable' then
+ top = top.value
+ end
+ if type(top) == 'number' then
+ local h = top
+ local w = pop_num()
+ local y = pop_num()
+ local x = pop_num()
+ pdfprint((string.format('%.5f %.5f %.5f %.5f re S', x, y, w, h):gsub('%.?0+ ', ' ')))
+ else
+ error'Unsupported rectstroke variant'
+ end
+ end,
+ rectfill = function()
+ flush_delayed()
+ local top = pop()
+ if type(top) == 'table' and top.kind == 'executable' then
+ top = top.value
+ end
+ if type(top) == 'number' then
+ local h = top
+ local w = pop_num()
+ local y = pop_num()
+ local x = pop_num()
+ pdfprint((string.format('%.5f %.5f %.5f %.5f re f', x, y, w, h):gsub('%.?0+ ', ' ')))
+ else
+ error'Unsupported rectfill variant'
+ end
+ end,
+
+ shfill = function()
+ local shading_dict, arg1 = pop_dict()
+ flush_delayed()
+ local data_src
+ local pdf_dict = ''
+ for k, v in next, shading_dict do
+ if k == 'DataSource' then
+ data_src = v
+ else
+ pdf_dict = pdf_dict .. serialize_pdf(k) .. ' ' .. serialize_pdf(v)
+ end
+ end
+ if shading_dict.ShadingType == 4 then
+ assert(data_src)
+ if type(data_src) ~= 'table' then
+ push(arg1)
+ ps_error'typecheck'
+ end
+ if data_src.kind == 'string' then
+ data_src = data_src.value
+ elseif data_src.kind == 'array' then
+ data_src = data_src.value
+ local color_model = shading_dict.ColorSpace.value[1]
+ if type(color_model) == 'table' and color_model.kind == 'name' then
+ color_model = color_model.value
+ end
+ if color_model == 'DeviceRGB' then
+ color_model = 3
+ elseif color_model == 'DeviceCMYK' then
+ color_model = 4
+ elseif color_model == 'DeviceGray' then
+ color_model = 1
+ else
+ error'Unsupported color model in Shading dictionary'
+ end
+ local components = color_model + 3
+ pdf_dict = pdf_dict .. '/BitsPerCoordinate 24/BitsPerComponent 8/BitsPerFlag 8/Decode[-8192 8191 -8192 8191' .. string.rep(' 0 1', color_model) .. ']'
+ local data = ''
+ for i = 1, #data_src-components+1, components do
+ data = data .. string.pack('>BI3I3', data_src[i], (data_src[i+1]*1024+.5)//1 + 8388608, (data_src[i+2]*1024+.5)//1 + 8388608)
+ for j = i + 3, i + 2 + color_model do
+ data = data .. string.pack('B', (data_src[j]*255+.5)//1)
+ end
+ end
+ data_src = data
+ else
+ error'Unsupported DataSource variant'
+ end
+ local obj = write_shading(pdf_dict, data_src)
+ pdfprint(string.format('%s sh', write_shading(pdf_dict, data_src)))
+ end
+ end,
+
+ scale = function()
+ local m = pop()
+ if type(m) == 'table' and m.kind == 'array' then
+ local mv = m.value
+ if #mv ~= 6 then error'Unexpected size of matrix' end
+ local y = pop_num()
+ local x = pop_num()
+ mv[1], mv[2], mv[3], mv[4], mv[5], mv[6] = x, 0, 0, y, 0, 0
+ push(m)
+ else
+ push(m)
+ local y = pop_num()
+ local x = pop_num()
+ update_matrix(x, 0, 0, y, 0, 0)
+ end
+ end,
+ translate = function()
+ local m = pop()
+ if type(m) == 'table' and m.kind == 'array' then
+ local mv = m.value
+ if #mv ~= 6 then error'Unexpected size of matrix' end
+ local y = pop_num()
+ local x = pop_num()
+ mv[1], mv[2], mv[3], mv[4], mv[5], mv[6] = 1, 0, 0, 1, x, y
+ push(m)
+ else
+ push(m)
+ local y = pop_num()
+ local x = pop_num()
+ update_matrix(1, 0, 0, 1, x, y)
+ end
+ end,
+ rotate = function()
+ local m = pop()
+ if type(m) == 'table' and m.kind == 'array' then
+ local mv = m.value
+ if #mv ~= 6 then error'Unexpected size of matrix' end
+ local angle = math.rad(pop_num())
+ local s, c = math.sin(angle), math.cos(angle)
+ mv[1], mv[2], mv[3], mv[4], mv[5], mv[6] = c, s, -s, c, 0, 0
+ push(m)
+ else
+ push(m)
+ local angle = math.rad(pop_num())
+ local s, c = math.sin(angle), math.cos(angle)
+ update_matrix(c, s, -s, c, 0, 0)
+ end
+ end,
+ transform = function()
+ local m = pop()
+ if type(m) == 'table' and m.kind == 'array' then
+ m = m.value
+ if #m ~= 6 then error'Unexpected size of matrix' end
+ else
+ push(m)
+ m = graphics_stack[#graphics_stack].matrix
+ end
+ local y = pop_num()
+ local x = pop_num()
+ x, y = matrix_transform(x, y, m[1], m[2], m[3], m[4], m[5], m[6])
+ push(x)
+ push(y)
+ end,
+ itransform = function()
+ local m = pop()
+ if type(m) == 'table' and m.kind == 'array' then
+ m = m.value
+ if #m ~= 6 then error'Unexpected size of matrix' end
+ else
+ push(m)
+ m = graphics_stack[#graphics_stack].matrix
+ end
+ local y = pop_num()
+ local x = pop_num()
+ x, y = matrix_transform(x, y, matrix_invert(m[1], m[2], m[3], m[4], m[5], m[6]))
+ push(x)
+ push(y)
+ end,
+ dtransform = function()
+ local m = pop()
+ if type(m) == 'table' and m.kind == 'array' then
+ m = m.value
+ if #m ~= 6 then error'Unexpected size of matrix' end
+ else
+ push(m)
+ m = graphics_stack[#graphics_stack].matrix
+ end
+ local y = pop_num()
+ local x = pop_num()
+ x, y = matrix_transform(x, y, m[1], m[2], m[3], m[4], 0, 0)
+ push(x)
+ push(y)
+ end,
+ idtransform = function()
+ local m = pop()
+ if type(m) == 'table' and m.kind == 'array' then
+ m = m.value
+ if #m ~= 6 then error'Unexpected size of matrix' end
+ else
+ push(m)
+ m = graphics_stack[#graphics_stack].matrix
+ end
+ local y = pop_num()
+ local x = pop_num()
+ x, y = matrix_transform(x, y, matrix_invert(m[1], m[2], m[3], m[4], 0, 0))
+ push(x)
+ push(y)
+ end,
+ concatmatrix = function()
+ local m3a = pop_array()
+ local m3 = m3a.value
+ if #m3 ~= 6 then error'Unexpected size of matrix' end
+ local m2 = pop_array().value
+ if #m2 ~= 6 then error'Unexpected size of matrix' end
+ local m1 = pop_array().value
+ if #m1 ~= 6 then error'Unexpected size of matrix' end
+ m3[1], m3[2],
+ m3[3], m3[4],
+ m3[5], m3[6]
+ = m1[1] * m2[1] + m1[2] * m2[3], m1[1] * m2[2] + m1[2] * m2[4],
+ m1[3] * m2[1] + m1[4] * m2[3], m1[3] * m2[2] + m1[4] * m2[4],
+ m1[5] * m2[1] + m1[6] * m2[3] + m2[5], m1[5] * m2[2] + m1[6] * m2[4] + m2[6]
+ push(m3a)
+ end,
+ invertmatrix = function()
+ local target = pop_array()
+ local T = target.value
+ assert(#T == 6)
+ local M = pop_array().value
+ assert(#M == 6)
+ T[1], T[2], T[3], T[4], T[5], T[6]
+ = matrix_invert(M[1], M[2], M[3], M[4], M[5], M[6])
+ push(target)
+ end,
+ concat = function()
+ local m = pop_array().value
+ if #m ~= 6 then error'Unexpected size of matrix' end
+ update_matrix(m[1], m[2], m[3], m[4], m[5], m[6])
+ end,
+ -- setmatrix is not supported in PDF, so we invert the old matrix first
+ setmatrix = function()
+ local m = pop()
+ if type(m) ~= 'table' or m.kind ~= 'array' then
+ ps_error'typecheck'
+ end
+ local m = m.value
+ if #m ~= 6 then ps_error'rangecheck' end
+ local old = graphics_stack[#graphics_stack].matrix
+ local pt = graphics_stack[#graphics_stack].current_point
+ local a, b, c, d, e, f = matrix_invert(old[1], old[2], old[3], old[4], old[5], old[6])
+ update_matrix(a, b, c, d, e, f)
+ update_matrix(m[1], m[2], m[3], m[4], m[5], m[6])
+ end,
+ setpdfcolor = function()
+ local pdf = pop_string().value
+ local color = graphics_stack[#graphics_stack].color
+ delayed_print(pdf)
+ color.space = {kind = 'array', value = {{kind = 'name', value = 'PDF'}}}
+ for i=2, #color do color[i] = nil end
+ color[1] = pdf
+ end,
+ setgray = function()
+ local g = pop_num()
+ local color = graphics_stack[#graphics_stack].color
+ color.space = {kind = 'array', value = {{kind = 'name', value = 'DeviceGray'}}}
+ for i=2, #color do color[i] = nil end
+ color[1] = g
+ delayed_print(string.format('%.3f g %.3f G', g, g))
+ end,
+ setrgbcolor = function()
+ local b = pop_num()
+ local g = pop_num()
+ local r = pop_num()
+ local color = graphics_stack[#graphics_stack].color
+ color.space = {kind = 'array', value = {{kind = 'name', value = 'DeviceRGB'}}}
+ for i=4, #color do color[i] = nil end
+ color[1], color[2], color[3] = r, g, b
+ delayed_print(string.format('%.3f %.3f %.3f rg %.3f %.3f %.3f RG', r, g, b, r, g, b))
+ end,
+ -- Conversion based on Wikipedia article about HSB colorspace
+ sethsbcolor = function()
+ local b = pop_num()
+ local s = pop_num()
+ local h = pop_num()
+ if b < 0 then b = 0 elseif b > 1 then b = 1 end
+ if s < 0 then s = 0 elseif s > 1 then s = 1 end
+ if h < 0 then h = 0 elseif h > 1 then h = 1 end
+ local hi, hf = math.modf(6 * h)
+ local p, q, t = b * (1 - s), b * (1 - s*hf), b * (1 - s * (1-hf))
+ if hi == 0 or hi == 6 then
+ push(b) push(t) push(p)
+ elseif hi == 1 then
+ push(q) push(b) push(p)
+ elseif hi == 2 then
+ push(p) push(b) push(t)
+ elseif hi == 3 then
+ push(p) push(q) push(b)
+ elseif hi == 4 then
+ push(t) push(p) push(b)
+ elseif hi == 5 then
+ push(b) push(p) push(q)
+ end
+ return systemdict.value.setrgbcolor()
+ end,
+ setcmykcolor = function()
+ local k = pop_num()
+ local y = pop_num()
+ local m = pop_num()
+ local c = pop_num()
+ local color = graphics_stack[#graphics_stack].color
+ color.space = {kind = 'array', value = {{kind = 'name', value = 'DeviceCMYK'}}}
+ for i=5, #color do color[i] = nil end
+ color[1], color[2], color[3], color[4] = c, m, y, k
+ delayed_print(string.format('%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K', c, m, y, k, c, m, y, k))
+ end,
+ ['.setopacityalpha'] = function()
+ error'Unsupported, use .setfillconstantalpha instead'
+ end,
+ ['.setfillconstantalpha'] = function()
+ local alpha = pop_num()
+ graphics_stack[#graphics_stack].fillconstantalpha = alpha
+ delayed_print(ExtGState['<</ca ' .. alpha .. '>>'])
+ end,
+ ['.setstrokeconstantalpha'] = function()
+ local alpha = pop_num()
+ graphics_stack[#graphics_stack].strokeconstantalpha = alpha
+ delayed_print(ExtGState['<</CA ' .. alpha .. '>>'])
+ end,
+ ['.currentalphaisshape'] = function()
+ local ais = graphics_stack[#graphics_stack].alphaisshape
+ if ais == nil then error'alphaisshape has to be set before it is queried' end
+ push(ais)
+ end,
+ ['.setalphaisshape'] = function()
+ local ais = pop_bool()
+ graphics_stack[#graphics_stack].alphaisshape = ais
+ delayed_print(ExtGState['<</AIS ' .. (ais and 'true' or 'false') .. '>>'])
+ end,
+ ['.currentblendmode'] = function()
+ local blendmode = graphics_stack[#graphics_stack].blendmode
+ if blendmode == nil then error'blendmode has to be set before it is queried' end
+ push{kind = 'name', value = blendmode}
+ end,
+ ['.setblendmode'] = function()
+ local blendmode = pop()
+ if type(blendmode) == 'string' then
+ elseif type(blendmode) == 'table' and blendmode.kind == 'name' then
+ blendmode = blendmode.value
+ else
+ push(blendmode)
+ ps_error'typecheck'
+ end
+ graphics_stack[#graphics_stack].blendmode = blendmode
+ delayed_print(ExtGState['<</BM /' .. blendmode .. '>>'])
+ end,
+ newpath = function()
+ local state = graphics_stack[#graphics_stack]
+ state.current_point = nil
+ state.current_path = nil
+ end,
+
+ currentcolorspace = function()
+ local color = graphics_stack[#graphics_stack].color
+ if not color then error'Color has to be set before it is queried' end
+ push(color.space)
+ end,
+ currentcolor = function()
+ local color = graphics_stack[#graphics_stack].color
+ if not color then error'Color has to be set before it is queried' end
+ for i = 1, #color do
+ push(color[i])
+ end
+ end,
+ currentcmykcolor = function()
+ local c, m, y, k
+ local color = graphics_stack[#graphics_stack].color
+ if not color then error'Color has to be set before it is queried' end
+ local space = color.space.value[1]
+ if type(space) == 'table' and space.kind == 'name' then space = space.value end
+ if space == 'DeviceRGB' then
+ c, m, y = 1 - color[1], 1 - color[2], 1 - color[3]
+ -- k = math.min(c, m, y)
+ -- TODO: Undercolor removal/black generation
+ -- local undercolor = undercolorremoval(k)
+ -- local undercolor = 0
+ -- k = blackgeneration(k)
+ k = 0
+ -- c, m, y = c - undercolor, y - undercolor, k - undercolor
+ elseif space == 'DeviceGray' then
+ c, m, y, k = 0, 0, 0, 1 - color[1]
+ elseif space == 'DeviceCMYK' then
+ c, m, y, k = color[1], color[2], color[3], color[4]
+ elseif space == 'PDF' then
+ c, m, y, k = 0, 0, 0, 1
+ print('???', 'tocmyk', color[1])
+ else
+ r, g, b, k = 0, 0, 0, 1
+ end
+ push(r)
+ push(g)
+ push(b)
+ end,
+ currentgraycolor = function()
+ local g
+ local color = graphics_stack[#graphics_stack].color
+ if not color then error'Color has to be set before it is queried' end
+ local space = color.space.value[1]
+ if type(space) == 'table' and space.kind == 'name' then space = space.value end
+ if space == 'DeviceRGB' then
+ g = 0.3 * color[1] + 0.59 * color[2], 0.11 * color[3]
+ elseif space == 'DeviceGray' then
+ g = color[1]
+ elseif space == 'DeviceCMYK' then
+ g = math.min(1, math.max(0, 0.3 * color[1] + 0.59 * color[2] + 0.11 * color[3] + color[4]))
+ elseif space == 'PDF' then
+ g = 1
+ print('???', 'togray', color[1])
+ else
+ g = 1
+ end
+ push(g)
+ end,
+ currentrgbcolor = function()
+ local r, g, b
+ local color = graphics_stack[#graphics_stack].color
+ if not color then error'Color has to be set before it is queried' end
+ local space = color.space.value[1]
+ if type(space) == 'table' and space.kind == 'name' then space = space.value end
+ if space == 'DeviceRGB' then
+ r, g, b = color[1], color[2], color[3]
+ elseif space == 'DeviceGray' then
+ r = color[1]
+ g, b = r, r
+ elseif space == 'DeviceCMYK' then
+ local c, m, y, k = color[1], color[2], color[3], color[4]
+ c, m, y = c+k, m+k, y+k
+ r, g, b = c >= 1 and 0 or 1-c, m >= 1 and 0 or 1-m, y >= 1 and 0 or 1-y
+ elseif space == 'PDF' then
+ r, g, b = 0, 0, 0
+ print('???', 'torgb', color[1])
+ else
+ r, g, b = 0, 0, 0
+ end
+ push(r)
+ push(g)
+ push(b)
+ end,
+ currenthsbcolor = function()
+ systemdict.value.currentrgbcolor()
+ local b = pop_num()
+ local g = pop_num()
+ local r = pop_num()
+ local M, m = math.max(r, g, b), math.min(r, g, b)
+ local H
+ if M == m then
+ H = 0
+ elseif M == r then
+ H = (g-b)/(M-m) / 6
+ if H < 0 then H = H + 1 end
+ elseif M == g then
+ H = (b-r)/(M-m) / 6 + 1/3
+ elseif assert(M == b) then
+ H = (r-g)/(M-m) / 6 + 2/3
+ end
+ local S = M == 0 and 0 or (M-m)/M
+ local B = M
+ push(H)
+ push(S)
+ push(B)
+ end,
+ currentfont = function()
+ local f = graphics_stack[#graphics_stack].font
+ if f then
+ push(f)
+ else
+ push{kind = 'dict', value = {
+ FID = font.current(),
+ FontMatrix = {kind = 'array', value = {1, 0, 0, 1, 0, 0}},
+ FontName = {kind = 'name', value = tex.fontname(font.current())},
+ FontType = 0x1CA,
+ }}
+ end
+ end,
+
+ gsave = function()
+ graphics_stack[#graphics_stack+1] = table.copy(graphics_stack[#graphics_stack])
+ graphics_stack[#graphics_stack].saved_delayed = delayed
+ delayed = {
+ text = {},
+ matrix = {1, 0, 0, 1, 0, 0},
+ }
+ end,
+ grestore = function()
+ local saved_delayed = graphics_stack[#graphics_stack].saved_delayed
+ if saved_delayed then
+ delayed = saved_delayed
+ else
+ pdfprint'Q'
+ reset_delayed(delayed)
+ end
+ graphics_stack[#graphics_stack] = nil
+ end,
+
+ setglobal = pop_bool,
+
+ flush = function()
+ io.stdout:flush()
+ end,
+ print = function()
+ local msg = pop_string()
+ io.stdout:write(msg.value)
+ end,
+ stack = function()
+ for i=#operand_stack, 1, -1 do
+ texio.write_nl('term and log', ps_to_string(operand_stack[i]))
+ end
+ end,
+ ['='] = function()
+ texio.write_nl('term and log', ps_to_string(pop()))
+ end,
+ ['=='] = function() -- FIXME: Should give a better representation
+ texio.write_nl('term and log', ps_to_string(pop()))
+ end,
+
+ stringwidth = function()
+ local state = graphics_stack[#graphics_stack]
+ local rawpsfont = assert(state.font, 'invalidfont')
+ local str = pop_string().value
+ local psfont = rawpsfont.value
+ local fid = psfont.FID
+ local matrix = psfont.FontMatrix.value
+ local fonttype = psfont.FontType
+ if fonttype ~= 0x1CA and fonttype ~= 3 then
+ texio.write_nl'Font support is not implemented'
+ return
+ end
+ local w = 0
+ if fonttype == 0x1CA then
+ local characters = assert(font.getfont(fid)).characters
+ for b in string.bytes(str) do
+ local char = characters[b]
+ w = w + (char and char.width or 0)
+ end
+ w = w/65781.76
+ elseif fonttype == 3 then
+ local saved_delayed = delayed
+ delayed = {
+ text = {},
+ matrix = {1, 0, 0, 1, 0, 0},
+ }
+ local saved_saved_delayed = state.saved_delayed
+ state.saved_delayed = nil
+ local saved_pdfprint = pdfprint
+ pdfprint = gobble
+ for b in string.bytes(str) do
+ systemdict.value.gsave()
+ local state = graphics_stack[#graphics_stack]
+ state.current_point, state.current_path = nil
+ push(rawpsfont)
+ push(b)
+ local this_w
+ char_width_storage = function(width)
+ this_w = width
+ end
+ execute_tok(psfont.BuildChar) -- FIXME(maybe): Switch to BuildGlyph?
+ systemdict.value.grestore()
+ w = w + assert(this_w, 'Type 3 character failed to set width')
+ update_matrix(1, 0, 0, 1, this_w, 0)
+ end
+ update_matrix(1, 0, 0, 1, -w, 0)
+ pdfprint = saved_pdfprint
+ state.saved_delayed = saved_saved_delayed
+ delayed = saved_delayed
+ end
+ local x, y = matrix_transform(w, 0,
+ matrix[1], matrix[2],
+ matrix[3], matrix[4],
+ 0, 0)
+ push(x)
+ push(y)
+ end,
+ ashow = function()
+ local str, arg3 = pop_string()
+ local ay, arg2 = pop_num(arg3)
+ local ax, arg1 = pop_num(arg2, arg3)
+ local res, err = generic_show(str, ax, ay)
+ if not res then
+ ps_error(err, arg1, arg2, arg3)
+ end
+ end,
+ show = function()
+ local str, orig = pop_string()
+ local res, err = generic_show(str)
+ if not res then
+ ps_error(err, orig)
+ end
+ end,
+ definefont = function()
+ local fontdict, raw_fontdict = pop_dict()
+ local fontkey = pop_key()
+ fontdict.FontMatrix = fontdict.FontMatrix or {kind = 'array', value = {1, 0, 0, 1, 0, 0}}
+ if assert(fontdict.FontType) == 0x1CA then
+ local fontname = fontdict.FontName
+ if type(fontname) == 'table' and fontname.kind == 'name' then
+ fontname = fontname.value
+ elseif type(fontname) ~= 'string' then
+ pushs(fontkey, raw_fontdict)
+ ps_error'typecheck'
+ end
+ local fid = fonts.definers.read(fontname, 65782)
+ if not fid then ps_error'invalidfont' end
+ if not tonumber(fid) then
+ local data = fid
+ fid = font.define(data)
+ fonts.definers.register(data, fid)
+ end
+ fontdict.FID = fid
+ else
+ texio.write_nl'definefont is not implemnted. Pushing dummy font.'
+ end
+ FontDirectory[fontkey] = raw_fontdict
+ push(raw_fontdict)
+ end,
+ makefont = function()
+ local m = pop_array().value
+ if #m ~= 6 then error'Unexpected size of matrix' end
+ local fontdict = pop_dict()
+ local new_fontdict = {}
+ for k,v in next, fontdict do
+ new_fontdict[k] = v
+ end
+ local old_m = assert(fontdict.FontMatrix, 'invalidfont').value
+ new_fontdict.FontMatrix = {kind = 'array', value = {
+ old_m[1] * m[1] + old_m[2] * m[3], old_m[1] * m[2] + old_m[2] * m[4],
+ old_m[3] * m[1] + old_m[4] * m[3], old_m[3] * m[2] + old_m[4] * m[4],
+ old_m[5] * m[1] + old_m[6] * m[3] + m[5], old_m[5] * m[2] + old_m[6] * m[4] + m[6],
+ }}
+ push{kind = 'dict', value = new_fontdict}
+ end,
+ scalefont = function()
+ local factor = pop_num()
+ local fontdict = pop_dict()
+ local new_fontdict = {}
+ for k,v in next, fontdict do
+ new_fontdict[k] = v
+ end
+ local old_m = assert(fontdict.FontMatrix, 'invalidfont').value
+ new_fontdict.FontMatrix = {kind = 'array', value = {
+ factor * old_m[1], factor * old_m[2],
+ factor * old_m[3], factor * old_m[4],
+ factor * old_m[5], factor * old_m[6],
+ }}
+ push{kind = 'dict', value = new_fontdict}
+ end,
+ setfont = function()
+ local _, _, fontdict = pop_dict()
+ local state = graphics_stack[#graphics_stack]
+ state.font = fontdict
+ end,
+ ['.findfontid'] = function()
+ local fid = pop_int()
+
+ if font.frozen(fid) == nil then
+ push(fid)
+ ps_error'invalidfont'
+ end
+ local fontsize_inv = 65782/pdf.getfontsize(fid)
+ local fontname = tex.fontname(fid)
+ return push{kind = 'dict', value = {
+ FID = fid,
+ FontMatrix = {kind = 'array', value = {fontsize_inv, 0, 0, fontsize_inv, 0, 0}},
+ FontName = {kind = 'name', value = fontname},
+ FontType = 0x1CA,
+ }}
+ end,
+ findfont = function()
+ local fontname = pop_key()
+ local fontdict = FontDirectory[fontname]
+ if fontdict then push(fontdict) return end
+
+ fontname = font_aliases[fontname] or fontname
+ local fid = fonts.definers.read(fontname, 65782)
+ if not fid then ps_error'invalidfont' end
+ if not tonumber(fid) then
+ local data = fid
+ fid = font.define(data)
+ fonts.definers.register(data, fid)
+ end
+ return push{kind = 'dict', value = {
+ FID = fid,
+ FontMatrix = {kind = 'array', value = {1, 0, 0, 1, 0, 0}},
+ FontName = {kind = 'name', value = fontname},
+ FontType = 0x1CA,
+ }}
+ end,
+ selectfont = function()
+ systemdict.value.exch()
+ systemdict.value.findfont()
+ systemdict.value.exch()
+ if type(operand_stack[#operand_stack]) == 'number' then
+ systemdict.value.scalefont()
+ else
+ systemdict.value.makefont()
+ end
+ systemdict.value.setfont()
+ end,
+
+ setcharwidth = function()
+ -- Pop and ignore the advance height -- FIXME(maybe)
+ pop_num()
+ assert(char_width_storage, 'undefined')(pop_num())
+ char_width_storage = nil
+ end,
+ setcachedevice = function()
+ -- First pop and ignore the bounding box
+ pop_num()
+ pop_num()
+ pop_num()
+ pop_num()
+ -- Fallback to setcharwidth
+ systemdict.value.setcharwidth()
+ end,
+ setcachedevice2 = function()
+ -- First pop additional entries for setccachedevice2 -- TODO: Implement other writing modes
+ pop_num()
+ pop_num()
+ pop_num()
+ pop_num()
+ -- Fallback to setcachedevice
+ systemdict.value.setcachedevice()
+ end,
+
+ findresource = function()
+ local category = pop_key()
+ local catdict = ResourceCategories.value[category]
+ if not catdict then
+ push(category)
+ print('undefined resource category', category)
+ ps_error'undefined'
+ end
+ local dict_height = #dictionary_stack + 1
+ dictionary_stack[dict_height] = catdict
+ execute_tok'FindResource'
+ if #dictionary_stack ~= dict_height or dictionary_stack[dict_height] ~= catdict then
+ error'Messed up dictionary stack in custom resource'
+ end
+ dictionary_stack[dict_height] = nil
+ end,
+ resourcestatus = function()
+ local category = pop_key()
+ local catdict = ResourceCategories.value[category]
+ if not catdict then
+ push(category)
+ print('undefined resource category', category)
+ ps_error'undefined'
+ end
+ local dict_height = #dictionary_stack + 1
+ dictionary_stack[dict_height] = catdict
+ execute_tok'ResourceStatus'
+ if #dictionary_stack ~= dict_height or dictionary_stack[dict_height] ~= catdict then
+ error'Messed up dictionary stack in custom resource'
+ end
+ dictionary_stack[dict_height] = nil
+ end,
+ resourceforall = function()
+ local category = pop_key()
+ local catdict = ResourceCategories.value[category]
+ if not catdict then
+ push(category)
+ print('undefined resource category', category)
+ ps_error'undefined'
+ end
+ local dict_height = #dictionary_stack + 1
+ dictionary_stack[dict_height] = catdict
+ execute_tok'ResourceForAll'
+ if #dictionary_stack ~= dict_height or dictionary_stack[dict_height] ~= catdict then
+ error'Messed up dictionary stack in custom resource'
+ end
+ dictionary_stack[dict_height] = nil
+ end,
+ defineresource = function()
+ local category = pop_key()
+ local catdict = ResourceCategories.value[category]
+ if not catdict then
+ push(category)
+ print('undefined resource category', category)
+ ps_error'undefined'
+ end
+ local dict_height = #dictionary_stack + 1
+ dictionary_stack[dict_height] = catdict
+ execute_tok'DefineResource'
+ if #dictionary_stack ~= dict_height or dictionary_stack[dict_height] ~= catdict then
+ error'Messed up dictionary stack in custom resource'
+ end
+ dictionary_stack[dict_height] = nil
+ end,
+ undefineresource = function()
+ local category = pop_key()
+ local catdict = ResourceCategories.value[category]
+ if not catdict then
+ push(category)
+ print('undefined resource category', category)
+ ps_error'undefined'
+ end
+ local dict_height = #dictionary_stack + 1
+ dictionary_stack[dict_height] = catdict
+ execute_tok'UndefineResource'
+ if #dictionary_stack ~= dict_height or dictionary_stack[dict_height] ~= catdict then
+ error'Messed up dictionary stack in custom resource'
+ end
+ dictionary_stack[dict_height] = nil
+ end,
+
+ realtime = function()
+ push(os.gettimeofday() * 1000 // 1)
+ end,
+
+ rrand = function()
+ push(rrand())
+ end,
+ srand = function()
+ srand(pop_int())
+ end,
+ rand = function()
+ push(rand())
+ end,
+
+ type = function()
+ local val = pop()
+ local tval = type(val)
+ if tval == 'table' and val.kind == 'executable' then
+ val = val.value
+ tval = type(val)
+ end
+ local tname
+ if tval == 'string' then
+ tname = 'nametype'
+ elseif tval == 'number' then
+ tname = math.type(val) == 'integer' and 'integertype' or 'realtype'
+ elseif tval == 'boolean' then
+ tname = 'booleantype'
+ elseif tval == 'function' then
+ tname = 'operatortype'
+ elseif tval == 'table' then
+ local kind = val.kind
+ if kind == 'name' then
+ tname = 'nametype'
+ elseif kind == 'operator' then
+ tname = 'operatortype'
+ elseif kind == 'array' then
+ tname = 'arraytype'
+ elseif kind == 'dict' then
+ tname = 'dicttype'
+ elseif kind == 'dict' then
+ tname = 'dicttype'
+ elseif kind == 'null' then
+ tname = 'nulltype'
+ elseif kind == 'mark' then
+ tname = 'nulltype'
+ elseif kind == 'string' then
+ tname = 'stringtype'
+ else
+ assert(false, 'Unexpected type')
+ end
+ else
+ assert(false, 'Unexpected type')
+ end
+ push(tname)
+ -- filetype
+ -- fonttype
+ -- gstatetype (LanguageLevel 2)
+ -- packedarraytype (LanguageLevel 2)
+ -- savetype
+ end,
+ xcheck = function()
+ local a = pop()
+ local ta = type(a)
+ push(ta == 'function' or ta == 'name' or (ta == 'table' and a.kind == 'executable'))
+ end,
+ cvlit = function()
+ local a = pop()
+ local ta = type(a)
+ if (ta == 'table' and a.kind == 'executable') or ta == 'string' or ta == 'function' then
+ return push(a.value)
+ end
+ if ta == 'string' then
+ return push{kind = 'name', value = a}
+ end
+ if ta == 'function' then
+ return push{kind = 'operator', value = a}
+ end
+ return push(a)
+ end,
+ cvx = function()
+ local a = pop()
+ local ta = type(a)
+ if (ta == 'table' and a.kind == 'executable') or ta == 'string' or ta == 'function' then
+ return push(a)
+ elseif ta == 'table' and (a.kind == 'operator' or a.kind == 'name') then
+ return push(a.value)
+ else
+ return push{kind = 'executable', value = a}
+ end
+ end,
+ exec = function()
+ return execute_tok((pop()))
+ end,
+ stopped = function()
+ local proc = pop()
+ local success, err = pcall(execute_tok, proc)
+ if success then
+ push(false)
+ elseif err == 'stop' or true then -- Since we don implement error handlers, all errors act like their error handler included "stop"
+ push(true)
+ end
+ end,
+ stop = function()
+ error'stop'
+ end,
+ exit = function()
+ error(exitmarker)
+ end,
+ quit = function()
+ os.exit()
+ end,
+ run = function()
+ local filename = pop_string().value
+ local resolved = kpse.find_file(filename, 'PostScript header')
+ if not resolved then
+ error(string.format('Unable to find file %q.', filename))
+ end
+ local f = assert(io.open(resolved, 'rb'))
+ local data = maybe_decompress(f:read'a')
+ f:close()
+ return execute_tok{kind = 'executable', value = {kind = 'string', value = data}}
+ end,
+
+ -- We don't implement local/global separation, so we ignore setglobal and always report currentglobal as true
+ setglobal = function()
+ pop()
+ end,
+ currentglobal = function()
+ push(true)
+ end,
+
+ closefile = function()
+ local f = pop()
+ f:close()
+ end,
+ file = function()
+ local access = pop_string()
+ local orig_filename = pop_string()
+ local filename = orig_filename.value
+ if access.value:sub(1, 1) == 'a' then
+ filename = kpse.find_file(filename)
+ if not filename then
+ push(orig_filename)
+ push(access)
+ ps_error'undefinedfilename'
+ end
+ end
+ if access.value == '' then
+ push(orig_filename)
+ push(access)
+ ps_error'invalidfileaccess'
+ end
+ local f = io.open(filename, access.value)
+ if not f then
+ push(orig_filename)
+ push(access)
+ ps_error'invalidfileaccess'
+ end
+ push(f)
+ end,
+ write = function()
+ local data = pop_num()
+ local f = pop()
+ data = data % 256
+ f:write(string.char(data))
+ end,
+ writestring = function()
+ local data = pop_string().value
+ local f = pop()
+ f:write(data)
+ end,
+ readstring = function()
+ local target = pop_string()
+ local f = pop()
+ local data = f:read(#target.value)
+ if #target.value == #data then
+ target.value = data
+ push(target)
+ push(true)
+ systemdict.value.stack()
+ else
+ target = str_view(target, 1, #data)
+ target.value = data
+ push(target)
+ push(false)
+ systemdict.value.stack()
+ end
+ end,
+ readline = function()
+ local target = pop_string()
+ local f = pop()
+ local data = f:read'L' -- TODO: \r should be accepted as EOL marker too
+ if data then
+ if #data > #target.value then
+ push(f)
+ push(target)
+ ps_error'rangecheck'
+ end
+ target = str_view(target, 1, #data)
+ target.value = data
+ push(target)
+ push(true)
+ else
+ push{kind = 'string', value = ''}
+ push(false)
+ end
+ end,
+
+ token = function()
+ local arg = pop()
+ if type(arg) ~= 'table' or arg.kind ~= 'string' then
+ push(arg)
+ if type(arg) == 'userdata' and arg.read then
+ error'token applied to file arguments is no yet implemented'
+ else
+ ps_error'typecheck'
+ end
+ end
+ local str = arg.value
+ local tok, after = l.match(any_object * l.Cp(), str)
+ if after == nil then
+ if l.match(whitespace^-1 * -1, str) then
+ push(false)
+ else
+ push(arg)
+ ps_error'syntaxerror'
+ end
+ else
+ push(str_view(arg, after, #str - after + 1))
+ push(tok)
+ push(true)
+ end
+ end,
+
+ revision = 1000,
+ ['true'] = true,
+ ['false'] = false,
+ systemdict = systemdict,
+ globaldict = globaldict,
+ FontDirectory = FontDirectory,
+
+ ISOLatin1Encoding = {kind = 'array', value = {
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = 'space'},
+ {kind = 'name', value = 'exclam'},
+ {kind = 'name', value = 'quotedbl'},
+ {kind = 'name', value = 'numbersign'},
+ {kind = 'name', value = 'dollar'},
+ {kind = 'name', value = 'percent'},
+ {kind = 'name', value = 'ampersand'},
+ {kind = 'name', value = 'quoteright'},
+ {kind = 'name', value = 'parenleft'},
+ {kind = 'name', value = 'parenright'},
+ {kind = 'name', value = 'asterisk'},
+ {kind = 'name', value = 'plus'},
+ {kind = 'name', value = 'comma'},
+ {kind = 'name', value = 'minus'},
+ {kind = 'name', value = 'period'},
+ {kind = 'name', value = 'slash'},
+ {kind = 'name', value = 'zero'},
+ {kind = 'name', value = 'one'},
+ {kind = 'name', value = 'two'},
+ {kind = 'name', value = 'three'},
+ {kind = 'name', value = 'four'},
+ {kind = 'name', value = 'five'},
+ {kind = 'name', value = 'six'},
+ {kind = 'name', value = 'seven'},
+ {kind = 'name', value = 'eight'},
+ {kind = 'name', value = 'nine'},
+ {kind = 'name', value = 'colon'},
+ {kind = 'name', value = 'semicolon'},
+ {kind = 'name', value = 'less'},
+ {kind = 'name', value = 'equal'},
+ {kind = 'name', value = 'greater'},
+ {kind = 'name', value = 'question'},
+ {kind = 'name', value = 'at'},
+ {kind = 'name', value = 'A'},
+ {kind = 'name', value = 'B'},
+ {kind = 'name', value = 'C'},
+ {kind = 'name', value = 'D'},
+ {kind = 'name', value = 'E'},
+ {kind = 'name', value = 'F'},
+ {kind = 'name', value = 'G'},
+ {kind = 'name', value = 'H'},
+ {kind = 'name', value = 'I'},
+ {kind = 'name', value = 'J'},
+ {kind = 'name', value = 'K'},
+ {kind = 'name', value = 'L'},
+ {kind = 'name', value = 'M'},
+ {kind = 'name', value = 'N'},
+ {kind = 'name', value = 'O'},
+ {kind = 'name', value = 'P'},
+ {kind = 'name', value = 'Q'},
+ {kind = 'name', value = 'R'},
+ {kind = 'name', value = 'S'},
+ {kind = 'name', value = 'T'},
+ {kind = 'name', value = 'U'},
+ {kind = 'name', value = 'V'},
+ {kind = 'name', value = 'W'},
+ {kind = 'name', value = 'X'},
+ {kind = 'name', value = 'Y'},
+ {kind = 'name', value = 'Z'},
+ {kind = 'name', value = 'bracketleft'},
+ {kind = 'name', value = 'backslash'},
+ {kind = 'name', value = 'bracketright'},
+ {kind = 'name', value = 'asciicircum'},
+ {kind = 'name', value = 'underscore'},
+ {kind = 'name', value = 'quoteleft'},
+ {kind = 'name', value = 'a'},
+ {kind = 'name', value = 'b'},
+ {kind = 'name', value = 'c'},
+ {kind = 'name', value = 'd'},
+ {kind = 'name', value = 'e'},
+ {kind = 'name', value = 'f'},
+ {kind = 'name', value = 'g'},
+ {kind = 'name', value = 'h'},
+ {kind = 'name', value = 'i'},
+ {kind = 'name', value = 'j'},
+ {kind = 'name', value = 'k'},
+ {kind = 'name', value = 'l'},
+ {kind = 'name', value = 'm'},
+ {kind = 'name', value = 'n'},
+ {kind = 'name', value = 'o'},
+ {kind = 'name', value = 'p'},
+ {kind = 'name', value = 'q'},
+ {kind = 'name', value = 'r'},
+ {kind = 'name', value = 's'},
+ {kind = 'name', value = 't'},
+ {kind = 'name', value = 'u'},
+ {kind = 'name', value = 'v'},
+ {kind = 'name', value = 'w'},
+ {kind = 'name', value = 'x'},
+ {kind = 'name', value = 'y'},
+ {kind = 'name', value = 'z'},
+ {kind = 'name', value = 'braceleft'},
+ {kind = 'name', value = 'bar'},
+ {kind = 'name', value = 'braceright'},
+ {kind = 'name', value = 'asciitilde'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = 'dotlessi'},
+ {kind = 'name', value = 'grave'},
+ {kind = 'name', value = 'acute'},
+ {kind = 'name', value = 'circumflex'},
+ {kind = 'name', value = 'tilde'},
+ {kind = 'name', value = 'macron'},
+ {kind = 'name', value = 'breve'},
+ {kind = 'name', value = 'dotaccent'},
+ {kind = 'name', value = 'dieresis'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = 'ring'},
+ {kind = 'name', value = 'cedilla'},
+ {kind = 'name', value = '.notdef'},
+ {kind = 'name', value = 'hungarumlaut'},
+ {kind = 'name', value = 'ogonek'},
+ {kind = 'name', value = 'caron'},
+ {kind = 'name', value = 'space'},
+ {kind = 'name', value = 'exclamdown'},
+ {kind = 'name', value = 'cent'},
+ {kind = 'name', value = 'sterling'},
+ {kind = 'name', value = 'currency'},
+ {kind = 'name', value = 'yen'},
+ {kind = 'name', value = 'brokenbar'},
+ {kind = 'name', value = 'section'},
+ {kind = 'name', value = 'dieresis'},
+ {kind = 'name', value = 'copyright'},
+ {kind = 'name', value = 'ordfeminine'},
+ {kind = 'name', value = 'guillemotleft'},
+ {kind = 'name', value = 'logicalnot'},
+ {kind = 'name', value = 'hyphen'},
+ {kind = 'name', value = 'registered'},
+ {kind = 'name', value = 'macron'},
+ {kind = 'name', value = 'degree'},
+ {kind = 'name', value = 'plusminus'},
+ {kind = 'name', value = 'twosuperior'},
+ {kind = 'name', value = 'threesuperior'},
+ {kind = 'name', value = 'acute'},
+ {kind = 'name', value = 'mu'},
+ {kind = 'name', value = 'paragraph'},
+ {kind = 'name', value = 'periodcentered'},
+ {kind = 'name', value = 'cedilla'},
+ {kind = 'name', value = 'onesuperior'},
+ {kind = 'name', value = 'ordmasculine'},
+ {kind = 'name', value = 'guillemotright'},
+ {kind = 'name', value = 'onequarter'},
+ {kind = 'name', value = 'onehalf'},
+ {kind = 'name', value = 'threequarters'},
+ {kind = 'name', value = 'questiondown'},
+ {kind = 'name', value = 'Agrave'},
+ {kind = 'name', value = 'Aacute'},
+ {kind = 'name', value = 'Acircumflex'},
+ {kind = 'name', value = 'Atilde'},
+ {kind = 'name', value = 'Adieresis'},
+ {kind = 'name', value = 'Aring'},
+ {kind = 'name', value = 'AE'},
+ {kind = 'name', value = 'Ccedilla'},
+ {kind = 'name', value = 'Egrave'},
+ {kind = 'name', value = 'Eacute'},
+ {kind = 'name', value = 'Ecircumflex'},
+ {kind = 'name', value = 'Edieresis'},
+ {kind = 'name', value = 'Igrave'},
+ {kind = 'name', value = 'Iacute'},
+ {kind = 'name', value = 'Icircumflex'},
+ {kind = 'name', value = 'Idieresis'},
+ {kind = 'name', value = 'Eth'},
+ {kind = 'name', value = 'Ntilde'},
+ {kind = 'name', value = 'Ograve'},
+ {kind = 'name', value = 'Oacute'},
+ {kind = 'name', value = 'Ocircumflex'},
+ {kind = 'name', value = 'Otilde'},
+ {kind = 'name', value = 'Odieresis'},
+ {kind = 'name', value = 'multiply'},
+ {kind = 'name', value = 'Oslash'},
+ {kind = 'name', value = 'Ugrave'},
+ {kind = 'name', value = 'Uacute'},
+ {kind = 'name', value = 'Ucircumflex'},
+ {kind = 'name', value = 'Udieresis'},
+ {kind = 'name', value = 'Yacute'},
+ {kind = 'name', value = 'Thorn'},
+ {kind = 'name', value = 'germandbls'},
+ {kind = 'name', value = 'agrave'},
+ {kind = 'name', value = 'aacute'},
+ {kind = 'name', value = 'acircumflex'},
+ {kind = 'name', value = 'atilde'},
+ {kind = 'name', value = 'adieresis'},
+ {kind = 'name', value = 'aring'},
+ {kind = 'name', value = 'ae'},
+ {kind = 'name', value = 'ccedilla'},
+ {kind = 'name', value = 'egrave'},
+ {kind = 'name', value = 'eacute'},
+ {kind = 'name', value = 'ecircumflex'},
+ {kind = 'name', value = 'edieresis'},
+ {kind = 'name', value = 'igrave'},
+ {kind = 'name', value = 'iacute'},
+ {kind = 'name', value = 'icircumflex'},
+ {kind = 'name', value = 'idieresis'},
+ {kind = 'name', value = 'eth'},
+ {kind = 'name', value = 'ntilde'},
+ {kind = 'name', value = 'ograve'},
+ {kind = 'name', value = 'oacute'},
+ {kind = 'name', value = 'ocircumflex'},
+ {kind = 'name', value = 'otilde'},
+ {kind = 'name', value = 'odieresis'},
+ {kind = 'name', value = 'divide'},
+ {kind = 'name', value = 'oslash'},
+ {kind = 'name', value = 'ugrave'},
+ {kind = 'name', value = 'uacute'},
+ {kind = 'name', value = 'ucircumflex'},
+ {kind = 'name', value = 'udieresis'},
+ {kind = 'name', value = 'yacute'},
+ {kind = 'name', value = 'thorn'},
+ {kind = 'name', value = 'ydieresis'},
+ }}
+}}
+systemdict.value.systemdict = systemdict
+dictionary_stack = {systemdict, globaldict, userdict}
+-- local execution_stack = {} -- Currently not implemented
+
+-- Quite some stuff is missing here since these aren't implemented yet. Anyway mostly useful for testing.
+ResourceCategories.value.Font = {kind = 'dict', value = {
+ Category = {kind = 'name', value = 'Font'},
+ InstanceType = 'dicttype',
+ DefineResource = systemdict.value.definefont,
+ FindResource = systemdict.value.findfont,
+}}
+
+ResourceCategories.value.Generic = {kind = 'dict', value = {
+ Category = {kind = 'name', value = 'Generic'},
+ DefineResource = function()
+ local instance = pop()
+ local key = pop_key()
+ execute_tok'.Instances'
+ local instances = pop_dict()
+ instances[key] = instance
+ push(instance)
+ end,
+ UndefineResource = function()
+ local key = pop_key()
+ execute_tok'.Instances'
+ local instances = pop_dict()
+ instances[key] = nil
+ end,
+ FindResource = function()
+ local key = pop_key()
+ execute_tok'.Instances'
+ local instances = pop_dict()
+ local instance = instances[key]
+ if instance then
+ push(instance)
+ return
+ end
+ push(key)
+ ps_error'undefinedresource'
+ end,
+ -- ResourceStatus = function()
+ -- local key = pop_key()
+ -- execute_tok'.Instances'
+ -- local instances = pop_dict()
+ -- local instance = instances[key]
+ -- if instance then
+ -- push(instance)
+ -- return
+ -- end
+ -- push(key)
+ -- ps_error'undefinedresource'
+ -- end,
+ -- ResourceForAll = function()
+ -- local key = pop_key()
+ -- execute_tok'.Instances'
+ -- local instances = pop_dict()
+ -- local instance = instances[key]
+ -- if instance then
+ -- push(instance)
+ -- return
+ -- end
+ -- push(key)
+ -- ps_error'undefinedresource'
+ -- end,
+ ['.Instances'] = {kind = 'dict', value = {}},
+}}
+
+local register_texbox do
+ local meta = {__gc = function(t) node.direct.free(t.box) end}
+ local dict = {}
+ ResourceCategories.value['.TeXBox'] = {kind = 'dict', value = {
+ Category = {kind = 'name', value = '.TeXBox'},
+ DefineResource = function()
+ push{kind = 'name', value = '.TeXBox'}
+ ps_error'undefined'
+ end,
+ UndefineResource = function()
+ local key = pop_key()
+ dict[key] = nil
+ end,
+ FindResource = function()
+ local key = pop_key()
+ local instance = dict[key]
+ if instance then
+ push(instance)
+ return
+ end
+ push(key)
+ ps_error'undefinedresource'
+ end,
+ }}
+ local id = 0
+ function register_texbox(box)
+ id = id + 1
+ box = setmetatable({box = node.direct.todirect(box)}, meta)
+ local op = function() flush_delayed() vf.push() vf.node(box.box) vf.pop() end
+ lua_node_lookup[op] = box
+ dict[id] = op
+ return id
+ end
+end
+
+ResourceCategories.value.Category = {kind = 'dict', value = {
+ Category = {kind = 'name', value = 'Generic'},
+ InstanceType = 'dicttype',
+ DefineResource = function()
+ local instance = pop()
+ local key = pop_key()
+ ResourceCategories.value[key] = instance
+ push(instance)
+ end,
+ UndefineResource = function()
+ local key = pop_key()
+ ResourceCategories.value[key] = nil
+ end,
+ FindResource = function()
+ local key = pop_key()
+ local instance = ResourceCategories.value[key]
+ if instance then
+ push(instance)
+ return
+ end
+ push(key)
+ ps_error'undefinedresource'
+ end,
+ -- ResourceStatus = function()
+ -- local key = pop_key()
+ -- execute_tok'.Instances'
+ -- local instances = pop_dict()
+ -- local instance = instances[key]
+ -- if instance then
+ -- push(instance)
+ -- return
+ -- end
+ -- push(key)
+ -- ps_error'undefinedresource'
+ -- end,
+ -- ResourceForAll = function()
+ -- local key = pop_key()
+ -- execute_tok'.Instances'
+ -- local instances = pop_dict()
+ -- local instance = instances[key]
+ -- if instance then
+ -- push(instance)
+ -- return
+ -- end
+ -- push(key)
+ -- ps_error'undefinedresource'
+ -- end,
+}}
+
+function execute_tok(tok, suppress_proc)
+ local ttok = type(tok)
+ if ttok == 'string' then
+ return execute_tok(lookup(tok))
+ elseif ttok == 'function' then
+ return tok()
+ elseif ttok == 'table' and tok.kind == 'executable' then
+ local vtok = tok.value
+ ttok = type(vtok)
+ if suppress_proc and ttok == 'table' and tok.value.kind == 'array' then
+ return push(tok)
+ end
+ if ttok == 'table' then
+ local kind = vtok.kind
+ if kind == 'array' then
+ return execute_ps(vtok.value)
+ elseif kind == 'string' then
+ return execute_ps(assert(parse_ps(vtok.value), 'syntaxerror'))
+ else
+ error'Unimplemented'
+ end
+ elseif ttok == 'number' then
+ return push(tok)
+ else
+ error'Unimplemented'
+ end
+ else
+ return push(tok)
+ end
+end
+
+function execute_ps(tokens)
+ for i=1, #tokens do
+ execute_tok(tokens[i], true)
+ end
+end
+local any_object_or_end = any_object * l.Cp() + whitespace^-1 * -1 * l.Cc(nil) + l.Cp() * l.Cc(false)
+function execute_string(str, context)
+ local pos = 1
+ while true do
+ local tok
+ tok, pos = any_object_or_end:match(str, pos)
+ if pos then
+ local success, err = pcall(execute_tok, tok, true)
+ if not success then
+ if context and type(err) == 'table' and err.pserror and not err.context then
+ err.tok = tok
+ err.context = context
+ end
+ error(err)
+ end
+ elseif pos == false then
+ ps_error'syntaxerror'
+ else
+ break
+ end
+ end
+end
+
+local func = luatexbase.new_luafunction'luaPSTheader'
+token.set_lua('luaPSTheader', func, 'protected')
+lua.get_functions_table()[func] = function()
+ local stack_depth = #operand_stack
+ local filename = token.scan_argument()
+ local f = io.open(kpse.find_file(filename, 'PostScript header'), 'r')
+ local src = f:read'a'
+ f:close()
+ execute_string(src, filename)
+ if #operand_stack ~= stack_depth then
+ error'Unexpected values on operand stack'
+ end
+end
+
+local func = luatexbase.new_luafunction'showPS'
+token.set_lua('showPS', func, 'protected')
+lua.get_functions_table()[func] = function()
+ local command = token.scan_argument(true)
+ local tokens = parse_ps(command)
+ execute_ps(tokens)
+ for i = 1, #operand_stack do
+ local op = operand_stack[i]
+ operand_stack[i] = nil
+ if type(op) == 'table' then
+ print(op.kind, op.value)
+ else
+ print(op)
+ end
+ end
+end
+
+local ps_tokens, ps_direct, ps_context, ps_pos_x, ps_pos_y
+local fid = font.define{
+ name = 'dummy virtual font for PS rendering',
+ -- type = 'virtual',
+ characters = {
+ [0x1F3A8] = {
+ commands = {
+ {'lua', function(fid)
+ local n = node.new('glyph', 256)
+ n.font = fid
+ n.char = 1
+ assert(not ps_pos_x)
+ ps_pos_x, ps_pos_y = pdf.getpos()
+ n.xoffset = -ps_pos_x
+ n.yoffset = -ps_pos_y
+ n = node.hpack(n)
+ vf.node(node.direct.todirect(n))
+ node.free(n)
+ end}
+ }
+ },
+ [1] = {
+ commands = {
+ {'lua', function()
+ local tokens, direct = assert(ps_tokens), ps_direct
+ ps_tokens = nil
+ local x, y = pdf.getpos()
+ local height = #operand_stack
+ operand_stack[height + 1], operand_stack[height + 2] = ps_pos_x/65781.76, ps_pos_y/65781.76
+ ps_pos_x, ps_pos_y = nil
+ if direct then
+ systemdict.value.moveto()
+ else
+ systemdict.value.gsave()
+ systemdict.value.translate()
+ end
+ local success, err = pcall(execute_string, tokens, ps_context)
+ if not success then
+ if type(err) == 'table' and err.pserror then
+ tex.error(string.format('luapstricks: %q error occured while executing PS code from %q', err.pserror, err.context), {
+ string.format('The error occured while executing the PS command %q.\n%s', err.tok, err.trace)
+ })
+ else
+ error(err, 0)
+ end
+ end
+ flush_delayed()
+ if not direct then
+ systemdict.value.grestore()
+ local new_height = #operand_stack
+ assert(new_height >= height)
+ for k = height + 1, new_height do
+ operand_stack[k] = nil
+ end
+ end
+ end}
+ }
+ },
+ },
+}
+
+local modes = tex.getmodevalues()
+local func = luatexbase.new_luafunction'luaPST'
+token.set_lua('luaPST', func, 'protected')
+lua.get_functions_table()[func] = function()
+ local context = string.format('%s:%i', status.filename, status.linenumber)
+ local direct = token.scan_keyword'direct'
+ local tokens = token.scan_argument(true)
+ local n = node.new('whatsit', 'late_lua')
+ function n.data()
+ assert(not ps_tokens)
+ ps_tokens = tokens
+ ps_direct = direct
+ ps_context = context
+ end
+ local nn = node.new('glyph')
+ nn.subtype = 256
+ nn.font, nn.char = fid, 0x1F3A8
+ n.next = nn
+ local modename = modes[math.abs(tex.nest.top.mode)]
+ if 'horizontal' ~= modename then
+ n = node.hpack(n) -- Glyphs can only appear in hmode
+ if 'math' == modename then
+ local d = node.new'disc'
+ d.penalty = 10000
+ d.replace = n
+ n = d
+ end
+ end
+ if tex.nest.ptr == 0 then
+ -- Main vertical list. Here we might appear before the page starts properly
+ -- and should not freeze page specifications. Since we don't have any outer dimensions,
+ -- we can ensure this by sneaking our node into the current page list whithout going though
+ -- build_page.
+ tex.triggerbuildpage() -- First ensure that everything else is contributed properly.
+ tex.lists.page_head = node.insert_after(tex.lists.page_head, nil, n)
+ else
+ node.write(n)
+ end
+end
+
+do
+ func = luatexbase.new_luafunction'luaPSTcolor'
+ token.set_lua('luaPSTcolor', func)
+ local ps_rgb = 'rgb ' * l.C(l.P(1)^0) * l.Cc' setrgbcolor' * l.Cc'rgb '
+ local ps_cmyk = 'cmyk ' * l.C(l.P(1)^0) * l.Cc' setcmykcolor' * l.Cc'cmyk '
+ local ps_gray = 'gray ' * l.C(l.P(1)^0) * l.Cc' setgray' * l.Cc'gray '
+ local pscolor = ps_rgb + ps_gray + ps_gray
+ local pdf_rgb = l.Cmt(l.C(number * whitespace * number * whitespace * number / 0) * whitespace * 'rg'
+ * whitespace * l.C(number * whitespace * number * whitespace * number / 0) * whitespace * 'RG' * -1, function(s, p, a, b)
+ if a == b then
+ return true, a, ' setrgbcolor', 'rgb '
+ else
+ return false
+ end
+ end)
+ local pdf_cmyk = l.Cmt(l.C(number * whitespace * number * whitespace * number * whitespace * number / 0) * whitespace * 'k'
+ * whitespace * l.C(number * whitespace * number * whitespace * number * whitespace * number / 0) * whitespace * 'K' * -1, function(s, p, a, b)
+ if a == b then
+ return true, a, ' setcmykcolor', 'cmyk '
+ else
+ return false
+ end
+ end)
+ local pdf_gray = l.Cmt(l.C(number / 0) * whitespace * 'g'
+ * whitespace * l.C(number / 0) * whitespace * 'G' * -1, function(s, p, a, b)
+ if a == b then
+ return true, a, ' setgray', 'gray '
+ else
+ return false
+ end
+ end)
+ local pdf_other = l.Cs(l.Cc'(' * l.P(1)^0 * l.Cc')') * l.C' setpdfcolor' * l.C'gray '
+ local pdfcolor = pdf_rgb + pdf_cmyk + pdf_gray + pdf_other
+ local anycolor = pscolor + pdfcolor
+ lua.get_functions_table()[func] = function()
+ local dvips_format = token.scan_keyword'dvips'
+ local result, suffix, prefix = anycolor:match(token.scan_argument())
+ tex.sprint(-2, dvips_format and prefix .. result or result .. suffix)
+ end
+end
+
+func = luatexbase.new_luafunction'luaPSTbox'
+token.set_lua('luaPSTbox', func)
+lua.get_functions_table()[func] = function()
+ local box = register_texbox(token.scan_list())
+ tex.sprint(-2, tostring(box))
+end
diff --git a/macros/latex/contrib/zref-check/CHANGELOG.md b/macros/latex/contrib/zref-check/CHANGELOG.md
index 130aaf8ad7..7ce9594a63 100644
--- a/macros/latex/contrib/zref-check/CHANGELOG.md
+++ b/macros/latex/contrib/zref-check/CHANGELOG.md
@@ -1,6 +1,19 @@
# Changelog
-## [Unreleased](https://github.com/gusbrs/zref-check/compare/v0.2.0...HEAD)
+## [Unreleased](https://github.com/gusbrs/zref-check/compare/v0.2.1...HEAD)
+
+## [v0.2.1](https://github.com/gusbrs/zref-check/compare/v0.2.0...v0.2.1) (2021-09-16)
+
+### Changed
+- Use `\msg_line_context:` instead of `\msg_line_number:` for messages.
+- Use more efficient way to set checks as option keys in `\zcheck`.
+- Spare setting end label in `\zcheck` for checks which don't need it.
+- Separate `zref` property lists for checks and targets, so that only the
+ minimum set of required properties for each are used.
+
+### Added
+- New `pagegap` check.
+- Provide infrastructure for integration with `zref-clever`.
## [v0.2.0](https://github.com/gusbrs/zref-check/compare/v0.1.0...v0.2.0) (2021-08-17)
diff --git a/macros/latex/contrib/zref-check/zref-check-code.pdf b/macros/latex/contrib/zref-check/zref-check-code.pdf
index b412a1c5be..f2af1c0794 100644
--- a/macros/latex/contrib/zref-check/zref-check-code.pdf
+++ b/macros/latex/contrib/zref-check/zref-check-code.pdf
Binary files differ
diff --git a/macros/latex/contrib/zref-check/zref-check.dtx b/macros/latex/contrib/zref-check/zref-check.dtx
index 29c48befbd..584cf1b316 100644
--- a/macros/latex/contrib/zref-check/zref-check.dtx
+++ b/macros/latex/contrib/zref-check/zref-check.dtx
@@ -231,6 +231,10 @@
% \item[nextpage] \meta{label} occurs on the next page relative to
% \cs{zcheck}.
%
+% \item[pagegap] There is a page gap between \meta{label} and \cs{zcheck}, in
+% other words, \meta{label} does \emph{not} occur on \opt{thispage},
+% \opt{prevpage} or \opt{nextpage}.
+%
% \item[facing] On a \texttt{twoside} document, both \meta{label} and
% \cs{zcheck} fall onto a double spread, each on one of the two facing
% pages.
@@ -512,6 +516,16 @@
% may be needed for these checks to work as expected.
%
%
+%
+% \section{Change history}
+%
+% A change log with relevant changes for each version, eventual upgrade
+% instructions, and upcoming changes, is maintained in the package's
+% repository, at
+% \url{https://github.com/gusbrs/zref-check/blob/main/CHANGELOG.md}.
+%
+%
+%
% \end{documentation}
%
%
@@ -549,7 +563,7 @@
%
% Identify the package.
% \begin{macrocode}
-\ProvidesExplPackage {zref-check} {2021-08-17} {0.2.0}
+\ProvidesExplPackage {zref-check} {2021-09-16} {0.2.1}
{Flexible cross-references with contextual checks based on zref}
% \end{macrocode}
%
@@ -600,14 +614,29 @@
% \end{macrocode}
%
%
-% This is the list of properties to be used by \pkg{zref-check}, that is, the
-% list of properties the references and targets store. This is the minimum
-% set required, more properties may be added according to options.
+% These are the lists of properties to be used by \pkg{zref-check}, that is,
+% the list of properties the references and targets store. This is the
+% minimum set required, more properties may be added according to options.
% \begin{macrocode}
-\zref@newlist { zrefcheck }
-\zref@addprops { zrefcheck }
+\zref@newlist { zrefcheck-check }
+\zref@addprops { zrefcheck-check }
+ {
+ page , % for messages
+ abspage ,
+ zc@abschap ,
+ zc@abssec
+ }
+\zref@newlist { zrefcheck-target }
+\zref@addprops { zrefcheck-target }
+ {
+ page , % so that \zpageref can refer to it
+ abspage ,
+ zc@abschap ,
+ zc@abssec
+ }
+\zref@newlist { zrefcheck-end }
+\zref@addprops { zrefcheck-end }
{
- page ,
abspage ,
zc@abschap ,
zc@abssec
@@ -621,7 +650,7 @@
%
% \begin{macro}{\@@_message:nnnn, \@@_message:nnnx}
% \begin{macrocode}
-\cs_new:Npn \@@_message:nnnn #1#2#3#4
+\cs_new_protected:Npn \@@_message:nnnn #1#2#3#4
{
\use:c { msg_ \l_@@_msglevel_tl :nnnnn }
{ zref-check } {#1} {#2} {#3} {#4}
@@ -632,29 +661,20 @@
%
% \begin{macrocode}
\msg_new:nnn { zref-check } { check-failed }
- {
- Failed~check~'#1'~for~label~'#2' \iow_newline:
- on~page~#3~on~input~line~\msg_line_number:.
- }
+ { Failed~check~'#1'~for~label~'#2'~on~page~#3~\msg_line_context:. }
\msg_new:nnn { zref-check } { double-check }
- {
- Double-check~'#1'~for~label~'#2' \iow_newline:
- on~page~#3~on~input~line~\msg_line_number:.
- }
+ { Double-check~'#1'~for~label~'#2'~on~page~#3~\msg_line_context:. }
% \end{macrocode}
%
% \begin{macrocode}
\msg_new:nnn { zref-check } { check-missing }
- { Check~'#1'~not~defined~on~input~line~\msg_line_number:. }
+ { Check~'#1'~not~defined~\msg_line_context:. }
\msg_new:nnn { zref-check } { property-undefined }
- { Property~'#1'~not~defined~on~input~line~\msg_line_number:. }
+ { Property~'#1'~not~defined~\msg_line_context:. }
\msg_new:nnn { zref-check } { property-not-in-label }
- { Label~'#1'~has~no~property~'#2'~on~input~line~\msg_line_number:. }
+ { Label~'#1'~has~no~property~'#2'~\msg_line_context:. }
\msg_new:nnn { zref-check } { property-not-integer }
- {
- Property~'#1'~for~label~'#2'~not~an~integer \iow_newline:
- on~input~line~\msg_line_number:.
- }
+ { Property~'#1'~for~label~'#2'~not~an~integer~\msg_line_context:. }
% \end{macrocode}
%
% \begin{macrocode}
@@ -671,14 +691,11 @@
Use~option~'msglevel'~instead.
}
\msg_new:nnn { zref-check } { option-preamble-only }
- {
- Option~'#1'~only~available~in~the~preamble \iow_newline:
- on~input~line~\msg_line_number:.
- }
+ { Option~'#1'~only~available~in~the~preamble~\msg_line_context:. }
\msg_new:nnn { zref-check } { closerange-not-positive-integer }
{
- Option~'closerange'~not~a~positive~integer \iow_newline:
- on~input~line~\msg_line_number:.~Using~default~value.
+ Option~'closerange'~not~a~positive~integer~\msg_line_context:.~
+ Using~default~value.
}
\msg_new:nnn { zref-check } { labelcmd-undefined }
{
@@ -781,7 +798,7 @@
\bool_if:NT \l_@@_use_hyperref_bool
{
\RequirePackage { zref-hyperref }
- \zref@addprop { zrefcheck } { anchor }
+ \zref@addprop { zrefcheck-target } { anchor }
}
}
{
@@ -930,8 +947,8 @@
% and \texttt{zcregion}. It may be redefined at \texttt{begindocument}
% according to option \opt{labelcmd}.
% \begin{macrocode}
-\cs_new:Npn \@@_target_label:n #1
- { \zref@labelbylist {#1} { zrefcheck } }
+\cs_new_protected:Npn \@@_target_label:n #1
+ { \zref@labelbylist {#1} { zrefcheck-target } }
% \end{macrocode}
% \end{macro}
%
@@ -944,7 +961,7 @@
{ \tl_clear:N \l_@@_target_label_tl }
\cs_if_exist:cTF { \l_@@_target_label_tl }
{
- \cs_set:Npx \@@_target_label:n #1
+ \cs_set_protected:Npx \@@_target_label:n #1
{
\exp_not:o
{ \cs:w \l_@@_target_label_tl \cs_end: }
@@ -952,7 +969,7 @@
}
}
{
- \exp_args:NnnV \msg_warning:nnn { zref-check }
+ \exp_args:Nnno \msg_warning:nnn { zref-check }
{ labelcmd-undefined } { \l_@@_target_label_tl }
}
}
@@ -1214,9 +1231,11 @@
% property values as arguments in the checks, however we use here a number
% of non-expandable operations. Hence, we receive a local \texttt{tl/int}
% variable as third argument and set that, so that it is available (and
-% expandable) at the place of use. For this reason, we do not group here,
-% because we are passing a local variable around, but it is expected this
-% function will be called within a group.
+% expandable) at the place of use, and also make these functions `protected'
+% (see egreg's \url{https://tex.stackexchange.com/a/572903}: ``a function
+% that performs assignments should be \texttt{protected}''). For this
+% reason, we do not group here, because we are passing a local variable
+% around, but it is expected this function will be called within a group.
%
% We're returning \cs{c_empty_tl} in case of failure to find the intended
% property value (explicitly in \cs{zref@extractdefault}, but that is also
@@ -1226,7 +1245,7 @@
% \cs{zrefcheck_get_astl:nnn} \Arg{label} \Arg{prop} \Arg{tl var}
% \end{syntax}
% \begin{macrocode}
-\cs_new:Npn \zrefcheck_get_astl:nnn #1#2#3
+\cs_new_protected:Npn \zrefcheck_get_astl:nnn #1#2#3
{
\tl_clear:N #3
\tl_if_eq:nnTF {#2} { lblseq }
@@ -1308,7 +1327,7 @@
% \cs{zrefcheck_get_asint:nnn} \Arg{label} \Arg{prop} \Arg{int var}
% \end{syntax}
% \begin{macrocode}
-\cs_new:Npn \zrefcheck_get_asint:nnn #1#2#3
+\cs_new_protected:Npn \zrefcheck_get_asint:nnn #1#2#3
{
\zrefcheck_get_astl:nnn {#1} {#2} { \l_@@_propval_tl }
\@@_is_integer:nTF { \l_@@_propval_tl }
@@ -1357,8 +1376,7 @@
% \end{syntax}
%
% \begin{macrocode}
-\NewDocumentCommand \zcheck
- { s O { } > { \SplitList { , } } m m }
+\NewDocumentCommand \zcheck { s O { } m m }
{ \zref@wrapper@babel \@@_zcheck:nnnn {#3} {#1} {#2} {#4} }
% \end{macrocode}
% \end{macro}
@@ -1366,17 +1384,17 @@
%
% \begin{variable}
% {
+% \l_@@_zcheck_labels_seq ,
% \g_@@_id_int ,
% \l_@@_checkbeg_tl ,
-% \l_@@_checkend_tl ,
% \l_@@_link_label_tl ,
% \l_@@_link_anchor_tl ,
% \l_@@_link_star_bool
% }
% \begin{macrocode}
+\seq_new:N \l_@@_zcheck_labels_seq
\int_new:N \g_@@_id_int
\tl_new:N \l_@@_checkbeg_tl
-\tl_new:N \l_@@_checkend_tl
\tl_new:N \l_@@_link_label_tl
\tl_new:N \l_@@_link_anchor_tl
\bool_new:N \l_@@_link_star_bool
@@ -1395,36 +1413,31 @@
% \end{syntax}
%
% \begin{macrocode}
-\cs_new:Npn \@@_zcheck:nnnn #1#2#3#4
+\cs_new_protected:Npn \@@_zcheck:nnnn #1#2#3#4
{
\group_begin:
% \end{macrocode}
-% Set checks keys.
-% \begin{macrocode}
- \@@_set_checks_keys:
-% \end{macrocode}
% Process local options and checks.
% \begin{macrocode}
- \keys_set:nn { zref-check } {#3}
+ \keys_set:nn { zref-check / zcheck } {#3}
+ \seq_set_from_clist:Nn \l_@@_zcheck_labels_seq {#1}
% \end{macrocode}
-% Names of the labels for this zrefcheck call.
+% Names of the labels for this zcheck call.
% \begin{macrocode}
\int_gincr:N \g_@@_id_int
\tl_set:Nx \l_@@_checkbeg_tl
{ \@@_check_lblfmt:n { \g_@@_id_int } }
- \tl_set:Nx \l_@@_checkend_tl
- { \@@_end_lblfmt:n { \l_@@_checkbeg_tl } }
% \end{macrocode}
% Set checkbeg label.
% \begin{macrocode}
- \zref@labelbylist { \l_@@_checkbeg_tl } { zrefcheck }
+ \zref@labelbylist { \l_@@_checkbeg_tl } { zrefcheck-check }
% \end{macrocode}
% Typeset \marg{text}, with hyperlink when appropriate. Even though the first
% argument can receive a list of labels, there is no meaningful way to set
% links to multiple targets. Hence, only the first one is considered for
% hyperlinking.
% \begin{macrocode}
- \tl_set:Nn \l_@@_link_label_tl { \tl_head:n {#1} }
+ \seq_get:NN \l_@@_zcheck_labels_seq \l_@@_link_label_tl
\bool_set:Nn \l_@@_link_star_bool {#2}
\zref@ifrefundefined { \l_@@_link_label_tl }
% \end{macrocode}
@@ -1448,16 +1461,21 @@
% \end{macrocode}
% Set checkend label.
% \begin{macrocode}
- \zref@labelbylist { \l_@@_checkend_tl } { zrefcheck }
+ \bool_if:NT \l_@@_zcheck_end_label_bool
+ {
+ \zref@labelbylist
+ { \@@_end_lblfmt:n { \l_@@_checkbeg_tl } }
+ { zrefcheck-end }
+ }
% \end{macrocode}
% Check if \meta{labels} are defined.
% \begin{macrocode}
- \tl_map_function:nN {#1} \zref@refused
+ \seq_map_function:NN \l_@@_zcheck_labels_seq \zref@refused
% \end{macrocode}
% Run the checks.
% \begin{macrocode}
- \@@_run_checks:nnv
- { \l_@@_zcheck_checks_seq } {#1} { l_@@_checkbeg_tl }
+ \@@_run_checks:nnx { \l_@@_zcheck_checks_seq }
+ { \l_@@_zcheck_labels_seq } { \l_@@_checkbeg_tl }
\group_end:
}
% \end{macrocode}
@@ -1483,7 +1501,7 @@
\zref@wrapper@babel \@@_target_label:n {#1}
#2
\zref@wrapper@babel
- \zref@labelbylist { \@@_end_lblfmt:n {#1} } { zrefcheck }
+ \zref@labelbylist { \@@_end_lblfmt:n {#1} } { zrefcheck-end }
\group_end:
}
% \end{macrocode}
@@ -1503,7 +1521,7 @@
}
{
\zref@wrapper@babel
- \zref@labelbylist { \@@_end_lblfmt:n {#1} } { zrefcheck }
+ \zref@labelbylist { \@@_end_lblfmt:n {#1} } { zrefcheck-end }
}
% \end{macrocode}
% \end{macro}
@@ -1516,7 +1534,7 @@
%
% First, a conditional function defined with:
%
-% \cs{prg_new_conditional:Npnn} \cs{@@_check_\meta{check}:nn} |#1#2 { F }|
+% \cs{prg_new_protected_conditional:Npnn} \cs{@@_check_\meta{check}:nn} |#1#2 { F }|
%
% \noindent where \meta{check} is the name of the check, the first argument is
% the \Arg{label} and the second the \Arg{reference}. The existence of the
@@ -1545,145 +1563,122 @@
% \cs{zref@addprop} and friends, as usual.
%
% Third, the check must be registered as a key which gets setup in
-% \cs{zcheck} by \cs{@@_set_checks_keys:}.
+% \cs{zcheck} by the \texttt{ zref-check / zcheck } key set.
+%
+% Fourth, if the check requires only a single label to work, it should be
+% registered in \cs{c_@@_single_label_checks_seq}.
+%
+%
+% \subsection{Single label checks}
+%
+%
+% Some checks do not require an ``end label'' in \cs{zcheck}, notably the
+% sectioning ones, which don't rely on page boundaries. Hence, in case
+% \cs{zcheck} only calls checks in this set, we can spare the setting of the
+% end label.
+%
+% \begin{variable}{\c_@@_single_label_checks_seq}
+% \begin{macrocode}
+\seq_new:N \c_@@_single_label_checks_seq
+\seq_set_from_clist:Nn \c_@@_single_label_checks_seq
+ {
+ thischap ,
+ prevchap ,
+ nextchap ,
+ chapsbefore ,
+ chapsafter ,
+ thissec ,
+ prevsec ,
+ nextsec ,
+ secsbefore ,
+ secsafter ,
+ }
+% \end{macrocode}
+% \end{variable}
+%
%
%
% \subsection{Setup}
%
-% \begin{variable}{\l_@@_zcheck_checks_seq}
+% \begin{variable}{\l_@@_zcheck_checks_seq,\l_@@_end_label_required_bool}
% \begin{macrocode}
\seq_new:N \l_@@_zcheck_checks_seq
+\bool_new:N \l_@@_zcheck_end_label_bool
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}{\@@_set_checks_keys:}
+%
+% First, we inherit all the main options into the keys of \texttt{zref-check /
+% zcheck}.
% \begin{macrocode}
-\cs_new:Npn \@@_set_checks_keys:
+\keys_define:nn { } { zref-check / zcheck .inherit:n = zref-check }
+% \end{macrocode}
+%
+% Then we add the checks to it.
+% \begin{macrocode}
+\clist_map_inline:nn
+ {
+ thispage ,
+ prevpage ,
+ nextpage ,
+ facing ,
+ pagegap ,
+ above ,
+ below ,
+ pagesbefore ,
+ ppbefore ,
+ pagesafter ,
+ ppafter ,
+ before ,
+ after ,
+ thischap ,
+ prevchap ,
+ nextchap ,
+ chapsbefore ,
+ chapsafter ,
+ thissec ,
+ prevsec ,
+ nextsec ,
+ secsbefore ,
+ secsafter ,
+ close ,
+ far ,
+ }
{
- \keys_define:nn { zref-check }
+ \keys_define:nn { zref-check / zcheck }
{
- thispage .code:n =
- { \seq_put_right:Nn \l_@@_zcheck_checks_seq { thispage } } ,
- thispage .value_forbidden:n = true ,
-
- prevpage .code:n =
- { \seq_put_right:Nn \l_@@_zcheck_checks_seq { prevpage } } ,
- prevpage .value_forbidden:n = true ,
-
- nextpage .code:n =
- { \seq_put_right:Nn \l_@@_zcheck_checks_seq { nextpage } } ,
- nextpage .value_forbidden:n = true ,
-
- facing .code:n =
- { \seq_put_right:Nn \l_@@_zcheck_checks_seq { facing } } ,
- facing .value_forbidden:n = true ,
-
- above .code:n =
- { \seq_put_right:Nn \l_@@_zcheck_checks_seq { above } } ,
- above .value_forbidden:n = true ,
-
- below .code:n =
- { \seq_put_right:Nn \l_@@_zcheck_checks_seq { below } } ,
- below .value_forbidden:n = true ,
-
- pagesbefore .code:n =
- { \seq_put_right:Nn \l_@@_zcheck_checks_seq { pagesbefore } } ,
- pagesbefore .value_forbidden:n = true ,
-
- ppbefore .code:n =
- { \seq_put_right:Nn \l_@@_zcheck_checks_seq { ppbefore } } ,
- ppbefore .value_forbidden:n = true ,
-
- pagesafter .code:n =
- { \seq_put_right:Nn \l_@@_zcheck_checks_seq { pagesafter } } ,
- pagesafter .value_forbidden:n = true ,
-
- ppafter .code:n =
- { \seq_put_right:Nn \l_@@_zcheck_checks_seq { ppafter } } ,
- ppafter .value_forbidden:n = true ,
-
- before .code:n =
- { \seq_put_right:Nn \l_@@_zcheck_checks_seq { before } } ,
- before .value_forbidden:n = true ,
-
- after .code:n =
- { \seq_put_right:Nn \l_@@_zcheck_checks_seq { after } } ,
- after .value_forbidden:n = true ,
-
- thischap .code:n =
- { \seq_put_right:Nn \l_@@_zcheck_checks_seq { thischap } } ,
- thischap .value_forbidden:n = true ,
-
- prevchap .code:n =
- { \seq_put_right:Nn \l_@@_zcheck_checks_seq { prevchap } } ,
- prevchap .value_forbidden:n = true ,
-
- nextchap .code:n =
- { \seq_put_right:Nn \l_@@_zcheck_checks_seq { nextchap } } ,
- nextchap .value_forbidden:n = true ,
-
- chapsbefore .code:n =
- { \seq_put_right:Nn \l_@@_zcheck_checks_seq { chapsbefore } } ,
- chapsbefore .value_forbidden:n = true ,
-
- chapsafter .code:n =
- { \seq_put_right:Nn \l_@@_zcheck_checks_seq { chapsafter } } ,
- chapsafter .value_forbidden:n = true ,
-
- thissec .code:n =
- { \seq_put_right:Nn \l_@@_zcheck_checks_seq { thissec } } ,
- thissec .value_forbidden:n = true ,
-
- prevsec .code:n =
- { \seq_put_right:Nn \l_@@_zcheck_checks_seq { prevsec } } ,
- prevsec .value_forbidden:n = true ,
-
- nextsec .code:n =
- { \seq_put_right:Nn \l_@@_zcheck_checks_seq { nextsec } } ,
- nextsec .value_forbidden:n = true ,
-
- secsbefore .code:n =
- { \seq_put_right:Nn \l_@@_zcheck_checks_seq { secsbefore } } ,
- secsbefore .value_forbidden:n = true ,
-
- secsafter .code:n =
- { \seq_put_right:Nn \l_@@_zcheck_checks_seq { secsafter } } ,
- secsafter .value_forbidden:n = true ,
-
- close .code:n =
- { \seq_put_right:Nn \l_@@_zcheck_checks_seq { close } } ,
- close .value_forbidden:n = true ,
-
- far .code:n =
- { \seq_put_right:Nn \l_@@_zcheck_checks_seq { far } } ,
- far .value_forbidden:n = true ,
- }
+ #1 .code:n =
+ {
+ \seq_put_right:Nn \l_@@_zcheck_checks_seq {#1}
+ \seq_if_in:NnF \c_@@_single_label_checks_seq {#1}
+ { \bool_set_true:N \l_@@_zcheck_end_label_bool }
+ } ,
+ #1 .value_forbidden:n = true ,
+ }
}
% \end{macrocode}
-% \end{macro}
-%
%
%
%
% \subsection{Running}
%
-% \begin{macro}{\@@_run_checks:nnn, \@@_run_checks:nnv}
+% \begin{macro}{\@@_run_checks:nnn}
% \begin{syntax}
% \cs{@@_run_checks:nnn} \Arg{checks} \Arg{labels} \Arg{reference}
% \end{syntax}
% \meta{checks} are expected to be received as a sequence variable.
% \begin{macrocode}
-\cs_new:Npn \@@_run_checks:nnn #1#2#3
+\cs_new_protected:Npn \@@_run_checks:nnn #1#2#3
{
\group_begin:
- \tl_map_inline:nn {#2}
+ \seq_map_inline:Nn #2
{
\seq_map_inline:Nn #1
{ \@@_do_check:nnn {####1} {##1} {#3} }
}
\group_end:
}
-\cs_generate_variant:Nn \@@_run_checks:nnn { nnv }
+\cs_generate_variant:Nn \@@_run_checks:nnn { nnx }
% \end{macrocode}
% \end{macro}
%
@@ -1714,7 +1709,7 @@
% \cs{@@_do_check:nnn} \Arg{check} \Arg{label beg} \Arg{reference beg}
% \end{syntax}
% \begin{macrocode}
-\cs_new:Npn \@@_do_check:nnn #1#2#3
+\cs_new_protected:Npn \@@_do_check:nnn #1#2#3
{
\group_begin:
% \end{macrocode}
@@ -1732,37 +1727,45 @@
\bool_set_false:N \l_@@_onpage_bool
\cs_if_exist:cTF { @@_check_ #1 :nnF }
{
-% \end{macrocode}
-% ``label beg'' vs ``reference beg''.
-% \begin{macrocode}
+ % ``label beg'' vs ``reference beg''.
\use:c { @@_check_ #1 :nnF }
{#2} {#3}
{ \bool_set_false:N \l_@@_passedcheck_bool }
-% \end{macrocode}
-% ``label beg'' vs ``reference end''.
-% \begin{macrocode}
- \exp_args:Nnno \use:c { @@_check_ #1 :nnF }
- {#2} { \@@_end_lblfmt:n {#3} }
- { \bool_set_false:N \l_@@_passedcheck_bool }
-% \end{macrocode}
-% ``label end'' \emph{may} have been created by the target commands.
-% \begin{macrocode}
- \zref@ifrefundefined { \@@_end_lblfmt:n {#2} }
- {}
+ % ``reference end'' \emph{may} exist or not depending on the
+ % checks.
+ \zref@ifrefundefined { \@@_end_lblfmt:n {#3} }
{
-% \end{macrocode}
-% ``label end'' vs ``reference beg''.
-% \begin{macrocode}
- \exp_args:Nno \use:c { @@_check_ #1 :nnF }
- { \@@_end_lblfmt:n {#2} } {#3}
- { \bool_set_false:N \l_@@_passedcheck_bool }
-% \end{macrocode}
-% ``label end'' vs ``reference end''.
-% \begin{macrocode}
- \exp_args:Nnoo \use:c { @@_check_ #1 :nnF }
- { \@@_end_lblfmt:n {#2} }
- { \@@_end_lblfmt:n {#3} }
+ % ``label end'' \emph{may} have been created by the
+ % target commands.
+ \zref@ifrefundefined { \@@_end_lblfmt:n {#2} }
+ {}
+ {
+ % ``label end'' vs ``reference beg''.
+ \exp_args:Nno \use:c { @@_check_ #1 :nnF }
+ { \@@_end_lblfmt:n {#2} } {#3}
+ { \bool_set_false:N \l_@@_passedcheck_bool }
+ }
+ }
+ {
+ % ``label beg'' vs ``reference end''.
+ \exp_args:Nnno \use:c { @@_check_ #1 :nnF }
+ {#2} { \@@_end_lblfmt:n {#3} }
{ \bool_set_false:N \l_@@_passedcheck_bool }
+ % ``label end'' \emph{may} have been created by the
+ % target commands.
+ \zref@ifrefundefined { \@@_end_lblfmt:n {#2} }
+ {}
+ {
+ % ``label end'' vs ``reference beg''.
+ \exp_args:Nno \use:c { @@_check_ #1 :nnF }
+ { \@@_end_lblfmt:n {#2} } {#3}
+ { \bool_set_false:N \l_@@_passedcheck_bool }
+ % ``label end'' vs ``reference end''.
+ \exp_args:Nnoo \use:c { @@_check_ #1 :nnF }
+ { \@@_end_lblfmt:n {#2} }
+ { \@@_end_lblfmt:n {#3} }
+ { \bool_set_false:N \l_@@_passedcheck_bool }
+ }
}
% \end{macrocode}
% Handle option \opt{onpage=msg}. This is only granted for tests which
@@ -1839,7 +1842,7 @@
%
% \begin{macro}{\@@_check_thispage:nn}
% \begin{macrocode}
-\prg_new_conditional:Npnn \@@_check_thispage:nn #1#2 { T , F , TF }
+\prg_new_protected_conditional:Npnn \@@_check_thispage:nn #1#2 { T , F , TF }
{
\group_begin:
\bool_set_true:N \l_@@_integer_bool
@@ -1871,7 +1874,7 @@
%
% \begin{macro}{\@@_check_above:nn, \@@_check_below:nn}
% \begin{macrocode}
-\prg_new_conditional:Npnn \@@_check_above:nn #1#2 { F , TF }
+\prg_new_protected_conditional:Npnn \@@_check_above:nn #1#2 { F , TF }
{
\group_begin:
\@@_check_thispage:nnTF {#1} {#2}
@@ -1893,7 +1896,7 @@
{ \group_insert_after:N \prg_return_false: }
\group_end:
}
-\prg_new_conditional:Npnn \@@_check_below:nn #1#2 { F , TF }
+\prg_new_protected_conditional:Npnn \@@_check_below:nn #1#2 { F , TF }
{
\@@_check_thispage:nnTF {#1} {#2}
{
@@ -1911,7 +1914,7 @@
%
% \begin{macro}{\@@_check_before:nn, \@@_check_after:nn}
% \begin{macrocode}
-\prg_new_conditional:Npnn \@@_check_before:nn #1#2 { F }
+\prg_new_protected_conditional:Npnn \@@_check_before:nn #1#2 { F }
{
\@@_check_pagesbefore:nnTF {#1} {#2}
{ \prg_return_true: }
@@ -1921,7 +1924,7 @@
{ \prg_return_false: }
}
}
-\prg_new_conditional:Npnn \@@_check_after:nn #1#2 { F }
+\prg_new_protected_conditional:Npnn \@@_check_after:nn #1#2 { F }
{
\@@_check_pagesafter:nnTF {#1} {#2}
{ \prg_return_true: }
@@ -1945,10 +1948,11 @@
% \@@_check_ppbefore:nn ,
% \@@_check_pagesafter:nn ,
% \@@_check_ppafter:nn ,
+% \@@_check_pagegap:nn ,
% \@@_check_facing:nn
% }
% \begin{macrocode}
-\prg_new_conditional:Npnn \@@_check_nextpage:nn #1#2 { F }
+\prg_new_protected_conditional:Npnn \@@_check_nextpage:nn #1#2 { F }
{
\group_begin:
\bool_set_true:N \l_@@_integer_bool
@@ -1966,7 +1970,7 @@
{ \group_insert_after:N \prg_return_false: }
\group_end:
}
-\prg_new_conditional:Npnn \@@_check_prevpage:nn #1#2 { F }
+\prg_new_protected_conditional:Npnn \@@_check_prevpage:nn #1#2 { F }
{
\group_begin:
\bool_set_true:N \l_@@_integer_bool
@@ -1984,7 +1988,7 @@
{ \group_insert_after:N \prg_return_false: }
\group_end:
}
-\prg_new_conditional:Npnn \@@_check_pagesbefore:nn #1#2 { F , TF }
+\prg_new_protected_conditional:Npnn \@@_check_pagesbefore:nn #1#2 { F , TF }
{
\group_begin:
\bool_set_true:N \l_@@_integer_bool
@@ -2003,7 +2007,7 @@
\group_end:
}
\cs_new_eq:NN \@@_check_ppbefore:nnF \@@_check_pagesbefore:nnF
-\prg_new_conditional:Npnn \@@_check_pagesafter:nn #1#2 { F , TF }
+\prg_new_protected_conditional:Npnn \@@_check_pagesafter:nn #1#2 { F , TF }
{
\group_begin:
\bool_set_true:N \l_@@_integer_bool
@@ -2022,7 +2026,25 @@
\group_end:
}
\cs_new_eq:NN \@@_check_ppafter:nnF \@@_check_pagesafter:nnF
-\prg_new_conditional:Npnn \@@_check_facing:nn #1#2 { F }
+\prg_new_protected_conditional:Npnn \@@_check_pagegap:nn #1#2 { F }
+ {
+ \group_begin:
+ \bool_set_true:N \l_@@_integer_bool
+ \zrefcheck_get_asint:nnn {#1} { abspage } { \l_@@_lbl_int }
+ \zrefcheck_get_asint:nnn {#2} { abspage } { \l_@@_ref_int }
+ \bool_lazy_and:nnTF
+ { \l_@@_integer_bool }
+ {
+ \int_compare_p:nNn
+ { \int_abs:n { \l_@@_lbl_int - \l_@@_ref_int } } > { 1 } &&
+ ! \int_compare_p:nNn { \l_@@_lbl_int } = { 0 } &&
+ ! \int_compare_p:nNn { \l_@@_ref_int } = { 0 }
+ }
+ { \group_insert_after:N \prg_return_true: }
+ { \group_insert_after:N \prg_return_false: }
+ \group_end:
+ }
+\prg_new_protected_conditional:Npnn \@@_check_facing:nn #1#2 { F }
{
\group_begin:
\bool_set_true:N \l_@@_integer_bool
@@ -2065,7 +2087,7 @@
%
% \begin{macro}{\@@_check_close:nn, \@@_check_far:nn}
% \begin{macrocode}
-\prg_new_conditional:Npnn \@@_check_close:nn #1#2 { F , TF }
+\prg_new_protected_conditional:Npnn \@@_check_close:nn #1#2 { F , TF }
{
\group_begin:
\bool_set_true:N \l_@@_integer_bool
@@ -2085,7 +2107,7 @@
{ \group_insert_after:N \prg_return_false: }
\group_end:
}
-\prg_new_conditional:Npnn \@@_check_far:nn #1#2 { F }
+\prg_new_protected_conditional:Npnn \@@_check_far:nn #1#2 { F }
{
\@@_check_close:nnTF {#1} {#2}
{ \prg_return_false: }
@@ -2106,7 +2128,7 @@
% \@@_check_chapsbefore:nn
% }
% \begin{macrocode}
-\prg_new_conditional:Npnn \@@_check_thischap:nn #1#2 { F }
+\prg_new_protected_conditional:Npnn \@@_check_thischap:nn #1#2 { F }
{
\group_begin:
\bool_set_true:N \l_@@_integer_bool
@@ -2132,7 +2154,7 @@
{ \group_insert_after:N \prg_return_false: }
\group_end:
}
-\prg_new_conditional:Npnn \@@_check_nextchap:nn #1#2 { F }
+\prg_new_protected_conditional:Npnn \@@_check_nextchap:nn #1#2 { F }
{
\group_begin:
\bool_set_true:N \l_@@_integer_bool
@@ -2149,7 +2171,7 @@
{ \group_insert_after:N \prg_return_false: }
\group_end:
}
-\prg_new_conditional:Npnn \@@_check_prevchap:nn #1#2 { F }
+\prg_new_protected_conditional:Npnn \@@_check_prevchap:nn #1#2 { F }
{
\group_begin:
\bool_set_true:N \l_@@_integer_bool
@@ -2167,7 +2189,7 @@
{ \group_insert_after:N \prg_return_false: }
\group_end:
}
-\prg_new_conditional:Npnn \@@_check_chapsafter:nn #1#2 { F }
+\prg_new_protected_conditional:Npnn \@@_check_chapsafter:nn #1#2 { F }
{
\group_begin:
\bool_set_true:N \l_@@_integer_bool
@@ -2184,7 +2206,7 @@
{ \group_insert_after:N \prg_return_false: }
\group_end:
}
-\prg_new_conditional:Npnn \@@_check_chapsbefore:nn #1#2 { F }
+\prg_new_protected_conditional:Npnn \@@_check_chapsbefore:nn #1#2 { F }
{
\group_begin:
\bool_set_true:N \l_@@_integer_bool
@@ -2217,7 +2239,7 @@
% \@@_check_secsbefore:nn
% }
% \begin{macrocode}
-\prg_new_conditional:Npnn \@@_check_thissec:nn #1#2 { F }
+\prg_new_protected_conditional:Npnn \@@_check_thissec:nn #1#2 { F }
{
\group_begin:
\bool_set_true:N \l_@@_integer_bool
@@ -2247,7 +2269,7 @@
{ \group_insert_after:N \prg_return_false: }
\group_end:
}
-\prg_new_conditional:Npnn \@@_check_nextsec:nn #1#2 { F }
+\prg_new_protected_conditional:Npnn \@@_check_nextsec:nn #1#2 { F }
{
\group_begin:
\bool_set_true:N \l_@@_integer_bool
@@ -2268,7 +2290,7 @@
{ \group_insert_after:N \prg_return_false: }
\group_end:
}
-\prg_new_conditional:Npnn \@@_check_prevsec:nn #1#2 { F }
+\prg_new_protected_conditional:Npnn \@@_check_prevsec:nn #1#2 { F }
{
\group_begin:
\bool_set_true:N \l_@@_integer_bool
@@ -2290,7 +2312,7 @@
{ \group_insert_after:N \prg_return_false: }
\group_end:
}
-\prg_new_conditional:Npnn \@@_check_secsafter:nn #1#2 { F }
+\prg_new_protected_conditional:Npnn \@@_check_secsafter:nn #1#2 { F }
{
\group_begin:
\bool_set_true:N \l_@@_integer_bool
@@ -2311,7 +2333,7 @@
{ \group_insert_after:N \prg_return_false: }
\group_end:
}
-\prg_new_conditional:Npnn \@@_check_secsbefore:nn #1#2 { F }
+\prg_new_protected_conditional:Npnn \@@_check_secsbefore:nn #1#2 { F }
{
\group_begin:
\bool_set_true:N \l_@@_integer_bool
@@ -2337,6 +2359,50 @@
% \end{macro}
%
%
+%
+% \section{\pkg{zref-clever} integration}
+%
+%
+% There are four tasks \pkg{zref-clever} needs to do, in order to offer
+% integration with \pkg{zref-check} from the options of \cs{zcref}: i) set the
+% ``beg label''; ii) set the checks options; iii) run the checks; iv)
+% (possibly) set the ``end label''. Since `ii)' can be done directly by
+% running |\keys_set:nn { zref-check / zcheck }| on the options received, we
+% provide convenience functions for the other three tasks.
+%
+%
+% \begin{macro}
+% {
+% \zrefcheck_zcref_beg_label: ,
+% \zrefcheck_zcref_end_label_maybe: ,
+% \zrefcheck_zcref_run_checks_on_labels:n
+% }
+% \begin{macrocode}
+\cs_new_protected:Npn \zrefcheck_zcref_beg_label:
+ {
+ \int_gincr:N \g_@@_id_int
+ \tl_set:Nx \l_@@_checkbeg_tl
+ { \@@_check_lblfmt:n { \g_@@_id_int } }
+ \zref@labelbylist { \l_@@_checkbeg_tl } { zrefcheck-check }
+ }
+\cs_new_protected:Npn \zrefcheck_zcref_end_label_maybe:
+ {
+ \bool_if:NT \l_@@_zcheck_end_label_bool
+ {
+ \zref@labelbylist
+ { \@@_end_lblfmt:n { \l_@@_checkbeg_tl } }
+ { zrefcheck-end }
+ }
+ }
+\cs_new_protected:Npn \zrefcheck_zcref_run_checks_on_labels:n #1
+ {
+ \@@_run_checks:nnx
+ { \l_@@_zcheck_checks_seq } {#1} { \l_@@_checkbeg_tl }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
% \begin{macrocode}
%</package>
% \end{macrocode}
diff --git a/macros/latex/contrib/zref-check/zref-check.pdf b/macros/latex/contrib/zref-check/zref-check.pdf
index f7b1110802..2197eda816 100644
--- a/macros/latex/contrib/zref-check/zref-check.pdf
+++ b/macros/latex/contrib/zref-check/zref-check.pdf
Binary files differ
diff --git a/macros/unicodetex/latex/njuthesis/README.md b/macros/unicodetex/latex/njuthesis/README.md
index d7c4cb33aa..e8e9c42190 100644
--- a/macros/unicodetex/latex/njuthesis/README.md
+++ b/macros/unicodetex/latex/njuthesis/README.md
@@ -1,11 +1,8 @@
-# NJU Thesis
-
-[![njuthesis](https://img.shields.io/badge/njuthesis-latex-blue)](https://git.nju.edu.cn/nju-lug/nju-latex-templates)
-[![overleaf](https://img.shields.io/badge/overleaf-supported-brightgreen)](https://tex.nju.edu.cn)
+# The njuthesis class
## Overview
-This is A LaTex Template for Nanjing University Bachelor Thesis. The Template needs `xelatex` or `lualatex`.
+This package is intended for typesetting Nanjing University thesis with LaTeX, providing support for bachelor, master, and doctoral thesis. Compilation of this class requires either `xelatex` or `lualatex` engine.
## License
@@ -18,7 +15,7 @@ This is A LaTex Template for Nanjing University Bachelor Thesis. The Template ne
## Contributing
-If you find a problem with the template, please submit an issue or PR in Github
+If you run into any problem with the template, please contact us via Github issue or submit Pull Request.
## Wiki
diff --git a/macros/unicodetex/latex/njuthesis/README_ZH_CN.md b/macros/unicodetex/latex/njuthesis/README_ZH_CN.md
new file mode 100644
index 0000000000..a3e0d04645
--- /dev/null
+++ b/macros/unicodetex/latex/njuthesis/README_ZH_CN.md
@@ -0,0 +1,77 @@
+# NJU Thesis
+
+[![njuthesis](https://img.shields.io/badge/njuthesis-latex-blue)](https://git.nju.edu.cn/nju-lug/nju-latex-templates)
+[![overleaf](https://img.shields.io/badge/overleaf-supported-brightgreen)](https://tex.nju.edu.cn)
+![build status](https://github.com/nju-lug/NJUThesis/actions/workflows/build.yml/badge.svg)
+
+> цндщб╣чЫоцШпхЯ║ф║О[NJU thesis 2021](https://github.com/FengChendian/NJUThesis2021)чЪДщЗНцЮДчЙИцЬмя╝МчЫохЙНцЬмчзСчФЯчЙИцЬм**х╖▓ч╗ПхЯ║цЬмщЗНцЮДхоМцИР**я╝МчбХхНЪшо║цЦЗ**цнгхЬи**ца╣цНочаФчй╢чФЯщЩвчЪДцЦЗф╗╢щЗНцЮДя╝Мф╜ЖчаФчй╢чФЯщЩвчЪДшзДхоЪх╣╢ф╕НхоМхЦДя╝МхЫацндщГихИЖца╝х╝ПхПпшГ╜ф╝ЪхПВшАГцЬмчзСчЪДя╝М**хжВцЮЬщЩвч│╗хПжцЬЙшжБц▒Вя╝Мшп╖шЗкшбМф┐оцФ╣цИЦшАЕцПРф║дissue**уАВ
+
+хОЯцЭечЪД[NJU thesis 2021](https://github.com/FengChendian/NJUThesis2021)цибцЭ┐хдкш┐ЗхПдшАБх╣╢ф╕Фф╕НцФпцМБчбХхглуАБхНЪхглшо║цЦЗя╝МчЫохЙНщЪ╛ф╗еч╗┤цКдя╝МхЫацндф╕║ф║ЖцибцЭ┐чЪДхПпцМБч╗нхПСх▒Хя╝МчО░хЬих░Жхп╣шпещб╣чЫош┐ЫшбМщЗНцЮДя╝Мщб╣чЫоцМВш╜╜ф║О[NJU-LUG](https://github.com/nju-lug)ч╗Дч╗Зф╗Ух║Уф╕Ля╝МчЫохЙНх╖▓[хПСх╕ГхЬиCTAN](https://ctan.org/pkg/njuthesis)уАВ
+
+чЫ╕хЕ│цЦЗцбгшп╖хПВшзБ[цЬмщб╣чЫоwiki](https://github.com/nju-lug/NJUThesis/wiki)уАВ
+
+## х┐лщАЯх╝АхзЛ
+
+ф╗О0.9.0чЙИф╗ехРОя╝МцЬмцибцЭ┐ф╗еDocStrip(`.dtx`)ца╝х╝Пш┐ЫшбМч╗┤цКдуАВх╕╕шзДчЪД`.cls`ца╝х╝ПцЦЗф╗╢хПпф╗ОReleasesщб╡щЭвф╕Лш╜╜цИЦф╜┐чФиф╗еф╕ЛцЦ╣ц│ХцПРхПЦуАВ
+
+### хЕ│ф║ОDocStripцЦЗф╗╢
+
+DocStripца╝х╝ПхРИх╣╢ф║ЖLaTeXц║Рф╗гчаБхТМшп┤цШОцЦЗцбгя╝МцЫ┤цЬЙхИйф║ОхоПхМЕчЪДхПСх╕ГуАВшжБф╜┐чФишпецЦЗф╗╢я╝Мшп╖хЬих╜УхЙНх╖еф╜ЬчЫох╜Хф╕ЛцЙУх╝Ач╗Ичлпя╝Ъ
+
+- ш╛УхЕе`xetex njuthesis.dtx`ф╗ецПРхПЦхоПхМЕхЖЕхо╣
+- ш╛УхЕе`latexmk njuthesis.dtx`ф╗ечФЯцИРх╣╢цЯечЬЛхЖЕч╜очЪДцЦЗцбг
+
+шп╖ц│ицДПя╝МчФ▒ф║ОцЦЗф╗╢щЗНхРНхОЯхЫая╝Мщб╣чЫоф╕нчЪДчд║ф╛Лшо║цЦЗцибцЭ┐х╖▓швлщЗНхС╜хРНф╕║`njuthesis-sample.tex`уАВ
+
+### цЬмхЬ░ч╝ЦшпС
+
+1. [ф╗ОхНЧхдзщХЬхГПчлЩф╕Лш╜╜](https://mirror.nju.edu.cn/download/app/TeX%20%E6%8E%92%E7%89%88%E7%B3%BB%E7%BB%9F)х╣╢хоЙшгЕTeXLiveцИЦшАЕMiKTeXцЬАцЦ░чЙИ
+2. ф╕Лш╜╜хМЕхРл[цибцЭ┐хЕищГицЦЗф╗╢](https://github.com/nju-lug/NJUThesis/releases/latest)чЪДхОЛч╝йхМЕ`njuthesis.zip`
+3. ца╣цНощЬАшжБцЫ┤цФ╣`njuthesis-sample.tex`цЦЗф╗╢ф╕нчЪДхЖЕхо╣
+4. хЬицибцЭ┐ца╣чЫох╜Хф╕Лш┐РшбМ`latexmk`ч╝ЦшпСцЦЗф╗╢я╝Мх╛ЧхИ░хп╣х║ФчЪДPDF
+
+#### **хЕ│ф║ОцЬмхЬ░ч╝ЦшпС**
+
+- цибцЭ┐цФпцМБ`latexmk`уАБ`xelatex`уАБ`lualatex`ф╕ЙчзНч╝ЦшпСцЦ╣х╝П
+- хжВцЮЬф╜┐чФи`latexmk`я╝Мшп╖хКбх┐Еф╜┐чФихоМцХ┤чЪДхС╜ф╗д`latexmk -xelatex`ф╗ехЕНф║зчФЯф╕Нх┐ЕшжБчЪДщЧощвШ
+- хжВцЮЬф╜┐чФи`xelatex`цИЦ`lualatex`я╝МщЬАшжБцМЙчЕз`xelatex/lualatex` -> `biber` -> `xelatex/lualatex` -> `xelatex/lualatex`чЪДщб║х║Пч╝ЦшпСхЫЫцмб
+- ф╗Ух║Уф╕н`.vscode`щЩДх╕жф╕Аф╗╜VScodeчЪДLaTeX WorkShopчЪДщЕНч╜оцЦЗф╗╢я╝МхПпца╣цНощЬАшжБф╜┐чФи
+
+### [хНЧхдзTeX](https://tex.nju.edu.cn)ч╝ЦшпС
+
+1. ф╕Лш╜╜хМЕхРл[цибцЭ┐хЕищГицЦЗф╗╢](https://github.com/nju-lug/NJUThesis/releases/latest)чЪДхОЛч╝йхМЕ`njuthesis.zip`
+2. чЩ╗х╜Х[хНЧхдзTeX](https://tex.nju.edu.cn)я╝МчВ╣хЗ╗New Project -> Upload Projectф╕Кф╝ахИЪхИЪх╛ЧхИ░чЪДхОЛч╝йхМЕя╝Мф╕Кф╝ахРО`njuthesis-sample.tex`уАБ`njuthesis.cls`чнЙцЦЗф╗╢х║ФхЬица╣чЫох╜Хя╝М0.9.0ф╗ехРОчЪДчЫох╜Хч╗УцЮДхжВф╕ЛцЙАчд║я╝Ъ
+
+ ```shell
+ NJUThesis-master/
+ тФВ
+ тФЬтФАfigure/
+ тФВ njulogo.pdf
+ тФВ njuname.pdf
+ тФВ
+ тФВ njuthesis.bib
+ тФВ njuthesis.cls
+ тФВ njuthesis-sample.tex
+ ```
+
+3. хЬихНЧхдзTeXщб╣чЫохЖЕщб╡щЭвх╖жф╕КшзТчЪД`Menu`ф╕ня╝Мх░Жч╝ЦшпСхЩицФ╣ф╕║`XeLaTeX`
+4. ч╝ЦхЖЩTeXцЦЗцбг
+
+### хЕ╢ф╗Ц
+
+цЫ┤хдЪхЖЕхо╣шп╖хПВшзБщб╣чЫоWikiф╕нчЪД[ф╜┐чФишп┤цШО](https://github.com/nju-lug/NJUThesis/wiki/%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E)уАВ
+
+ф╜аф╣ЯхПпф╗еф╕Лш╜╜[Release](https://github.com/nju-lug/NJUThesis/releases/latest)ф╕нщЩДх╕жчЪД`njuthesis.pdf`я╝МщЗМщЭвшпжх░╜щШРш┐░ф║ЖцибцЭ┐чЪДчЙ╣цАзхТМф╜┐чФицЦ╣ц│ХуАВ
+
+## х╕╕шзБщЧощвШ
+
+шп╖хПВшзБ[х╕╕шзБщЧощвШ](https://github.com/nju-lug/NJUThesis/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98)уАВ
+
+## ш┤бчМо
+
+хжВцЮЬф╜ахПСчО░ф║ЖцибцЭ┐чЪДщЧощвШя╝Мцмвш┐ОхЬиGithubф╕н[цПРф║дissue](https://github.com/nju-lug/NJUThesis/issues)цИЦшАЕPRуАВ
+
+## шо╕хПп
+
+цЬмцибцЭ┐чЪДхПСх╕ГщБ╡хоИ LaTeX Project Public Licenseя╝ИчЙИцЬм 1.3c цИЦцЫ┤щлШя╝ЙуАВ
+
diff --git a/macros/unicodetex/latex/njuthesis/figure/njuname-large.jpg b/macros/unicodetex/latex/njuthesis/figure/njuname-large.jpg
deleted file mode 100644
index b69db06921..0000000000
--- a/macros/unicodetex/latex/njuthesis/figure/njuname-large.jpg
+++ /dev/null
Binary files differ
diff --git a/macros/unicodetex/latex/njuthesis/figure/njuname-large.pdf b/macros/unicodetex/latex/njuthesis/figure/njuname-large.pdf
new file mode 100644
index 0000000000..f7e71662e5
--- /dev/null
+++ b/macros/unicodetex/latex/njuthesis/figure/njuname-large.pdf
Binary files differ
diff --git a/macros/unicodetex/latex/njuthesis/njuthesis.cls b/macros/unicodetex/latex/njuthesis/njuthesis.cls
deleted file mode 100644
index d8d8f57f3a..0000000000
--- a/macros/unicodetex/latex/njuthesis/njuthesis.cls
+++ /dev/null
@@ -1,96 +0,0 @@
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesExplClass{njuthesis}{2021-09-11}{0.7.3}{NJU Thesis LaTeX Template}
-
-% щАЪш┐Зч▒╗ф╝ащАТхПВцХ░
-\RequirePackage{l3keys2e}
-
-\LoadClass[
- a4paper,
- twoside,
- UTF8,
- scheme=chinese,
- linespread=1.625,% laTexщ╗Шшод1.2шбМш╖Эя╝Мwordщ╗ШшодшбМш╖ЭцШп1.3я╝МшжБц▒В1.5хАНwordшбМш╖Эя╝МцХЕ1.5/1.2*1.3 = 1.625
- fontset=none,
- zihao=-4
- ]{ctexbook}[2018/04/01]
-
-% хоЪф╣ЙцибцЭ┐щФохА╝
-% чФиф║Оца╝х╝ПцОзхИ╢чЪДщФохА╝
-\keys_define:nn { nju }
-{
- titlelength .int_set:N = \nju_titlelength,
- titlelength .initial:n = 1,
-
- secondmentor .bool_set:N = \nju_second_mentor,
- secondmentor .initial:n = false,
-
- degree .tl_set:N = \nju_degree,
- degree .initial:n = UG,
-
- type .tl_set:N = \nju_type,
- type .initial:n = thesis,
-
- systemfont .bool_set:N = \nju_systemfont,
- systemfont .initial:n = true,
-
- customlatinfont .tl_set:N = \nju_customlatinfont,
- customlatinfont .initial:n = windows,
-
- customchinesefont .tl_set:N = \nju_customchinesefont,
- customchinesefont .initial:n = windows,
-
- info .meta:nn = { nju / info } { #1 }
-}
-
-\keys_define:nn { nju / info }
-{
- % щвШчЫо
- TitleA .tl_set:N = \nju_title_a,
- TitleB .tl_set:N = \nju_title_b,
- TitleC .tl_set:N = \nju_title_c,
- TitleEN .tl_set:N = \nju_title_en,
-
- % х╣┤ч║зхнжхП╖хзУхРН
- Grade .tl_set:N = \nju_grade,
- StudentID .tl_set:N = \nju_student_id,
- StudentName .tl_set:N = \nju_student_name,
- StudentNameEN .tl_set:N = \nju_student_name_en,
-
- % щЩвч│╗ф╕Уф╕ЪцЦ╣хРС
- Department .tl_set:N = \nju_department,
- DepartmentEN .tl_set:N = \nju_department_en,
- Major .tl_set:N = \nju_major,
- MajorEN .tl_set:N = \nju_major_en,
- Field .tl_set:N = \nju_field,
- FieldEN .tl_set:N = \nju_field_en,
-
- % хп╝х╕И
- MentorA .tl_set:N = \nju_mentor_a,
- MentorAEN .tl_set:N = \nju_mentor_a_en,
- MentorATitle .tl_set:N = \nju_mentor_a_title,
- MentorATitleEN .tl_set:N = \nju_mentor_a_title_en,
-
- % чммф║Мхп╝х╕И
- MentorB .tl_set:N = \nju_mentor_b,
- MentorBEN .tl_set:N = \nju_mentor_b_en,
- MentorBTitle .tl_set:N = \nju_mentor_b_title,
- MentorBTitleEN .tl_set:N = \nju_mentor_b_title_en,
-
- % цЧецЬЯ
- SubmitDate .tl_set:N = \nju_submit_date,
- DefenseDate .tl_set:N = \nju_defense_date,
-}
-
-\NewDocumentCommand \njusetup { m }
-{ \keys_set:nn { nju } { #1 } }
-
-\ProcessKeysOptions { nju }
-
-% ш╛УхЕещЕНч╜оцЦЗф╗╢
-\RequirePackage{profile/packages}
-\RequirePackage{profile/font}
-\RequirePackage{profile/page}
-\RequirePackage{profile/reference}
-\RequirePackage{profile/components}
-\RequirePackage{profile/cover}
-\RequirePackage{profile/abstract}
diff --git a/macros/unicodetex/latex/njuthesis/njuthesis.dtx b/macros/unicodetex/latex/njuthesis/njuthesis.dtx
new file mode 100644
index 0000000000..008b7173f7
--- /dev/null
+++ b/macros/unicodetex/latex/njuthesis/njuthesis.dtx
@@ -0,0 +1,2266 @@
+% \iffalse meta-comment
+% !TeX program = XeLaTeX
+% !TeX encoding = UTF-8
+%
+% Copyright (C) 2021
+% by Nanjing University Linux User Group <nju.lug@yaoge123.cn>
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% https://www.latex-project.org/lppl.txt
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the template can be found at
+%
+% https://github.com/nju-lug/NJUThesis
+%
+% for those people who are interested.
+%
+%<*internal>
+\iffalse
+%</internal>
+%
+%<*readme-zh>
+# NJU Thesis
+
+[![njuthesis](https://img.shields.io/badge/njuthesis-latex-blue)](https://git.nju.edu.cn/nju-lug/nju-latex-templates)
+[![overleaf](https://img.shields.io/badge/overleaf-supported-brightgreen)](https://tex.nju.edu.cn)
+![build status](https://github.com/nju-lug/NJUThesis/actions/workflows/build.yml/badge.svg)
+
+> цндщб╣чЫоцШпхЯ║ф║О[NJU thesis 2021](https://github.com/FengChendian/NJUThesis2021)чЪДщЗНцЮДчЙИцЬмя╝МчЫохЙНцЬмчзСчФЯчЙИцЬм**х╖▓ч╗ПхЯ║цЬмщЗНцЮДхоМцИР**я╝МчбХхНЪшо║цЦЗ**цнгхЬи**ца╣цНочаФчй╢чФЯщЩвчЪДцЦЗф╗╢щЗНцЮДя╝Мф╜ЖчаФчй╢чФЯщЩвчЪДшзДхоЪх╣╢ф╕НхоМхЦДя╝МхЫацндщГихИЖца╝х╝ПхПпшГ╜ф╝ЪхПВшАГцЬмчзСчЪДя╝М**хжВцЮЬщЩвч│╗хПжцЬЙшжБц▒Вя╝Мшп╖шЗкшбМф┐оцФ╣цИЦшАЕцПРф║дissue**уАВ
+
+хОЯцЭечЪД[NJU thesis 2021](https://github.com/FengChendian/NJUThesis2021)цибцЭ┐хдкш┐ЗхПдшАБх╣╢ф╕Фф╕НцФпцМБчбХхглуАБхНЪхглшо║цЦЗя╝МчЫохЙНщЪ╛ф╗еч╗┤цКдя╝МхЫацндф╕║ф║ЖцибцЭ┐чЪДхПпцМБч╗нхПСх▒Хя╝МчО░хЬих░Жхп╣шпещб╣чЫош┐ЫшбМщЗНцЮДя╝Мщб╣чЫоцМВш╜╜ф║О[NJU-LUG](https://github.com/nju-lug)ч╗Дч╗Зф╗Ух║Уф╕Ля╝МчЫохЙНх╖▓[хПСх╕ГхЬиCTAN](https://ctan.org/pkg/njuthesis)уАВ
+
+чЫ╕хЕ│цЦЗцбгшп╖хПВшзБ[цЬмщб╣чЫоwiki](https://github.com/nju-lug/NJUThesis/wiki)уАВ
+
+## х┐лщАЯх╝АхзЛ
+
+ф╗О0.9.0чЙИф╗ехРОя╝МцЬмцибцЭ┐ф╗еDocStrip(`.dtx`)ца╝х╝Пш┐ЫшбМч╗┤цКдуАВх╕╕шзДчЪД`.cls`ца╝х╝ПцЦЗф╗╢хПпф╗ОReleasesщб╡щЭвф╕Лш╜╜цИЦф╜┐чФиф╗еф╕ЛцЦ╣ц│ХцПРхПЦуАВ
+
+### хЕ│ф║ОDocStripцЦЗф╗╢
+
+DocStripца╝х╝ПхРИх╣╢ф║ЖLaTeXц║Рф╗гчаБхТМшп┤цШОцЦЗцбгя╝МцЫ┤цЬЙхИйф║ОхоПхМЕчЪДхПСх╕ГуАВшжБф╜┐чФишпецЦЗф╗╢я╝Мшп╖хЬих╜УхЙНх╖еф╜ЬчЫох╜Хф╕ЛцЙУх╝Ач╗Ичлпя╝Ъ
+
+- ш╛УхЕе`xetex njuthesis.dtx`ф╗ецПРхПЦхоПхМЕхЖЕхо╣
+- ш╛УхЕе`latexmk njuthesis.dtx`ф╗ечФЯцИРх╣╢цЯечЬЛхЖЕч╜очЪДцЦЗцбг
+
+шп╖ц│ицДПя╝МчФ▒ф║ОцЦЗф╗╢щЗНхРНхОЯхЫая╝Мщб╣чЫоф╕нчЪДчд║ф╛Лшо║цЦЗцибцЭ┐х╖▓швлщЗНхС╜хРНф╕║`njuthesis-sample.tex`уАВ
+
+### цЬмхЬ░ч╝ЦшпС
+
+1. [ф╗ОхНЧхдзщХЬхГПчлЩф╕Лш╜╜](https://mirror.nju.edu.cn/download/app/TeX%20%E6%8E%92%E7%89%88%E7%B3%BB%E7%BB%9F)х╣╢хоЙшгЕTeXLiveцИЦшАЕMiKTeXцЬАцЦ░чЙИ
+2. ф╕Лш╜╜хМЕхРл[цибцЭ┐хЕищГицЦЗф╗╢](https://github.com/nju-lug/NJUThesis/releases/latest)чЪДхОЛч╝йхМЕ`njuthesis.zip`
+3. ца╣цНощЬАшжБцЫ┤цФ╣`njuthesis-sample.tex`цЦЗф╗╢ф╕нчЪДхЖЕхо╣
+4. хЬицибцЭ┐ца╣чЫох╜Хф╕Лш┐РшбМ`latexmk`ч╝ЦшпСцЦЗф╗╢я╝Мх╛ЧхИ░хп╣х║ФчЪДPDF
+
+#### **хЕ│ф║ОцЬмхЬ░ч╝ЦшпС**
+
+- цибцЭ┐цФпцМБ`latexmk`уАБ`xelatex`уАБ`lualatex`ф╕ЙчзНч╝ЦшпСцЦ╣х╝П
+- хжВцЮЬф╜┐чФи`latexmk`я╝Мшп╖хКбх┐Еф╜┐чФихоМцХ┤чЪДхС╜ф╗д`latexmk -xelatex`ф╗ехЕНф║зчФЯф╕Нх┐ЕшжБчЪДщЧощвШ
+- хжВцЮЬф╜┐чФи`xelatex`цИЦ`lualatex`я╝МщЬАшжБцМЙчЕз`xelatex/lualatex` -> `biber` -> `xelatex/lualatex` -> `xelatex/lualatex`чЪДщб║х║Пч╝ЦшпСхЫЫцмб
+- ф╗Ух║Уф╕н`.vscode`щЩДх╕жф╕Аф╗╜VScodeчЪДLaTeX WorkShopчЪДщЕНч╜оцЦЗф╗╢я╝МхПпца╣цНощЬАшжБф╜┐чФи
+
+### [хНЧхдзTeX](https://tex.nju.edu.cn)ч╝ЦшпС
+
+1. ф╕Лш╜╜хМЕхРл[цибцЭ┐хЕищГицЦЗф╗╢](https://github.com/nju-lug/NJUThesis/releases/latest)чЪДхОЛч╝йхМЕ`njuthesis.zip`
+2. чЩ╗х╜Х[хНЧхдзTeX](https://tex.nju.edu.cn)я╝МчВ╣хЗ╗New Project -> Upload Projectф╕Кф╝ахИЪхИЪх╛ЧхИ░чЪДхОЛч╝йхМЕя╝Мф╕Кф╝ахРО`njuthesis-sample.tex`уАБ`njuthesis.cls`чнЙцЦЗф╗╢х║ФхЬица╣чЫох╜Хя╝М0.9.0ф╗ехРОчЪДчЫох╜Хч╗УцЮДхжВф╕ЛцЙАчд║я╝Ъ
+
+ ```shell
+ NJUThesis-master/
+ тФВ
+ тФЬтФАfigure/
+ тФВ njulogo.pdf
+ тФВ njuname.pdf
+ тФВ
+ тФВ njuthesis.bib
+ тФВ njuthesis.cls
+ тФВ njuthesis-sample.tex
+ ```
+
+3. хЬихНЧхдзTeXщб╣чЫохЖЕщб╡щЭвх╖жф╕КшзТчЪД`Menu`ф╕ня╝Мх░Жч╝ЦшпСхЩицФ╣ф╕║`XeLaTeX`
+4. ч╝ЦхЖЩTeXцЦЗцбг
+
+### хЕ╢ф╗Ц
+
+цЫ┤хдЪхЖЕхо╣шп╖хПВшзБщб╣чЫоWikiф╕нчЪД[ф╜┐чФишп┤цШО](https://github.com/nju-lug/NJUThesis/wiki/%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E)уАВ
+
+ф╜аф╣ЯхПпф╗еф╕Лш╜╜[Release](https://github.com/nju-lug/NJUThesis/releases/latest)ф╕нщЩДх╕жчЪД`njuthesis.pdf`я╝МщЗМщЭвшпжх░╜щШРш┐░ф║ЖцибцЭ┐чЪДчЙ╣цАзхТМф╜┐чФицЦ╣ц│ХуАВ
+
+## х╕╕шзБщЧощвШ
+
+шп╖хПВшзБ[х╕╕шзБщЧощвШ](https://github.com/nju-lug/NJUThesis/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98)уАВ
+
+## ш┤бчМо
+
+хжВцЮЬф╜ахПСчО░ф║ЖцибцЭ┐чЪДщЧощвШя╝Мцмвш┐ОхЬиGithubф╕н[цПРф║дissue](https://github.com/nju-lug/NJUThesis/issues)цИЦшАЕPRуАВ
+
+## шо╕хПп
+
+цЬмцибцЭ┐чЪДхПСх╕ГщБ╡хоИ LaTeX Project Public Licenseя╝ИчЙИцЬм 1.3c цИЦцЫ┤щлШя╝ЙуАВ
+
+%</readme-zh>
+%
+%<*readme-en>
+# The njuthesis class
+
+## Overview
+
+This package is intended for typesetting Nanjing University thesis with LaTeX, providing support for bachelor, master, and doctoral thesis. Compilation of this class requires either `xelatex` or `lualatex` engine.
+
+## License
+
+-----
+ This work may be distributed and/or modified under the conditions of
+ the [LaTeX Project Public License](http://www.latex-project.org/lppl.txt),
+ either version 1.3c of this license or (at your option) any later
+ version.
+-----
+
+## Contributing
+
+If you run into any problem with the template, please contact us via Github issue or submit Pull Request.
+
+## Wiki
+
+Please see [Chinese wiki](https://github.com/nju-lug/NJUThesis/wiki)уАВ
+
+-----
+
+Copyright ┬й NJU-LUG
+%</readme-en>
+%
+%<*internal>
+\fi
+\begingroup
+ \def\NameOfLaTeXe{LaTeX2e}
+\expandafter\endgroup\ifx\NameOfLaTeXe\fmtname\else
+\csname fi\endcsname
+%</internal>
+%
+%<*install>
+\input l3docstrip.tex
+\keepsilent
+\askforoverwritefalse
+
+\preamble
+
+Copyright (C) 2021
+by Nanjing University Linux User Group <nju.lug@yaoge123.cn>
+
+This file 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.
+
+To produce the documentation run the original source files ending with `.dtx'
+through XeTeX.
+
+\endpreamble
+
+\generate{
+ \usedir{tex/latex/njuthesis}
+ \file{\jobname.cls} {\from{\jobname.dtx}{class}}
+%</install>
+%<*internal>
+ \usedir{source/latex/njuthesis}
+ \file{\jobname.ins} {\from{\jobname.dtx}{install}}
+%</internal>
+%<*install>
+ \usedir{doc/latex/njuthesis}
+ \nopreamble\nopostamble
+ \file{README_EN.md} {\from{\jobname.dtx}{readme-en}}
+ \file{README.md} {\from{\jobname.dtx}{readme-zh}}
+}
+
+\obeyspaces
+\Msg{*************************************************************}
+\Msg{* *}
+\Msg{* To finish the installation you have to move the following *}
+\Msg{* files into a directory searched by TeX: *}
+\Msg{* *}
+\Msg{* The recommended directory is TDS:tex/latex/njuthesis *}
+\Msg{* *}
+\Msg{* njuthesis.cls *}
+\Msg{* njuthesis.ins *}
+\Msg{* README.md *}
+\Msg{* README_EN.md *}
+\Msg{* *}
+\Msg{* To produce the documentation, run the file njuthesis.dtx *}
+\Msg{* through XeLaTeX. *}
+\Msg{* *}
+\Msg{* Happy TeXing! *}
+\Msg{* *}
+\Msg{*************************************************************}
+
+\endbatchfile
+%</install>
+%
+%<*internal>
+\fi
+%</internal>
+%
+%<class>\NeedsTeXFormat{LaTeX2e}
+%<class>\RequirePackage{expl3}
+%<!(readme-zh|readme-en)> \GetIdInfo $Id: njuthesis.dtx 0.9.2 2021-09-17 22:00:00 +0800 NJU LUG <nju.lug@yaoge123.cn> $
+%<class> {Thesis template for Nanjing University}
+%<class>\ProvidesExplClass{\ExplFileName}{\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription}
+%
+%<*driver>
+\ProvidesFile{njuthesis.dtx}
+\documentclass{ctxdoc}
+\usepackage{listings,xcolor}
+\definecolor{njuviolet}{cmyk}{0.5,1,0,0.4}
+\definecolor{njumagenta}{cmyk}{0.05,1,0.55,0}
+\definecolor{njublue}{cmyk}{0.8,0.5,0,0}
+\definecolor{njuyellow}{cmyk}{0,0.3,1,0}
+\begin{document}
+ \DocInput{njuthesis.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{\color{njuviolet}{The \textsc{NJuThesis} class\\ хНЧф║мхдзхнжхнжф╜Ншо║цЦЗцибцЭ┐}}
+%
+% \author{^^A
+% Nanjing University Linux User Group
+% \thanks{E-mail: \href{mailto:nju.lug@yaoge123.cn}{nju.lug@yaoge123.cn}}}
+%
+% \date{v0.9.2 \\ Released 2021-09-17}
+%
+% \maketitle
+%
+% \begin{abstract}
+% хНЧф║мхдзхнжхнжф╜Ншо║цЦЗ\hologo{LaTeX}цибцЭ┐хЯ║ф║ОцЬмчзСчФЯщЩвчЪДшо║цЦЗцТ░хЖЩшзДшМГхИ╢ф╜Ья╝МхРМцЧ╢хПВшАГчаФчй╢чФЯщЩвцПРф╛ЫчЪДчбХхглуАБхНЪхглхнжф╜НцЭРцЦЩхМЕя╝МчФиф║ОчФЯцИРчмжхРИхНЧф║мхдзхнжхнжф╜Ншо║цЦЗцОТчЙИшжБц▒ВхТМчЫ╕х║ФчЪДхЫ╜хо╢шзДшМГуАБшбМф╕ЪцаЗхЗЖчЪДхнжф╜Ншо║цЦЗя╝МцЧихЬиф╕║хРМхнжцПРф╛ЫцпХф╕Ъшо║цЦЗф╣жхЖЩчЪДцЦ╣ф╛┐уАВ
+% \end{abstract}
+%
+% \def\abstractname{Abstract}
+% \begin{abstract}
+% The \textsc{NJuThesis} class is intended for typesetting Nanjing University thesis with LaTeX, providing support for bachelor, master, and doctoral thesis.
+% \end{abstract}
+%
+% \def\abstractname{чЙ╣хИлхг░цШО}
+% \begin{abstract}
+% шп╖ц│ицДПя╝МцЬмцибцЭ┐ф╗НцЬкхоМцИРх╝АхПСя╝МхЗ║чО░bugцИЦшАЕцЦЗцбгф╕НхоМхЦДх▒Юф║Оцнгх╕╕цГЕхЖ╡я╝МцПРissueцИЦPull RequestхН│хПпуАВ
+%
+% \href{https://git.nju.edu.cn/nju-lug/lug-introduction}{NJU LUG}хзЛч╗Ицмвш┐ОцВичЪДхКахЕеф╕Ош┤бчМоя╝Б
+% \end{abstract}
+%
+% \clearpage
+%
+% \setcounter{tocdepth}{4}
+% \tableofcontents
+% \clearpage
+%
+% \EnableDocumentation
+%^^A \DisableDocumentation
+%
+% \begin{documentation}
+%
+%
+% \section{цибцЭ┐ф╗Лч╗Н}
+% \textsc{NJuThesis}я╝МхН│хНЧф║мхдзхнжхнжф╜Ншо║цЦЗцибцЭ┐я╝МцШпф╕Аф╕кчФ▒хНЧф║мхдзхнжLUGч╗Дч╗Зч╗┤цКдчЪДя╝МчФиф║ОхдДчРЖцЬмцабхнжчФЯцпХф╕Ъшо║цЦЗцОТчЙИщЬАц▒ВчЪД\hologo{LaTeX}цибцЭ┐уАВ
+%
+% \subsection{хОЖхП▓ц▓┐щЭй}
+%
+% хНБхЗах╣┤цЭея╝МхдЪф╜НчГнх┐ГцабхПЛхПСх╕Гш┐ЗшЗкх╖▒ч╝ЦхЖЩчЪДцибцЭ┐я╝МхЬиGitHubф╕КхПпшАГчЪДхМЕцЛм
+% \begin{enumerate}
+% \item цЭицЦЗхНЪя╝И\href{http://yangwenbo.com/}{@solrex}я╝ЙчЪД\href{https://github.com/solrex/njuthesis}{хНЧф║мхдзхнжхнжф╜Ншо║цЦЗ\hologo{LaTeX}цибцЭ┐}я╝И2010я╝Й
+% \item \href{https://github.com/fireblue}{@fireblue}хЯ║ф║ОsolrexцибцЭ┐чЪДчЪД\href{https://github.com/fireblue/NJUThesis}{хНЧф║мхдзхнжхнжф╜Ншо║цЦЗ\hologo{LaTeX}цибцЭ┐}я╝И2013я╝Й
+% \item \href{https://github.com/wenhai-zheng}{@wenhai-zheng}чЪД\href{https://github.com/wenhai-zheng/NJUThesis}{NJUThesis}я╝И2013я╝Й
+% \item шГбц╡╖цШЯя╝И\href{http://haixing-hu.github.io/}{@Haixing-Hu}я╝ЙчЪД\href{https://github.com/Haixing-Hu/nju-thesis}{NJU-Thesis}я╝И2013 - 2018я╝Й
+% \item х╝ацеЪчПйя╝И\href{https://github.com/zhangchuheng123}{@zhangchuheng123}я╝ЙхЯ║ф║ОшГбц╡╖цШЯцибцЭ┐чЪД\href{https://github.com/zhangchuheng123/NJUThesis}{NJUThesis}я╝И2016я╝Й
+% \item шТЛчВОх▓йя╝И\href{http://ics.nju.edu.cn/~jyy/}{@jiangyy}я╝ЙчЪД\href{https://github.com/jiangyy/njuthesis}{хНЧф║мхдзхнжх▒▒хпи\hologo{LyX}чаФчй╢чФЯцпХф╕Ъшо║цЦЗцибцЭ┐}я╝И2017я╝Й
+% \item ще╢хоЙщА╕я╝И\href{https://anyirao.com/}{@AnyiRao}я╝ЙхЯ║ф║ОшГбц╡╖цШЯцибцЭ┐чЪД\href{https://github.com/jiangyy/njuthesis}{NJU-Thesis}я╝И2018я╝Й
+% \item \href{https://github.com/njuHan}{@njuHan}хЯ║ф║ОшГбц╡╖цШЯцибцЭ┐чЪД\href{https://github.com/njuHan/njuthesis-nju-thesis-template/}{NJU-Thesis}я╝И2018 - 2021я╝Й
+% \item ш╡╡цЗ┐цЩия╝И\href{https://fengchendian.github.io/about.html}{@FengChendian}я╝ЙхЯ║ф║ОAnyiRaoцибцЭ┐чЪД\href{https://github.com/FengChendian/NJUThesis2021}{NJU Thesis 2021}я╝И2021я╝Й
+% \end{enumerate}
+% шЗ│ф║Оф╕Нх╣╕шАМцЬкш┐ЫшбМф╗гчаБчЙИцЬмчобчРЖчЪДя╝МчФЪшЗ│ф║Ошп┤ф╗ехОЛч╝йхМЕх╜вх╝Пц╡Бф╝аф║ОхРДф║║чбмчЫШф╕нчЪДя╝Мх░▒цЫ┤ф╕НхПпшобцХ░ф║ЖуАВ
+%
+% ф╕ОхЕ╢шойф╕АхНГф╕кхнжчФЯхБЪф╕АхНГчзНф╕НхРМчЪДцибцЭ┐я╝Мф╕НхжВцЬЙф║║чЙ╡ш╡╖хд┤цЭея╝МщЫЖф╕нхКЫщЗПхКЮхдзф║ЛуАВхЫацндя╝МхНЧф║мхдзхнж Linux User Group чЪДцЬЙх┐Чф╣ЛхглхЬи2021х╣┤цЪСцЬЯшБФхРИш╡╖цЭея╝МхПВшАГф╗еф╕КчЪДчО░цИРцибцЭ┐я╝МхЕ╝щб╛хПЛцабthuthesisуАБfduthesisчнЙф╝ШчзАщб╣чЫоя╝МцЮДх╗║ф║Жш┐Щф╕АхЕицЦ░цибцЭ┐я╝МхКЫц▒ВщАЪш┐З\hologo{LaTeX3}шпнц│ХхТМц╕Ец╖ЕчЪДцОехПгхоЮчО░шЙпхе╜чЪДцШУчФицАзхТМхПпч╗┤цКдцАзуАВ
+%
+% чЫохЙНя╝МцЬмцибцЭ┐чЪДф╕╗шжБч╗┤цКдшАЕхМЕцЛмя╝Ъ
+%
+% \begin{itemize}
+% \item ш╡╡цЗ┐цЩи
+% \item чЖКчЕЬ
+% \end{itemize}
+%
+% \subsection{хРЫ\hologo{LaTeX}цЬмх╜Уф╕КцЙЛ}
+% \hologo{LaTeX}х╣╢ф╕НцШпф╕АчзНщЫ╢щЧицзЫчЪДшпншиАя╝Мф║жф╕НцШпхНЧф║мхдзхнжхнжчФЯчЪДх┐ЕхдЗцКАшГ╜уАВцЬЙхРМхнжхРмхИ░тАЬ\emph{ч╗ЩцпХф╕Ъшо║цЦЗф║дх╖оф╣Ях╛ЧхЖЩф╗гчаБ}тАЭш┐ЩчзНф║ЛцГЕх░▒хд┤чЦ╝я╝МхоЮхЬицШпцИСф╗мф╕НцД┐цДПшзБхИ░шАМх┐Ещб╗шжБщЭвхп╣чЪДцГЕхЖ╡уАВчЫохЙНя╝Мф╕нцЦЗф║ТшБФч╜Сф╕КчЪД\hologo{LaTeX}хЖЩф╜ЬцХЩчиЛф╕НшГ╜шп┤х▒ИцМЗхПпцХ░я╝Мш╡╖чаБф╣ЯцШпц▒ЧчЙЫхЕЕцаЛя╝МцпФш╛ГшСЧхРНчЪДхМЕцЛмхИШц╡╖ц┤ЛчЪДуАК\hologo{LaTeX}хЕещЧиуАЛчнЙчнЙщГ╜цШпф╕НщФЩчЪДхПВшАГш╡ДцЦЩуАВчД╢шАМхжВф╜Хх┐лщАЯхЗЖчбоцЙ╛хИ░цЙАщЬАшжБчЪДчФиц│Хя╝Мх░дхЕ╢цШп\hologo{LaTeX3}чЪДцЦ░цОехПгя╝МщЬАшжБф╕АхоЪчЪДцЧ╢щЧ┤цИЦшАЕшЙпхе╜чЪДшЛ▒цЦЗщШЕшп╗шГ╜хКЫуАВхЬицЬмцЦЗцбгчЪДхЖЩф╜Ьф╕ня╝МцИСф╗мцЧахКЫф╗ОчЫШхПдх╝Ахдйш╛ЯхЬ░х╝АхзЛф╗Охд┤цЮДх╗║цВичЪДчЫ╕хЕ│чЯешпЖф╜Уч│╗я╝МхПкшГ╜\textbf{х░╜хКЫхБЪхИ░цЬЙц▒Вх┐Ех║Ф}я╝МхЬищЬАшжБчЪДхЬ░цЦ╣щб║х╕жцПРф╕АхШ┤я╝Мф┐ЭшпБцВих░Сш╡░чВ╣х╝пш╖пуАВ
+%
+% \subsection{хЕ│ф║ОцЬмшп┤цШОцЙЛхЖМ}
+%
+% цЬмцибцЭ┐щАЪш┐З\textsc{DocStrip}ш┐ЫшбМч╗┤цКдя╝МхоЮщЩЕф╕КцШпф╕АчзН\emph{цЦЗхнжч╝ЦчиЛ}уАВцЦЗхнжч╝ЦчиЛчЪДцЬмф╜УцШпщВгф║ЫчФицЭешп┤цШОчЪДцЦЗхнЧя╝МцМЙхЖЩф╣жхЖЩцЦЗчлачЪДцЦ╣х╝Пч╗Дч╗ЗуАВ
+% \file{njuthesis.dtx}хМЕхРлnjuthesisцибцЭ┐чЪДцЙАцЬЙф┐бцБпуАВхЙНхНКщГихИЖф╕║цибцЭ┐шп┤цШОя╝МхН│хРДчзНх╕╕чФихС╜ф╗дф╕Ох┐ЕшжБчЪДф╜┐чФицЦ╣ц│Хя╝ЫхРОхНКщГихИЖф╕║ф╗гчаБхоЮчО░я╝Мф╕║х╕жцЬЙшпжч╗Жц│ищЗКчЪД\hologo{TeX}ц║Рф╗гчаБуАВхРОшАЕщЕНхРИщЩДх╜Хя╝Мф╕║цЬЙцДПф║ЖшзгцЬмцибцЭ┐ч╗ЖшКВчЪДхРМхнжцПРф╛ЫчоАцШОчЪДцМЗх╝ХуАВ
+%
+% ф╕ЛцЦЗф╕нх░ЖхЗ║чО░шЛех╣▓чЙ╣цоКца╝х╝Пя╝МхМЕцЛм\file{file-example.xxx}чнЙуАВ
+%
+% хжВцЮЬцВихЬиф╜┐чФицЬАцЦ░чЙИцибцЭ┐цЧ╢хПСчО░ф║Жф╗╗ф╜ХщЧощвШя╝МцКСцИЦцЬЙцДПхРСхПВф╕ОцЬмцибцЭ┐чЪДч╗┤цКдя╝Мшп╖щАЪш┐ЗGitHub issueцИЦшАЕQQч╛дшБКшБФч│╗LUGуАВ
+%
+% \section{хоЙшгЕ}
+% \label{sec:setup}
+%
+% цЬмшКВф╕╗шжБф╗Лч╗НцЬмхоПхМЕчЪДшО╖хПЦуАБхоЙшгЕф╗ехПКч╝ЦшпСцЦ╣х╝П
+% \subsection{ф╕Лш╜╜цибцЭ┐}
+%
+% цЬмхоПхМЕх╖▓ч╗ПхПСх╕ГхЬиCTANя╝Мх░ЖхЬицШОх╣┤ш┐ЫхЕе\hologo{TeX}\,Live 2022 хПСшбМчЙИуАВчД╢шАМCTANчЙИцЫ┤цЦ░ф╕НхПКцЧ╢я╝МцЫ┤цОишНРф╜┐чФиф╗еф╕ЛцЦ╣х╝Пф╕Лш╜╜уАВ
+%
+% ф╗ОцЬмцибцЭ┐чЪДGithub Releasesщб╡щЭвф╕Лш╜╜цЬАцЦ░чЪДхПСх╕ГчЙИ
+%
+% ф╗ОцЬмцибцЭ┐чЪДGithubф╗Ух║Уф╕Лш╜╜цЬАцЦ░чЪДdtxцЦЗф╗╢шЗкшбМхоЙшгЕ
+%
+% \subsection{цЬмхЬ░ч╝ЦшпС}
+%
+% \subsubsection{хоЙшгЕ\hologo{TeX}хПСшбМчЙИ}
+%
+% щжЦхЕИщЬАшжБф╕Лш╜╜\hologo{TeX}ш╜пф╗╢хПСшбМчЙИя╝МцабхЫнч╜СчОпхвГф╕нф╜┐чФи\href{https://mirror.nju.edu.cn/download/app/TeX%20%E6%8E%92%E7%89%88%E7%B3%BB%E7%BB%9F}{хНЧхдзщХЬхГПчлЩ}хПпф╗ешО╖х╛ЧцЬАхе╜чЪДф╜УщкМуАВ\textbf{цОишНРф╜┐чФицЬАцЦ░чЪД\hologo{TeX}\,Live 2021цИЦшАЕ\hologo{MiKTeX} 21ф╗ещБ┐хЕНц╜ЬхЬичЪДхЕ╝хо╣цАзщЧощвШуАВ}
+%
+% \begin{itemize}
+% \item ф╕║ф║ЖщБ┐хЕНф╕Нх┐ЕшжБчЪДщ║╗чГжя╝Мшп╖х░╜хПпшГ╜ф╕Лш╜╜ full чЙИцЬмя╝МхжВ texlive-fullуАВчоАшАМшиАф╣Ля╝Мф╕Лш╜╜хдзчЪДщВгф╕куАВ
+% \item х╣╢ф╕Фя╝Мх░╜хПпшГ╜ф╜┐чФицЬАцЦ░чЙИя╝ИцИкшЗ│чЫохЙНцШп 2021я╝ЙуАВ2020 хПКф╣ЛхЙНчЙИцЬмф╜┐чФи PDF ца╝х╝ПчЪДхЫ╛чЙЗхПпшГ╜ф╝ЪхЗ║чО░хКач▓ЧщЧощвШуАВ
+% \end{itemize}
+%
+% ф╕ЛшбицШпчЫохЙНч╗Пш┐Зц╡ЛшпХчЪДчОпхвГуАВхжВцЮЬцЬЙхЕ╢ф╗ЦхПпчФиф╕НхПпчФичЪДчОпхвГя╝Мцмвш┐ОшбехЕЕуАВ
+% \begin{table}[ht]
+% \centering
+% \caption{ч╗Пш┐Зц╡ЛшпХчЪДчОпхвГ}
+% % \label{tab:1}
+% \begin{tabular}{ccc}
+% \toprule
+% OS & TeX & ц╡ЛшпХцГЕхЖ╡ \\
+% \midrule
+% Windows 10 & \hologo{TeX}\,Live 2020 & crefхнШхЬица╝х╝ПщЧощвШ \\
+% Windows 10 & \hologo{TeX}\,Live 2021 & щАЪш┐З \\
+% Windows 10 & \hologo{MiKTeX} & щАЪш┐З \\
+% macOS 10.15 & mac\hologo{TeX} 2021 & щАЪш┐З \\
+% Ubuntu 20.04 & \hologo{TeX}\,Live 2021 & щАЪш┐З \\
+% Arch Linux & \hologo{TeX}\,Live 2021 & щАЪш┐З \\
+% \bottomrule
+% \end{tabular}
+% \end{table}
+%
+% \subsubsection{щАЙцЛйч╝Цш╛СхЩи}
+%
+% щЕНч╜охоМч╝ЦшпСхЩихРОя╝Мш┐ШщЬАшжБф╕Аф╕к\textbf{цЦЗцЬмч╝Цш╛СхЩи}ф╜Ьф╕║хЙНчлпцЭехоМцИР\texttt{.tex}цЦЗф╗╢хЖЕхо╣чЪДхЖЩф╜ЬуАВ
+%
+% шЗ│ф╗Кф╗НцЬЙчЫ╕х╜Уф╕АщГихИЖф║║шодф╕║WindowsшЗкх╕жчЪД\textit{шо░ф║ЛцЬм}цШпцЬАхе╜чЪДцЦЗцЬмч╝Цш╛СхЩия╝Мф╜Жхп╣ф║ОцЬмщб╣чЫошАМшиАя╝МхЬицндшпЪх┐ГшпЪцДПхЬ░цОишНРф╜аф╜┐чФи\textbf{цЫ┤чО░ф╗гцЫ┤ч╛ОшзВцЫ┤хдЪхКЯшГ╜}чЪДч╝Цш╛СхЩия╝МшнмхжВ\emph{хоЙшгЕф║Ж LaTeX Workshop цПТф╗╢ чЪД \href{https://code.visualstudio.com/}{Visual Studio Code}}я╝МцЭехоМцИРшо║цЦЗч╝ЦхЖЩуАВф╜аф╣ЯхПпф╗еца╣цНоф╕кф║║чЪДхЦЬхе╜щЪПф╛┐ф╜┐чФихЕ╢ф╗Цч╝Цш╛СхЩия╝МхжВ TeXworksуАБTeX Studio чнЙя╝Мщб║цЙЛх░▒шбМуАВ
+%
+% шЛеф╜┐чФи LaTeX Workshop цПТф╗╢я╝МцЬмщб╣чЫохЬи|.vscode/|ф╕нцПРф╛Ыф╕Аф╗╜чоАцШУщЕНч╜оя╝МхПпф╗ечЬБчХехИЭхзЛщЕНч╜оцнещкдчЫ┤цОеф╜┐чФиуАВ
+%
+% \subsubsection{ч╝ЦшпСщб║х║П}
+% хБЗшо╛хН│х░Жф╜┐чФичЪДцЦЗф╗╢хРНф╕║\file{mynjuthesis.tex}
+% х║ФщЗЗчФиф╗еф╕ЛхС╜ф╗дщб║х║Пш┐ЫшбМч╝ЦшпСя╝Мф╗ечФЯцИРцнгчбочЪДчЫох╜ХуАБч╝ЦхП╖хТМхПВшАГцЦЗчМоцЭбчЫоуАВ
+% \begin{ctexexam}
+% xelatex mynjuthesis
+% biber mynjuthesis
+% xelatex mynjuthesis
+% xelatex mynjuthesis
+% \end{ctexexam}
+% ф╜┐чФи \pkg{latexmk}
+% \begin{ctexexam}
+% latexmk -xelatex mynjuthesis
+% \end{ctexexam}
+%
+% \begin{ctexexam}
+% lualatex mynjuthesis
+% biber mynjuthesis
+% lualatex mynjuthesis
+% lualatex mynjuthesis
+% \end{ctexexam}
+% ф╜┐чФи \pkg{latexmk}
+% \begin{ctexexam}
+% latexmk -lualatex mynjuthesis
+% \end{ctexexam}
+%
+% ч╝ЦшпСф║зчЙйф╕║\file{njuthesis.pdf}я╝Мф╜Нф║Оф╕╗чЫох╜Хф╕ЛуАВцндхдЦш┐Шф╝ЪчФЯцИРф╕Ач│╗хИЧф╕нщЧ┤цЦЗф╗╢я╝МхПпф╗ещАЙцЛйф╜┐чФиф╗еф╕ЛхС╜ф╗дш┐ЫшбМц╕ЕчРЖуАВ
+%
+% \begin{ctexexam}
+% latexmk -c
+% \end{ctexexam}
+%
+% \subsection{хЬич║┐ч╝ЦшпС}
+%
+% чЫ╕ф┐бф╜ахЬицОешзжф║ЖцЬмхЬ░ч╝ЦшпСф╗ехРОя╝Мх╛Их┐лх░▒ф╝ЪцДПшпЖхИ░ф╕Аф║ЫхНБхИЖцШ╛чД╢чЪДф║ЛхоЮя╝МшнмхжВ\hologo{TeX}ч╝ЦшпСхЩихоЙшгЕш┐ЗчиЛш╛Гф╕║ц╝лщХ┐я╝МхНачФичй║щЧ┤ш┐Зхдзя╝МшАМф╕ФхЬиф╕АщГихИЖхдДчРЖхЩицАзшГ╜ф╕Нф╜│чЪДчФ╡шДСф╕КщЬАшжБш╛ГщХ┐ч╝ЦшпСцЧ╢щЧ┤\footnote{хЕ╢хоЮш┐Щф╕ЙчВ╣щГ╜цШпхп╣х╣┐хдзчЪДWindowsчФицИ╖шп┤чЪДя╝МхРМф╕Аф╕кцибцЭ┐хЬиLinuxч╝ЦшпСхПпф╗ешКВчЬБф╕АхНКшАЧцЧ╢}уАВцЛТч╗ЭцОехПЧш┐Щф║Ыщ║╗чГжчЪДхРМхнжф╕Нхжих░ЭшпХцЬмшКВф╗Лч╗НчЪДхЬич║┐ч╝ЦшпСцЦ╣ц│ХуАВ
+%
+% \subsubsection{хНЧхдз\hologo{TeX}х╣│хП░чоАф╗Л}
+%
+% \href{https://tex.nju.edu.cn}{хНЧхдз\hologo{TeX}}хЯ║ф║Ох╝Ац║РчЪДShareLaTeXх╣│хП░\footnote{чРЖшо║ф╕КхЬи\href{https://doc.nju.edu.cn/books/latex}{ш┐Щф╕кч╜СчлЩ}шГ╜цЙ╛хИ░ф╕Ацо╡х╣│хП░чоАф╗Ля╝МхоЮщЩЕф╕Кхдзхо╢щГ╜цЬЙцДПцЧацДПхЬ░щ╕╜ф║Жя╝Мф╕Лцмбф╕АхоЪшбеф╕КуАВ}я╝Мф║О2021х╣┤3цЬИ4цЧецнгх╝Пф╕Кч║┐я╝МщЭвхРСхНЧф║мхдзхнжхЕиф╜Ух╕ИчФЯх╝АцФ╛я╝МщжЦцмбф╜┐чФищЬАхЗнхнжцабщВочо▒шЗкхКйц│ихЖМш┤жхП╖уАВ
+%
+% \subsubsection{цУНф╜Ьцнещкд}
+%
+% \begin{enumerate}
+% \item ф╕Лш╜╜\href{https://github.com/nju-lug/NJUThesisUndergraduate/archive/refs/heads/master.zip}{цибцЭ┐хЕищГицЦЗф╗╢}
+% \item шо┐щЧо\href{https://tex.nju.edu.cn}{хНЧхдз\hologo{TeX}}я╝МчВ╣хЗ╗чХМщЭвхП│ф╕КцЦ╣Registerя╝Мф╜┐чФи\emph{хНЧф║мхдзхнжщВочо▒}ц│ихЖМш┤жхП╖х╣╢чЩ╗х╜Х
+% \item чВ╣хЗ╗New Project -> Upload Projectф╕Кф╝ахИЪхИЪх╛ЧхИ░чЪДzipцЦЗф╗╢я╝Мф╕Кф╝ахРОnjuthesis.texуАБnjuthesis.clsчнЙцЦЗф╗╢х║ФхЬица╣чЫох╜Хя╝МчЫох╜Хч╗УцЮДхжВ{{sec:directory}}цЙАчд║
+% \item хЬищб╣чЫощб╡щЭвх╖жф╕КшзТчЪДMenuф╕ня╝Мх░Жч╝ЦшпСхЩицФ╣ф╕║\hologo{XeLaTeX}цИЦшАЕ\hologo{LuaLaTeX}
+% \item ч╝ЦхЖЩшо║цЦЗ
+% \item чВ╣хЗ╗CompileцМЙщТош┐ЫшбМч╝ЦшпСхТМщвДшзИ
+% \item чВ╣хЗ╗ч╝ЦшпСцМЙщТохП│ф╛зчммф╕Йф╕кцМЙщТоф╕Лш╜╜ф║зчЙй
+% \end{enumerate}
+%
+% \subsubsection{хЕ│ф║ОOverleafх╣│хП░}
+%
+% чФ▒ф║О\href{https://www.overleaf.com/}{Overleafх╣│хП░}чЪД\hologo{TeX}\,LiveчЙИцЬмхБЬчХЩхЬи2020я╝М\texttt{cleveref}хМЕхЬих╝ХчФичлашКВцЧ╢ф╝ЪчФЯцИРщФЩшппчЪДцаЗчн╛я╝Мх╝ХхПСца╝х╝ПщФЩшппя╝ЫшАМхНЧхдз\hologo{TeX}щАЪш┐ЗхПКцЧ╢цЫ┤цЦ░шзДщБ┐ф║Жш┐Щф╕АщЧощвШуАВхЫацнд\emph{шп╖хКбх┐Еф╕НшжБф╜┐чФиOverleafхоШч╜Сш┐ЫшбМч╝ЦшпС}уАВ
+%
+%
+%
+% \section{ф╜┐чФицЦ╣ц│Х}
+%
+% \subsection{шЗкхоЪф╣ЙщАЙщб╣}
+%
+% х░ЦцЛмхП╖хЖЕхИЧхЗ║ф║ЖшЛех╣▓ф╕кхЕБшо╕чЪДщАЙщб╣я╝МхЕ╢ф╕нхКач▓ЧчЪДф╕║щ╗ШшодщАЙщб╣уАВ
+%
+% х░БщЭвцаЗщвШчХЩчй║хН│хПпшЗкхКихМЦцНвшбМ
+%
+% чммф║Мхп╝х╕Иф╕НхблхИЩчХЩчй║я╝МчЫохЙНцЭешп┤цЛецЬЙф╕дф╜НцМЗхп╝шАБх╕Их╣╢ф╕НцШпф╕АчзНцЩощБНчК╢хЖ╡уАВ
+%
+% \begin{function}[added=2021-09-07]{nlcover}
+% \begin{syntax}
+% nlcover = <\TTF>
+% \end{syntax}
+%
+% щАЪш┐Зцндщб╣хПпщАЙцЛйцШпхРжц╖╗хКахЫ╜хо╢хЫ╛ф╣жщжЖх░БщЭвя╝МцЬмщАЙщб╣ф╗Ехп╣ф║ОчаФчй╢чФЯцЬЙцХИ
+% \end{function}
+%
+%
+% \subsubsection{хнжф╜Нф┐бцБп}
+% \begin{function}[added=2021-09-07]{degree}
+% \begin{syntax}
+% degree = <(ug)|mg|mf|phd>
+% \end{syntax}
+%
+% щАЙцЛйхнжф╜Ня╝МхПпщАЙя╝Ъ
+% \opt{ug}я╝Ищ╗ШшодцЬмчзСя╝Йя╝М\opt{mg}хН│хнжцЬпчбХхгля╝М\opt{mf}я╝М\opt{phd}уАВ
+% \end{function}
+%
+%
+% \begin{function}[added=2021-09-07]{type}
+% \begin{syntax}
+% type = <(thesis)|design>
+% \end{syntax}
+%
+% чФиф║ОщАЙцЛйцЦЗцбгч▒╗хЮЛх╣╢х░ЖчЫ╕хЕ│хнЧцо╡ш╛УхЗ║хЬих░БщЭвхТМцСШшжБщб╡уАВхПпщАЙхА╝хМЕцЛмthesisя╝Ишбичд║цпХф╕Ъшо║цЦЗя╝ЙхТМdesignя╝Ишбичд║цпХф╕Ъшо╛шобя╝Йя╝Мч╝║чЬБхА╝ф╕║thesisуАВ
+% \opt{thesis}я╝Ищ╗Шшодя╝Йя╝М\opt{design}уАВ
+% \end{function}
+%
+%
+%
+% \subsubsection{цМЗхоЪхнЧф╜У}
+%
+%
+% хнжцабшо║цЦЗца╝х╝ПшжБц▒Вф╜┐чФичЪДхнЧф╜Уф╕АшИмх╖▓ч╗ПщвДшгЕхЬихРДф╕кцУНф╜Ьч│╗ч╗Яя╝МцЬмцибцЭ┐щТИхп╣ф╕НхРМх╣│хП░ш┐ЫшбМф║ЖшЗкхКицгАц╡ЛщАВщЕНя╝МхПпф╗ех╝Ачо▒хН│чФиуАВ
+%
+% хжВцЮЬх╕МцЬЫцЫ┤цФ╣цЬмцибцЭ┐ф╜┐чФичЪДхнЧф╜Уя╝Мшп╖хблхЖЩф╗еф╕Лф╕дф╕кщАЙщб╣шжЖчЫЦцгАц╡ЛцУНф╜Ьч│╗ч╗Ях╛ЧхИ░чЪДшо╛ч╜о
+%
+%
+% \begin{function}[added=2021-09-07]{customlatinfont}
+% \begin{syntax}
+% customlatinfont = <(windows)|macos|gyre|null>
+% \end{syntax}
+%
+% цЙЛхКицМЗхоЪшЛ▒цЦЗхнЧф╜Уя╝МхПпщАЙя╝Ъ
+% \opt{windows}я╝Ищ╗Шшодя╝Йя╝М \opt{macos}я╝М \opt{gyre}я╝М \opt{null}уАВ
+% \end{function}
+%
+%
+% \begin{function}[added=2021-09-07]{customchinesefont}
+% \begin{syntax}
+% customchinesefont = <(windows)|macos|fandol|founder|noto|null>
+% \end{syntax}
+%
+% цЙЛхКицМЗхоЪф╕нцЦЗхнЧф╜Уя╝МхПпщАЙя╝Ъ
+% \opt{windows}я╝Ищ╗Шшодя╝Йя╝М \opt{macos}я╝М \opt{fandol}я╝М \opt{founder}я╝М\opt{noto}я╝М\opt{null}уАВ
+%
+% цЦ╣цнгхнЧф╜Уя╝ИчоАч╣БцЙйх▒Хя╝Йч│╗хИЧ
+% FZSSK \href{http://www.foundertype.com/index.php/FontInfo/index/id/151}{цЦ╣цнгф╣жхоЛ} хЕНш┤╣хХЖчФи
+%
+% FZXBSK \href{http://www.foundertype.com/index.php/FontInfo/index/id/164}{цЦ╣цнгх░ПцаЗхоЛ} шо╛шобх╕ИщЭЮхХЖхЕНш┤╣
+%
+% FZKTK \href{http://www.foundertype.com/index.php/FontInfo/index/id/137}{цЦ╣цнгце╖ф╜У} хЕНш┤╣хХЖчФи
+%
+% FZXH1K \href{http://www.foundertype.com/index.php/FontInfo/index/id/161}{цЦ╣цнгч╗Жщ╗Сф╕А} шо╛шобх╕ИщЭЮхХЖхЕНш┤╣
+%
+% FZHTK \href{http://www.foundertype.com/index.php/FontInfo/index/id/131}{цЦ╣цнгщ╗Сф╜У} хЕНш┤╣хХЖчФи
+%
+% FZFSK \href{http://www.foundertype.com/index.php/FontInfo/index/id/128}{цЦ╣цнгф╗┐хоЛ}
+%
+% FZYouHK_508R \href{http://www.foundertype.com/index.php/FontInfo/index/id/244}{цЦ╣цнгцВащ╗С508R} шо╛шобх╕ИщЭЮхХЖхЕНш┤╣
+%
+% FZYouHK_511M \href{http://www.foundertype.com/index.php/FontInfo/index/id/244}{цЦ╣цнгцВащ╗С511M} шо╛шобх╕ИщЭЮхХЖхЕНш┤╣
+%
+% цАЭц║РхнЧф╜У\footnote{цАЭц║РхоЛф╜УхТМцАЭц║Рщ╗Сф╜УцЬЙф╕дчзНшЛ▒цЦЗхС╜хРНя╝МцЬмцибцЭ┐щЗЗчФиGoogleчЪДnotoч│╗хИЧ}я╝Ъ
+% \href{https://www.google.com/get/noto/#serif-hans}{цАЭц║РхоЛф╜У}уАБ
+% \href{https://www.google.com/get/noto/#sans-hans}{цАЭц║Рщ╗Сф╜У}
+%
+%
+%
+% цЦ╣цнгце╖ф╜УуАБцЦ╣цнгф╗┐хоЛф╕║хЕНш┤╣хХЖчФихнЧф╜Уя╝Мф╕ФцФпцМБCJKхнЧчмжщЫЖ
+% \href{http://www.foundertype.com/index.php/FontInfo/index/id/128.html}{цЦ╣цнгф╗┐хоЛ}
+% \href{http://www.foundertype.com/index.php/FontInfo/index/id/137.html}{цЦ╣цнгце╖ф╜У}
+%
+% хРДф╕кч│╗ч╗ЯчЪДщ╗ШшодхнЧф╜Ушп╖хПВшАГуАВхПпф╗ечЬЛхИ░я╝Мф╕НхРМч│╗ч╗Яф╕Кф╜┐чФичЪДхнЧф╜УцЬЙцЙАх╖охИля╝МхоЮщЩЕш╛УхЗ║ч╗УцЮЬхПпшГ╜хнШхЬич╗Жх╛оф╕НхРМ, ф╜┐чФицЧ╢шп╖ц│ицДПуАВф╛ЛхжВя╝МхЬиLinuxх╣│хП░цИЦшАЕф╜┐чФиф║ЖUbuntuхРОчлпчЪДхНЧхдз\hologo{TeX}ф╕Кя╝МхоЛф╜УхКач▓ЧцХИцЮЬцЫ┤цШОцШ╛я╝ЫхПжф╕АцЦ╣щЭвя╝МхЬиWindowsх╣│хП░ш┐ЫшбМч╝ЦшпСчЪДцХИцЮЬцЫ┤цОеш┐СWordхКач▓Ч\footnote{хЫаф╕║SimSunц▓бцЬЙхОЯчФЯч▓Чф╜Уя╝МщАЪш┐ЗAutoFakeBold=2.17ш┐ЫшбМцибф╗┐}я╝МчмжхРИшзЖшзЙф╣ацГпуАВ
+%
+% \end{function}
+%
+%
+% \subsection{х░БщЭвф┐бцБп}
+%
+% \subsection{ш╛УхЕеф╕кф║║ф┐бцБп}
+%
+% \begin{function}{\njusetup}
+%
+% хоЪф╣Йф║ЖчФиф║ОцЦЗцбгх░БщЭвчЪДшп╕хдЪх▒ЮцАзхПВцХ░я╝М
+% хЖЩф╜ЬцЧ╢ф┐оцФ╣чЫ╕х║ФхнЧчмжф╕▓хН│хПпуАВц│ицДПф╕НшжБцЬЙчй║шбМя╝МхРжхИЩхПпшГ╜цКещФЩ
+%
+% \end{function}
+%
+% цЬмчзСчФЯхПпф╗ехПВшАГхжВф╕ЛхИЧшбиш╛УхЕеф╕кф║║ф┐бцБпуАВц│ицДПф╕НшГ╜цЬЙчй║шбМя╝МцЬЙчй║ца╝чЪДхЖЕхо╣щЬАшжБх░Жчй║ца╝цЫ┐цНвф╕║ц│вц╡кч║┐цИЦшАЕф╕дчлпхКаф╕КхдзцЛмхП╖
+%
+% \begin{ctexexam}
+% \njusetup {
+% info = {
+% TitleA = ф╕АчзНф╜┐чФихНЧф║мхдзхнж\hologo{LaTeX}цибчЙИ,
+% TitleB = ч╝ЦхЖЩцпХф╕Ъшо║цЦЗчЪДч╗ПщкМцАзцЦ╣ц│Х,
+% Title* = {An Empirical Way of Composing Thesis with NJU \hologo{LaTeX} Template},
+% Grade = 2018,
+% StudentID = 189114514,
+% StudentName = хСичЕЬхНО,
+% StudentName* = Zhou~Yuhua,
+% Department = цЛЙхдкш╡лчзСхнжф╕ОцКАцЬпхнжщЩв,
+% Department* = School~of~\hologo{LaTeX},
+% Major = цЛЙхдкш╡лшпншиАхнж,
+% Major* = \hologo{LaTeX}~Linguistics,
+% SupervisorA = цЭОцИРцо┐,
+% SupervisorA*= Li~Chengdian,
+% SupervisorATitle = цХЩцОИ,
+% SupervisorATitle* = Professor,
+% SupervisorB = хнЩш╡лх╝е,
+% SupervisorB* = Sun~Hemi,
+% SupervisorBTitle = хЙпцХЩцОИ,
+% SupervisorBTitle* = Associate professor,
+% SubmitDate = 2021х╣┤8цЬИ10цЧе,
+% }
+% }
+% \end{ctexexam}
+%
+% чаФчй╢чФЯхПпф╗ехПВшАГхжВф╕ЛхИЧшбиш╛УхЕеф╕кф║║ф┐бцБп
+%
+% \begin{ctexexam}
+% \njusetup {
+% info = {
+% TitleA = ф╕АчзНф╜┐чФихНЧф║мхдзхнж\hologo{LaTeX}цибчЙИ,
+% TitleB = ч╝ЦхЖЩцпХф╕Ъшо║цЦЗчЪДч╗ПщкМцАзцЦ╣ц│Х,
+% TitleC = я╝ИхЖЕхо╣х╖▓ч╗Пш┐ЗцЧ╢я╝МшпжшзБшп┤цШОцЙЛхЖМя╝Й,
+% Title* = {An Empirical Way of Composing Thesis with NJU \hologo{LaTeX} Template},
+% Grade = 2018,
+% StudentID = dz18114514,
+% StudentName = хСичЕЬхНО,
+% StudentName* = Zhou~Yuhua,
+% Department = цЛЙхдкш╡лчзСхнжф╕ОцКАцЬпхнжщЩв,
+% Department* = School~of~\hologo{LaTeX},
+% Major = цЛЙхдкш╡лшпншиАхнж,
+% Major* = \hologo{LaTeX}~Linguistics,
+% Field = цЛЙхдкш╡лшпншиАхЬичО░х╜Уф╗гчЪДф╜┐чФи,
+% Field* = Contemporary~Usage~of~the~\hologo{LaTeX}~Language,
+% SupervisorA = цЭОцИРцо┐,
+% SupervisorA*= Li~Chengdian,
+% SupervisorATitle = цХЩцОИ,
+% SupervisorATitle* = Professor,
+% SubmitDate = 2021х╣┤8цЬИ10цЧе,
+% SubmitDate* = {Aug 10, 2021},
+% DefendDate = 2021х╣┤9цЬИ19цЧе,
+% ReviewerChairman = х╝ацЩУх▒▒~цХЩцОИ,
+% ReviewerA = чОЛчСЮх╕М~цХЩцОИ,
+% ReviewerB = щГнх╛╖ч║▓~хЙпцХЩцОИ,
+% ReviewerC = хНОшКИх║У~цХЩцОИ,
+% ReviewerD = цИ┤шП▓шП▓~цХЩцОИ,
+% Classification = 0175.2,
+% SecurityLevel = щЩРхИ╢,
+% UDC = 004.72,
+% SupervisorContact = {цЛЙхдкш╡лчзСхнжф╕ОцКАцЬпхнжщЩв цЮЭц▒Ях╕Вч╗Уф╕Шш╖п 19 хП╖ 114514},
+% }
+% }
+% \end{ctexexam}
+%
+% \subsection{цСШшжБщб╡}
+%
+% цСШшжБщб╡ф╕АшИмф╕НцПТхЕечЫох╜Хя╝Мщ╗ШшодхПкц╖╗хКаpdfф╣жчн╛уАВхжВчбохоЮцЬЙцПТхЕечЫох╜ХчЪДщЬАц▒Вя╝Мшп╖хЬи\texttt{abstract.sty}цЦЗф╗╢ф╕нхоЪф╜НхИ░хжВф╕ЛшпнхПе
+%
+% хЬиф╜┐чФи\hologo{LuaLaTeX}ч╝ЦшпСцЧ╢я╝МчаФчй╢чФЯф╕нцЦЗцСШшжБщб╡чЪДцаЗщвШф╝ЪхЗ║чО░чй║ца╝цЧаф╕ЛхИТч║┐чЪДщЧощвШя╝МчЫохЙНцнгхЬичзпцЮБхп╗ц▒ВшзгхЖ│цЦ╣ц│ХуАВ
+%
+% {хЙНшиАщб╡}
+% ф╜┐чФи\env{preface}чОпхвГхоЪф╣Й
+%
+%
+% \subsection{цнгцЦЗца╝х╝П}
+%
+% цЬмчзСчФЯцЧащб╡чЬЙя╝Мщб╡щЭвч╝ЦхП╖х▒Еф╕нф╜Нф║Ощб╡шДЪя╝ЫчаФчй╢чФЯцЧащб╡шДЪя╝Мщб╡чЬЙхМЕцЛмчлашКВхРНхТМщб╡щЭвч╝ЦхП╖уАВ
+%
+%
+% хп╣ф╕нцЦЗхКаф╕ЛхИТч║┐шп╖ф╜┐чФиxeCJKfntefхМЕчЪДCJKunderlineхС╜ф╗дф╗гцЫ┐ulineя╝Мф╗ешзгхЖ│ф╕нцЦЗчЪДцНвшбМщЧощвШ
+%
+% {хПВшАГцЦЗчМощб╡}
+%
+% щЬАшжБф╜┐чФиbiberцЙЛхКич╝ЦшпСцЙНф╝ЪцШ╛чд║я╝МхЕ╖ф╜УхЖЕхо╣хПВшАГ
+%
+% {шЗ┤ш░вщб╡}
+% хРМхЙНшиАя╝Мф╜┐чФи\env{acknowledgement}чОпхвГ
+%
+% {щЩДх╜Хщб╡}
+%
+% щЩДх╜ХцФ╛хЬи|\appendix|хС╜ф╗дхРОя╝Мф╗ешЛ▒цЦЗхнЧцпНш┐ЫшбМч╝ЦхП╖
+%
+% \end{documentation}
+%
+% \begin{implementation}
+%
+% \section{ф╗гчаБхоЮчО░}
+% @@хЬиl3docstripф╕ншбичд║хРНчй║щЧ┤я╝МхЬичФЯцИРclsцЧ╢ф╝ЪшвлчЫ╕х║ФхнЧцо╡цЫ┐цНвя╝МшнмхжВхЬиnjuthesisф╕н@@=njuуАВ
+% х░ЦцЛмхП╖хМЕшг╣чЪД|<*class>||</class>|чФицЭецМЗхоЪцЯРцо╡ф╗гчаБх▒Юф║ОхУкф╕кцЦЗф╗╢уАВ
+%
+% \begin{macrocode}
+%<@@=nju>
+%<*class>
+\LoadClass[
+ a4paper,
+ twoside,
+ UTF8,
+ scheme=chinese,
+% \end{macrocode}
+%
+% хЕ│ф║ОшбМш╖Эя╝М\hologo{LaTeX}щ╗Шшод1.2шбМш╖Эя╝Мwordщ╗ШшодшбМш╖ЭцШп1.3я╝МшжБц▒В1.5хАНwordшбМш╖Эя╝МцХЕ
+% \[ 1.5\times\frac{1.3}{1.2} = 1.625\]
+% \begin{macrocode}
+ linespread=1.625,
+ fontset=none,
+ zihao=-4
+ ]{ctexbook}[2018/04/01]
+% \end{macrocode}
+%
+% хоПхМЕ\pkg{l3keys2e}чФиф║ОщЕНч╜оцибцЭ┐щАЙщб╣уАВ
+% \begin{macrocode}
+\RequirePackage{l3keys2e}
+% \end{macrocode}
+% чФиф║ОхнШхВихнжф╜НхРНчз░чЪДхЕих▒АхПШщЗПя╝Мц│ицДПхоПчЪДхС╜хРНя╝Мlф╗гшбих▒АщГихПШщЗПя╝Мgф╗гшбихЕих▒АхПШщЗП
+% \begin{macrocode}
+\tl_new:N \l_@@_info_degree_tl
+\tl_new:N \l_@@_info_type_tl
+% \end{macrocode}
+%
+% цШпхРжщЬАшжБхЫ╜хо╢хЫ╛ф╣жщжЖх░БщЭвчЪДшо╛ч╜о
+% \begin{macrocode}
+\keys_define:nn { nju }
+{
+ nlcover .bool_set:N = \g_@@_nlcover_bool,
+ nlcover .initial:n = false,
+}
+% \end{macrocode}
+%
+% хнжф╜Нф┐бцБпчЪДшо╛ч╜о
+% \begin{macrocode}
+\keys_define:nn { nju }
+{
+ degree .choices:nn =
+ { ug, mg, mg, phd }
+ { \tl_set_eq:NN \l_@@_info_degree_tl \l_keys_choice_tl },
+ degree .initial:n = ug,
+ type .choices:nn =
+ { thesis, design }
+ { \tl_set_eq:NN \l_@@_info_type_tl \l_keys_choice_tl },
+ type .initial:n = thesis,
+}
+% \end{macrocode}
+%
+% \subsection{ф╕кф║║ф┐бцБп}
+% ш╛УхЕеф╕кф║║ф┐бцБпчЪДхМ║хЯЯуАВ
+% \begin{macrocode}
+\keys_define:nn { nju }
+{
+ info.meta:nn = { nju / info } { #1 }
+}
+% \end{macrocode}
+%
+% щвШчЫо
+% \begin{macrocode}
+\keys_define:nn { nju / info }
+{
+ TitleA .tl_set:N = \l_@@_info_title_a_tl,
+ TitleB .tl_set:N = \l_@@_info_title_b_tl,
+ TitleC .tl_set:N = \l_@@_info_title_c_tl,
+ Title* .tl_set:N = \l_@@_info_title_en_tl,
+}
+% \end{macrocode}
+%
+% х╣┤ч║зуАБхнжхП╖уАБхзУхРН
+% \begin{macrocode}
+\keys_define:nn { nju / info }
+{
+ Grade .tl_set:N = \l_@@_info_grade_tl,
+ StudentID .tl_set:N = \l_@@_info_id_tl,
+ StudentName .tl_set:N = \l_@@_info_author_tl,
+ StudentName* .tl_set:N = \l_@@_info_author_en_tl,
+}
+% \end{macrocode}
+%
+% щЩвч│╗уАБф╕Уф╕ЪуАБцЦ╣хРС
+% \begin{macrocode}
+\keys_define:nn { nju / info }
+{
+ Department .tl_set:N = \l_@@_info_dept_tl,
+ Department* .tl_set:N = \l_@@_info_dept_en_tl,
+ Major .tl_set:N = \l_@@_major_tl,
+ Major* .tl_set:N = \l_@@_major_en_tl,
+ Field .tl_set:N = \l_@@_field_tl,
+ Field* .tl_set:N = \l_@@_field_en_tl,
+}
+% \end{macrocode}
+%
+% хп╝х╕И
+%
+% \begin{macrocode}
+\keys_define:nn { nju / info }
+{
+ SupervisorA .tl_set:N = \l_@@_info_supv_a_tl,
+ SupervisorA* .tl_set:N = \l_@@_info_supv_a_en_tl,
+ SupervisorATitle .tl_set:N = \l_@@_info_supv_a_title_tl,
+ SupervisorATitle* .tl_set:N = \l_@@_info_supv_a_title_en_tl,
+}
+% \end{macrocode}
+%
+% чммф║Мхп╝х╕И
+%
+% \begin{macrocode}
+\keys_define:nn { nju / info }
+{
+ SupervisorB .tl_set:N = \l_@@_info_supv_b_tl,
+ SupervisorB* .tl_set:N = \l_@@_info_supv_b_en_tl,
+ SupervisorBTitle .tl_set:N = \l_@@_info_supv_b_title_tl,
+ SupervisorBTitle* .tl_set:N = \l_@@_info_supv_b_title_en_tl,
+}
+% \end{macrocode}
+%
+% цПРф║дцЧецЬЯ
+% \begin{macrocode}
+\keys_define:nn { nju / info }
+{
+ SubmitDate .tl_set:N = \l_@@_submit_date_tl,
+ SubmitDate* .tl_set:N = \l_@@_submit_date_en_tl,
+}
+% \end{macrocode}
+%
+% чнФш╛й
+% \begin{macrocode}
+\keys_define:nn { nju / info }
+{
+ DefendDate .tl_set:N = \l_@@_defend_date_tl,
+ ReviewerChairman .tl_set:N = \l_@@_info_chairman_tl,
+ ReviewerA .tl_set:N = \l_@@_info_reviewer_a_tl,
+ ReviewerB .tl_set:N = \l_@@_info_reviewer_b_tl,
+ ReviewerC .tl_set:N = \l_@@_info_reviewer_c_tl,
+ ReviewerD .tl_set:N = \l_@@_info_reviewer_d_tl,
+}
+% \end{macrocode}
+%
+% хЫ╜хо╢хЫ╛ф╣жщжЖх░БщЭвчЫ╕хЕ│
+% \begin{macrocode}
+\keys_define:nn { nju / info }
+{
+ Classification .tl_set:N = \l_@@_info_classif_tl,
+ SecurityLevel .tl_set:N = \l_@@_info_seclv_tl,
+ UDC .tl_set:N = \l_@@_info_udc_tl,
+ SupervisorContact .tl_set:N = \l_@@_info_supv_cont_tl,
+}
+% \end{macrocode}
+% хоЪф╣ЙчФиф║Ошо╛ч╜оф╕кф║║ф┐бцБпчЪДхС╜ф╗д
+% \begin{macrocode}
+\NewDocumentCommand \njusetup { m }
+{ \keys_set:nn { nju } { #1 } }
+% \end{macrocode}
+%
+% ф╜┐чФи\pkg{geometry}шо╛ч╜ощб╡ш╛╣ш╖ЭуАВ
+% \begin{macrocode}
+\RequirePackage[
+ top=2.5cm,
+ bottom=2.5cm,
+ left=3.2cm,
+ right=3.2cm
+]{geometry}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\RequirePackage{xparse}
+\RequirePackage{titletoc} % ф┐оцФ╣чЫох╜ХхЖЕцаЗщвШца╝х╝П
+\RequirePackage[hyphens]{url} % generate better linebreaks in the url
+% \RequirePackage[normalem]{ulem} % ч╗ШхИ╢ф╕ЛхИТч║┐
+\RequirePackage{dashundergaps}
+\RequirePackage{setspace}
+\RequirePackage{lastpage}
+\RequirePackage{emptypage} % ц╕ЕщЩдчй║чЩ╜щб╡чЪДщб╡чаБ
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\RequirePackage{listings} % ф╗гчаБчОпхвГ
+\RequirePackage{enumitem} % чФиф║Оф┐оцФ╣хИЧшбичОпхвГ
+\RequirePackage{caption}
+\RequirePackage{floatrow} % чФиф║ОхЫ╛шбичнЙщб╡щЭвхЕГч┤ачЪДхоЪф╜Н
+\RequirePackage{booktabs} % чФиф║Оч╗ШхИ╢ф╕Йч║┐шби
+\RequirePackage{multirow} % Cells occupying multiple rows in tables
+\RequirePackage{multicol} % Multiple columns in dictionary
+\RequirePackage{siunitx} % чФиф║Оф╣жхЖЩхНХф╜НчмжхП╖
+% \end{macrocode}
+%
+% чФиф║ОхМЦхнж
+% \begin{macrocode}
+\RequirePackage[version=4]{mhchem} % чФиф║Оч╗ШхИ╢хИЖхнРх╝П
+% \end{macrocode}
+%
+% чФиф║ОчФЯцИРхПпф╗ешвлцПТхЕеф╣жчн╛чЪДLaTeX logoя╝МTODO: ф╜┐чФиhologoхИЫх╗║|latex{}|хС╜ф╗д
+% \begin{macrocode}
+\RequirePackage{hologo}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+% Required to prevent page break right after a sectioning command
+% \RequirePackage{needspace}
+
+% \RequirePackage{xspace} % Better print trailing whitespace
+% \end{macrocode}
+%
+% щТИхп╣ч╝ЦшпСх╝ХцУОя╝Мф╜┐чФиф╕НхРМчЪДхоПхМЕщЗНцЮДф╕ЛхИТч║┐хС╜ф╗д
+% \begin{macrocode}
+\sys_if_engine_xetex:T
+{
+ \RequirePackage{microtype}
+
+ % хКаф╕нцЦЗф╕ЛхИТч║┐я╝Мф╕НшГ╜чФиф║Оlualatex
+ \RequirePackage{xeCJKfntef}
+ \cs_new:Npn \nju_underline:n #1 {\CJKunderline{#1}}
+}
+\sys_if_engine_luatex:T{
+ % хКаф╕нцЦЗф╕ЛхИТч║┐
+ \RequirePackage{lua-ul}
+ \cs_new:Npn \nju_underline:n #1 {\underLine{#1}}
+
+ % emojiцФпцМБ
+ % \RequirePackage{emoji}
+ % \setemojifont{Segoe~UI~Emoji} % windows
+ % \setemojifont{Apple~Color~Emoji} % macos
+ % \setemojifont{Noto~Color~Emoji}
+ % For windows.
+ % Shipped with the best `grinning-face-with-sweat' support.
+}
+% \end{macrocode}
+%
+% чФЯцИРчФиф║Оц╡ЛшпХчЪДхдзцо╡цЧацДПф╣ЙшЛ▒цЦЗцЦЗхнЧ
+% \begin{macrocode}
+\RequirePackage{blindtext}
+\RequirePackage{zhlipsum}
+% \end{macrocode}
+%
+% хКаш╜╜ф╗ехРОх▒Хчд║хЖЕхо╣ш╛╣чХМ
+% \begin{macrocode}
+% \RequirePackage{showframe}
+% \end{macrocode}
+%
+% цХ░хнж
+% \begin{macrocode}
+\RequirePackage{amsmath} % Must be loaded before unicode-math
+\RequirePackage{amsthm} % Mathematical environments
+\RequirePackage{mathtools} % Mathematical tools to use with amsmath
+\RequirePackage{thmtools} % Theorem styles
+\RequirePackage[
+ warnings-off={% ц╢ИщЩдф╕ОmathtoolsхРИчФиф║зчФЯчЪДшнжхСК
+ mathtools-colon,
+ mathtools-overbracket}
+ ]{unicode-math} % Math fonts in xetex or luatex
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\RequirePackage{graphicx}
+\DeclareGraphicsExtensions{.pdf,.eps,.jpg,.png}
+\graphicspath{{figure/}} % хЫ╛чЙЗш╖пх╛Д
+\RequirePackage{wrapfig} % Wrap text around figures
+% \end{macrocode}
+%
+% х┐Ещб╗ф╗ешпещб║х║ПхКаш╜╜ф╗еф╕Лф╕Йф╕кхМЕ
+% \begin{macrocode}
+% \RequirePackage{varioref}
+\RequirePackage[hidelinks,bookmarksnumbered=true]{hyperref}
+\RequirePackage[capitalise,nameinlink,noabbrev]{cleveref}
+% \end{macrocode}
+%
+% \subsection{хнЧф╜Ушо╛ч╜о}
+%
+% хКаш╜╜шо╛ч╜охнЧф╜УцЙАщЬАчЪДхМЕ\pkg{fontspec}
+% \begin{macrocode}
+\RequirePackage{fontspec}
+% \end{macrocode}
+%
+%
+%
+% \begin{variable}{\g_@@_latin_fontset_tl,\g_@@_cjk_fontset_tl}
+% чФиф║ОхнШхВицЙАф╜┐чФихнЧф╜УхРНчз░чЪДхЕих▒АхПШщЗП
+% \begin{macrocode}
+\tl_new:N \g_@@_latin_fontset_tl
+\tl_new:N \g_@@_cjk_fontset_tl
+% \end{macrocode}
+% \end{variable}
+%
+% хоЪф╣ЙхнЧф╜УщАЙщб╣
+% \begin{macrocode}
+\keys_define:nn { nju }
+{
+ customlatinfont .choices:nn =
+ { gyre, macos, windows, null }
+ { \tl_set_eq:NN \g_@@_latin_fontset_tl \l_keys_choice_tl },
+ customchinesefont .choices:nn =
+ { fandol, founder, macos, noto, windows, null }
+ { \tl_set_eq:NN \g_@@_cjk_fontset_tl \l_keys_choice_tl },
+}
+% \end{macrocode}
+%
+% \begin{macro}{\ProcessKeysOptions}
+% хЬихоЪф╣ЙхоМхЕищГишо╛ч╜оф╗ехРОф╗ОtexцЦЗф╗╢хп╝шиАхМ║ш╛УхЕехПВцХ░
+% \begin{macrocode}
+\ProcessKeysOptions { nju }
+% \end{macrocode}
+% \end{macro}
+%
+% хжВцЮЬцЬкш┐ЫшбМшо╛ч╜охИЩф╜┐чФич│╗ч╗Ящ╗ШшодхнЧф╜УшжЖчЫЦш╛УхЕехПВцХ░
+%
+% \begin{variable}{\g_@@_load_system_fontset_bool}
+% чФиф║ОхИдцЦнцШпхРжщЬАшжБш╜╜хЕеч│╗ч╗ЯщвДшгЕхнЧф╜УчЪДхЕих▒АхПШщЗП
+% \begin{macrocode}
+\bool_new:N \g_@@_load_system_fontset_bool
+% \end{macrocode}
+% \end{variable}
+%
+% хИдцЦнчФицИ╖цШпхРжшЗкхоЪф╣Йф║Жф╕ншЛ▒цЦЗхнЧф╜Уя╝МхжВцЮЬхЕ╢ф╕нф╗╗цДПф╕АчзНцЬкшвлхоЪф╣Йя╝М
+% хИЩф╜┐чФич│╗ч╗ЯщвДшгЕхнЧф╜УшжЖчЫЦхнЧф╜УщАЙщб╣
+% \begin{macrocode}
+\tl_if_empty:NTF \g_@@_latin_fontset_tl
+ { \bool_gset_true:N \g_@@_load_system_fontset_bool }
+{
+ \tl_if_empty:NT \g_@@_cjk_fontset_tl
+ { \bool_gset_true:N \g_@@_load_system_fontset_bool }
+}
+\bool_if:NT \g_@@_load_system_fontset_bool
+{
+ % цгАц╡ЛцШпхРжцШп Windows
+ \sys_if_platform_windows:TF
+ {
+ \tl_set:Nn \g_@@_latin_fontset_tl { windows }
+ \tl_set:Nn \g_@@_cjk_fontset_tl { windows }
+ }
+ {
+ % цгАц╡ЛцШпхРжцШп macOS
+ \ctex_if_platform_macos:TF
+ {
+ \tl_set:Nn \g_@@_latin_fontset_tl { macos }
+ \tl_set:Nn \g_@@_cjk_fontset_tl { macos }
+ }
+ % хЕ╢ф╜Щч│╗ч╗Яф╕Ах╛Лф╜┐чФишЗкчФ▒хнЧф╜У
+ {
+ \tl_set:Nn \g_@@_latin_fontset_tl { gyre }
+ \tl_set:Nn \g_@@_cjk_fontset_tl { fandol }
+ }
+ }
+}
+% \end{macrocode}
+%
+% цОеф╕ЛцЭещАРф╕кхоЪф╣ЙцЙАщЬАшжБф╜┐чФичЪДхнЧчмжщЫЖ
+%
+% \begin{macro}{\@@_load_latin_font_windows:}
+% Windows ше┐цЦЗхнЧф╜У
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_load_latin_font_windows:
+{
+ \setmainfont{Times~New~Roman}
+ \setsansfont{Arial}
+ \setmonofont{Courier~New}[Scale=MatchLowercase]
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_load_latin_font_macos:}
+% macOS ше┐цЦЗхнЧф╜У
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_load_latin_font_macos:
+{
+\setmainfont{Times~New~Roman}
+\setsansfont{Arial}
+\setmonofont{Menlo}[Scale=MatchLowercase]
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_load_latin_font_gyre:}
+% х╝Ац║РчЪД gyre ше┐цЦЗхнЧф╜У
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_load_latin_font_gyre:
+{
+\setmainfont{texgyretermes}[
+ Extension=.otf,
+ UprightFont=*-regular,
+ BoldFont=*-bold,
+ ItalicFont=*-italic,
+ BoldItalicFont=*-bolditalic]
+\setsansfont{texgyreheros}[
+ Extension=.otf,
+ UprightFont=*-regular,
+ BoldFont=*-bold,
+ ItalicFont=*-italic,
+ BoldItalicFont=*-bolditalic]
+\setmonofont{texgyrecursor}[
+ Extension=.otf,
+ UprightFont=*-regular,
+ BoldFont=*-bold,
+ ItalicFont=*-italic,
+ BoldItalicFont=*-bolditalic,
+ Scale=MatchLowercase,
+ Ligatures=CommonOff]
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_load_cjk_font_windows:}
+% Windows ф╕нцЦЗхнЧф╜У
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_load_cjk_font_windows:
+{
+ \setCJKmainfont{SimSun}[
+ AutoFakeBold=2.17,
+ ItalicFont=KaiTi]
+ \setCJKsansfont{SimHei}
+ \setCJKmonofont{FangSong}
+ \setCJKfamilyfont{zhsong}{SimSun}[AutoFakeBold=2.17]
+ \setCJKfamilyfont{zhhei}{SimHei}
+ \setCJKfamilyfont{zhfs}{FangSong}
+ \setCJKfamilyfont{zhkai}{KaiTi}[AutoFakeBold=2.17]
+ \setCJKfamilyfont{zhnewhei}{Microsoft~YaHei}[
+ BoldFont=Microsoft~YaHei~Bold]
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_load_cjk_font_macos:}
+% macOS хнЧф╜У
+% хПВшАГCTeXцЙЛхЖМчмм9шКВ LuaLATEX ф╕ЛчЪДф╕нцЦЗцФпцМБцЦ╣х╝ПшзгхЖ│issueщЧощвШ
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_load_cjk_font_macos:
+{
+ % чз╗щЩд does not contain script "CJK" шнжхСК
+ \msg_redirect_name:nnn {fontspec} {no-script} {info}
+ \setCJKmainfont{Songti~SC~Light}[
+ BoldFont=Songti~SC~Bold,
+ ItalicFont=Kaiti~SC,
+ BoldItalicFont=Kaiti~SC~Bold]
+ \setCJKsansfont{Heiti~SC~Light}[BoldFont=Heiti~SC~Medium]
+ \setCJKmonofont{STFangsong}
+ \setCJKfamilyfont{zhsong}{Songti~SC~Light}[BoldFont=Songti~SC~Bold]
+ \setCJKfamilyfont{zhhei}{Heiti~SC~Light}[BoldFont=Heiti~SC~Medium]
+ \setCJKfamilyfont{zhfs}{STFangsong}
+ \setCJKfamilyfont{zhkai}{Kaiti~SC}
+ [
+ BoldFont=Kaiti~SC~Bold,
+ % AlternateFont =
+ % {
+ % {character range1} {alternate font name1}
+ % {alternate font features2} ,
+ % ......
+ % }
+ ]
+ \setCJKfamilyfont{zhnewhei}{PingFang~SC}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_load_cjk_font_fandol:}
+% Fandol хнЧф╜У
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_load_cjk_font_fandol:
+{
+ % чз╗щЩд does not contain script "CJK" шнжхСК
+ \msg_redirect_name:nnn {fontspec} {no-script} {info}
+ \setCJKmainfont{FandolSong-Regular}[
+ Extension=.otf,
+ BoldFont=FandolSong-Bold,
+ ItalicFont=FandolKai-Regular]
+ \setCJKsansfont{FandolHei-Regular}[
+ Extension=.otf,
+ BoldFont=FandolHei-Bold]
+ \setCJKmonofont{FandolFang-Regular}[Extension=.otf]
+ \setCJKfamilyfont{zhsong}{FandolSong-Regular}[
+ Extension=.otf,
+ BoldFont=FandolSong-Bold]
+ \setCJKfamilyfont{zhhei}{FandolHei-Regular}[
+ Extension=.otf,
+ BoldFont=FandolHei-Bold]
+ \setCJKfamilyfont{zhfs}{FandolFang-Regular}[Extension=.otf]
+ \setCJKfamilyfont{zhkai}{FandolKai-Regular}[
+ Extension=.otf,
+ AutoFakeBold=2.17]
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_load_cjk_font_founder:}
+% цЦ╣цнгхнЧчмжщЫЖя╝ИчоАч╣БцЙйх▒Хя╝Й
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_load_cjk_font_founder:
+{
+ \setCJKmainfont{FZSSK}[% цЦ╣цнгф╣жхоЛ
+ Extension=.ttf,
+ BoldFont=FZXBSK,% цЦ╣цнгх░ПцаЗхоЛ
+ ItalicFont=FZKTK]% цЦ╣цнгце╖ф╜У
+ \setCJKsansfont{FZXH1K}[% цЦ╣цнгч╗Жщ╗Сф╕А
+ Extension=.ttf,
+ BoldFont=FZHTK]% FZHTK цЦ╣цнгщ╗Сф╜У
+ \setCJKmonofont{FZFSK}[Extension=.ttf]% цЦ╣цнгф╗┐хоЛ
+ \setCJKfamilyfont{zhsong}
+ {FZSSK}[
+ Extension=.ttf,
+ BoldFont=FZXBSK]
+ \setCJKfamilyfont{zhhei}
+ {FZHTK}[
+ Extension=.ttf,
+ AutoFakeBold=2.17]
+ \setCJKfamilyfont{zhfs}
+ {FZFSK}[Extension=.ttf]
+ \setCJKfamilyfont{zhkai}
+ {FZKTK}[Extension=.ttf]
+ \setCJKfamilyfont{zhnewhei}
+ {FZYouHK_508R}[% цЦ╣цнгцВащ╗С508R
+ Extension=.ttf,
+ BoldFont=FZYouHK_511M]% цЦ╣цнгцВащ╗С511M
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_load_cjk_font_noto:}
+% цАЭц║РхнЧф╜У
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_load_cjk_font_noto:
+{
+ % цАЭц║РхоЛф╜У
+ \setCJKmainfont[
+ UprightFont=NotoSerifCJKsc-Regular,
+ BoldFont=NotoSerifCJKsc-Bold,
+ ItalicFont=NotoSerifCJKsc-Regular,
+ BoldItalicFont=NotoSerifCJKsc-Bold,
+ ItalicFeatures=FakeSlant,
+ BoldItalicFeatures=FakeSlant]{Noto~Serif~CJK~SC}
+
+ % цАЭц║Рщ╗Сф╜У
+ \setCJKsansfont[
+ UprightFont=NotoSansCJKsc-Regular,
+ BoldFont=NotoSansCJKsc-Bold,
+ ItalicFont=NotoSansCJKsc-Regular,
+ BoldItalicFont=NotoSansCJKsc-Bold,
+ ItalicFeatures=FakeSlant,
+ BoldItalicFeatures=FakeSlant]{Noto~Sans~CJK~SC}
+
+ % хМЕхРлф║ОцАЭц║Рщ╗Сф╜У
+ \setCJKmonofont[
+ UprightFont=NotoSansMonoCJKsc-Regular,
+ BoldFont=NotoSansMonoCJKsc-Bold,
+ ItalicFont=NotoSansMonoCJKsc-Regular,
+ BoldItalicFont=NotoSansMonoCJKsc-Bold,
+ ItalicFeatures=FakeSlant,
+ BoldItalicFeatures=FakeSlant]{Noto~Sans~Mono~SC}
+
+ \setCJKfamilyfont{zhsong}{Noto~Serif~CJK~SC}
+ \setCJKfamilyfont{zhhei}{Noto~Sans~CJK~SC}
+ \setCJKfamilyfont{zhfs}{цЦ╣цнгф╗┐хоЛчоАф╜У}[AutoFakeBold=2.17]
+ \setCJKfamilyfont{zhkai}{цЦ╣цнгце╖ф╜УчоАф╜У}[AutoFakeBold=2.17]
+}
+% \end{macrocode}
+% \end{macro}
+%
+% ш╜╜хЕешо╛ч╜очЪДхнЧф╜У
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_load_font:
+{
+ \use:c { @@_load_latin_font_ \g_@@_latin_fontset_tl : }
+ \use:c { @@_load_cjk_font_ \g_@@_cjk_fontset_tl : }
+
+ \NewDocumentCommand\songti{}{\CJKfamily{zhsong}}
+ \NewDocumentCommand\heiti{}{\CJKfamily{zhhei}}
+ \NewDocumentCommand\fangsong{}{\CJKfamily{zhfs}}
+ \NewDocumentCommand\kaishu{}{\CJKfamily{zhkai}}
+}
+\@@_load_font:
+% \end{macrocode}
+%
+% шо╛ч╜оцХ░хнжхнЧф╜У (XITS, цИЦшАЕ STIX, ф╕О Times New Roman цЬАф╕║чЫ╕ш┐С)
+% \begin{macrocode}
+% \setmathfont{STIXTwoMath-Regular}[Extension = .otf]
+\setmathfont{XITSMath-Regular}[
+ BoldFont = XITSMath-Bold,
+ Extension = .otf]
+% \end{macrocode}
+%
+%
+% \subsection{щб╡щЭвца╖х╝П}
+%
+% \subsubsection{щб╡чЬЙщб╡шДЪ}
+%
+%
+% \begin{macrocode}
+\RequirePackage{fancyhdr} % ш░ГцХ┤щб╡чЬЙщб╡шДЪ
+% цЬмчзСчФЯщб╡чЬЙщб╡шДЪ
+\fancypagestyle{njuplain}{%
+ \fancyhead{}
+ \fancyfoot[C]{\zihao{5}\thepage} % щб╡шДЪх▒Еф╕н ф║ФхП╖цЦ░ч╜Чщймф╜УцХ░хнЧ
+}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+% TODO: чаФчй╢чФЯщб╡чЬЙщб╡шДЪ
+\fancypagestyle{njuheadings}{%
+ \fancyhead{}
+ \fancyfoot[C]{\zihao{5}\thepage}
+}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\str_if_eq:NNTF {\l_@@_info_degree_tl} { ug }
+{
+ % the header line
+ \tl_set:Nn \headrulewidth {0pt}
+ % the footer line
+ \tl_set:Nn \footrulewidth {0pt}
+
+ \AtBeginDocument{\pagestyle{njuplain}} % цЬмчзСцЧащб╡чЬЙщб╡шДЪ
+}
+{
+ % the header line
+ \tl_set:Nn \headrulewidth {1pt}
+ % the footer line
+ \tl_set:Nn \footrulewidth {0pt}
+
+ % \AtBeginDocument{\pagestyle{njuplain}} % цЧащб╡чЬЙщб╡шДЪ
+ \AtBeginDocument{\pagestyle{headings}} % чаФчй╢чФЯцЬЙщб╡чЬЙщб╡шДЪ
+}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+% ctexца╝х╝Пшо╛ч╜о
+% чЫох╜ХцаЗщвШ ф╕ЙхП╖хоЛф╜УхКач▓Ч
+% хРДщГихИЖцаЗщвШ хЫЫхП╖щ╗Сф╜У
+\ctexset{
+ contentsname = чЫох╜Х,
+ listfigurename = цПТхЫ╛ц╕ЕхНХ,
+ listtablename = шбица╝ц╕ЕхНХ,
+ chapter/format = \zihao{4}\heiti\centering,
+ chapter/beforeskip = 10pt,
+ chapter/afterskip = 60pt,
+ section/format = \zihao{4}\heiti\raggedright,
+ subsection/format = \zihao{4}\heiti\raggedright,
+ subsubsection/format = \zihao{4}\heiti\raggedright
+}
+
+% щЗНхоЪф╣ЙчЫох╜Хф╕нчлашКВцаЗщвШца╖х╝П
+% чЫох╜ХхЖЕхо╣ф╕нчлачЪДцаЗщвШ хЫЫхП╖щ╗Сф╜У
+% чЫох╜Хф╕нхЕ╢ф╗ЦхЖЕхо╣ х░ПхЫЫхП╖хоЛф╜У
+\titlecontents{chapter}% цаЗщвШч║зхИл
+ [5em]% цаЗщвШх╖жщЧ┤ш╖Э
+ {\heiti\zihao{4}\vspace{10pt}}% цаЗщвШца╝х╝П
+ {\contentslabel{4em}}% цаЗщвШцаЗх┐Ч
+ {\hspace*{-4em}}% цЧах║ПхП╖цаЗщвШ
+ {~\titlerule*[0.6pc]{$.$}~\contentspage}% цМЗх╝Хч║┐ф╕Ощб╡чаБ
+
+ \titlecontents{section}
+ [5em]
+ {\zihao{-4}\vspace{0pt}}
+ {\contentslabel{2.5em}}
+ {\hspace*{-4em}}
+ {~\titlerule*[0.6pc]{$.$}~\contentspage}
+
+\titlecontents{subsection}
+ [8em]
+ {\zihao{-4}\vspace{0pt}}
+ {\contentslabel{3em}}
+ {\hspace*{-4em}}
+ {~\titlerule*[0.6pc]{$.$}~\contentspage}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\cs_set:Npn \CTEX@addtocline #1#2
+{
+ \addcontentsline { toc } {#1}
+ { \use:c { CTEX@#1@tocline } {#1} {#2} }
+}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+% чЫох╜Хщб╡щЭвца╝х╝Пф┐оцФ╣
+\cs_new:Npn \nju_tocpagestyle:nnn #1 #2 #3
+{
+ \newpage
+ \hspace{0pt}
+ \vskip 10pt
+ \begin{center}
+ \mbox{\songti\bf\zihao{3}{#1}} % чЫох╜Хщб╡щЭвцаЗщвШ
+ \phantomsection
+ \addcontentsline{toc}{chapter}{#2} % цПТхЕечЫох╜Х
+ \end{center}
+ \vskip 40pt
+ \@starttoc{#3}%
+ \cleardoublepage
+}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\tl_set:Nn \tableofcontents
+{
+ \nju_tocpagestyle:nnn {чЫо\hspace{2em}х╜Х}{\contentsname}{toc}
+}
+\tl_set:Nn \listoffigures
+{
+ \nju_tocpagestyle:nnn {\listfigurename}{\listfigurename}{lof}
+}
+\tl_set:Nn \listoftables
+{
+ \nju_tocpagestyle:nnn {\listtablename}{\listtablename}{lot}
+}
+% \end{macrocode}
+%
+% \begin{environment}{preface}
+%
+% \begin{macrocode}
+% хоЪхИ╢хЙНшиАуАБшЗ┤ш░вчОпхвГ
+\NewDocumentEnvironment{preface}{}
+{%
+ \chapter*{хЙНшиА}
+ \addcontentsline{toc}{chapter}{хЙНшиА}
+}{}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{acknowledgement}
+% хНХчЛмхИ╢ф╜ЬчЪДшЗ┤ш░вщб╡уАВ
+% \begin{macrocode}
+\NewDocumentEnvironment{acknowledgement}{}
+{%
+ \chapter*{шЗ┤ш░в}
+ \addcontentsline{toc}{chapter}{шЗ┤ш░в}
+}{}
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \begin{macrocode}
+% biblatexшо╛ч╜о
+\RequirePackage[
+ style=gb7714-2015,
+ %style=numeric-comp,
+ %citestyle=authortitle-icomp,
+ % citestyle=numeric-comp,
+ %bibstyle=authoryear,
+ % bibstyle=numeric,
+ sorting=none,
+ %sorting=nyt,
+ %sortcites=true,
+ %autocite=footnote,
+ backend=biber, % Compile the bibliography with biber
+ hyperref=true,
+ backref=false,
+ citecounter=true,
+ pagetracker=true,
+ citetracker=true,
+ ibidtracker=context,
+ autopunct=true,
+ autocite=plain,
+ % gbpub=false, % Uncomment if you do NOT want '[S.l. : s.n.]'
+ % in reference entries, GitHub Issue (#47)
+ % gbnamefmt=lowercase, % Uncomment if you do NOT want uppercase author
+ % names in reference entries, GitHub Issue (#23)
+]{biblatex}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+% Remove some unwanted entries from the bibliography
+\AtEveryBibitem{
+ \clearfield{abstract}
+ \clearfield{issn}
+ \clearfield{isbn}
+ \clearfield{archivePrefix}
+ \clearfield{arxivId}
+ \clearfield{pmid}
+ \clearfield{eprint}
+ \ifentrytype{online}{}{\ifentrytype{misc}{}{\clearfield{url}}}
+ % \ifentrytype{book}{\clearfield{doi}}{}
+}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+% ф┐оцФ╣цаЗчн╛хРНчз░
+\crefdefaultlabelformat{#2#1#3\,} % щ╗ШшодхЬихРНчз░хРОщЭвц╖╗хКачй║ца╝
+
+\crefname{figure}{хЫ╛}{хЫ╛}
+\crefname{table}{шби}{шби}
+% \crefname{equation}{хЕмх╝П}{хЕмх╝П}
+\crefformat{equation}{хЕмх╝П~#2#1#3~} % хИащЩдхЕмх╝Пч╝ЦхП╖чЪДцЛмхП╖
+
+\crefformat{chapter}{чмм#2#1#3чла}
+\crefformat{section}{чмм~#2#1#3~шКВ}
+\crefformat{subsection}{чмм~#2#1#3~х░ПшКВ}
+\crefformat{subsubsection}{чмм~#2#1#3~х░ПшКВ}
+% \crefname{chapter}{┬з}{┬з}
+% \crefname{section}{┬з}{┬з}
+% \crefname{subsection}{┬з}{┬з}
+% \crefname{subsubsection}{┬з}{┬з}
+\crefname{appendix}{щЩДх╜Х}{щЩДх╜Х}
+
+% \crefname{definition}{хоЪф╣Й}{хоЪф╣Й}
+% \crefname{axiom}{хЕмчРЖ}{хЕмчРЖ}
+% \crefname{property}{цАзш┤и}{цАзш┤и}
+% \crefname{proposition}{хС╜щвШ}{хС╜щвШ}
+% \crefname{lemma}{х╝ХчРЖ}{х╝ХчРЖ}
+% \crefname{corollary}{цОишо║}{цОишо║}
+% \crefname{remark}{ц│ишзг}{ц│ишзг}
+% \crefname{condition}{цЭбф╗╢}{цЭбф╗╢}
+% \crefname{conclusion}{ч╗Ушо║}{ч╗Ушо║}
+% \crefname{assumption}{хБЗшо╛}{хБЗшо╛}
+% \end{macrocode}
+%
+% soifjsojfosjfos
+% \begin{macrocode}
+% хЫ╛шбиф╜Нч╜ош░ГцХ┤
+\floatsetup[lstlisting]{ % Captions for lstlistings
+ capposition=above,%
+ margins=centering,%
+ floatwidth=\textwidth%
+}
+\floatsetup[figure]{ % Captions for figures
+ capposition=bottom,%
+ margins=centering,%
+ floatwidth=\textwidth%
+}
+\floatsetup[table]{ % Captions for tables
+ capposition=above,%
+ margins=centering,%
+ floatwidth=\textwidth%
+}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+% ф╗гчаБца╖х╝П
+\lstset{
+ basicstyle=\ttfamily\linespread{1}\small\selectfont,
+ keywordstyle=\bfseries,% use bold style for keywords
+ commentstyle=\rmfamily\itshape,% use italic style for comments
+ stringstyle=\ttfamily,% хнЧчмжф╕▓щгОца╝
+ flexiblecolumns,% ?
+ numbers=left,% left-aligned numbering
+ showspaces=false,% hide markers for spaces
+ showstringspaces=false,
+ captionpos=t,% place the caption at the top
+ % frame=lrtb,% show all four sides of the frame
+ % linewidth=.8\textwidth,
+ % breakatwhitespace=true,
+ breaklines=true,
+ xleftmargin=2em,xrightmargin=2em,% set the width of the code environment
+}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\lstdefinestyle{LaTeX}{
+ language=TeX,
+ morekeywords={
+ begin, caption, label, mathrm, frac,
+ toprule, midrule, bottomrule, includegraphics}
+}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+% хЫ╛шбицаЗщвШца╖х╝П
+\DeclareCaptionFont{songticap}{\zihao{5}\bf\songti}
+\captionsetup{
+ font=small,%
+ labelfont=songticap,
+ textfont=songticap,
+ strut=no,%
+ hypcap=true, % Links point to the top of the figure
+ % indention=0pt, % Suppress indentation
+ % % parindent=0pt, % Suppress space between paragraphs
+ aboveskip=6pt, % Increase the space between the figure and the caption
+ belowskip=6pt, % Increase the space between the caption and the table
+}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+% list configuration
+\renewcommand{\labelitemi}{\tiny$\blacktriangleright$}
+\renewcommand{\labelitemii}{\textbullet}
+
+\setlist[itemize]{noitemsep}
+\setlist[enumerate]{noitemsep}
+\setlist[description]{noitemsep}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+% цХ░хнжчОпхвГ
+\declaretheoremstyle[
+ %spaceabove=.5\thm@preskip,
+ %spacebelow=.5\thm@postskip,
+ headfont=\bf\songti,%\scshape,
+ notefont=\songti,% notebraces={ (}{)},
+ bodyfont=\songti,
+ %headformat={\NAME\space\NUMBER\space\NOTE},
+ headpunct={},
+ %postheadspace={.5em plus .1em minus .1em},
+ %prefoothook={\hfill\qedsymbol}
+ ]{njuthm}
+
+\theoremstyle{njuthm}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\let\oldproofname=\proofname
+\renewcommand*{\proofname}{\rm\bf\songti{\oldproofname}} % ф┐оцФ╣шпБцШОчОпхвГцаЗщвШ
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\declaretheorem[
+ name=чоЧц│Х,
+ style=njuthm,
+ refname={чоЧц│Х,чоЧц│Х},
+ Refname={чоЧц│Х,чоЧц│Х},
+ % numberwithin=section,
+]{algorithm}
+\declaretheorem[
+ name=хБЗшо╛,
+ style=njuthm,
+ refname={хБЗшо╛,хБЗшо╛},
+ Refname={хБЗшо╛,хБЗшо╛},
+ % numberwithin=section,
+]{assumption}
+\declaretheorem[
+ name=хЕмчРЖ,
+ style=njuthm,
+ refname={хЕмчРЖ,хЕмчРЖ},
+ Refname={хЕмчРЖ,хЕмчРЖ},
+ % numberwithin=section,
+]{axiom}
+\declaretheorem[
+ name=ч╗Ушо║,
+ style=njuthm,
+ refname={ч╗Ушо║,ч╗Ушо║},
+ Refname={ч╗Ушо║,ч╗Ушо║},
+ % numberwithin=section,
+]{conclusion}
+\declaretheorem[
+ name=цЭбф╗╢,
+ style=njuthm,
+ refname={цЭбф╗╢,цЭбф╗╢},
+ Refname={цЭбф╗╢,цЭбф╗╢},
+ % numberwithin=section,
+]{condition}
+\declaretheorem[
+ name=цОишо║,
+ style=njuthm,
+ refname={цОишо║,цОишо║},
+ Refname={цОишо║,цОишо║},
+ % numberwithin=section,
+]{corollary}
+\declaretheorem[
+ name=хоЪф╣Й,
+ style=njuthm,
+ refname={хоЪф╣Й,хоЪф╣Й},
+ Refname={хоЪф╣Й,хоЪф╣Й},
+ % numberwithin=section,
+]{definition}
+\declaretheorem[
+ name=ф╛Л,
+ style=njuthm,
+ refname={ф╛Л,ф╛Л},
+ Refname={ф╛Л,ф╛Л},
+ % numberwithin=section,
+]{example}
+\declaretheorem[
+ name=х╝ХчРЖ,
+ style=njuthm,
+ refname={х╝ХчРЖ,х╝ХчРЖ},
+ Refname={х╝ХчРЖ,х╝ХчРЖ},
+ % numberwithin=section,
+]{lemma}
+\declaretheorem[
+ name=цАзш┤и,
+ style=njuthm,
+ refname={цАзш┤и,цАзш┤и},
+ Refname={цАзш┤и,цАзш┤и},
+ % numberwithin=section,
+]{property}
+\declaretheorem[
+ name=хС╜щвШ,
+ style=njuthm,
+ refname={хС╜щвШ,хС╜щвШ},
+ Refname={хС╜щвШ,хС╜щвШ},
+ % numberwithin=section,
+]{proposition}
+\declaretheorem[
+ name=ц│ишзг,
+ style=njuthm,
+ refname={ц│ишзг,ц│ишзг},
+ Refname={ц│ишзг,ц│ишзг},
+ % numberwithin=section,
+]{remark}
+\declaretheorem[
+ name=хоЪчРЖ,
+ style=njuthm,
+ refname={хоЪчРЖ,хоЪчРЖ},
+ Refname={хоЪчРЖ,хоЪчРЖ},
+ numberwithin=section,
+]{theorem}
+% \end{macrocode}
+%
+% \subsection{х░БщЭвч╗ШхИ╢}
+% \begin{macrocode}
+% цЛ╝хРИцаЗщвШ
+\tl_const:Nn \l_@@_info_title_tl
+{
+ \l_@@_info_title_a_tl
+ \l_@@_info_title_b_tl
+ \l_@@_info_title_c_tl
+}
+% \end{macrocode}
+% хПМхп╝х╕ИчЪДхдДчРЖ
+%% \begin{variable}{\l_@@_info_supv_full_tl,\l_@@_info_supv_full_en_tl}
+% чФиф║ОхнШхВихп╝х╕ИхзУхРНхКашБМчз░чЪДхПШщЗПя╝МцЧзчЙИч╝ЦшпСхЩиф╕НцФпцМБхнЧчмжф╕▓ф╕нхРлцЬЙ|\hspace{.5em}|ш┐Щца╖чЪДчй║чЩ╜чй║щЧ┤хС╜ф╗д
+% \begin{macrocode}
+\tl_new:N \l_@@_info_supv_full_tl
+\tl_new:N \l_@@_info_supv_full_en_tl
+% \end{macrocode}
+% \end{variable}
+%
+% цЛ╝хРИхп╝х╕И
+% \begin{macrocode}
+\tl_set:Nn \l_@@_info_supv_full_tl
+{
+ \l_@@_info_supv_a_tl\
+ \l_@@_info_supv_a_title_tl\ \
+ \l_@@_info_supv_b_tl\
+ \l_@@_info_supv_b_title_tl
+}
+\tl_set:Nn \l_@@_info_supv_full_en_tl
+{
+ \l_@@_info_supv_a_en_tl\
+ \l_@@_info_supv_a_title_en_tl\ \
+ \l_@@_info_supv_b_en_tl\
+ \l_@@_info_supv_b_title_en_tl
+}
+% \end{macrocode}
+% \begin{variable}{\c_@@_name_degree_tl,\c_@@_name_degree_en_tl}
+% чФиф║ОхнШхВихнжф╜НхРНчз░чЪДхПШщЗП
+% \begin{macrocode}
+\tl_new:N \c_@@_name_degree_tl
+\tl_new:N \c_@@_name_degree_en_tl
+% \end{macrocode}
+% \end{variable}
+%
+% хИдцЦнхнжф╜Нш┐ЫшбМхС╜ф╗дхоЪф╣Й
+% \begin{macrocode}
+\str_if_eq:NNTF {\l_@@_info_degree_tl} { ug }
+{
+ % цЬмчзС
+ \tl_const:Nn \l_@@_name_diploma_tl { цЬм\hfill чзС\hfill }
+ \tl_const:Nn \c_@@_name_title_tl { щвШ\hfill чЫо }
+
+ \tl_const:Nn \c_@@_cover_uline_len_a_tl { 250pt }
+ \tl_const:Nn \c_@@_cover_uline_len_b_tl { 90pt }
+ \tl_const:Nn \c_@@_cover_uline_font_tl { \songti }
+ \tl_const:Nn \c_@@_cover_uline_style_tl { \bf }
+ \tl_const:Nn \c_@@_cover_uline_bskip_tl {}
+
+ \tl_const:Nn \c_@@_cover_box_len_tl { 4.2em }
+
+ % цЬмчзСх╝║хИ╢ф╕НцЙУхН░хЫ╜хо╢хЫ╛ф╣жщжЖх░БщЭв
+ \bool_set_false:N \g_@@_nlcover_bool
+}
+{
+ % цЬмчзСф╗ехдЦщГ╜цШпчаФчй╢чФЯ
+ \tl_const:Nn \l_@@_name_diploma_tl { чаФ\hfill чй╢\hfill чФЯ\hfill }
+ \tl_const:Nn \c_@@_name_title_tl { шо║\hfill цЦЗ\hfill щвШ\hfill чЫо }
+
+ \tl_const:Nn \c_@@_cover_uline_len_a_tl { 250pt }
+ \tl_const:Nn \c_@@_cover_uline_len_b_tl { 14em }
+ \tl_const:Nn \c_@@_cover_uline_font_tl { \kaishu }
+ \tl_const:Nn \c_@@_cover_uline_style_tl {}
+ \tl_const:Nn \c_@@_cover_uline_bskip_tl { \hspace{1em} }
+
+ \tl_const:Nn \c_@@_cover_box_len_tl { 6em }
+
+ % чаФчй╢чФЯхнжф╜НхРНчз░
+ \str_if_eq:NNTF { \l_@@_info_degree_tl } { phd }
+ {
+ \tl_set:Nn \c_@@_name_degree_tl { хНЪхгл }
+ \tl_set:Nn \c_@@_name_degree_en_tl { Doctor~of~Philosophy }
+ }
+ {
+ \tl_set:Nn \c_@@_name_degree_en_tl { Master }
+ \str_if_eq:NNTF { \l_@@_info_degree_tl } { mg }
+ { \tl_set:Nn \c_@@_name_degree_tl { чбХхгл } }
+ { \tl_set:Nn \c_@@_name_degree_tl { чбХхглф╕Уф╕Ъ } }
+ }
+}
+% \end{macrocode}
+%
+% \begin{macro}{\@@_cover_uline_a:n}
+% хЬих░БщЭвч╗ШхИ╢ф╕ЛхИТч║┐
+% \begin{macrocode}
+\cs_new:Npn \@@_cover_uline_a:n #1
+{
+ \uline{\makebox[\c_@@_cover_uline_len_a_tl]
+ {\rm\c_@@_cover_uline_font_tl #1 }}
+}
+\cs_new:Npn \@@_cover_uline_b:n #1
+{
+ \uline{\makebox[\c_@@_cover_uline_len_b_tl]
+ {\rm\c_@@_cover_uline_font_tl #1 }}
+}
+\cs_new:Npn \@@_cover_uline_nl:nn #1 #2
+{
+ \uline{\makebox[#1]
+ {\rm\c_@@_cover_uline_font_tl #2 }}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_cover_box:n}
+% х░БщЭвшбица╝ш╛╣цбЖ
+% \begin{macrocode}
+\cs_new:Npn \@@_cover_box:n #1
+{
+ \makebox[\c_@@_cover_box_len_tl][s]{
+ #1\c_@@_cover_uline_bskip_tl}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% хИдцЦнч▒╗хЮЛ
+%
+% \begin{macrocode}
+\str_if_eq:NNTF { \l_@@_info_type_tl } { thesis }
+{
+ \tl_const:Nn \l_@@_info_type_tl_name
+ { \l_@@_name_diploma_tl цпХ\hfill ф╕Ъ\hfill шо║\hfill цЦЗ }
+}
+{
+ \tl_const:Nn \l_@@_info_type_tl_name
+ { \l_@@_name_diploma_tl цпХ\hfill ф╕Ъ\hfill шо╛\hfill шоб }
+}
+% \end{macrocode}
+%
+% \begin{macro}{\@@_cover_title_breakline:}
+% хп╣хдЪшбМцаЗщвШш┐ЫшбМшЗкхКихИдцЦня╝Мх╣╢ш╛УхЗ║цНвшбМхРОчЪДч╗УцЮЬ
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_cover_title_breakline:
+{
+ \@@_cover_box:n {\c_@@_name_title_tl}
+ & \@@_cover_uline_a:n
+ { \c_@@_cover_uline_style_tl \l_@@_info_title_a_tl } \\
+ % хжВцЮЬцЯРшбМцаЗщвШчй║хИЩф╕Нш╛УхЗ║цОеф╕ЛцЭечЪДшЛех╣▓шбМ
+ \tl_if_empty:NF \l_@@_info_title_b_tl
+ {
+ \tl_if_empty:NTF \l_@@_info_title_c_tl
+ {
+ & \@@_cover_uline_a:n
+ {\c_@@_cover_uline_style_tl \l_@@_info_title_b_tl } \\
+ }
+ {
+ & \@@_cover_uline_a:n
+ { \c_@@_cover_uline_style_tl \l_@@_info_title_b_tl } \\
+ & \@@_cover_uline_a:n
+ { \c_@@_cover_uline_style_tl \l_@@_info_title_c_tl } \\
+ }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_print_covertab:}
+% х░БщЭвф┐бцБпцаП
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_print_covertab:
+{%
+ \str_if_eq:NNTF { \l_@@_info_degree_tl } { ug }
+ {
+ \begin{tabular}{p{4.2em}c}
+ \@@_cover_box:n {щЩв\hfill ч│╗}
+ & \@@_cover_uline_a:n {\l_@@_info_dept_tl} \\
+ \@@_cover_box:n {ф╕У\hfill ф╕Ъ}
+ & \@@_cover_uline_a:n {\l_@@_major_tl} \\
+ \@@_cover_title_breakline:
+ \end{tabular}\\
+
+ \begin{tabular}{p{4.2em}cp{4.2em}c}
+ \@@_cover_box:n {х╣┤\hfill ч║з}
+ & \@@_cover_uline_b:n {\l_@@_info_grade_tl}
+ & \@@_cover_box:n {хнж\hfill хП╖}
+ & \@@_cover_uline_b:n {\l_@@_info_id_tl}\\
+ \end{tabular}\\
+
+ \begin{tabular}{p{4.2em}c}
+ \@@_cover_box:n {хнж\hfill чФЯ\hfill хзУ\hfill хРН}
+ & \@@_cover_uline_a:n {\l_@@_info_author_tl}
+ \end{tabular}\\
+ \begin{tabular}{p{4.2em}cp{4.2em}c}
+ \@@_cover_box:n {хп╝\hfill х╕И}
+ & \@@_cover_uline_b:n {\l_@@_info_supv_a_tl}
+ & \@@_cover_box:n {шБМ\hfill чз░}
+ & \@@_cover_uline_b:n {\l_@@_info_supv_a_title_tl}\\
+
+ % чммф║Мхп╝х╕И
+ \tl_if_empty:NF \l_@@_info_supv_b_tl
+ {
+ \@@_cover_box:n {чмм\hfill ф║М\hfill хп╝\hfill х╕И}
+ & \@@_cover_uline_b:n {\l_@@_info_supv_b_tl}
+ & \@@_cover_box:n {шБМ\hfill чз░}
+ & \@@_cover_uline_b:n {\l_@@_info_supv_b_title_tl}\\
+ }
+ \end{tabular}\\
+
+ \begin{tabular}{p{4.2em}c}
+ \@@_cover_box:n {цПР\hfill ф║д\hfill цЧе\hfill цЬЯ}
+ & \@@_cover_uline_a:n {\l_@@_submit_date_tl}\\
+ \end{tabular}
+ }
+ {
+ \begin{tabular}{p{6em}c}
+ \@@_cover_title_breakline:
+ \@@_cover_box:n {ф╜Ь\hfill шАЕ\hfill хзУ\hfill хРН}
+ & \@@_cover_uline_a:n {\l_@@_info_author_tl}\\
+ \@@_cover_box:n {ф╕У\hfill ф╕Ъ\hfill хРН\hfill чз░}
+ & \@@_cover_uline_a:n {\l_@@_major_tl}\\
+ \@@_cover_box:n {чаФ\hfill чй╢\hfill цЦ╣\hfill хРС}
+ & \@@_cover_uline_a:n {\l_@@_field_tl}\\
+ \@@_cover_box:n {цМЗ\hfill хп╝\hfill цХЩ\hfill х╕И}
+ & \@@_cover_uline_a:n {\l_@@_info_supv_full_tl}\\
+ \end{tabular}
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \begin{macro}{\@@_print_cover_nl:}
+% цМЙщЬАч╗ШхИ╢хЫ╜хо╢хЫ╛ф╣жщжЖх░БщЭвя╝Мф┐оцФ╣шЗкшГбц╡╖цШЯцибцЭ┐
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_print_cover_nl:
+{
+ \thispagestyle{empty}
+ \pdfbookmark[0]{хЫ╜хо╢хЫ╛ф╣жщжЖх░БщЭв}{nl}
+ {
+ % щб╢члп
+ \hspace{0mm}
+ \vskip -20mm \hskip -15mm
+ \songti\zihao{-4}
+ \makebox[40pt][l]{хИЖч▒╗хП╖}
+ \@@_cover_uline_b:n {\l_@@_info_classif_tl}
+ \hfill
+ \makebox[40pt][l]{хпЖч║з}
+ \@@_cover_uline_b:n {\l_@@_info_seclv_tl}
+ \vskip 10pt \hskip -15mm
+ \makebox[40pt][l]{UDC}
+ \@@_cover_uline_b:n {\l_@@_info_udc_tl}
+ }
+
+ % ф╕нщГи
+ \vskip\stretch{2}
+ \begin{center}
+ \def\ULthickness{1pt}
+ {\kaishu\zihao{-0} хнж\hspace{0.5em}ф╜Н\hspace{0.5em}шо║\hspace{0.5em}цЦЗ}
+ {
+ \kaishu\zihao{1}
+ \vskip \stretch{1}
+ \@@_cover_uline_b:n {\l_@@_info_title_a_tl}\\
+ \@@_cover_uline_b:n {\l_@@_info_title_b_tl}\\
+ \@@_cover_uline_b:n {\l_@@_info_title_c_tl}\\
+ }
+ \vskip \stretch{1}
+ {\kaishu\zihao{4}я╝ИщвШхРНхТМхЙпщвШхРНя╝Й}
+ \vskip \stretch{1} \vskip 5mm
+ {\kaishu\zihao{1}\uline{\makebox{\l_@@_info_author_tl}}}
+ \vskip \stretch{1}
+ {\kaishu\zihao{4}я╝Иф╜ЬшАЕхзУхРНя╝Й}
+ \end{center}
+
+ % х║ХщГи
+ \vskip\stretch{1}
+ {
+ \kaishu\zihao{4}
+ \noindent цМЗхп╝цХЩх╕ИхзУхРНуАБшБМхКбуАБшБМчз░уАБхнжф╜НуАБхНХф╜НхРНчз░хПКхЬ░хЭА%
+ \@@_cover_uline_nl:nn {94pt}{\l_@@_info_supv_a_tl}\par
+ \noindent\@@_cover_uline_nl:nn {\textwidth}{%
+ \l_@@_info_supv_cont_tl}\par
+ \noindent чФ│шп╖хнжф╜Нч║зхИл%
+ \@@_cover_uline_nl:nn {9em}{\c_@@_name_degree_tl}%
+ \noindent ф╕Уф╕ЪхРНчз░%
+ \uline{\hfill\l_@@_major_tl\hfill}\par% щЬАшжБш░ГцХ┤ф╕ЛхИТч║┐щХ┐х║ж
+ \noindent шо║цЦЗцПРф║дцЧецЬЯ%
+ \@@_cover_uline_nl:nn {9em}{\l_@@_submit_date_tl}%
+ шо║цЦЗчнФш╛йцЧецЬЯ%
+ \uline{\hfill\l_@@_defend_date_tl\hfill}\par% щЬАшжБш░ГцХ┤ф╕ЛхИТч║┐щХ┐х║ж
+ \noindent хнжф╜НцОИф║ИхНХф╜НхТМцЧецЬЯ\uline{\hfill}\par
+ \noindent\hfill чнФш╛йхзФхСШф╝Ъф╕╗х╕ня╝Ъ%
+ \@@_cover_uline_nl:nn {9em}{\l_@@_info_chairman_tl}\par
+ \noindent\hfill шпДщШЕф║║я╝Ъ%
+ \@@_cover_uline_nl:nn {9em}{\l_@@_info_reviewer_a_tl}\par
+ \noindent\hfill\@@_cover_uline_nl:nn {9em}{\l_@@_info_reviewer_b_tl}\par
+ \noindent\hfill\@@_cover_uline_nl:nn {9em}{\l_@@_info_reviewer_c_tl}\par
+ \noindent\hfill\@@_cover_uline_nl:nn {9em}{\l_@@_info_reviewer_d_tl}\par
+
+ \begin{center}
+ \kaishu\zihao{3}\hspace{2em} х╣┤\hspace{1em} цЬИ\hspace{1em} цЧе
+ \end{center}
+ \vskip -10mm
+ }
+ \cleardoublepage
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_print_cover_ug:}
+% цЬмчзСх░БщЭв
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_print_cover_ug:
+{
+ \thispagestyle{empty}
+ \pagenumbering{Roman}
+ % Start
+ \pdfbookmark{х░БщЭв}{х░БщЭв} % х░Жх░БщЭвцПТхЕеpdfф╣жчн╛
+ \begin{spacing}{1.25}
+ \vskip 0mm
+ \hspace{-10mm}
+ \includegraphics[height=3cm]{njulogo}\smallskip
+ \begin{center}
+ \includegraphics[height=3.35cm]{njuname}
+ \vskip 10mm
+ {\zihao{1}\makebox[9em][s]{\bf{\songti\l_@@_info_type_tl_name}}}
+ \vfill
+ \vskip\stretch{0}
+ {\bgroup
+ \kaishu\zihao{3}
+ \def\tabcolsep{1pt}
+ \def\arraystretch{1.5}
+ % ч╗ШхИ╢ф┐бцБпцбЖ
+ \@@_print_covertab:
+ \egroup}
+ \vfill
+ \end{center}
+ \end{spacing}
+ \cleardoublepage
+ % \vfill
+ % \newpage
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_print_cover_g:}
+% чаФчй╢чФЯх░БщЭв
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_print_cover_g:
+{
+ \thispagestyle{empty}
+ \pagenumbering{Roman}
+ % Start
+ \pdfbookmark{х░БщЭв}{х░БщЭв} % х░Жх░БщЭвцПТхЕеpdfф╣жчн╛
+ \begin{spacing}{1.25}
+ \begin{center}
+ \hspace{0pt} \vskip 5mm
+ \includegraphics[height=1.9cm]{njulogo}
+ \vskip 10mm
+ \includegraphics[height=2cm]{njuname-large}
+ \vskip 15mm
+ {\zihao{1}\makebox[10em][s]{\bf{\kaishu\l_@@_info_type_tl_name}}}
+ \vskip 5mm
+ {\zihao{1}\bf{\kaishu{я╝ИчФ│шп╖\c_@@_name_degree_tl хнжф╜Ня╝Й}}}
+ \par\vfill
+ \vskip\stretch{0}
+ {\bgroup
+ \bf\kaishu\zihao{3}
+ \def\tabcolsep{1pt}
+ \def\arraystretch{1.5}
+ \vskip 10mm
+ % ч╗ШхИ╢ф┐бцБпцбЖ
+ \@@_print_covertab:
+ \egroup}
+ \vfill
+ \vskip 10mm
+ \bf\kaishu\zihao{4}\l_@@_submit_date_tl
+ \vskip 15mm
+ \end{center}
+ \end{spacing}
+
+ \newpage % х░БщЭвшГМщЭв
+ \thispagestyle{empty}
+ \begin{spacing}{1.625}
+ % TODO: чнЙх╛Еш░ГцХ┤ца╝х╝П
+ \hspace{0pt} \vfill
+ {\bgroup
+ \kaishu\zihao{3}
+ \makebox[6em][s]{\bf\kaishu хнж\hfill хП╖}я╝Ъ\MakeUppercase{\l_@@_info_id_tl}
+ \par
+ \makebox[6em][s]{\bf\kaishu шо║цЦЗчнФш╛йцЧецЬЯ}я╝Ъ\l_@@_defend_date_tl
+ \par
+ \makebox[6em][s]{\bf\kaishu цМЗ\hfill хп╝\hfill цХЩ\hfill х╕И}я╝Ъ\hspace{50mm}я╝Ичн╛хнЧя╝Й
+ \par
+ \egroup}
+ \vskip 15mm
+ \end{spacing}
+ \cleardoublepage
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_print_cover_en:}
+% чаФчй╢чФЯшЛ▒цЦЗх░БщЭв
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_print_cover_en:
+{
+ \thispagestyle{empty}
+ \pdfbookmark{шЛ▒цЦЗх░БщЭв}{English~cover} % х░Жх░БщЭвцПТхЕеpdfф╣жчн╛
+ \begin{center}
+ \vspace*{20pt}
+ \bf\sffamily\zihao{2}\l_@@_info_title_en_tl
+ \vskip \stretch{1}
+ \normalfont\rmfamily\zihao{4}{by}
+ \vskip 3pt
+ \bf\sffamily\zihao{4}\l_@@_info_author_en_tl
+ \vskip\stretch{1}
+ \normalfont\rmfamily\zihao{4}{Supervised~by}
+ \vskip 3pt
+ \normalfont\sffamily\zihao{4}\l_@@_info_supv_a_title_en_tl
+ \hspace{.5em}\l_@@_info_supv_a_en_tl
+ \vskip\stretch{1}
+ \normalsize\rmfamily{%
+ A~dissertation~submitted~to\\
+ the~graduate~school~of~Nanjing~University\\
+ in~partial~fulfilment~of~the~requirements~for~the~degree~of\\
+ {\textsc{\c_@@_name_degree_en_tl}}\\
+ in\\
+ {\l_@@_major_en_tl}
+ }
+ \vskip\stretch{2}
+ \includegraphics[width=2.5cm]{njulogo} \\
+ \vskip 3mm
+ \normalfont\l_@@_info_dept_en_tl\\
+ {Nanjing~University}
+ \vskip 30pt
+ \normalfont\normalsize\l_@@_submit_date_en_tl
+ \end{center}
+ \normalfont
+ \cleardoublepage
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% щЗНхоЪф╣ЙmaketitleчФЯцИРх░БщЭв
+% \begin{macrocode}
+\tl_set:Nn \maketitle
+{%
+ \str_if_eq:NNTF { \l_@@_info_degree_tl } { ug }
+ {
+ \@@_print_cover_ug: % цЬмчзСх░БщЭв
+ }
+ {
+ \bool_if:NT \g_@@_nlcover_bool { \@@_print_cover_nl: } % хЫ╜хо╢хЫ╛ф╣жщжЖх░БщЭв
+ \@@_print_cover_g: % чаФчй╢чФЯх░БщЭв
+ \@@_print_cover_en: % шЛ▒цЦЗх░БщЭв
+ }
+}
+% \end{macrocode}
+%
+% \subsection{цСШшжБч╗ШхИ╢}
+%
+% ф╕нцЦЗхЕ│щФошпН
+% \begin{macrocode}
+\NewDocumentCommand \keywords {m} {%
+ \par\vspace{2ex}\noindent%
+ {\kaishu\zihao{-4}\makebox[4em][s]{хЕ│щФошпН{я╝Ъ}}}~{#1}%
+}
+% \end{macrocode}
+%
+%
+% шЛ▒цЦЗхЕ│щФошпН
+%
+% \begin{macrocode}
+\NewDocumentCommand \englishkeywords {m} {%
+ \par\vspace{2ex}\noindent%
+ {KEYWORDS{:}}~~{#1}%
+}
+% \end{macrocode}
+%
+%
+%
+% \begin{macrocode}
+% хИдцЦнхнжф╜Н
+\str_if_eq:NNTF {\l_@@_info_degree_tl} { ug }
+{
+ % цЬмчзСцСШшжБчОпхвГ
+ \NewDocumentEnvironment{abstract} {}
+ {%
+ % \pagestyle{plain}
+ % \pagenumbering{Roman}
+ % \phantomsection\addcontentsline{toc}{chapter}{ф╕нцЦЗцСШшжБ} % х░ЖцСШшжБцПТхЕечЫох╜ХхТМpdfф╣жчн╛
+ \pdfbookmark[0]{ф╕нцЦЗцСШшжБ}{ф╕нцЦЗцСШшжБ} % х░ЖцСШшжБцПТхЕеpdfф╣жчн╛я╝Мф╕Оф╕Кф╕АшбМф╕НхПпхЕ▒хнШ
+ \begin{center}
+ \kaishu\zihao{-2}{\textbf{
+ \uuline{хНЧф║мхдзхнжцЬмчзСчФЯцпХф╕Ъшо║цЦЗя╝Ишо╛шобуАБф╜ЬхУБя╝Йф╕нцЦЗцСШшжБ}}}
+ \end{center}
+ {\bgroup
+ \kaishu\zihao{-4}
+ \tl_set:Nn \tabcolsep {0pt}
+ \tl_set:Nn \arraystretch {0.8}
+ \noindent
+ щвШчЫоя╝Ъ \l_@@_info_title_tl \\
+ щЩвч│╗я╝Ъ \l_@@_info_dept_tl \\
+ ф╕Уф╕Ъя╝Ъ \l_@@_major_tl \\
+ цЬмчзСчФЯхзУхРНя╝Ъ \l_@@_info_author_tl \\
+ цМЗхп╝цХЩх╕Ия╝ИхзУхРНуАБшБМчз░я╝Йя╝Ъ\l_@@_info_supv_full_tl \\
+ цСШшжБя╝Ъ
+ \egroup
+ }
+ \kaishu\zihao{-4}\par%
+ }{%
+ \newpage
+ }
+
+ % шЛ▒цЦЗцСШшжБ
+ \NewDocumentEnvironment{englishabstract} {}
+ {%
+ \pagestyle{plain}
+ % \phantomsection\addcontentsline{toc}{chapter}{шЛ▒цЦЗцСШшжБ} % х░ЖцСШшжБцПТхЕечЫох╜ХхТМpdfф╣жчн╛
+ \pdfbookmark[0]{шЛ▒цЦЗцСШшжБ}{шЛ▒цЦЗцСШшжБ} % х░ЖцСШшжБцПТхЕеpdfф╣жчн╛я╝Мф╕Оф╕Кф╕АшбМф╕НхПпхЕ▒хнШ
+ \begin{center}
+ \kaishu\zihao{-2}{\textbf{\uuline{
+ хНЧф║мхдзхнжцЬмчзСчФЯцпХф╕Ъшо║цЦЗя╝Ишо╛шобуАБф╜ЬхУБя╝ЙшЛ▒цЦЗцСШшжБ}}}
+ \end{center}
+ {
+ \bgroup
+ THESIS: ~~\l_@@_info_title_en_tl \\
+ DEPARTMENT: ~~\l_@@_info_dept_en_tl \\
+ SPECIALIZATION: ~~\l_@@_major_en_tl \\
+ UNDERGRADUATE:~~\l_@@_info_author_en_tl \\
+ MENTOR:~~\l_@@_info_supv_full_en_tl \\
+ ABSTRACT:
+ \egroup
+ }
+ \zihao{-4}\par%
+ }{%
+ \cleardoublepage
+ \newpage
+ }
+}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+{
+ % чаФчй╢чФЯцСШшжБчОпхвГ
+ \NewDocumentEnvironment{abstract} {}
+ {%
+ \pagestyle{plain}
+ \pagenumbering{Roman}
+ % \phantomsection\addcontentsline{toc}{chapter}{ф╕нцЦЗцСШшжБ} % х░ЖцСШшжБцПТхЕечЫох╜ХхТМpdfф╣жчн╛
+ \pdfbookmark[0]{ф╕нцЦЗцСШшжБ}{ф╕нцЦЗцСШшжБ} % х░ЖцСШшжБцПТхЕеpdfф╣жчн╛я╝Мф╕Оф╕Кф╕АшбМф╕НхПпхЕ▒хнШ
+ \begin{center}
+ \kaishu\zihao{-2}{\textbf{\uuline{
+ хНЧф║мхдзхнжчаФчй╢чФЯцпХф╕Ъшо║цЦЗф╕нцЦЗцСШшжБщжЦщб╡чФич║╕}}}
+ \end{center}
+
+ \bgroup
+ \kaishu\zihao{4}
+ \tl_set:Nn \tabcolsep {0pt}
+ \tl_set:Nn \arraystretch {0.8}
+ \noindent
+ цпХф╕Ъшо║цЦЗщвШчЫоя╝Ъ\hspace{0.5em}\nju_underline:n {\l_@@_info_title_tl\hfill}\\
+ \uline{\makebox[9em]{\l_@@_major_tl}}ф╕Уф╕Ъ
+ \uline{\makebox[4em]{\l_@@_info_grade_tl}}ч║з
+ \str_if_eq:NNTF {\l_@@_info_degree_tl} { phd } {хНЪ}{чбХ}
+ хглчФЯхзУхРНя╝Ъ\uline{\hfill\l_@@_info_author_tl\hfill} \\
+ цМЗхп╝цХЩх╕Ия╝ИхзУхРНуАБшБМчз░я╝Йя╝Ъ\uline{\hfill\l_@@_info_supv_full_tl\hfill}\par
+ \egroup
+
+ \kaishu\zihao{4}\par%
+ }{%
+ \newpage
+ }
+
+ % шЛ▒цЦЗцСШшжБ
+ \NewDocumentEnvironment{englishabstract} {}
+ {%
+ \pagestyle{plain}
+ % \phantomsection\addcontentsline{toc}{chapter}{шЛ▒цЦЗцСШшжБ} % х░ЖцСШшжБцПТхЕечЫох╜ХхТМpdfф╣жчн╛
+ \pdfbookmark[0]{шЛ▒цЦЗцСШшжБ}{шЛ▒цЦЗцСШшжБ} % х░ЖцСШшжБцПТхЕеpdfф╣жчн╛я╝Мф╕Оф╕Кф╕АшбМф╕НхПпхЕ▒хнШ
+ \begin{center}
+ \kaishu\zihao{-2}{\textbf{\uuline{
+ хНЧф║мхдзхнжчаФчй╢чФЯцпХф╕Ъшо║цЦЗшЛ▒цЦЗцСШшжБщжЦщб╡чФич║╕}}}
+ \end{center}
+ {
+ \bgroup
+ \zihao{4}
+ THESIS: ~~\l_@@_info_title_en_tl \\
+ SPECIALIZATION: ~~\l_@@_major_en_tl \\
+ POSTGRADUATE:~~\l_@@_info_author_en_tl \\
+ MENTOR:~~\l_@@_info_supv_full_en_tl\par
+ \egroup
+ }
+ \zihao{4}\par%
+ }{%
+ \cleardoublepage
+ \newpage
+ }
+}
+%</class>
+% \end{macrocode}
+%
+%
+%
+%
+% \end{implementation}
+%
+% \PrintIndex
diff --git a/macros/unicodetex/latex/njuthesis/njuthesis.pdf b/macros/unicodetex/latex/njuthesis/njuthesis.pdf
index 11b1922dea..a254258dd5 100644
--- a/macros/unicodetex/latex/njuthesis/njuthesis.pdf
+++ b/macros/unicodetex/latex/njuthesis/njuthesis.pdf
Binary files differ
diff --git a/macros/unicodetex/latex/njuthesis/profile/abstract.sty b/macros/unicodetex/latex/njuthesis/profile/abstract.sty
deleted file mode 100644
index 37814cef13..0000000000
--- a/macros/unicodetex/latex/njuthesis/profile/abstract.sty
+++ /dev/null
@@ -1,136 +0,0 @@
-\ProvidesExplPackage{profile/abstract}{2021-09-11}{0.7.0}{NJU Thesis abstract design}
-
-% хИдцЦнхнжф╜Н
-\str_if_eq:eeTF {\nju_degree} { ug }
-{
- % цЬмчзСцСШшжБчОпхвГ
- \NewDocumentEnvironment{abstract} {}
- {%
- \pagestyle{plain}
- \pagenumbering{Roman}
- % \phantomsection\addcontentsline{toc}{chapter}{ф╕нцЦЗцСШшжБ} % х░ЖцСШшжБцПТхЕечЫох╜ХхТМpdfф╣жчн╛
- \pdfbookmark[0]{ф╕нцЦЗцСШшжБ}{ф╕нцЦЗцСШшжБ} % х░ЖцСШшжБцПТхЕеpdfф╣жчн╛я╝Мф╕Оф╕Кф╕АшбМф╕НхПпхЕ▒хнШ
- \begin{center}
- \kaishu\zihao{-2}{\textbf{\uuline{хНЧф║мхдзхнжцЬмчзСчФЯцпХф╕Ъшо║цЦЗя╝Ишо╛шобуАБф╜ЬхУБя╝Йф╕нцЦЗцСШшжБ}}}
- \end{center}
- {\bgroup
- \kaishu\zihao{-4}
- \tl_set:Nn \tabcolsep {0pt}
- \tl_set:Nn \arraystretch {0.8}
- \noindent
- щвШчЫоя╝Ъ \nju_title \\
- щЩвч│╗я╝Ъ \nju_department \\
- ф╕Уф╕Ъя╝Ъ \nju_major \\
- цЬмчзСчФЯхзУхРНя╝Ъ \nju_student_name \\
- цМЗхп╝цХЩх╕Ия╝ИхзУхРНуАБшБМчз░я╝Йя╝Ъ\nju_mentor_full \\
- цСШшжБя╝Ъ
- \egroup
- }
- \kaishu\zihao{-4}\par%
- }{%
- \newpage
- }
-
- % ф╕нцЦЗхЕ│щФошпН
- \NewDocumentCommand \keywords {m} {%
- \par\vspace{2ex}\noindent%
- {\kaishu\zihao{-4}\makebox[4em][s]{хЕ│щФошпН{я╝Ъ}}}~{#1}%
- }
-
- % шЛ▒цЦЗцСШшжБ
- \NewDocumentEnvironment{englishabstract} {}
- {%
- \pagestyle{plain}
- % \phantomsection\addcontentsline{toc}{chapter}{шЛ▒цЦЗцСШшжБ} % х░ЖцСШшжБцПТхЕечЫох╜ХхТМpdfф╣жчн╛
- \pdfbookmark[0]{шЛ▒цЦЗцСШшжБ}{шЛ▒цЦЗцСШшжБ} % х░ЖцСШшжБцПТхЕеpdfф╣жчн╛я╝Мф╕Оф╕Кф╕АшбМф╕НхПпхЕ▒хнШ
- \begin{center}
- \kaishu\zihao{-2}{\textbf{\uuline{хНЧф║мхдзхнжцЬмчзСчФЯцпХф╕Ъшо║цЦЗя╝Ишо╛шобуАБф╜ЬхУБя╝ЙшЛ▒цЦЗцСШшжБ}}}
- \end{center}
- {
- \bgroup
- THESIS: ~~\nju_title_en \\
- DEPARTMENT: ~~\nju_department_en \\
- SPECIALIZATION: ~~\nju_major_en \\
- UNDERGRADUATE:~~\nju_student_name_en \\
- MENTOR:~~\nju_mentor_full_en \\
- ABSTRACT:
- \egroup
- }
- \zihao{-4}\par%
- }{%
- \cleardoublepage
- \newpage
- }
-
- % шЛ▒цЦЗхЕ│щФошпН
- \NewDocumentCommand \englishkeywords {m} {%
- \par\vspace{2ex}\noindent%
- {KEYWORDS{:}}~~{#1}%
- }
-}
-{
- % цСШшжБчОпхвГ
- \NewDocumentEnvironment{abstract} {}
- {%
- \pagestyle{plain}
- \pagenumbering{Roman}
- % \phantomsection\addcontentsline{toc}{chapter}{ф╕нцЦЗцСШшжБ} % х░ЖцСШшжБцПТхЕечЫох╜ХхТМpdfф╣жчн╛
- \pdfbookmark[0]{ф╕нцЦЗцСШшжБ}{ф╕нцЦЗцСШшжБ} % х░ЖцСШшжБцПТхЕеpdfф╣жчн╛я╝Мф╕Оф╕Кф╕АшбМф╕НхПпхЕ▒хнШ
- \begin{center}
- \kaishu\zihao{-2}{\textbf{\uuline{хНЧф║мхдзхнжчаФчй╢чФЯцпХф╕Ъшо║цЦЗф╕нцЦЗцСШшжБщжЦщб╡чФич║╕}}}
- \end{center}
-
- \bgroup
- \kaishu\zihao{4}
- \tl_set:Nn \tabcolsep {0pt}
- \tl_set:Nn \arraystretch {0.8}
- \noindent
- % цпХф╕Ъшо║цЦЗщвШчЫоя╝Ъ\ \uline{\nju_title} \\ % ф╕ЛхИТч║┐цЬЙщЧощвШ
- цпХф╕Ъшо║цЦЗщвШчЫоя╝Ъ\ \nju_title \\
- \uline{\makebox[9em]{\nju_major}}ф╕Уф╕Ъ\uline{\makebox[3em]{\nju_grade}}ч║з
- \str_if_eq:eeTF {\nju_degree} { d } {хНЪ}{чбХ}
- хглчФЯхзУхРНя╝Ъ\uline{\hfill\nju_student_name\hfill} \\
- цМЗхп╝цХЩх╕Ия╝ИхзУхРНуАБшБМчз░я╝Йя╝Ъ\uline{\hfill\nju_mentor_full\hfill}\par
- \egroup
-
- \kaishu\zihao{4}\par%
- }{%
- \newpage
- }
-
- % ф╕нцЦЗхЕ│щФошпН
- \NewDocumentCommand \keywords {m} {%
- \par\vspace{2ex}\noindent%
- {\kaishu\zihao{4}\makebox[4em][s]{хЕ│щФошпН{я╝Ъ}}}~{#1}%
- }
-
- % шЛ▒цЦЗцСШшжБ
- \NewDocumentEnvironment{englishabstract} {}
- {%
- \pagestyle{plain}
- % \phantomsection\addcontentsline{toc}{chapter}{шЛ▒цЦЗцСШшжБ} % х░ЖцСШшжБцПТхЕечЫох╜ХхТМpdfф╣жчн╛
- \pdfbookmark[0]{шЛ▒цЦЗцСШшжБ}{шЛ▒цЦЗцСШшжБ} % х░ЖцСШшжБцПТхЕеpdfф╣жчн╛я╝Мф╕Оф╕Кф╕АшбМф╕НхПпхЕ▒хнШ
- \begin{center}
- \kaishu\zihao{-2}{\textbf{\uuline{хНЧф║мхдзхнжчаФчй╢чФЯцпХф╕Ъшо║цЦЗшЛ▒цЦЗцСШшжБщжЦщб╡чФич║╕}}}
- \end{center}
- {
- \bgroup
- \zihao{4}
- THESIS: ~~\nju_title_en \\
- SPECIALIZATION: ~~\nju_major_en \\
- POSTGRADUATE:~~\nju_student_name_en \\
- MENTOR:~~\nju_mentor_full_en\par
- \egroup
- }
- \zihao{4}\par%
- }{%
- \cleardoublepage
- \newpage
- }
-
- % шЛ▒цЦЗхЕ│щФошпН
- \NewDocumentCommand \englishkeywords {m} {%
- \par\vspace{2ex}\noindent%
- {KEYWORDS{:}}~~{#1}%
- }
-}
diff --git a/macros/unicodetex/latex/njuthesis/profile/components.sty b/macros/unicodetex/latex/njuthesis/profile/components.sty
deleted file mode 100644
index 4a24fe4f59..0000000000
--- a/macros/unicodetex/latex/njuthesis/profile/components.sty
+++ /dev/null
@@ -1,173 +0,0 @@
-\ProvidesExplPackage{profile/components}{2021-09-11}{0.6.0}{NJU Thesis components configuration}
-
-% хЫ╛шбиф╜Нч╜ош░ГцХ┤
-\floatsetup[lstlisting]{ % Captions for lstlistings
- capposition=above,%
- margins=centering,%
- floatwidth=\textwidth%
-}
-\floatsetup[figure]{ % Captions for figures
- capposition=bottom,%
- margins=centering,%
- floatwidth=\textwidth%
-}
-\floatsetup[table]{ % Captions for tables
- capposition=above,%
- margins=centering,%
- floatwidth=\textwidth%
-}
-
-% ф╗гчаБца╖х╝П
-\lstset{
- basicstyle=\ttfamily\linespread{1}\small\selectfont,
- keywordstyle=\bfseries,% use bold style for keywords
- commentstyle=\rmfamily\itshape,% use italic style for comments
- stringstyle=\ttfamily,% хнЧчмжф╕▓щгОца╝
- flexiblecolumns,% ?
- numbers=left,% left-aligned numbering
- showspaces=false,% hide markers for spaces
- showstringspaces=false,
- captionpos=t,% place the caption at the top
- % frame=lrtb,% show all four sides of the frame
- % linewidth=.8\textwidth,
- % breakatwhitespace=true,
- breaklines=true,
- xleftmargin=2em,xrightmargin=2em,% set the width of the code environment
-}
-
-\lstdefinestyle{LaTeX}{
- language=TeX,
- morekeywords={begin, caption, label, mathrm, frac, toprule, midrule, bottomrule, includegraphics}
-}
-
-% хЫ╛шбицаЗщвШца╖х╝П
-\DeclareCaptionFont{songticap}{\zihao{5}\bf\songti}
-\captionsetup{
- font=small,%
- labelfont=songticap,
- textfont=songticap,
- strut=no,%
- hypcap=true, % Links point to the top of the figure
- % indention=0pt, % Suppress indentation
- % % parindent=0pt, % Suppress space between paragraphs
- aboveskip=6pt, % Increase the space between the figure and the caption
- belowskip=6pt, % Increase the space between the caption and the table
-}
-
-% list configuration
-\renewcommand{\labelitemi}{\tiny$\blacktriangleright$}
-\renewcommand{\labelitemii}{\textbullet}
-
-\setlist[itemize]{noitemsep}
-\setlist[enumerate]{noitemsep}
-\setlist[description]{noitemsep}
-
-% цХ░хнжчОпхвГ
-\declaretheoremstyle[
- %spaceabove=.5\thm@preskip,
- %spacebelow=.5\thm@postskip,
- headfont=\bf\songti,%\scshape,
- notefont=\songti,% notebraces={ (}{)},
- bodyfont=\songti,
- %headformat={\NAME\space\NUMBER\space\NOTE},
- headpunct={},
- %postheadspace={.5em plus .1em minus .1em},
- %prefoothook={\hfill\qedsymbol}
- ]{njuthm}
-
-\theoremstyle{njuthm}
-
-\let\oldproofname=\proofname
-\renewcommand*{\proofname}{\rm\bf\songti{\oldproofname}} % ф┐оцФ╣шпБцШОчОпхвГцаЗщвШ
-
-\declaretheorem[
- name=чоЧц│Х,
- style=njuthm,
- refname={чоЧц│Х,чоЧц│Х},
- Refname={чоЧц│Х,чоЧц│Х},
- % numberwithin=section,
-]{algorithm}
-\declaretheorem[
- name=хБЗшо╛,
- style=njuthm,
- refname={хБЗшо╛,хБЗшо╛},
- Refname={хБЗшо╛,хБЗшо╛},
- % numberwithin=section,
-]{assumption}
-\declaretheorem[
- name=хЕмчРЖ,
- style=njuthm,
- refname={хЕмчРЖ,хЕмчРЖ},
- Refname={хЕмчРЖ,хЕмчРЖ},
- % numberwithin=section,
-]{axiom}
-\declaretheorem[
- name=ч╗Ушо║,
- style=njuthm,
- refname={ч╗Ушо║,ч╗Ушо║},
- Refname={ч╗Ушо║,ч╗Ушо║},
- % numberwithin=section,
-]{conclusion}
-\declaretheorem[
- name=цЭбф╗╢,
- style=njuthm,
- refname={цЭбф╗╢,цЭбф╗╢},
- Refname={цЭбф╗╢,цЭбф╗╢},
- % numberwithin=section,
-]{condition}
-\declaretheorem[
- name=цОишо║,
- style=njuthm,
- refname={цОишо║,цОишо║},
- Refname={цОишо║,цОишо║},
- % numberwithin=section,
-]{corollary}
-\declaretheorem[
- name=хоЪф╣Й,
- style=njuthm,
- refname={хоЪф╣Й,хоЪф╣Й},
- Refname={хоЪф╣Й,хоЪф╣Й},
- % numberwithin=section,
-]{definition}
-\declaretheorem[
- name=ф╛Л,
- style=njuthm,
- refname={ф╛Л,ф╛Л},
- Refname={ф╛Л,ф╛Л},
- % numberwithin=section,
-]{example}
-\declaretheorem[
- name=х╝ХчРЖ,
- style=njuthm,
- refname={х╝ХчРЖ,х╝ХчРЖ},
- Refname={х╝ХчРЖ,х╝ХчРЖ},
- % numberwithin=section,
-]{lemma}
-\declaretheorem[
- name=цАзш┤и,
- style=njuthm,
- refname={цАзш┤и,цАзш┤и},
- Refname={цАзш┤и,цАзш┤и},
- % numberwithin=section,
-]{property}
-\declaretheorem[
- name=хС╜щвШ,
- style=njuthm,
- refname={хС╜щвШ,хС╜щвШ},
- Refname={хС╜щвШ,хС╜щвШ},
- % numberwithin=section,
-]{proposition}
-\declaretheorem[
- name=ц│ишзг,
- style=njuthm,
- refname={ц│ишзг,ц│ишзг},
- Refname={ц│ишзг,ц│ишзг},
- % numberwithin=section,
-]{remark}
-\declaretheorem[
- name=хоЪчРЖ,
- style=njuthm,
- refname={хоЪчРЖ,хоЪчРЖ},
- Refname={хоЪчРЖ,хоЪчРЖ},
- numberwithin=section,
-]{theorem}
diff --git a/macros/unicodetex/latex/njuthesis/profile/cover.sty b/macros/unicodetex/latex/njuthesis/profile/cover.sty
deleted file mode 100644
index 8293e64780..0000000000
--- a/macros/unicodetex/latex/njuthesis/profile/cover.sty
+++ /dev/null
@@ -1,251 +0,0 @@
-\ProvidesExplPackage{profile/cover}{2021-09-11}{0.7.0}{NJU Thesis cover design}
-
-% цЛ╝хРИцаЗщвШ
-\tl_const:Nn \nju_title {\nju_title_a \nju_title_b \nju_title_c}
-
-% цЛ╝хРИхп╝х╕И
-\bool_if:NTF \nju_second_mentor
-{
- \tl_const:Nn \nju_mentor_full
- {
- \nju_mentor_a\ \nju_mentor_a_title
- \ \ \nju_mentor_b\ \nju_mentor_b_title
- }
- \tl_const:Nn \nju_mentor_full_en
- {
- \nju_mentor_a_en\ \nju_mentor_a_title_en
- \ \ \nju_mentor_b_en\ \nju_mentor_b_title_en
- }
-}
-{
- \tl_const:Nn \nju_mentor_full
- {
- \nju_mentor_a\ \nju_mentor_a_title
- }
- \tl_const:Nn \nju_mentor_full_en
- {
- \nju_mentor_a_en\ \nju_mentor_a_title_en
- }
-}
-
-% х░БщЭвф╕ЛхИТч║┐
-\cs_new:Npn \nju_cover_underline_ug:nn #1 #2 {
- \uline{\makebox[#1]{\rm\songti#2}}
-}
-\cs_new:Npn \nju_cover_underline_g:n #1 {
- \uline{\makebox[215pt]{\rm\kaishu#1}}
-}
-
-% х░БщЭвшбица╝ш╛╣цбЖ
-\cs_new:Npn \nju_coverbox_ug:n #1 {
- \makebox[4.2em][s]{#1}
-}
-\cs_new:Npn \nju_coverbox_g:n #1 {
- \makebox[6em][s]{#1\hspace{1em}}
-}
-
-% хИдцЦнхнжф╜Н
-\str_if_eq:eeTF {\nju_degree} { ug }
-{ \tl_const:Nn \nju_degree_name {цЬм\hfill чзС\hfill } } % цЬмчзС
-{
- % цЬмчзСф╗ехдЦщГ╜цШпчаФчй╢чФЯ
- \tl_const:Nn \nju_degree_name {чаФ\hfill чй╢\hfill чФЯ\hfill }
-
- % чаФчй╢чФЯч▒╗хИл
- \str_case_e:nn { \nju_degree }
- {
- { mg } { \tl_const:Nn \nju_degree_title {чбХхгл} }
- { mf } { \tl_const:Nn \nju_degree_title {чбХхглф╕Уф╕Ъ} }
- { d } { \tl_const:Nn \nju_degree_title {хНЪхгл} }
- }
-}
-
-% хИдцЦнч▒╗хЮЛ
-\str_if_eq:eeTF {\nju_type} {thesis}
-{\tl_const:Nn \nju_type_name {\nju_degree_name цпХ\hfill ф╕Ъ\hfill шо║\hfill цЦЗ}}
-{\tl_const:Nn \nju_type_name {\nju_degree_name цпХ\hfill ф╕Ъ\hfill шо╛\hfill шоб}}
-
-% х░БщЭвф┐бцБпцаП цЬмчзС
-\tl_new:N \nju_printcoverinfo_ug
-\tl_set:Nn \nju_printcoverinfo_ug {
- \begin{tabular}{p{4.2em}c}
- \nju_coverbox_ug:n {щЩв\hfill ч│╗}
- & \nju_cover_underline_ug:nn {250pt}{\nju_department}\\
- \nju_coverbox_ug:n {ф╕У\hfill ф╕Ъ}
- & \nju_cover_underline_ug:nn {250pt}{\nju_major}\\
-
- % цаЗщвШцНвшбМ
- \int_case:nn {\nju_titlelength}
- {
- { 1 } {
- \nju_coverbox_ug:n {щвШ\hfill чЫо}
- & \nju_cover_underline_ug:nn {250pt}{\bf{\nju_title_a}} \\ }
- { 2 } {
- \nju_coverbox_ug:n {щвШ\hfill чЫо}
- & \nju_cover_underline_ug:nn {250pt}{\bf{\nju_title_a}} \\
- & \nju_cover_underline_ug:nn {250pt}{\bf{\nju_title_b}} \\ }
- { 3 } {
- \nju_coverbox_ug:n {щвШ\hfill чЫо}
- & \nju_cover_underline_ug:nn {250pt}{\bf{\nju_title_a}} \\
- & \nju_cover_underline_ug:nn {250pt}{\bf{\nju_title_b}} \\
- & \nju_cover_underline_ug:nn {250pt}{\bf{\nju_title_c}} \\}
- }
- \end{tabular}\\
-
- \begin{tabular}{p{4.2em}cp{4.2em}c}
- \nju_coverbox_ug:n {х╣┤\hfill ч║з}
- & \nju_cover_underline_ug:nn {90pt}{\nju_grade}
- & \nju_coverbox_ug:n {хнж\hfill хП╖}
- & \nju_cover_underline_ug:nn {90pt}{\nju_student_id}\\
- \end{tabular}\\
-
- \begin{tabular}{p{4.2em}c}
- \nju_coverbox_ug:n {хнж\hfill чФЯ\hfill хзУ\hfill хРН}
- & \nju_cover_underline_ug:nn {250pt}{\nju_student_name}
- \end{tabular}\\
- \begin{tabular}{p{4.2em}cp{4.2em}c}
- \nju_coverbox_ug:n {хп╝\hfill х╕И}
- & \nju_cover_underline_ug:nn {90pt}{\nju_mentor_a}
- & \nju_coverbox_ug:n {шБМ\hfill чз░}
- & \nju_cover_underline_ug:nn {90pt}{\nju_mentor_a_title}\\
-
- % чммф║Мхп╝х╕И
- \bool_if:NTF \nju_second_mentor
- {
- \nju_coverbox_ug:n {чмм\hfill ф║М\hfill хп╝\hfill х╕И}
- & \nju_cover_underline_ug:nn {90pt}{\nju_mentor_b}
- & \nju_coverbox_ug:n {шБМ\hfill чз░}
- & \nju_cover_underline_ug:nn {90pt}{\nju_mentor_b_title}\\
- }
- {}
- \end{tabular}\\
-
- \begin{tabular}{p{4.2em}c}
- \nju_coverbox_ug:n {цПР\hfill ф║д\hfill цЧе\hfill цЬЯ}
- & \nju_cover_underline_ug:nn {250pt}{\nju_submit_date}\\
- \end{tabular}
-}
-
-% х░БщЭвф┐бцБпцаП чаФчй╢чФЯ
-\tl_new:N \nju_printcoverinfo_g
-\tl_set:Nn \nju_printcoverinfo_g {
- \begin{tabular}{p{6em}c}
- % цаЗщвШцНвшбМ
- \int_case:nn {\nju_titlelength}
- {
- { 1 } {
- \nju_coverbox_g:n {шо║\hfill цЦЗ\hfill щвШ\hfill чЫо}
- & \nju_cover_underline_g:n {\nju_title_a} \\ }
- { 2 } {
- \nju_coverbox_g:n {шо║\hfill цЦЗ\hfill щвШ\hfill чЫо}
- & \nju_cover_underline_g:n {\nju_title_a} \\
- & \nju_cover_underline_g:n {\nju_title_b} \\ }
- { 3 } {
- \nju_coverbox_g:n {шо║\hfill цЦЗ\hfill щвШ\hfill чЫо}
- & \nju_cover_underline_g:n {\nju_title_a} \\
- & \nju_cover_underline_g:n {\nju_title_b} \\
- & \nju_cover_underline_g:n {\nju_title_c} \\}
- }
-
- \nju_coverbox_g:n {ф╜Ь\hfill шАЕ\hfill хзУ\hfill хРН}
- & \nju_cover_underline_g:n {\nju_student_name}\\
- \nju_coverbox_g:n {ф╕У\hfill ф╕Ъ\hfill хРН\hfill чз░}
- & \nju_cover_underline_g:n {\nju_major}\\
- \nju_coverbox_g:n {чаФ\hfill чй╢\hfill цЦ╣\hfill хРС}
- & \nju_cover_underline_g:n {\nju_field}\\
- \nju_coverbox_g:n {цМЗ\hfill хп╝\hfill цХЩ\hfill х╕И}
- & \nju_cover_underline_g:n {\nju_mentor_full}\\
- \end{tabular}
-}
-
-% ч╗ШхИ╢х░БщЭвхС╜ф╗д
-\tl_new:N \nju_printcover_ug % цЬмчзСх░БщЭв
-\tl_new:N \nju_printcover_g % чаФчй╢чФЯх░БщЭв
-
-% цЬмчзСх░БщЭв
-\tl_set:Nn \nju_printcover_ug {
- \thispagestyle{empty}
- \pagenumbering{Roman}
- % Start
- \pdfbookmark{х░БщЭв}{х░БщЭв} % х░Жх░БщЭвцПТхЕеpdfф╣жчн╛
- \begin{spacing}{1.25}
- \vskip 0mm
- \hspace{-10mm}
- \includegraphics[height=3cm]{njulogo}\smallskip
- \begin{center}
- \includegraphics[height=3.35cm]{njuname}
- \vskip 10mm
- {\zihao{1}\makebox[9em][s]{\bf{\songti\nju_type_name}}}
- \vfill
- \vskip\stretch{0}
- {\bgroup
- \kaishu\zihao{3}
- \def\tabcolsep{1pt}
- \def\arraystretch{1.5}
- \nju_printcoverinfo_ug % ч╗ШхИ╢ф┐бцБпцбЖ
- \egroup}
- \vfill
- \end{center}
- \end{spacing}
- \cleardoublepage
- \vfill
- % \newpage
-}
-
-% чаФчй╢чФЯх░БщЭв
-\tl_set:Nn \nju_printcover_g {
- \thispagestyle{empty}
- \pagenumbering{Roman}
- % Start
- \pdfbookmark{х░БщЭв}{х░БщЭв} % х░Жх░БщЭвцПТхЕеpdfф╣жчн╛
- \begin{spacing}{1.25}
- \begin{center}
- \hspace{0pt} \vskip 5mm
- \includegraphics[height=1.9cm]{njulogo}
- \vskip 10mm
- \includegraphics[height=1.9cm]{njuname-large}
- \vskip 15mm
- {\zihao{1}\makebox[10em][s]{\bf{\kaishu\nju_type_name}}}
- \vskip 5mm
- {\zihao{1}\bf{\kaishu{я╝ИчФ│шп╖\nju_degree_title хнжф╜Ня╝Й}}}
- \par\vfill
- \vskip\stretch{0}
- {\bgroup
- \bf\kaishu\zihao{3}
- \def\tabcolsep{1pt}
- \def\arraystretch{1.5}
- \vskip 10mm
- \nju_printcoverinfo_g % ч╗ШхИ╢ф┐бцБпцбЖ
- \egroup}
- \vfill
- \vskip 10mm
- \bf\kaishu\zihao{4}\nju_submit_date
- \vskip 15mm
- \end{center}
- \end{spacing}
-
- \newpage % х░БщЭвшГМщЭв
- \thispagestyle{empty}
- \begin{spacing}{1.625}
- % TODO: чнЙх╛Еш░ГцХ┤ца╝х╝П
- \hspace{0pt} \vfill
- {\bgroup
- \bf\kaishu\zihao{3}
- \makebox[6em][s]{хнж\hfill хП╖}я╝Ъ\nju_student_id
- \par
- \makebox[6em][s]{шо║цЦЗчнФш╛йцЧецЬЯ}я╝Ъ\nju_defense_date
- \par
- \makebox[6em][s]{цМЗ\hfill хп╝\hfill цХЩ\hfill х╕И}я╝Ъ\hspace{50mm}я╝Ичн╛хнЧя╝Й
- \par
- \egroup}
- \vskip 15mm
- \end{spacing}
- \cleardoublepage
-}
-
-% щЗНхоЪф╣ЙmaketitleчФЯцИРх░БщЭв
-\RenewDocumentCommand \maketitle {} {%
- \str_if_eq:eeTF {\nju_degree} { ug }
- { \nju_printcover_ug } % цЬмчзСх░БщЭв
- { \nju_printcover_g } % чаФчй╢чФЯх░БщЭв
-}
diff --git a/macros/unicodetex/latex/njuthesis/profile/font.sty b/macros/unicodetex/latex/njuthesis/profile/font.sty
deleted file mode 100644
index d939fb4842..0000000000
--- a/macros/unicodetex/latex/njuthesis/profile/font.sty
+++ /dev/null
@@ -1,219 +0,0 @@
-\ProvidesExplPackage{profile/font}{2021-09-11}{0.7.0}{NJU Thesis font configuration}
-
-% \RequireXeTeX
-% \RequireLuaTeX
-
-% шо╛ч╜оше┐цЦЗхнЧф╜У
-\NewDocumentCommand\set_latin_fontset_windows{}{
- \setmainfont{Times~New~Roman}
- \setsansfont{Arial}
- \setmonofont{Courier~New}[Scale=MatchLowercase]
-}
-
-\NewDocumentCommand\set_latin_fontset_macos{}{
- \setmainfont{Times~New~Roman}
- \setsansfont{Arial}
- \setmonofont{Menlo}[Scale=MatchLowercase]
-}
-
-\NewDocumentCommand\set_latin_fontset_gyre{}{
- \setmainfont{texgyretermes}[
- Extension=.otf,
- UprightFont=*-regular,
- BoldFont=*-bold,
- ItalicFont=*-italic,
- BoldItalicFont=*-bolditalic]
- \setsansfont{texgyreheros}[
- Extension=.otf,
- UprightFont=*-regular,
- BoldFont=*-bold,
- ItalicFont=*-italic,
- BoldItalicFont=*-bolditalic]
- \setmonofont{texgyrecursor}[
- Extension=.otf,
- UprightFont=*-regular,
- BoldFont=*-bold,
- ItalicFont=*-italic,
- BoldItalicFont=*-bolditalic,
- Scale=MatchLowercase,
- Ligatures=CommonOff]
-}
-
-% шо╛ч╜оф╕нцЦЗхнЧф╜У
-\NewDocumentCommand\set_chinese_fontset_windows{}{
- \setCJKmainfont{SimSun}[
- AutoFakeBold=2.17,
- ItalicFont=KaiTi]
- \setCJKsansfont{SimHei}
- \setCJKmonofont{FangSong}
- \setCJKfamilyfont{zhsong}{SimSun}[AutoFakeBold=2.17]
- \setCJKfamilyfont{zhhei}{SimHei}
- \setCJKfamilyfont{zhfs}{FangSong}
- \setCJKfamilyfont{zhkai}{KaiTi}[AutoFakeBold=2.17]
- \setCJKfamilyfont{zhnewhei}{Microsoft~YaHei}[BoldFont=Microsoft~YaHei~Bold]
-}
-
-\NewDocumentCommand\set_chinese_fontset_macos{}{
- \msg_redirect_name:nnn {fontspec} {no-script} {info} % чз╗щЩд does not contain script "CJK" шнжхСК
- \setCJKmainfont{Songti~SC~Light}[
- BoldFont=Songti~SC~Bold,
- ItalicFont=Kaiti~SC,
- BoldItalicFont=Kaiti~SC~Bold]
- \setCJKsansfont{Heiti~SC~Light}[BoldFont=Heiti~SC~Medium]
- \setCJKmonofont{STFangsong}
- \setCJKfamilyfont{zhsong}{Songti~SC~Light}[BoldFont=Songti~SC~Bold]
- \setCJKfamilyfont{zhhei}{Heiti~SC~Light}[BoldFont=Heiti~SC~Medium]
- \setCJKfamilyfont{zhfs}{STFangsong}
- \setCJKfamilyfont{zhkai}{Kaiti~SC}[BoldFont=Kaiti~SC~Bold]
- \setCJKfamilyfont{zhnewhei}{PingFang~SC}
-}
-
-\NewDocumentCommand\set_chinese_fontset_fandol{}{
- \msg_redirect_name:nnn {fontspec} {no-script} {info} % чз╗щЩд does not contain script "CJK" шнжхСК
- \setCJKmainfont{FandolSong-Regular}[
- Extension=.otf,
- BoldFont=FandolSong-Bold,
- ItalicFont=FandolKai-Regular]
- \setCJKsansfont{FandolHei-Regular}[
- Extension=.otf,
- BoldFont=FandolHei-Bold]
- \setCJKmonofont{FandolFang-Regular}[Extension=.otf]
- \setCJKfamilyfont{zhsong}{FandolSong-Regular}[
- Extension=.otf,
- BoldFont=FandolSong-Bold]
- \setCJKfamilyfont{zhhei}{FandolHei-Regular}[
- Extension=.otf,
- BoldFont=FandolHei-Bold]
- \setCJKfamilyfont{zhfs}{FandolFang-Regular}[Extension=.otf]
- \setCJKfamilyfont{zhkai}{FandolKai-Regular}[
- Extension=.otf,
- AutoFakeBold=2.17]
-}
-
-% цЦ╣цнгхнЧчмжщЫЖ
-\NewDocumentCommand\set_chinese_fontset_founder{}{
- % FZSSK цЦ╣цнгф╣жхоЛя╝ИчоАч╣БцЙйх▒Хя╝Й http://www.foundertype.com/index.php/FontInfo/index/id/151 хЕНш┤╣хХЖчФи
- % FZXBSK цЦ╣цнгх░ПцаЗхоЛя╝ИчоАч╣БцЙйх▒Хя╝Й http://www.foundertype.com/index.php/FontInfo/index/id/164 шо╛шобх╕ИщЭЮхХЖхЕНш┤╣
- % FZKTK цЦ╣цнгце╖ф╜Уя╝ИчоАч╣БцЙйх▒Хя╝Й http://www.foundertype.com/index.php/FontInfo/index/id/137 хЕНш┤╣хХЖчФи
- \setCJKmainfont{FZSSK}[
- Extension=.ttf,
- BoldFont=FZXBSK,
- ItalicFont=FZKTK]
- % FZXH1K цЦ╣цнгч╗Жщ╗Сф╕Ая╝ИчоАч╣БцЙйх▒Хя╝Й http://www.foundertype.com/index.php/FontInfo/index/id/161 шо╛шобх╕ИщЭЮхХЖхЕНш┤╣
- % FZHTK цЦ╣цнгщ╗Сф╜Уя╝ИчоАч╣БцЙйх▒Хя╝Й http://www.foundertype.com/index.php/FontInfo/index/id/131 хЕНш┤╣хХЖчФи
- \setCJKsansfont{FZXH1K}[
- Extension=.ttf,
- BoldFont=FZHTK]
- % FZFSK цЦ╣цнгф╗┐хоЛя╝ИчоАч╣БцЙйх▒Хя╝Й http://www.foundertype.com/index.php/FontInfo/index/id/128
- \setCJKmonofont{FZFSK}[Extension=.ttf]
-
- \setCJKfamilyfont{zhsong}{FZSSK}[
- Extension=.ttf,
- BoldFont=FZXBSK]
- \setCJKfamilyfont{zhhei}{FZHTK}[
- Extension=.ttf,
- AutoFakeBold=2.17]
- \setCJKfamilyfont{zhfs}{FZFSK}[Extension=.ttf]
- \setCJKfamilyfont{zhkai}{FZKTK}[Extension=.ttf]
- % FZYouHK_508R цЦ╣цнгцВащ╗С508Rя╝ИчоАч╣БцЙйх▒Хя╝Й http://www.foundertype.com/index.php/FontInfo/index/id/244 шо╛шобх╕ИщЭЮхХЖхЕНш┤╣
- % FZYouHK_511M цЦ╣цнгцВащ╗С511Mя╝ИчоАч╣БцЙйх▒Хя╝Й http://www.foundertype.com/index.php/FontInfo/index/id/244 шо╛шобх╕ИщЭЮхХЖхЕНш┤╣
- \setCJKfamilyfont{zhnewhei}{FZYouHK_508R}[
- Extension=.ttf,
- BoldFont=FZYouHK_511M]
-}
-
-\NewDocumentCommand\set_chinese_fontset_noto{}{
- % цАЭц║РхоЛф╜У https://www.google.com/get/noto/#serif-hans
- \setCJKmainfont[
- UprightFont=NotoSerifCJKsc-Regular,
- BoldFont=NotoSerifCJKsc-Bold,
- ItalicFont=NotoSerifCJKsc-Regular,
- BoldItalicFont=NotoSerifCJKsc-Bold,
- ItalicFeatures=FakeSlant,
- BoldItalicFeatures=FakeSlant]{Noto~Serif~CJK~SC}
-
- % цАЭц║Рщ╗Сф╜У https://www.google.com/get/noto/#sans-hans
- \setCJKsansfont[
- UprightFont=NotoSansCJKsc-Regular,
- BoldFont=NotoSansCJKsc-Bold,
- ItalicFont=NotoSansCJKsc-Regular,
- BoldItalicFont=NotoSansCJKsc-Bold,
- ItalicFeatures=FakeSlant,
- BoldItalicFeatures=FakeSlant]{Noto~Sans~CJK~SC}
-
- % хМЕхРлф║Оф╕Кш┐░цАЭц║Рщ╗Сф╜У
- \setCJKmonofont[
- UprightFont=NotoSansMonoCJKsc-Regular,
- BoldFont=NotoSansMonoCJKsc-Bold,
- ItalicFont=NotoSansMonoCJKsc-Regular,
- BoldItalicFont=NotoSansMonoCJKsc-Bold,
- ItalicFeatures=FakeSlant,
- BoldItalicFeatures=FakeSlant]{Noto~Sans~Mono~SC}
-
- \setCJKfamilyfont{zhsong}{Noto~Serif~CJK~SC}
- \setCJKfamilyfont{zhhei}{Noto~Sans~CJK~SC}
-
- % цЦ╣цнгце╖ф╜УуАБцЦ╣цнгф╗┐хоЛф╕║хЕНш┤╣хХЖчФихнЧф╜Уя╝Мф╕ФцФпцМБCJKхнЧчмжщЫЖ
- % цЦ╣цнгф╗┐хоЛ http://www.foundertype.com/index.php/FontInfo/index/id/128.html
- % цЦ╣цнгце╖ф╜У http://www.foundertype.com/index.php/FontInfo/index/id/137.html
- \setCJKfamilyfont{zhfs}{цЦ╣цнгф╗┐хоЛчоАф╜У}[AutoFakeBold=2.17]
- \setCJKfamilyfont{zhkai}{цЦ╣цнгце╖ф╜УчоАф╜У}[AutoFakeBold=2.17]
-}
-
-% хнЧф╜УхИдцЦн
-\bool_if:NTF \nju_systemfont
-% ца╣цНоцУНф╜Ьч│╗ч╗ЯшЗкхКищАЙцЛйчЫ╕х║ФхнЧф╜У
-{
- % цгАц╡ЛцШпхРжцШп Windows
- \sys_if_platform_windows:TF
- {
- \set_latin_fontset_windows
- \set_chinese_fontset_windows
- }
- {
- % цгАц╡ЛцШпхРжцШп macOS
- \ctex_if_platform_macos:TF
- {
- \set_latin_fontset_macos
- \set_chinese_fontset_macos
- }
- % хЕ╢ф╜Щч│╗ч╗Яф╕Ах╛Лф╜┐чФишЗкчФ▒хнЧф╜У
- {
- \set_latin_fontset_gyre
- \set_chinese_fontset_fandol
- }
- }
-}
-{
- % хжВцЮЬчФицИ╖щЬАшжБшЗкхоЪф╣ЙхнЧф╜У
- % цндхдДщЬАшжБф╜┐чФи\str_case_eшАМф╕НцШп\str_caseф╜┐хоПх▒Хх╝Аф╕║хнЧчмжф╕▓
- \str_case_e:nn { \nju_customlatinfont }
- {
- { windows } { \set_latin_fontset_windows }
- { macos } { \set_latin_fontset_macos }
- { gyre } { \set_latin_fontset_gyre }
- { null } {}
- }
- \str_case_e:nn { \nju_customchinesefont }
- {
- { windows } { \set_chinese_fontset_windows }
- { macos } { \set_chinese_fontset_macos }
- { gyre } { \set_chinese_fontset_gyre }
- { founder } { \set_chinese_fontset_founder }
- { noto } { \set_chinese_fontset_noto }
- { null } {}
- }
-}
-% щАЙцЛйхЕ╢ф╗ЦхнЧф╜Уя╝Мшп╖чбоф┐ЭчЫ╕х║ФхнЧф╜Ух╖▓хоЙшгЕ
-
-% шо╛ч╜оцХ░хнжхнЧф╜У (XITS, цИЦшАЕ STIX, ф╕О Times New Roman цЬАф╕║чЫ╕ш┐С)
-% \setmathfont{STIXTwoMath-Regular}[Extension = .otf]
-\setmathfont{XITSMath-Regular}[
- BoldFont = XITSMath-Bold,
- Extension = .otf]
-
-\NewDocumentCommand\songti{}{\CJKfamily{zhsong}}
-\NewDocumentCommand\heiti{}{\CJKfamily{zhhei}}
-\NewDocumentCommand\fangsong{}{\CJKfamily{zhfs}}
-\NewDocumentCommand\kaishu{}{\CJKfamily{zhkai}}
-% \NewDocumentCommand\lishu{}{\CJKfamily{zhli}}
diff --git a/macros/unicodetex/latex/njuthesis/profile/packages.sty b/macros/unicodetex/latex/njuthesis/profile/packages.sty
deleted file mode 100644
index 029488b787..0000000000
--- a/macros/unicodetex/latex/njuthesis/profile/packages.sty
+++ /dev/null
@@ -1,71 +0,0 @@
-\ProvidesExplPackage{profile/packages}{2021-09-11}{0.6.0}{NJU Thesis packages used}
-
-\RequirePackage{expl3}
-\RequirePackage{ifxetex}
-\RequirePackage{fontspec}
-\RequirePackage[
- top=2.5cm,
- bottom=2.5cm,
- left=3.2cm,
- right=3.2cm
-]{geometry}
-\RequirePackage{ifthen}
-\RequirePackage{xparse}
-% \RequirePackage{etoolbox}
-\RequirePackage{titlesec} % ф┐оцФ╣члашКВцаЗщвШхКЯшГ╜чФ▒CTeXцПРф╛Ы
-\RequirePackage{titletoc}
-% \RequirePackage{appendix} % хоЪф╣ЙщЩДх╜Хца╖х╝П
-\RequirePackage{fancyhdr} % ш░ГцХ┤щб╡чЬЙщб╡шДЪ
-\RequirePackage[hyphens]{url} % generate better linebreaks in the url
-% \RequirePackage[normalem]{ulem} % ч╗ШхИ╢ф╕ЛхИТч║┐
-% \RequirePackage{soul} % чФиф╕Нш╡╖цЭе
-% \RequirePackage{soulutf8}
-\RequirePackage{dashundergaps}
-\RequirePackage{setspace}
-\RequirePackage{lastpage}
-\RequirePackage{emptypage} % ц╕ЕщЩдчй║чЩ╜щб╡чЪДщб╡чаБ
-\RequirePackage{listings} % ф╗гчаБчОпхвГ
-\RequirePackage{enumitem} % чФиф║Оф┐оцФ╣хИЧшбичОпхвГ
-\RequirePackage{caption}
-\RequirePackage{floatrow} % чФиф║ОхЫ╛шбичнЙщб╡щЭвхЕГч┤ачЪДхоЪф╜Н
-\RequirePackage{booktabs} % чФиф║Оч╗ШхИ╢ф╕Йч║┐шби
-\RequirePackage{multirow} % Cells occupying multiple rows in tables
-\RequirePackage{multicol} % Multiple columns in dictionary
-\RequirePackage{siunitx} % чФиф║Оф╣жхЖЩхНХф╜НчмжхП╖
-\RequirePackage[version=4]{mhchem} % чФиф║Оч╗ШхИ╢хИЖхнРх╝П
-\RequirePackage{hologo} % чФиф║ОчФЯцИРхПпф╗ешвлцПТхЕеф╣жчн╛чЪДLaTeX logo
-% \RequirePackage{needspace} % Required to prevent page break right after a sectioning command
-% \RequirePackage{xspace} % Better print trailing whitespace
-\sys_if_engine_xetex:T{
- \RequirePackage{microtype}}
-% \sys_if_engine_luatex:T{
-% \RequirePackage{emoji}
-% \setemojifont{Segoe UI Emoji} % For windows.
-% % Shipped with the best `grinning-face-with-sweat' support.
-% % Use `Apple Color Emoji' for macos
-% % or `Noto Color Emoji' if you prefer.
-% }
-
-\RequirePackage{blindtext} % чФЯцИРчФиф║Оц╡ЛшпХчЪДхдзцо╡цЧацДПф╣ЙшЛ▒цЦЗцЦЗхнЧ
-\RequirePackage{zhlipsum} % чФЯцИРчФиф║Оц╡ЛшпХчЪДхдзцо╡цЧацДПф╣Йф╕нцЦЗцЦЗхнЧ
-% \RequirePackage{showframe} % хКаш╜╜ф╗ехРОх▒Хчд║хЖЕхо╣ш╛╣чХМ
-
-\RequirePackage{amsmath} % Must be loaded before unicode-math
-\RequirePackage{amsthm} % Mathematical environments
-\RequirePackage{mathtools} % Mathematical tools to use with amsmath
-\RequirePackage{thmtools} % Theorem styles
-\RequirePackage[
- warnings-off={% ц╢ИщЩдф╕ОmathtoolsхРИчФиф║зчФЯчЪДшнжхСК
- mathtools-colon,
- mathtools-overbracket}
- ]{unicode-math} % Math fonts in xetex or luatex
-
-\RequirePackage{graphicx}
-\DeclareGraphicsExtensions{.pdf,.eps,.jpg,.png}
-\graphicspath{{figure/}} % хЫ╛чЙЗш╖пх╛Д
-\RequirePackage{wrapfig} % Wrap text around figures
-
-% х┐Ещб╗ф╗ешпещб║х║ПхКаш╜╜ф╗еф╕Лф╕Йф╕кхМЕ
-% \RequirePackage{varioref}
-\RequirePackage[hidelinks,bookmarksnumbered=true]{hyperref}
-\RequirePackage[capitalise,nameinlink,noabbrev]{cleveref}
diff --git a/macros/unicodetex/latex/njuthesis/profile/page.sty b/macros/unicodetex/latex/njuthesis/profile/page.sty
deleted file mode 100644
index e926fa73ea..0000000000
--- a/macros/unicodetex/latex/njuthesis/profile/page.sty
+++ /dev/null
@@ -1,54 +0,0 @@
-\ProvidesExplPackage{profile/page}{2021-09-11}{0.6.0}{NJU Thesis page layout}
-
-% шо║цЦЗщб╡чаБ щб╡шДЪх▒Еф╕нуАБф║ФхП╖щШ┐цЛЙф╝пцХ░хнЧя╝ИцЦ░ч╜Чщймф╜Уя╝Йш┐Юч╗нч╝ЦчаБ
-\fancypagestyle{njuplain}{%
- \fancyhead{}
- \fancyfoot[C]{\zihao{5}\thepage}
-}
-% the header line
-\tl_set:Nn \headrulewidth {0pt}
-% the footer line
-\tl_set:Nn \footrulewidth {0pt}
-
-\AtBeginDocument{\pagestyle{njuplain}} % цЧащб╡чЬЙщб╡шДЪ
-
-% ctexца╝х╝Пшо╛ч╜о
-% чЫох╜ХцаЗщвШ ф╕ЙхП╖хоЛф╜УхКач▓Ч
-% хРДщГихИЖцаЗщвШ хЫЫхП╖щ╗Сф╜У
-\ctexset{
- contentsname = \songti\bfseries\zihao{3}чЫо\hspace{2em} х╜Х,
- chapter/format = \zihao{4}\heiti\centering,
- section/format = \zihao{4}\heiti\raggedright,
- subsection/format = \zihao{4}\heiti\raggedright,
- subsubsection/format = \zihao{4}\heiti\raggedright
-}
-
-% щЗНхоЪф╣ЙчЫох╜Хф╕нчлашКВцаЗщвШца╖х╝П
-% чЫох╜ХхЖЕхо╣ф╕нчлачЪДцаЗщвШ хЫЫхП╖щ╗Сф╜У
-% чЫох╜Хф╕нхЕ╢ф╗ЦхЖЕхо╣ х░ПхЫЫхП╖хоЛф╜У
-\titlecontents{chapter}% цаЗщвШч║зхИл
- [5em]% цаЗщвШх╖жщЧ┤ш╖Э
- {\heiti\zihao{4}\vspace{10pt}}% цаЗщвШца╝х╝П
- {\contentslabel{4em}}% цаЗщвШцаЗх┐Ч
- {\hspace*{-4em}}% цЧах║ПхП╖цаЗщвШ
- {~\titlerule*[0.6pc]{$.$}~\contentspage}% цМЗх╝Хч║┐ф╕Ощб╡чаБ
-
-\titlecontents{section}
- [5em]
- {\zihao{-4}\vspace{0pt}}
- {\contentslabel{2.5em}}
- {\hspace*{-4em}}
- {~\titlerule*[0.6pc]{$.$}~\contentspage}
-
-\titlecontents{subsection}
- [8em]
- {\zihao{-4}\vspace{0pt}}
- {\contentslabel{3em}}
- {\hspace*{-4em}}
- {~\titlerule*[0.6pc]{$.$}~\contentspage}
-
-% х░ЖчЫох╜Хщб╡цПТхЕеpdfф╣жчн╛
-\let\savedtableofcontents\tableofcontents
-\renewcommand{\tableofcontents}{%
- \pdfbookmark{чЫох╜Х}{чЫох╜Х}
- \savedtableofcontents}
diff --git a/macros/unicodetex/latex/njuthesis/profile/reference.sty b/macros/unicodetex/latex/njuthesis/profile/reference.sty
deleted file mode 100644
index 4087f9f561..0000000000
--- a/macros/unicodetex/latex/njuthesis/profile/reference.sty
+++ /dev/null
@@ -1,68 +0,0 @@
-\ProvidesExplPackage{profile/reference}{2021-09-11}{0.6.0}{NJU Thesis bibliography and reference}
-
-% biblatexшо╛ч╜о
-\RequirePackage[
- style=gb7714-2015,
- %style=numeric-comp,
- %citestyle=authortitle-icomp,
- % citestyle=numeric-comp,
- %bibstyle=authoryear,
- % bibstyle=numeric,
- sorting=none,
- %sorting=nyt,
- %sortcites=true,
- %autocite=footnote,
- backend=biber, % Compile the bibliography with biber
- hyperref=true,
- backref=false,
- citecounter=true,
- pagetracker=true,
- citetracker=true,
- ibidtracker=context,
- autopunct=true,
- autocite=plain,
- % gbpub=false, % Uncomment if you do NOT want '[S.l. : s.n.]' in reference entries, GitHub Issue (#47)
- % gbnamefmt=lowercase, % Uncomment if you do NOT want uppercase author names in reference entries, GitHub Issue (#23)
-]{biblatex}
-
-% Remove some unwanted entries from the bibliography
-\AtEveryBibitem{
- \clearfield{abstract}
- \clearfield{issn}
- \clearfield{isbn}
- \clearfield{archivePrefix}
- \clearfield{arxivId}
- \clearfield{pmid}
- \clearfield{eprint}
- \ifentrytype{online}{}{\ifentrytype{misc}{}{\clearfield{url}}}
- % \ifentrytype{book}{\clearfield{doi}}{}
-}
-
-% ф┐оцФ╣цаЗчн╛хРНчз░
-\crefdefaultlabelformat{#2#1#3\,} % щ╗ШшодхЬихРНчз░хРОщЭвц╖╗хКачй║ца╝
-
-\crefname{figure}{хЫ╛}{хЫ╛}
-\crefname{table}{шби}{шби}
-% \crefname{equation}{хЕмх╝П}{хЕмх╝П}
-\crefformat{equation}{хЕмх╝П~#2#1#3~} % хИащЩдхЕмх╝Пч╝ЦхП╖чЪДцЛмхП╖
-
-\crefformat{chapter}{чмм#2#1#3чла}
-\crefformat{section}{чмм~#2#1#3~шКВ}
-\crefformat{subsection}{чмм~#2#1#3~х░ПшКВ}
-\crefformat{subsubsection}{чмм~#2#1#3~х░ПшКВ}
-% \crefname{chapter}{┬з}{┬з}
-% \crefname{section}{┬з}{┬з}
-% \crefname{subsection}{┬з}{┬з}
-% \crefname{subsubsection}{┬з}{┬з}
-\crefname{appendix}{щЩДх╜Х}{щЩДх╜Х}
-
-% \crefname{definition}{хоЪф╣Й}{хоЪф╣Й}
-% \crefname{axiom}{хЕмчРЖ}{хЕмчРЖ}
-% \crefname{property}{цАзш┤и}{цАзш┤и}
-% \crefname{proposition}{хС╜щвШ}{хС╜щвШ}
-% \crefname{lemma}{х╝ХчРЖ}{х╝ХчРЖ}
-% \crefname{corollary}{цОишо║}{цОишо║}
-% \crefname{remark}{ц│ишзг}{ц│ишзг}
-% \crefname{condition}{цЭбф╗╢}{цЭбф╗╢}
-% \crefname{conclusion}{ч╗Ушо║}{ч╗Ушо║}
-% \crefname{assumption}{хБЗшо╛}{хБЗшо╛}
diff --git a/support/TeX4ht/source/ChangeLog b/support/TeX4ht/source/ChangeLog
index 738ecdbd7c..d4d252102d 100644
--- a/support/TeX4ht/source/ChangeLog
+++ b/support/TeX4ht/source/ChangeLog
@@ -1,3 +1,10 @@
+2021-09-17 Michal Hoftich <michal.h21@gmail.com>
+
+ * tex4ht-html4.tex (html4.4ht): fixed support for floating listings.
+ https://tex.stackexchange.com/a/615703/2891
+ * tex4ht-ooffice.tex (ooffice.4ht): fixed listings support in the ODT
+ format.
+
2021-09-14 Michal Hoftich <michal.h21@gmail.com>
* tex4ht-mathjax.tex (mathjax-latex-4ht.4ht): fixed TOC support for \exp
diff --git a/support/TeX4ht/source/tex4ht-html4.tex b/support/TeX4ht/source/tex4ht-html4.tex
index 0108f2d289..5dfb67b428 100644
--- a/support/TeX4ht/source/tex4ht-html4.tex
+++ b/support/TeX4ht/source/tex4ht-html4.tex
@@ -1,4 +1,4 @@
-% $Id: tex4ht-html4.tex 978 2021-09-12 21:26:18Z michal_h21 $
+% $Id: tex4ht-html4.tex 982 2021-09-17 12:20:37Z michal_h21 $
% Compile 4 times: latex tex4ht-html4
% Copy html4.4ht into the work directory before all but the last compilation.
%
@@ -15254,15 +15254,17 @@ Configuration for the inline code
\gdef\start:LstLn{%
\HCode{<div class="lstlisting" id="listing-\listingN">}%
\gdef\start:LstLn{|<nbsp|>\HCode{<br />\Hnewline}}}
- \bgroup
+ \bgroup%
+ % we put the closing </div> here in order to support floating listings
+ % https://tex.stackexchange.com/a/615703/2891
+ \pend:def\lst@DeInit{\ifvmode\IgnorePar\fi\EndP\HCode{</div>}}%
\Configure{listings}
{{\everypar{}\leavevmode}}
{{\everypar{}\leavevmode}}
{\start:LstLn \HCode{<span class="label">}}
{\HCode{</span>}}%
}
- {\egroup
- \ifvmode \IgnorePar\fi \EndP \HCode{</div>}\par}
+ {\egroup\par}
{} {}
\Css{.lstlisting .label{margin-right:0.5em; }}
\Css{div.lstlisting{font-family: monospace,monospace; white-space: nowrap;
diff --git a/support/TeX4ht/source/tex4ht-ooffice.tex b/support/TeX4ht/source/tex4ht-ooffice.tex
index 71b3105795..1eac506543 100644
--- a/support/TeX4ht/source/tex4ht-ooffice.tex
+++ b/support/TeX4ht/source/tex4ht-ooffice.tex
@@ -1,4 +1,4 @@
-% $Id: tex4ht-ooffice.tex 977 2021-09-09 13:53:34Z michal_h21 $
+% $Id: tex4ht-ooffice.tex 983 2021-09-17 14:27:15Z michal_h21 $
% compile 3 times: latex tex4ht-ooffice
% htlatex tex4ht-ooffice "xhtml,4,sections+"
%
@@ -10446,15 +10446,21 @@ Y{0178}\i{00EF}%
\ConfigureEnv{lstlisting}
{\ifvmode \IgnorePar\fi \EndP
\HCode{<!--l. \the\inputlineno lstlisting-->}%
- \HCode{<text:p\Hnewline text:style-name="Preformatted-Text">}%
- \bgroup \special{t4ht@(}%
+ % \HCode{}%
+ \bgroup %
+ \gdef\start:LstLn{%
+ \ifvmode\IgnorePar\fi\EndP\HCode{<text:p\Hnewline text:style-name="Preformatted-Text">}%
+ \ht:special{t4ht@(}\ttfamily%
+ \gdef\start:LstLn{\HCode{<text:s/><text:line-break/>}}}
+ \pend:def\lst@DeInit{\ifvmode\IgnorePar\fi\EndP\HCode{</text:p>}}%
\Configure{listings}
{{\everypar{}\leavevmode}}
{{\everypar{}\leavevmode}}
- {\HCode{<text:s/><text:line-break/>}}{}%
+ {\start:LstLn}{}%
}
- {\special{t4ht@)}\egroup
- \ifvmode \IgnorePar\fi \EndP \HCode{</text:p>}\par}
+ {\ht:special{t4ht@)}\egroup
+ % \ifvmode \IgnorePar\fi \EndP \HCode{</text:p>}\par}
+ \par}
{} {}
>>>
@@ -10462,16 +10468,20 @@ Y{0178}\i{00EF}%
\Configure{lstinputlisting}
{\ifvmode \IgnorePar\fi \EndP
\HCode{<!--l. \the\inputlineno lstinputlisting-->}%
- \HCode{<text:p\Hnewline text:style-name="Preformatted-Text">}%
- \bgroup \tt \special{t4ht@(}%
+ % \HCode{<text:p\Hnewline text:style-name="Preformatted-Text">}%
+ \bgroup%
+ \gdef\start:LstLn{%
+ \ifvmode\IgnorePar\fi\EndP\HCode{<text:p\Hnewline text:style-name="Preformatted-Text">}%
+ \ht:special{t4ht@(}\ttfamily%
+ \gdef\start:LstLn{\HCode{<text:s/><text:line-break/>}}}
+ \pend:def\lst@DeInit{\ifvmode\IgnorePar\fi\EndP\HCode{</text:p>}}%
\Configure{listings}
{{\everypar{}\leavevmode}}
{{\everypar{}\leavevmode}}
- {\HCode{<text:s/><text:line-break/>}}
+ {\start:LstLn}
{\HCode{<text:line-break/>}}%
}
- {\special{t4ht@)}\egroup
- \ifvmode \IgnorePar\fi \EndP \HCode{</text:p>}\par}
+ {\special{t4ht@)}\egroup\par}
>>>
diff --git a/support/latex2nemeth/README b/support/latex2nemeth/README
index e5a7588528..cfabeb24db 100644
--- a/support/latex2nemeth/README
+++ b/support/latex2nemeth/README
@@ -1,6 +1,6 @@
Latex2Nemeth
============
-Version 1.0.2
+Version 1.0.3
====================================
@@ -9,6 +9,8 @@ is basic macro support. The program supports
simple replacement commands (such as \newcommand{}{})
and commands with optional arguments
(such as \newcommand{\inner}[2]{\langle#1,#2\rangle}).
+A bug in Windows loading the default Nemeth table has
+also been corrected.
=====================================
@@ -23,20 +25,20 @@ This is the source tree for Latex2Nemeth, a tool for translating TeX files to Br
Licence
-------
-Copyright 2016-2020 by Andreas Papasal╬┐uros, Antonis Tsolomitis.
+Copyright 2016-2021 by Andreas Papasal╬┐uros, Antonis Tsolomitis.
This program is distributed under the GPL, version 3 or later. Please see the COPYING file for details.
Dependencies
------------
-In order to use the tool, you need the following programs:
+In order to build the tool from source, you need the following programs:
-1. **Java**
+1. Java
The tool has been tested with `Java 7` and `Java 8`.
-2. **Apache Maven**
+2. Apache Maven
Apache Maven is a software project management and comprehension tool.
- For Windows, download the [latest version](https://maven.apache.org/download.cgi).
@@ -45,7 +47,7 @@ In order to use the tool, you need the following programs:
sudo apt-get install maven
-Installing
+Building
----------
* Download Latex2Nemeth's sources. E.g. for anonymous access on SourceForge:
@@ -57,37 +59,46 @@ Installing
cd /path/to/latex2nemeth
mvn package -Dmaven.test.skip=true
-* **[Optional]** You can compile and also run the tests with `mvn package`
+* [Optional] You can compile and also run the tests with `mvn package`
Usage
-----
After compiling the tool the executable `jar` will be located in the `target/` directory,
-e.g. `target/latex2nemeth-v1.0.2.jar`.
+e.g. `target/latex2nemeth.jar`.
A simple to way to run the tool is
- java -jar <latex2nemeth.jar> <tex-file> <aux-file>
+ java -jar latex2nemeth.jar <tex-file> <aux-file>
-**Options**
+Options
+-------
+Option Description
+--------------------------------------------------------------------------------
+-e, --encoding <arg> The encoding table for Braille Mathematical symbols in the form of
+ a JSON file. If not specified, default Nemeth table is used.
+
+-m,--mode <arg> The mode of the parser which controls the type of the output
+ Braille files. It can be either 'nemeth' or 'pef'. The default mode
+ is nemeth.
-|Option|Description|
-|------|-----------|
-|-e,--encoding <arg> | The encoding table for Braille Mathematical symbols in the form of a JSON file. If not specified, default Nemeth table is used. |
-| -m,--mode <arg> | The mode of the parser which controls the type of the output Braille files. It can be either 'nemeth' or 'pef'. The default mode is nemeth.|
-| -o <arg> | The output prefix of the Braille files. It can also be prefixed with a path to a specific directory. The default value is the name of the TeX file. The program generates an output file for each chapter in the input TeX file.|
+-o <arg> The output prefix of the Braille files. It can also be prefixed
+ with a path to a specific directory. The default value is the name
+ of the TeX file. The program generates an output file for each
+ chapter in the input TeX file.
-**Examples**
+Examples
+------------
A simple example:
- java -jar target/latex2nemeth-v1.0.2.jar src/test/resources/com/latex2nemeth/bootstrap/mathtest.tex src/test/resources/com/latex2nemeth/bootstrap/mathtest.aux
+ java -jar latex2nemeth.jar examples/mathtest.tex examples/mathtest.aux
A more complicated example:
- java -jar target/latex2nemeth-v1.0.2.jar src/test/resources/com/latex2nemeth/bootstrap/mathtest.tex src/test/resources/com/latex2nemeth/bootstrap/mathtest.aux -o ch -m nemeth -e src/test/resources/com/latex2nemeth/bootstrap/nemeth.json
+ java -jar latex2nemeth.jar examples/mathtest.tex examples/mathtest.aux -o ch -m nemeth -e encodings/nemeth.json
An example with pictures:
- java -jar target/latex2nemeth-v1.0.2.jar src/test/resources/com/latex2nemeth/bootstrap/mathpics.tex src/test/resources/com/latex2nemeth/bootstrap/mathpics.aux
+ java -jar latex2nemeth.jar examples/mathpics.tex examples/mathpics.aux
-**Notes**
+Notes
-------------
1. Input tex files must be in utf-8. If using another encoding (such as iso-8859-7)
run first LaTeX to produce the aux file and then convert the source.tex to utf-8
@@ -95,7 +106,7 @@ A simple to way to run the tool is
iconv -f iso8859-7 -t utf-8 source.tex > source-utf8.tex
- or using your editor. Now run "java -jar latex2nemeth-v1.0.2.jar" as above with
+ or using your editor. Now run "java -jar latex2nemeth.jar" as above with
source-utf8.tex as the tex file and source.aux as the aux file. If errors are
produced you need to modify the source-utf8.tex at the line indicated.
Usually the errors have to do either with non supported shortcuts for macros
@@ -112,24 +123,18 @@ A simple to way to run the tool is
3. To emboss the output open the produced source-utf8.nemeth in LibreOffice
with the odt2braille plugin installed, open it as "Unicode UTF-8 encoded text"
- and emboss as usually.
+ and emboss as usually. Steps 1,2, and 3 are automated with the use of the nemeth2odt Bash script, found in the contrib folder (only in Linux).
-4. Pictures are exported separately in text files. Currently only `pstricks` pictures are supported.
-Currently their preable is hardcoded in `com.latex2nemeth.utils.Preamble`.
+4. Pictures are exported separately in text files. Currently only `pstricks` pictures are
+ supported. Currently their preable is hardcoded in `com.latex2nemeth.utils.Preamble`.
5. In order to save space when braille pages are embossed a paragraph change corresponds
-to three spaces. Thus commands such as \\ (double backslash) are transcribed as three spaces.
-However, there are cases, such as in poems, that a change of line must occur from line to line.
-To support these cases, a new latex-type command, named \latextonemethnewline
-is understood by the program, which produces a new line. So the double backslash
-at the end of each line of a poem must be substituted by \latextonemethnewline. For LaTeX to run
-smoothly a \newcommand can be introduced in the preamble, such as
-\newcommand{\latextonemethnewline}{\newline}
-
-6. It is possible to translate TeX files using different Braille alphabets. A different Braille alphabet
-is encoded in a JSON file. For example, in order to translate a texfile into polytonic Greek, the command is as follows:
+ to three spaces. Thus commands such as \\ (double backslash) are transcribed as three spaces. However, there are cases, such as in poems, that a change of line must occur from line to line. To support these cases, a new latex-type command, named \latextonemethnewline is understood by the program, which produces a new line. So the double backslash at the end of each line of a poem must be substituted by \latextonemethnewline. For LaTeX to run smoothly a \newcommand can be introduced in the preamble, such as \newcommand{\latextonemethnewline}{\newline}
+
+6. It is possible to translate TeX files using different Braille alphabets. A different
+ Braille alphabet is encoded in a JSON file. For example, in order to translate a texfile into polytonic Greek, the command is as follows:
- java -jar latex2nemeth-v1.0.2.jar texfile.tex auxfile.aux -e /path/to/polytonic.json
+ java -jar latex2nemeth.jar texfile.tex auxfile.aux -e /path/to/polytonic.json
Please report issues related to erratic output to a n d p a p a s [AT] a e g e a n . g r
and issues related to the tex file handling/modifying to a n t o n i s . t s o l o m i t i s [AT] g m a i l . c o m
diff --git a/support/latex2nemeth/contrib/nemeth2odt b/support/latex2nemeth/contrib/nemeth2odt
new file mode 100644
index 0000000000..9777f9322f
--- /dev/null
+++ b/support/latex2nemeth/contrib/nemeth2odt
@@ -0,0 +1,30 @@
+#!/bin/bash
+#get a random name first of 8 chars
+tmpdir=`cat /dev/urandom | tr -cd 'a-f0-9' | head -c 8`
+
+#make a folder
+mkdir $tmpdir
+
+#get the base name of the fole to convert
+file=`basename "$1" .nemeth`
+
+#convert nemeth from utf16 to utf8
+iconv -f utf-16 -t utf-8 "$1" > $file.txt
+
+#convert txt file to odt
+libreoffice --headless --convert-to odt $file.txt 1>/dev/null
+
+# odt is setup with a bultintemplate for convertions
+#from text, that uses Liberation Mono font.
+#we need DejaVu Serif. We change the font and repack
+#the odt file
+unzip -qq -d $tmpdir $file.odt
+rm -f $file.odt
+find $tmpdir -type f | xargs sed -i 's/Liberation Mono/DejaVu Serif/g'
+( cd $tmpdir; zip -qq -r ../$file.odt . )
+
+#cleanup
+/bin/rm -rf $tmpdir $file.txt
+
+
+
diff --git a/support/latex2nemeth/examples/nemeth.json b/support/latex2nemeth/encodings/nemeth.json
index 6c395dedd4..75be79b10c 100644
--- a/support/latex2nemeth/examples/nemeth.json
+++ b/support/latex2nemeth/encodings/nemeth.json
@@ -1,5 +1,7 @@
{
"letters": {
+ "\\&":"та╕тап",
+ "\\$": "таИтаО",
".": "\u2832",
",": "\u2802",
";": "\u2822",
@@ -13,6 +15,7 @@
"\\}": "\u2828\u283e",
"\\{": "\u2828\u2837",
"\\_": "\u2824\u2824",
+ "\\%": "\u2808\u2834",
":": "\u2806",
"?": "\u2838\u2826",
"!": "\u2816",
@@ -23,9 +26,29 @@
"-": "\u2824",
"=": "\u282d",
"\\backslash": "\u2838\u2821",
+ "\\aa": "таБтагтаитаб",
+ "\\AA": "таИтаатаБ",
+ "\\cent": "таИтаЙ",
+ "\\dag": "та╕та╗",
+ "\\dj": "таИтал",
+ "\\P": "таИтаатаП",
+ "\\planck": "таИтаУ",
+ "\\pounds": "таИтаЗ",
+ "\\qoppa": "таитаЯ",
+ "\\S": "таИтаатаО",
+ "\\samp": "таитаЙ",
+ "\\stigma": "таитао",
+ "\\textasciicircum": "та╕таг",
+ "\\textbackslash": "та╕таб",
+ "\\textregistered": "талтаЙта╕талтаатаЧта╗",
+ "\\textsection": "таИтаатаО",
+ "\\texttrademark": "таШтаатаЮтаатаН",
+ "\\textvisiblespace": "та┐",
+ "\\trianglelefteq": "талтаРтаЕтаЗта▒та╗",
+ "\\varsupsetneq": "та╕таитаВтаМта▒",
+ "\\VDash": "талта│та│таТтаТ",
"\\#": "\u2828\u283c",
- "\\&": "\u282f",
- "\\ ": " ",
+ "\\ ": " ",
"\\,": "\u2802",
"--": "\u2824\u2824",
"---": "\u2824\u2824\u2824",
@@ -34,6 +57,7 @@
" ": " ",
"\\quad": " ",
"\\qquad": " ",
+ "\"": "\u2834\u2804",
"#": "\u283c",
"0": "\u2834",
"1": "\u2802",
@@ -210,7 +234,538 @@
"\\textbf-close": "\u2838\u2820\u2804",
"\\textit": "\u2828",
"\\textit-open": "\u2820\u2804\u2838",
- "\\textit-close": "\u2838\u2820\u2804"
+ "\\textit-close": "\u2838\u2820\u2804",
+ "\\copyright": "\u282b\u2809\u2838\u282b\u2820\u2809\u283b",
+ "\\sampi": "\u2828\u2809",
+ "\\textcircled-open":"талтаЙта╕тал",
+ "\\textcircled-close": "та╗",
+ "b-allcaps": "таитаитаи",
+ "e-allcaps": "таитаитаи",
+ "\\latextonemethnewline": "\n",
+ "\\bf": "",
+ "\\it": "",
+ "\\=": "",
+ "\\>": "",
+ "╬Р": "таК",
+ "╬░": "та╜",
+ "\\noindent": "",
+ "\\hfill": " ",
+ "\\bigskip": " ",
+ "\\smallskip": " ",
+ "\\medskip": " ",
+"╬▒с╜╢": "таИтаг",
+"╬▒с╜╖": "таРтаг",
+"╬▒с╝░": "таг",
+"╬▒с╝▒": "тазтаг",
+"╬▒с╝▓": "та╛таг",
+"╬▒с╝│": "та╖таг",
+"╬▒с╝┤": "та┤таг",
+"╬▒с╝╡": "тавтаг",
+"╬▒с╝╢": "та▓таг",
+"╬▒с╝╖": "таЦтаг",
+"╬Сс╜╢": "таитаИтаг",
+"╬Сс╜╖": "таитаРтаг",
+"╬Сс╝░": "таитаг",
+"╬Сс╝▒": "таитазтаг",
+"╬Сс╝▓": "таита╛таг",
+"╬Сс╝│": "таита╖таг",
+"╬Сс╝┤": "таита┤таг",
+"╬Сс╝╡": "таитавтаг",
+"╬Сс╝╢": "таита▓таг",
+"╬Сс╝╖": "таитаЦтаг",
+"╬╡с╜╢": "таИтай",
+"╬╡с╜╖": "таРтай",
+"╬╡с╝░": "тай",
+"╬╡с╝▒": "тазтай",
+"╬╡с╝▓": "та╛тай",
+"╬╡с╝│": "та╖тай",
+"╬╡с╝┤": "та┤тай",
+"╬╡с╝╡": "тавтай",
+"╬╡с╝╢": "та▓тай",
+"╬╡с╝╖": "таЦтай",
+"╬Хс╜╢": "таитаИтай",
+"╬Хс╜╖": "таитаРтай",
+"╬Хс╝░": "таитай",
+"╬Хс╝▒": "таитазтай",
+"╬Хс╝▓": "таита╛тай",
+"╬Хс╝│": "таита╖тай",
+"╬Хс╝┤": "таита┤тай",
+"╬Хс╝╡": "таитавтай",
+"╬Хс╝╢": "таита▓тай",
+"╬Хс╝╖": "таитаЦтай",
+"╬┐с╜╢": "таИтак",
+"╬┐с╜╖": "таРтак",
+"╬┐с╝░": "так",
+"╬┐с╝▒": "тазтак",
+"╬┐с╝▓": "та╛так",
+"╬┐с╝│": "та╖так",
+"╬┐с╝┤": "та┤так",
+"╬┐с╝╡": "тавтак",
+"╬┐с╝╢": "та▓так",
+"╬┐с╝╖": "таЦтак",
+"╬Яс╜╢": "таитаИтак",
+"╬Яс╜╖": "таитаРтак",
+"╬Яс╝░": "таитак",
+"╬Яс╝▒": "таитазтак",
+"╬Яс╝▓": "таита╛так",
+"╬Яс╝│": "таита╖так",
+"╬Яс╝┤": "таита┤так",
+"╬Яс╝╡": "таитавтак",
+"╬Яс╝╢": "таита▓так",
+"╬Яс╝╖": "таитаЦтак",
+"╧Ес╜╢": "таИта╗",
+"╧Ес╜╖": "таРта╗",
+"╧Ес╝░": "та╗",
+"╧Ес╝▒": "тазта╗",
+"╧Ес╝▓": "та╛та╗",
+"╧Ес╝│": "та╖та╗",
+"╧Ес╝┤": "та┤та╗",
+"╧Ес╝╡": "тавта╗",
+"╧Ес╝╢": "та▓та╗",
+"╧Ес╝╖": "таЦта╗",
+"╬ес╜╢": "таитаИта╗",
+"╬ес╜╖": "таитаРта╗",
+"╬ес╝░": "таита╗",
+"╬ес╝▒": "таитазта╗",
+"╬ес╝▓": "таита╛та╗",
+"╬ес╝│": "таита╖та╗",
+"╬ес╝┤": "таита┤та╗",
+"╬ес╝╡": "таитавта╗",
+"╬ес╝╢": "таита▓та╗",
+"╬ес╝╖": "таитаЦта╗",
+"╬▒с╜║": "таИтаб",
+"╬▒с╜╗": "таРтаб",
+"╬▒с╜Р": "таб",
+"╬▒с╜С": "тазтаб",
+"╬▒с╜Т": "та╛таб",
+"╬▒с╜У": "та╖таб",
+"╬▒с╜Ф": "та┤таб",
+"╬▒с╜Х": "тавтаб",
+"╬▒с╜Ц": "та▓таб",
+"╬▒с╜Ч": "таЦтаб",
+"╬Сс╜║": "таитаИтаб",
+"╬Сс╜╗": "таитаРтаб",
+"╬Сс╜Р": "таитаб",
+"╬Сс╜С": "таитазтаб",
+"╬Сс╜Т": "таита╛таб",
+"╬Сс╜У": "таита╖таб",
+"╬Сс╜Ф": "таита┤таб",
+"╬Сс╜Х": "таитавтаб",
+"╬Сс╜Ц": "таита▓таб",
+"╬Сс╜Ч": "таитаЦтаб",
+"╬╡с╜║": "таИта▒",
+"╬╡с╜╗": "таРта▒",
+"╬╡с╜Р": "та▒",
+"╬╡с╜С": "тазта▒",
+"╬╡с╜Т": "та╛та▒",
+"╬╡с╜У": "та╖та▒",
+"╬╡с╜Ф": "та┤та▒",
+"╬╡с╜Х": "тавта▒",
+"╬╡с╜Ц": "та▓та▒",
+"╬╡с╜Ч": "таЦта▒",
+"╬Хс╜║": "таитаИта▒",
+"╬Хс╜╗": "таитаРта▒",
+"╬Хс╜Р": "таита▒",
+"╬Хс╜С": "таитазта▒",
+"╬Хс╜Т": "таита╛та▒",
+"╬Хс╜У": "таита╖та▒",
+"╬Хс╜Ф": "таита┤та▒",
+"╬Хс╜Х": "таитавта▒",
+"╬Хс╜Ц": "таита▓та▒",
+"╬Хс╜Ч": "таитаЦта▒",
+"╬╖с╜║": "таИта│",
+"╬╖с╜╗": "таРта│",
+"╬╖с╜Р": "та│",
+"╬╖с╜С": "тазта│",
+"╬╖с╜Т": "та╛та│",
+"╬╖с╜У": "та╖та│",
+"╬╖с╜Ф": "та┤та│",
+"╬╖с╜Х": "тавта│",
+"╬╖с╜Ц": "та▓та│",
+"╬╖с╜Ч": "таЦта│",
+"╬Чс╜║": "таитаИта│",
+"╬Чс╜╗": "таитаРта│",
+"╬Чс╜Р": "таита│",
+"╬Чс╜С": "таитазта│",
+"╬Чс╜Т": "таита╛та│",
+"╬Чс╜У": "таита╖та│",
+"╬Чс╜Ф": "таита┤та│",
+"╬Чс╜Х": "таитавта│",
+"╬Чс╜Ц": "таита▓та│",
+"╬Чс╜Ч": "таитаЦта│",
+"╬┐с╜║": "таИтае",
+"╬┐с╜╗": "таРтае",
+"╬┐с╜Р": "тае",
+"╬┐с╜С": "тазтае",
+"╬┐с╜Т": "та╛тае",
+"╬┐с╜У": "та╖тае",
+"╬┐с╜Ф": "та┤тае",
+"╬┐с╜Х": "тавтае",
+"╬┐с╜Ц": "та▓тае",
+"╬┐с╜Ч": "таЦтае",
+"╬Яс╜║": "таитаИтае",
+"╬Яс╜╗": "таитаРтае",
+"╬Яс╜Р": "таитае",
+"╬Яс╜С": "таитазтае",
+"╬Яс╜Т": "таита╛тае",
+"╬Яс╜У": "таита╖тае",
+"╬Яс╜Ф": "таита┤тае",
+"╬Яс╜Х": "таитавтае",
+"╬Яс╜Ц": "таита▓тае",
+"╬Яс╜Ч": "таитаЦтае",
+"╬▒╬╣": "таг",
+"╬▒╬п": "таРтаг",
+"╬С╬╣": "таитаг",
+"╬С╬п": "таитаРтаг",
+"╬▒╧Е": "таб",
+"╬▒╧Н": "таРтаб",
+"╬С╧Е": "таитаб",
+"╬С╧Н": "таитаРтаб",
+"╬╡╬╣": "тай",
+"╬╡╬п": "таРтай",
+"╬Х╬╣": "таитай",
+"╬Х╬п": "таитаРтай",
+"╬╡╧Е": "та▒",
+"╬╡╧Н": "таРта▒",
+"╬Х╧Е": "таита▒",
+"╬Х╧Н": "таитаРта▒",
+"╬┐╬╣": "так",
+"╬┐╬п": "таРтак",
+"╬Я╬╣": "таитак",
+"╬Я╬п": "таитаРтак",
+"╬┐╧Е": "тае",
+"╬┐╧Н": "таРтае",
+"╬Я╧Е": "таитае",
+"╬Я╧Н": "таитаРтае",
+"╧Е╬╣": "та╗",
+"╧Е╬п": "таРта╗",
+"╬е╬╣": "таита╗",
+"╬е╬п": "таитаРта╗",
+"╬╖╧Е": "та│",
+"╬╖╧Н": "таРта│",
+"╬Ч╧Е": "таита│",
+"╬Ч╧Н": "таитаРта│",
+
+
+
+"с╜░": "таИтаБ",
+"с╜▒": "таРтаБ",
+"с╝А": "таБ",
+"с╝Б": "тазтаБ",
+"с╝В": "та╛таБ",
+"с╝Г": "та╖таБ",
+"с╝Д": "та┤таБ",
+"с╝Е": "тавтаБ",
+"с╝Ж": "та▓таБ",
+"с╝З": "таЦтаБ",
+"с╛╢": "таатаБ",
+
+"с╛│": "таБтаФ",
+"с╛▓": "таИтаБтаФ",
+"с╛┤ ": "таРтаБтаФ",
+"с╛А": "таБтаФ",
+"с╛Б": "тазтаБтаФ",
+"с╛В": "та╛таБтаФ",
+"с╛Г": "та╖таБтаФ",
+"с╛Д": "та┤таБтаФ",
+"с╛Е": "тавтаБтаФ",
+"с╛Ж": "та▓таБтаФ",
+"с╛З": "таЦтаБтаФ",
+"с╛╖": "таатаБтаФ",
+
+"с╜▓": "таИтаС",
+"с╜│": "таРтаС",
+"с╝Р": "таС",
+"с╝С": "тазтаС",
+"с╝Т": "та╛таС",
+"с╝У": "та╖таС",
+"с╝Ф": "та┤таС",
+"с╝Х": "тавтаС",
+
+
+"с╜┤": "таИтаЬ",
+"с╜╡": "таРтаЬ",
+"с╝а": "таЬ",
+"с╝б": "тазтаЬ",
+"с╝в": "та╛таЬ",
+"с╝г": "та╖таЬ",
+"с╝д": "та┤таЬ",
+"с╝е": "тавтаЬ",
+"с╝ж": "та▓таЬ",
+"с╝з": "таЦтаЬ",
+"с┐Ж": "таатаЬ",
+
+"с┐Г": "та╝",
+"с┐В": "таИта╝",
+"с┐Д": "таРта╝ ",
+"с╛Р": "та╝",
+"с╛С": "тазта╝",
+"с╛Т": "та╛та╝",
+"с╛У": "та╖та╝",
+"с╛Ф": "та┤та╝",
+"с╛Х": "тавта╝",
+"с╛Ц": "та▓та╝",
+"с╛Ч": "таЦта╝",
+"с┐З": "таата╝",
+
+"с╜╢": "таИтаК",
+"с╜╖": "таРтаК",
+"с╝░": "таК",
+"с╝▒": "тазтаК",
+"с╝▓": "та╛таК",
+"с╝│": "та╖таК",
+"с╝┤": "та┤таК",
+"с╝╡": "тавтаК",
+"с╝╢": "та▓таК",
+"с╝╖": "таЦтаК",
+"с┐Ц": "таатаК",
+
+"с╜╕": "таИтаХ",
+"с╜╣": "таРтаХ",
+"с╜А": "таХ",
+"с╜Б": "тазтаХ",
+"с╜В": "та╛таХ",
+"с╜Г": "та╖таХ",
+"с╜Д": "та┤таХ",
+"с╜Е": "тавтаХ",
+
+"с╜║": "таИта╜",
+"с╜╗": "таРта╜",
+"с╜Р": "та╜",
+"с╜С": "тазта╜",
+"с╜Т": "та╛та╜",
+"с╜У": "та╖та╜",
+"с╜Ф": "та┤та╜",
+"с╜Х": "тавта╜",
+"с╜Ц": "та▓та╜",
+"с╜Ч": "таЦта╜",
+"с┐ж": "таата╜",
+
+"с╜╝": "таИтаЪ",
+"с╜╜": "таРтаЪ",
+"с╜а": "таЪ",
+"с╜б": "тазтаЪ",
+"с╜в": "та╛таЪ",
+"с╜г": "та╖таЪ",
+"с╜д": "та┤таЪ",
+"с╜е": "тавтаЪ",
+"с╜ж": "та▓таЪ",
+"с╜з": "таЦтаЪ",
+"с┐╢": "таатаЪ",
+
+"с┐│": "та║",
+"с┐▓": "таИта║",
+"с┐┤": "таРта║",
+"с╛а": "та║",
+"с╛б": "тазта║",
+"с╛в": "та╛та║",
+"с╛г": "та╖та║",
+"с╛д": "та┤та║",
+"с╛е": "тавта║",
+"с╛ж": "та▓та║",
+"с╛з": "таЦта║",
+"с┐╖": "таата║",
+
+"с┐д": "таЧ",
+"с┐е": "тазтаЧ",
+"с┐м": "таитазтаЧ",
+
+"с╛║": "таитаИтаБ",
+"с╛╗": "таитаРтаБ",
+"с╝И": "таитаБ",
+"с╝Й": "таитазтаБ",
+"с╝К": "таита╛таБ",
+"с╝Л": "таита╖таБ",
+"с╝М": "таита┤таБ",
+"с╝Н": "таитавтаБ",
+"с╝О": "таита▓таБ",
+"с╝П": "таитаЦтаБ",
+" ": " ",
+"с╛╝ таитаБтаФ ": " ",
+"с╛И": "таитаБтаФ",
+"с╛Й": "таитазтаБтаФ",
+"с╛К": "таита╛таБтаФ",
+"с╛Л": "таита╖таБтаФ",
+"с╛М": "таита┤таБтаФ",
+"с╛Н": "таитавтаБтаФ",
+"с╛О": "таита▓таБтаФ",
+"с╛П": "таитаЦтаБтаФ",
+
+
+"с┐И": "таитаИтаС",
+"с┐Й": "таитаРтаС",
+"с╝Ш": "таитаС",
+"с╝Щ": "таитазтаС",
+"с╝Ъ": "таита╛таС",
+"с╝Ы": "таита╖таС",
+"с╝Ь": "таита┤таС",
+"с╝Э": "таитавтаС",
+
+"с┐К": "таитаИтаЬ",
+"с┐Л": "таитаРтаЬ",
+"с╝и": "таитаЬ",
+"с╝й": "таитазтаЬ",
+"с╝к": "таита╛таЬ",
+"с╝л": "таита╖таЬ",
+"с╝м": "таита┤таЬ",
+"с╝н": "таитавтаЬ",
+"с╝о": "таита▓таЬ",
+"с╝п": "таитаЦтаЬ",
+
+"с┐М": "таита╝",
+"с╛Ш": "таита╝",
+"с╛Щ": "таитазта╝",
+"с╛Ъ": "таита╛та╝",
+"с╛Ы": "таита╖та╝",
+"с╛Ь": "таита┤та╝",
+"с╛Э": "таитавта╝",
+"с╛Ю": "таита▓та╝",
+"с╛Я": "таитаЦта╝",
+
+
+"с┐Ъ": "таитаИтаК",
+"с┐Ы ": "таРтаитаК",
+"с╝╕": "таитаК",
+"с╝╣": "таитазтаК",
+"с╝║": "таита╛таК",
+"с╝╗": "таита╖таК",
+"с╝╝": "таита┤таК",
+"с╝╜": "таитавтаК",
+"с╝╛": "таита▓таК",
+"с╝┐": "таитаЦтаК",
+
+"с┐╕": "таитаИтаХ",
+"с┐╣": "таитаРтаХ",
+"с╜И": "таитаХ",
+"с╜Й": "таитазтаХ",
+"с╜К": "таита╛таХ",
+"с╜Л": "таита╖таХ",
+"с╜М": "таита┤таХ",
+"с╜Н": "таитавтаХ",
+
+"с┐к": "таитаИта╜",
+"с┐л": "таитаРта╜",
+"с╜Щ": "таитазта╜",
+"с╜Ы": "таита╖та╜",
+"с╜Э": "таитавта╜",
+"с╜Я": "таитаЦта╜",
+
+"с┐║": "таитаИтаЪ",
+"с┐╗": "таитаРтаЪ",
+"с╜и": "таитаЪ",
+"с╜й": "таитазтаЪ",
+"с╜к": "таита╛таЪ",
+"с╜л": "таита╖таЪ",
+"с╜м": "таита┤таЪ",
+"с╜н": "таитавтаЪ",
+"с╜о": "таита▓таЪ",
+"с╜п": "таитаЦтаЪ",
+
+"с┐╝": "таита║",
+"с╛и": "таита║",
+"с╛й": "таитазта║",
+"с╛к": "таита╛та║",
+"с╛л": "таита╖та║",
+"с╛м": "таита┤та║",
+"с╛н": "таитавта║",
+"с╛о": "таита▓та║",
+"с╛п": "таитаЦта║",
+
+"тАЬ": "таж",
+"тАЭ": "та┤",
+"с╛╜": "таБ",
+"с╛╛": "таФ",
+"с╛┐": "таБ",
+"с┐А": "таа",
+"с┐Б": "таа",
+"с┐Н": "та╛",
+"с┐О": "та┤",
+"с┐П": "та▓",
+"с┐Э": "та╖",
+"с┐Ю": "тав",
+"с┐Я": "таЦ",
+"с┐Т": "таИтаК",
+"с┐У": "таРтаК",
+"с┐Ч": "таатаК",
+"с┐в": "таИта╜",
+"с┐г": "таРта╜",
+"с┐з": "таата╜",
+"с┐н": "таИ",
+"с┐о": "таР",
+"с┐п": "таИ",
+"с┐╜": "таИ",
+"с┐╛": "таз",
+"тАа": "\u2838\u283b",
+
+
+"с╛░": "таБта╕тай",
+"с╛▒": "таБта▒",
+"с╛╕": "таитаБта╕тай",
+"с╛╣": "таитаБта▒",
+"с┐Р": "таКта╕тай",
+"с┐С": "таКта▒",
+"с┐Ш": "таитаКта╕тай",
+"с┐Щ": "таитаКта▒",
+"с┐а": "та╜та╕тай",
+"с┐б": "та╜та▒",
+"с┐и": "таита╜та╕тай",
+"с┐й": "таита╜та▒",
+
+"╬▒с┐Ц": "таатаг",
+"╬Сс┐Ц": "таитаатаг",
+"╬▒с┐ж": "таатаб",
+"╬Сс┐ж": "таитаатаб",
+"╬╡с┐Ц": "таатай",
+"╬Хс┐Ц": "таитаатай",
+"╬╡с┐ж": "таата▒",
+"╬Хс┐ж": "таитаата▒",
+"╬┐с┐Ц": "таатак",
+"╬Яс┐Ц": "таитаатак",
+"╬┐с┐ж": "таатае",
+"╬Яс┐ж": "таитаатае",
+"╧Ес┐Ц": "таата╗",
+"╬ес┐Ц": "таитаата╗",
+"╬╖с┐ж": "таата│",
+"╬Чс┐ж": "таитаата│",
+
+"\n": "\n",
+"\r": "\r",
+
+"~": "таИта▒",
+"@": "таИтаБ",
+"#": "таита╝",
+"$": "таИтаО",
+"%": "таИта┤",
+"^": "та╕таг",
+"&": "тап",
+"*": "таИта╝",
+"(": "та╖",
+")": "та╛",
+"-": "тад",
+"_": "тай",
+"=": "таитаЕ",
+"+": "тао",
+
+"[": "таИта╖",
+"{": "таита╖",
+"]": "таИта╛",
+"}": "таита╛",
+"\\": "та╕таб",
+"|": "та│",
+";": "тав",
+":": "таЖ",
+"тАШ": "таД",
+"тАЩ": "таД",
+"тАЬ": "таж",
+"тАЭ": "та┤",
+",": "таВ",
+"<": "таРтаЕ",
+".": "та▓",
+">": "таитаВ",
+"/": "таМ",
+"?": "та╕таж",
+"`": "\u2820\u2826",
+"'": "\u2834\u2804",
},
"mathSymbols": {
"#": "\u283c",
@@ -438,33 +993,21 @@
"\\bigvee": "\u2808\u282c",
"\\bigwedge": "\u2808\u2829",
"\\coprod": "INVERTED PI",
- "\\AA": "\u2808\u2820\u2801",
- "\\aa": "\u2801\u2823\u2828\u2821",
"@": "\u2808\u2801\u281e",
- "\\P": "\u2808\u2820\u280f",
- "\\dag": "\u2838\u283b",
"\\ddag": "\u2838\u2838\u283b",
- "\\S": "\u2808\u2820\u280e",
- "\\textsection": "\u2808\u2820\u280e",
- "\\textregistered": "\u282b\u2809\u2838\u282b\u2820\u2817\u283b",
- "\\copyright": "\u282b\u2809\u2838\u282b\u2820\u2809\u283b",
- "\\pounds": "\u2808\u2807",
"\\textstirling": "\u2808\u2807",
"\\SS": "\u2820\u280e\u2820\u280e",
"\\lq": "\u2820\u2826",
+ "`": "\u2820\u2826",
+ "'": "\u2834\u2804",
"\\leftquote": "\u2820\u2826",
"\\rq": "\u2834\u2804",
"\\rightquote": "\u2834\u2804",
- "\\texttrademark": "\u2818\u2820\u281e\u2820\u280d",
- "\\textasciicircum": "\u2838\u2823",
+ "\"": "\u2834\u2804",
"\\&": "\u2838\u282f",
"\\_": "\u2824\u2824",
- "\\textbackslash": "\u2838\u2821",
- "\\cent": "\u2808\u2809",
"\\checked": "\u2808\u281c",
- "\\dj": "\u2808\u282b",
"\\barlambda": "\u2808\u2828\u2807",
- "\\planck": "\u2808\u2813",
"\\$": "\u2808\u280e",
"\\bigoplus": "\u282b\u2809\u2838\u282b\u282c\u283b",
"\\biguplus": "\u2828\u282c\u2838\u282b\u282c\u283b",
@@ -508,11 +1051,11 @@
"\\Biggr\\}": "\u2828\u2820\u283e",
"\\rfloor": "\u2808\u2830\u283e",
"\\rangle": "\u2828\u2828\u283e",
- "\\right\rangle": "\u2828\u2828\u2820\u283e",
- "\\bigr\rangle": "\u2828\u2828\u2820\u283e",
- "\\Bigr\rangle": "\u2828\u2828\u2820\u283e",
- "\\biggr\rangle": "\u2828\u2828\u2820\u283e",
- "\\Biggr\rangle": "\u2828\u2828\u2820\u283e",
+ "\\right\\rangle": "\u2828\u2828\u2820\u283e",
+ "\\bigr\\rangle": "\u2828\u2828\u2820\u283e",
+ "\\Bigr\\rangle": "\u2828\u2828\u2820\u283e",
+ "\\biggr\\rangle": "\u2828\u2828\u2820\u283e",
+ "\\Biggr\\rangle": "\u2828\u2828\u2820\u283e",
"\\|": "\u2833\u2833",
"\\left\\|": "\u2820\u2833\u2820\u2833",
"\\right\\|": "\u2820\u2833\u2820\u2833",
@@ -536,7 +1079,6 @@
"\\Downarrow": "\u282b\u2829\u2836\u2836\u2815",
"\\Updownarrow": "\u282b\u2829\u282a\u2836\u2836\u2815",
"\\rceil": "\u2808\u2818\u283e",
- "\\backslash": "\u2838\u2821",
"\\ulcorner": "\u2808\u2818\u2837",
"\\left\\ulcorner": "\u2808\u2818\u2820\u2837",
"\\bigl\\ulcorner": "\u2808\u2818\u2820\u2837",
@@ -590,7 +1132,7 @@
"\\varsigma": "\u2828\u2808\u280e",
"\\varphi": "\u2828\u2808\u280b",
"\\Theta": "\u2828\u2820\u2839",
- "\\Sigma ": "\u2828\u2820\u280e",
+ "\\Sigma" : "\u2828\u2820\u280e",
"\\Omega": "\u2828\u2820\u283a",
"\\delta": "\u2828\u2819",
"\\eta": "\u2828\u2831",
@@ -606,11 +1148,8 @@
"\\beth": "\u2820\u2820\u2827",
"\\daleth": "\u2820\u2820\u2819",
"\\gimel": "\u2820\u2820\u281b",
- "\\stigma": "\u2828\u282e",
"\\Stigma": "\u2828\u2820\u282e",
- "\\qoppa": "\u2828\u281f",
- "\\sampi": "\u2828\u2809",
- "\\Sampi ": "\u2828\u2820\u2809",
+ "\\Sampi": "\u2828\u2820\u2809",
"\\Qoppa": "\u2828\u2820\u281f",
"\\pm": "\u282c\u2824",
"\\mp": "\u2824\u282c",
@@ -637,6 +1176,7 @@
"\\bigcirc": "\u282b\u2809",
"\\dagger": "\u2838\u283b",
"\\ddagger": "\u2838\u2838\u283b",
+
"\\amalg": "????",
"\\dotplus": "\u2810\u282c\u2823\u2821\u283b",
"\\Cup": "\u2828\u282c\u2838\u282b\u2828\u282c\u283b",
@@ -764,7 +1304,7 @@
"\\eqslantgtr": "\u2831\u2828\u2802",
"\\gtrdot": "\u2828\u2802\u2838\u282b\u2821\u283b",
"\\gtreqless": "\u2828\u2802\u2831\u2810\u2805",
- "\\circeq ": "\u2810\u2828\u2805\u2823\u2828\u2821\u283b",
+ "\\circeq": "\u2810\u2828\u2805\u2823\u2828\u2821\u283b",
"\\thickapprox": "\u2838\u2808\u2831\u2838\u2808\u2831",
"\\succsim": "\u2828\u2828\u2802\u2808\u2831",
"\\shortparallel": "\u282b\u2807",
@@ -797,7 +1337,7 @@
"\\geqslant": "\u2828\u2802\u2831",
"\\gtrapprox": "\u2828\u2802\u2808\u2831\u2808\u2831",
"\\gtrless": "\u2828\u2802\u2810\u2805",
- "\\eqcirc ": "\u2828\u2821\u2808\u2828\u2805\u283b",
+ "\\eqcirc": "\u2828\u2821\u2808\u2828\u2805\u283b",
"\\thicksim": "\u2838\u2808\u2831",
"\\Supset": "\u2838\u2828\u2802\u2838\u282b\u2838\u2828\u2802\u283b",
"\\shortmid": "\u2833",
@@ -811,13 +1351,13 @@
"\\subsetneq": "\u2838\u2810\u2805\u280c\u2831",
"\\varsubsetneqq": "\u2838\u2810\u2805\u280c\u2828\u2805",
"\\ngeqslant": "\u280c\u2828\u2802\u2831",
- "\\gneqq ": "\u2828\u2802\u280c\u2828\u2805",
+ "\\gneqq": "\u2828\u2802\u280c\u2828\u2805",
"\\gnapprox": "\u2828\u2802\u280c\u2808\u2831\u2808\u2831",
"\\succnsim": "\u2828\u2828\u2802\u280c\u2808\u2831",
"\\nshortparallel": "\u280c\u282b\u2807",
"\\nVDash": "\u280c\u282b\u2833\u2833\u2812\u2812",
"\\nsupseteq": "\u280c\u2838\u2828\u2802\u2831",
- "\\varsupsetneq ": "\u2838\u2828\u2802\u280c\u2831",
+ "\\varsupsetneq": "\u2838\u2828\u2802\u280c\u2831",
"\\nleq": "\u280c\u2810\u2805\u2831",
"\\lneq": "\u2810\u2805\u280c\u2831",
"\\lnsim": "\u2810\u2805\u280c\u2808\u2831",
@@ -902,11 +1442,11 @@
"\\biggl\\llbracket": "\u2808\u2838\u2820\u2837",
"\\Biggl\\llbracket": "\u2808\u2838\u2820\u2837",
"\\rrbracket": "\u2808\u2838\u283e",
- "\\right\rrbracket": "\u2808\u2838\u2820\u283e",
- "\\bigr\rrbracket": "\u2808\u2838\u2820\u283e",
- "\\Bigr\rrbracket": "\u2808\u2838\u2820\u283e",
- "\\biggr\rrbracket": "\u2808\u2838\u2820\u283e",
- "\\Biggr\rrbracket": "\u2808\u2838\u2820\u283e",
+ "\\right\\rrbracket": "\u2808\u2838\u2820\u283e",
+ "\\bigr\\rrbracket": "\u2808\u2838\u2820\u283e",
+ "\\Bigr\\rrbracket": "\u2808\u2838\u2820\u283e",
+ "\\biggr\\rrbracket": "\u2808\u2838\u2820\u283e",
+ "\\Biggr\\rrbracket": "\u2808\u2838\u2820\u283e",
"\\varg": "\u2808\u281b",
"\\varv": "\u2808\u2827",
"\\varw": "\u2808\u283a",
@@ -955,7 +1495,7 @@
"\\oiintctrclockwise": "\u282e\u282e\u2808\u282b\u2822\u2814\u2815\u283b",
"\\varoiintclockwise": "\u282e\u282e\u2808\u282b\u282a\u2822\u2814\u283b",
"\\varoiiintctrclockwise": "\u282e\u282e\u282e\u2808\u282b\u2822\u2814\u2815\u283b",
- "\\dashrightarrow": "\u282b\u2812",
+ "\\dashrightarrow": "талтаТ таТтаХ",
"\\ntwoheadrightarrow": "\u280c\u282b\u2812\u2812\u2815\u2815",
"\\Searrow": "\u282b\u2830\u2836\u2836\u2815",
"\\Perp": "\u282b\u2829\u2836\u2836\u2833",
@@ -967,7 +1507,7 @@
"\\DiamonddotLeft": "\u282b\u282a\u2836\u2836\u282b\u2819\u2838\u282b\u2821\u283b",
"\\circleddotright": "\u282b\u2809\u2838\u282b\u2821\u282b\u2815\u283b",
"\\multimapdotbothvert": "\u282b\u2823\u2821\u2812\u2812\u2821",
- "\\dashleftrightarrow": "\u282b\u282a\u2812",
+ "\\dashleftrightarrow": "талтактаТ таТтаХ",
"\\ntwoheadleftarrow": "\u280c\u282b\u282a\u282a\u2812\u2812",
"\\Nwarrow": "\u282b\u2818\u282a\u2836\u2836",
"\\leadstoext": "\u2808\u2831",
@@ -1079,6 +1619,8 @@
"\\overline-end": "\u2823\u2831",
"\\underline-begin": "\u2810",
"\\underline-end": "\u2829\u2831",
+ "\\dot-begin": "таР",
+ "\\dot-end": "таб",
"?": "\u2838\u2826",
"'": "\u2804",
"{": "",
@@ -1095,6 +1637,8 @@
"\\under": "\u2829",
"\\leqno": " ",
"\\hat": "\u2823\u2838\u2823",
+ "\\vec-begin": "\u2810",
+ "\\vec-end": "\u2823\u282b\u2815\u283b",
"\\%": "\u2808\u2834",
"\\bar": "\u2831",
"\\stackrel-begin": "\u2810",
@@ -1124,6 +1668,7 @@
"\\sqsupseteq": "таИта╕таитаВта▒",
"\\bowtie": "талта╕таИтабтаЗта╗",
"\\Join": "талта╕таИтабтаЗта╗",
+ "\\lrJoin": "талта╕таИтабтаЗта╗",
"\\risingdotseq": "",
"\\backsimeq": "таИтаИта▒та▒",
"\\tianglelefteq": "талтаРтаЕтаЗта▒та╗",
@@ -1170,12 +1715,25 @@
"\\rJoin": "талтаИтабтаЗта╗",
"\\npreccurlyeq": "таМталтаитаРтаЕта▒та╗",
"\\nbacksim": "таМтаИтаИта▒",
- "\\textvisiblespace": "та┐",
"\\imath": "талтаКта╗",
"\\jmath": "талтаЪта╗",
"\\check": "\u2823\u2808\u2838\u2823",
"\\acute": "\u2823\u2804",
- "\\grave": "\u2831"
+ "\\grave": "\u2831",
+ "\\sphericalangle": "талтакта╕талталтаБта╗",
+ "\\Theta": "таитаата╣",
+ "\\Sigma": "таитаатаО",
+ "\\Omega": "таитаата║",
+ "\\breve": "та╕тай",
+ "\\ddot": "тагтабтабта╗",
+ "\\mathring":"таитаб",
+ "\\circeq": "таРтаитаЕтагтаитабта╗",
+ "\\copyright": "талтаЙта╕талтаатаЙта╗",
+ "\\eqcirc": "таитабтаИтаитаЕта╗",
+ "\\gneqq": "таРтаитаЕтагтаитабта╗",
+ "\\trianglelefteq": "талтаРтаЕтаЗта▒та╗",
+ "\\VDash": "талта│та│таТтаТ",
+ "\\multimapdotbothAvert": "талтагтабтаТтаТтаитаб"
},
"theoremSymbols": {
".": "\u2828",
@@ -1201,4 +1759,4 @@
"#8": "\u283c\u2826",
"#9": "\u283c\u2814"
}
-} \ No newline at end of file
+}
diff --git a/support/latex2nemeth/encodings/polytonic.json b/support/latex2nemeth/encodings/polytonic.json
index 054c61c22a..ea440062ee 100644
--- a/support/latex2nemeth/encodings/polytonic.json
+++ b/support/latex2nemeth/encodings/polytonic.json
@@ -246,7 +246,15 @@
"\\latextonemethnewline": "\n",
"╬Р": "таК",
"╬░": "та╜",
-
+ "\\bf": "",
+ "\\it": "",
+ "\\=": "",
+ "\\>": "",
+ "\\noindent": "",
+ "\\hfill": " ",
+ "\\bigskip": " ",
+ "\\smallskip": " ",
+ "\\medskip": " ",
"╬▒с╜╢": "таИтаг",
"╬▒с╜╖": "таРтаг",
"╬▒с╝░": "таБтаг",
diff --git a/support/latex2nemeth/latex2nemeth b/support/latex2nemeth/latex2nemeth
index 3ce409fc29..9aa230a9ad 100755
--- a/support/latex2nemeth/latex2nemeth
+++ b/support/latex2nemeth/latex2nemeth
@@ -1,3 +1,3 @@
#!/bin/sh
-jarpath=`kpsewhich --progname=latex2nemeth --format=texmfscripts latex2nemeth-v1.0.2.jar`
+jarpath=`kpsewhich --progname=latex2nemeth --format=texmfscripts latex2nemeth.jar`
exec java -jar "$jarpath" "$@"
diff --git a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
index cffd5bdee7..fe71cd86ea 100644
--- a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+++ b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
@@ -49,7 +49,6 @@ $mirrors = {
'https://cran.asia/tex/' => 1,
'https://ftp.harukasan.org/CTAN/' => 1,
'https://ftp.kaist.ac.kr/pub/tex-archive/' => 1,
- 'https://mirror.kakao.com/CTAN/' => 1,
'https://mirror.navercorp.com/CTAN/' => 1,
'https://mirror.yongbok.net/ctan/' => 1,
},
@@ -87,7 +86,6 @@ $mirrors = {
'https://distrib-coffee.ipsl.jussieu.fr/pub/mirrors/ctan/' => 1,
'https://mirror.ibcp.fr/pub/CTAN/' => 1,
'https://mirrors.chevalier.io/CTAN/' => 1,
- 'https://mirrors.ircam.fr/pub/CTAN/' => 1,
'https://texlive.mycozy.space/' => 1,
},
'Germany' => {
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb b/systems/texlive/tlnet/tlpkg/texlive.tlpdb
index 6bf059a7d5..203f94cc01 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/2021
-depend revision/60523
+depend revision/60530
name 00texlive.image
category TLCore
-revision 60503
+revision 60529
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
@@ -2595,6 +2595,7 @@ runfiles size=13900
tlpkg/tlpsrc/luaotfload.tlpsrc
tlpkg/tlpsrc/luapackageloader.tlpsrc
tlpkg/tlpsrc/luaprogtable.tlpsrc
+ tlpkg/tlpsrc/luapstricks.tlpsrc
tlpkg/tlpsrc/luarandom.tlpsrc
tlpkg/tlpsrc/luasseq.tlpsrc
tlpkg/tlpsrc/luatex.tlpsrc
@@ -4457,7 +4458,7 @@ depend setting_available_architectures:aarch64-linux amd64-freebsd amd64-netbsd
name 00texlive.installer
category TLCore
-revision 60518
+revision 60525
shortdesc TeX Live standalone installer package
longdesc This package defines the files to go into the installer
longdesc archives (install-tl-unx.tar.gz, install-tl.zip) built by the
@@ -69698,7 +69699,7 @@ containerchecksum 3513b00f6c81b941389c3bb2b2e2dd1eb1d93c63edcc8c77f3aefbb15132e9
name collection-pstricks
category Collection
-revision 54455
+revision 60526
shortdesc PSTricks
relocated 1
longdesc PSTricks core and all add-on packages.
@@ -69707,6 +69708,7 @@ depend bclogo
depend collection-basic
depend collection-plaingeneric
depend dsptricks
+depend luapstricks
depend makeplot
depend pdftricks
depend pdftricks2
@@ -69814,8 +69816,8 @@ depend pstricks_calcnotes
depend uml
depend vaucanson-g
depend vocaltract
-containersize 808
-containerchecksum 653143f95761352dc349c66f618b01a77650b20bf8b2cf45137e72b2f05ba3dcefbf0238f1b2757297ac37ec6cbd4a05283c0bfc03d6e153e57f4be23ca8f87f
+containersize 812
+containerchecksum 2b900dbe1cd032509169ee2b63f283cac0c9e42276f853e6f8556a0432e4133d020cee6cba848e79a336824ffd5078d82bb1754d32dff704443c0c4d007a1b0e
name collection-publishers
category Collection
@@ -167484,7 +167486,7 @@ binfiles arch=x86_64-solaris size=1
name latex2nemeth
category Package
-revision 54389
+revision 60528
shortdesc Convert LaTeX source to Braille with math in Nemeth
longdesc After many failed attempts to transcribe real math notes and
longdesc books to Braille/Nemeth in order to deal with a real situation
@@ -167501,25 +167503,27 @@ longdesc specialized equipment. Note that embossing will need
longdesc LibreOffice and odt2braille as this project does not deal with
longdesc embossers' drivers.
depend latex2nemeth.ARCH
-containersize 7125616
-containerchecksum 37065f9916e6755c1a97f2b8a1f1cfd838008b5da2d2131938626ae4eb6872af30e5b4b767ff3204e271a86b7245b54d9146d9fdd8c807f882ca28e1663d2d14
-doccontainersize 26836
-doccontainerchecksum e2ea8084bec4d41a4b694c3b46788e3170043ba1f7ce4096bf029a4de61b76cb504b532d7e0c454943980d44d1c145a78a9e4a7f20a6654aa9cca63d388bdb5a
-docfiles size=42
+containersize 7234364
+containerchecksum d245b34164d29fe4380e81ed76bee7042bd102e53dd86dae98d0faf9575fd2c9153b9570946cbc372119b6d6d8810239dd695b2f880043cd0b1561f94482dd90
+doccontainersize 165264
+doccontainerchecksum 1c2c15af443e7b2289fd49d6572818b3268eae1f0bd77fe47d559652ada909f26557180da2f10fe08542e8e65ee977ec8b105fa9361af1caaeb6b12da7b74ac3
+docfiles size=82
texmf-dist/doc/support/latex2nemeth/README details="Readme"
+ texmf-dist/doc/support/latex2nemeth/contrib/nemeth2odt
+ texmf-dist/doc/support/latex2nemeth/encodings/nemeth.json
texmf-dist/doc/support/latex2nemeth/encodings/polytonic.json
texmf-dist/doc/support/latex2nemeth/examples/mathpics.tex
texmf-dist/doc/support/latex2nemeth/examples/mathtest.tex
- texmf-dist/doc/support/latex2nemeth/examples/nemeth.json
texmf-dist/doc/support/latex2nemeth/gpl-3.0.txt
-runfiles size=1947
+ texmf-dist/doc/support/latex2nemeth/source.zip
+runfiles size=1977
texmf-dist/scripts/latex2nemeth/latex2nemeth
- texmf-dist/scripts/latex2nemeth/latex2nemeth-v1.0.2.jar
+ texmf-dist/scripts/latex2nemeth/latex2nemeth.jar
catalogue-contact-home http://myria.math.aegean.gr/labs/dt/braille/index-en.html
catalogue-ctan /support/latex2nemeth
catalogue-license gpl3
catalogue-topics cvt-other maths accessible
-catalogue-version 1.0.2
+catalogue-version 1.0.3
name latex2nemeth.aarch64-linux
category Package
@@ -186674,6 +186678,32 @@ catalogue-license mit
catalogue-topics table
catalogue-version 1.0
+name luapstricks
+category Package
+revision 60526
+shortdesc A PSTricks backend for LuaLaTeX
+relocated 1
+longdesc This package enables the use of PSTricks directly in LuaLaTeX
+longdesc documents, without invoking external programmes, by
+longdesc implementing a PostScript interpreter in Lua. Therefore it does
+longdesc not require shell escape to be enabled or special environments,
+longdesc and instead allows PSTricks to be used exactly like in dvips
+longdesc based documents.
+containersize 21316
+containerchecksum 05090f0d2f89d3fd1ff4102f902885f415a330bbb1e0f01fe5b4392f48ad8d2a1c2d7da9c1e561fb5db174244a1a5a8580bba29085a5d1ede8dc4179ee53cd98
+doccontainersize 1492
+doccontainerchecksum e6e65f725832e9c62188455d2114a7141c1936ee927d2b98b1e571c76a544afc5a83e30952baa7d8eaeff7194230c0a42c57255fdda35aa0cd9dae1467dbd30e
+docfiles size=1
+ RELOC/doc/latex/luapstricks/README.md details="Readme"
+runfiles size=30
+ RELOC/tex/latex/luapstricks/luapstricks.lua
+catalogue-contact-bugs https://github.com/zauguin/luapstricks/issues
+catalogue-contact-repository https://github.com/zauguin/luapstricks
+catalogue-ctan /graphics/pstricks/contrib/luapstricks
+catalogue-license lppl1.3
+catalogue-topics luatex pstricks
+catalogue-version 0.1
+
name luarandom
category Package
revision 49419
@@ -216279,30 +216309,29 @@ catalogue-version 1.1.2
name njuthesis
category Package
-revision 60486
+revision 60529
shortdesc LaTeX thesis template for Nanjing University
relocated 1
longdesc This is a LaTeX Template for Nanjing University Bachelor
longdesc Thesis.
-containersize 1424
-containerchecksum abb3d6fd0eccefc36e71476b56abb2616de6910669c8e6a7e82f4f0a6e7971f6d69977838a401b900f5f6c10cb5b65e224cde1382af23e10649793c9fae549dd
-doccontainersize 1223256
-doccontainerchecksum 792b91b39a1be2ece0c33cb60920d693e40fe3d6f470c877216d3fa9f285223d1f14fca90f2f60cb4a97c44779fdbebe5288ff174fdef3e5e30c330e80428a6a
-docfiles size=585
+containersize 9236
+containerchecksum 8159f93484c7900af5c958feb70d012e22e5eb6bfcc3dcb3ebdb183b54e03f1076e026d7d163905a625a9ab2db6b5298a52118c3a2700b8c19add772826abf06
+doccontainersize 702212
+doccontainerchecksum 486b63b29c88b66d9469cc316863e2dc8097044b59bc4d58e20d7499bdae3800c236263aae2d64186067109300a6a1e36d95122ac9f3d136db16bda7d6e7b4cb
+docfiles size=195
RELOC/doc/latex/njuthesis/LICENSE
RELOC/doc/latex/njuthesis/README.md details="Readme"
+ RELOC/doc/latex/njuthesis/README_EN.md
+ RELOC/doc/latex/njuthesis/README_ZH_CN.md
RELOC/doc/latex/njuthesis/figure/njulogo.pdf
- RELOC/doc/latex/njuthesis/figure/njuname-large.jpg
+ RELOC/doc/latex/njuthesis/figure/njuname-large.pdf
RELOC/doc/latex/njuthesis/figure/njuname.pdf
RELOC/doc/latex/njuthesis/njuthesis.pdf
- RELOC/doc/latex/njuthesis/profile/abstract.sty
- RELOC/doc/latex/njuthesis/profile/components.sty
- RELOC/doc/latex/njuthesis/profile/cover.sty
- RELOC/doc/latex/njuthesis/profile/font.sty
- RELOC/doc/latex/njuthesis/profile/packages.sty
- RELOC/doc/latex/njuthesis/profile/page.sty
- RELOC/doc/latex/njuthesis/profile/reference.sty
-runfiles size=1
+srccontainersize 19732
+srccontainerchecksum f511fe665aae0d09bbfe19fe57757832a0f912446bdf16558faa96bf70f4dad1d5ac7052cc6fe37302a97d5390343d0ebf080349f45459887552afe702e92585
+srcfiles size=18
+ RELOC/source/latex/njuthesis/njuthesis.dtx
+runfiles size=9
RELOC/tex/latex/njuthesis/njuthesis.cls
catalogue-contact-bugs https://github.com/nju-lug/NJUThesis/issues
catalogue-contact-home https://github.com/nju-lug
@@ -216310,7 +216339,7 @@ catalogue-contact-repository https://github.com/nju-lug/NJUThesis
catalogue-contact-support https://github.com/nju-lug/NJUThesis/wiki
catalogue-ctan /macros/unicodetex/latex/njuthesis
catalogue-license lppl1.3c
-catalogue-topics proposal
+catalogue-topics dissertation proposal
catalogue-version 0.7.3
name nkarta
@@ -286016,7 +286045,7 @@ binfiles arch=x86_64-solaris size=1
name tex4ht
category Package
-revision 60512
+revision 60530
shortdesc Convert (La)TeX to HTML/XML
longdesc A converter from TeX and LaTeX to SGML-based formats such as
longdesc (X)HTML, MathML, OpenDocument, and Docbook, providing a
@@ -286030,9 +286059,9 @@ longdesc TeX4ht to approach the robustness characteristic of
longdesc restricted-syntax systems such as gellmu.
depend tex4ht.ARCH
containersize 908344
-containerchecksum 3ae208b95769b47f49fb8c94dbe209451831748b78b1a6e92102167bde056ab63496de7ae9c1edf7782b4dfe17d69e49a020da6d011fd5ab45c4d0268b310114
+containerchecksum 6d58986cc1c58c57b542a79ee754eb9878f553b6f26009cfddeae170ab39b6f6f27b20dad5e4636ed2e3552ab258018ca814c59cf21af61a88428a730f6b19c3
doccontainersize 136384
-doccontainerchecksum c5825b3b373dc0d21a9bf6bbf13475017b9654e6de60195de446610b5aba71a446b6fe686434461dfa18946cef6dd1dd17409ec5b3361bf12d00ca7ab1b500df
+doccontainerchecksum a98bd6e3bad9b794da321ac518be8c035c2b3d610ab5e38816a6cb99277885bc494a42131058c1a0421d47fdd8b4e1e81c837bf9e7753ffc92f02cc3202fff60
docfiles size=260
texmf-dist/doc/generic/tex4ht/Makefile
texmf-dist/doc/generic/tex4ht/README details="Readme"
@@ -286104,8 +286133,8 @@ docfiles size=260
texmf-dist/doc/generic/tex4ht/mn56.html
texmf-dist/doc/generic/tex4ht/mn5x.png
texmf-dist/doc/generic/tex4ht/mn6x.png
-srccontainersize 1210048
-srccontainerchecksum 5d5f2e5e8c4a6bf1d81e550ff50767d62d1e2ab67cf3e295a2e666b49e87acd8d2c391075b2dfc834cb0ec596f9e643099845f4f781789ae58aef063b358a405
+srccontainersize 1206112
+srccontainerchecksum 31135058bbda3895d23df0ec5f9867cff607488ee8f1d50939fbf25d82350f9a1753deeb8aa49181c3487e95236e9f007cb3d3f6e590b80c1f65b30de28e9238
srcfiles size=3627
texmf-dist/source/generic/tex4ht/ChangeLog
texmf-dist/source/generic/tex4ht/Makefile
@@ -295241,7 +295270,7 @@ docfiles size=376
name texlive-scripts
category TLCore
-revision 60518
+revision 60525
shortdesc TeX Live infrastructure programs
longdesc Includes install-tl, tl-portable, rungs, etc.; not needed for
longdesc tlmgr to run but still ours. Not included in tlcritical.
@@ -295249,10 +295278,10 @@ depend texlive-scripts.ARCH
depend texlive.infra
execute addMap mathpple.map
postaction shortcut type=menu name="TeX Live command-line" cmd=TEXDIR/tlpkg/installer/tl-cmd.bat
-containersize 108308
-containerchecksum 5aaa330ca74867f626bc80dc4abda753cab1d70ca68ad077c3f0401850a56cf26d3ef71a8e041130577b44eeeee4b1352f3324164ffc62458ba3f0bb30872cb0
+containersize 108296
+containerchecksum c40d26caaf4e39b1ad60c9b81f8913d1e0f2779a45f0a018383be744c81a825aee4058e7df6bd47144769dd5d50a4109b98bd6e1684a008746c8bac1b53c79d6
doccontainersize 400152
-doccontainerchecksum e49c4554962a12f306f27cef76cf604ef5624bcb4892197f940e619576b760bcd84bc59bc4dd1ad22dc84a1149012f1ef12daa808206217b544abdc49a8aa69a
+doccontainerchecksum 34658fb3ad78acf5d0fd99bece8a47984596ccef32b42ef889cc067119d631a9f1680447bf1cb1ffb633129a6024598201bec18c3ff183a3c20b7cc70befb56c
docfiles size=495
doc.html
texmf-dist/doc/man/man1/fmtutil-sys.1
@@ -341984,7 +342013,7 @@ catalogue-version 2.32
name zref-check
category Package
-revision 60270
+revision 60527
shortdesc Flexible cross-references with contextual checks based on zref
relocated 1
longdesc This package provides an user interface for making LaTeX
@@ -341998,11 +342027,11 @@ longdesc in a warning at compilation time if any of these checks fail.
longdesc \zctarget and the zcregion environment are also defined as a
longdesc means to easily set label targets to arbitrary places in the
longdesc text which can be referred to by \zcheck.
-containersize 5364
-containerchecksum a04b17e090ac7ecb16af57c3cfc5a37a0759818c57b7e34c028d85078bf7e8c8f508449857d9fc1fe78fe149b04815f83b5de1417dd6005513527374d982a983
-doccontainersize 1018292
-doccontainerchecksum 0943a9d608166faa82535efb2b941e8339134738c3362a0aa0bf903a8578ce5333e32db0546d23c34151029d0fab5f9f54e13270faba143cbe4afeaa6ed06509
-docfiles size=291
+containersize 5516
+containerchecksum 7e9e61d5d718f412e866dffae44457dc528cd82b9fd56b10cdfdec03bf4f99524a8f262cb94e03cbc12ed805976772e2503627930a2a635a6e9506cffb2d080e
+doccontainersize 1054416
+doccontainerchecksum dc2550245f8112275ce8b238272d1a9ba92ba09e03161e565c6beaf5415f29da064463b74c9b6f3ba378b78990607071217f9e5e066587ad56cb2a44ad61c0ac
+docfiles size=298
RELOC/doc/latex/zref-check/CHANGELOG.md
RELOC/doc/latex/zref-check/DEPENDS.txt
RELOC/doc/latex/zref-check/README.md details="Readme"
@@ -342010,8 +342039,8 @@ docfiles size=291
RELOC/doc/latex/zref-check/zref-check-code.tex
RELOC/doc/latex/zref-check/zref-check.pdf details="User manual"
RELOC/doc/latex/zref-check/zref-check.tex
-srccontainersize 19104
-srccontainerchecksum 4233cb1d3f38ea83fef0fee6578f6bf80c58b70739db9414eb2ae9c484fb8519367c46d2a165d04e12e8ced60b00913a400d8bc38caa2dac617accdd5283d299
+srccontainersize 19740
+srccontainerchecksum cd685b6340425a66e0fd6a07d6db57d260f60fe972be190ea8dc36a4114149963d73469c09c0b08531db29bf04370be53916e901b7d81d775719f42824727352
srcfiles size=23
RELOC/source/latex/zref-check/zref-check.dtx
RELOC/source/latex/zref-check/zref-check.ins
@@ -342022,7 +342051,7 @@ catalogue-contact-repository https://github.com/gusbrs/zref-check
catalogue-ctan /macros/latex/contrib/zref-check
catalogue-license lppl1.3c
catalogue-topics label-ref expl3
-catalogue-version 0.2.0
+catalogue-version 0.2.1
name zwgetfdate
category Package
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
index cb12b6f281..b4786e9932 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
@@ -1 +1 @@
-820a38d978b3c47057e9e19d56642a64 texlive.tlpdb
+da3dda0a2458301201d88d7e9b91e144 texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
index e2021058d1..92ee4c3021 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
@@ -1 +1 @@
-634a0b2caa5575dd31f3f6c5ab536dccf63f483063ec0ff00697efc8a3d1e182961e7f0788a06a100a917ca7e1c183e3ededbc9f099717e63b55f5404f6786ad texlive.tlpdb
+a3b051400119b7f155a400ad6c3c6b8bfe6f795037ca595501c0849868f5d916c99b79287c4321e324bd731a984e914a516f07164920183727e31d73324dff6d texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
index 5089ce1709..d96a492207 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-----
-iQEcBAEBCgAGBQJhQ9ifAAoJEEzhh34ZQ4xwutQIAKEA1+0zCBXCNXlsw5PhZ0gE
-c7fwkD/apx9nOZZl64uWnOv5S5r3aWJXAhcnN50MJ37I3V9AMQs/jZUYrpwpz3kF
-kQnWPaFH5+ZOHgyaMP2cGMSvSUGwNR54LyAC7GDlZrIRHrF5FLTZkSz42VYGYIcb
-3RHfr2Il24w+YD2N+83LlhSswhJqZmX9akGsDjmy2LluC43LHyMfsm64tA3Ogi/s
-CPUq3qhONaWDLu+l6DAN5vaNyJBm9lLNlo0NqI4p9Wjs5JgOLniv/qUzrZnVbRem
-HeXahhZDmX6lnYkaqu6zL7QMtLGQjDLd6OW2pNyE5lPqsBmUBZB4A4yjiDdBWxk=
-=FJ1/
+iQEcBAEBCgAGBQJhRSpAAAoJEEzhh34ZQ4xwg30IAIB9NM2ZhfNJ0+BZJA2p9+Gb
+7FB/kxQ6UvDb/M1puDBFclMWCFXyxvzub78uH/Af8g9ryOKG2v3DBMuGcYeMGQF4
+MEo9dQ7oPmrwDKVZIfliwj0NjNw9eEhkxPuhtYsc3WwfADAcwab7mROjNmc1zMzq
+YCXVZivNPtD6UwQJnAiCPkOXRomsxKDqOx8ZkMoZIEWn9UKg+TgqpUHuQ2g20G01
+vyZNIW2vkEWO3a1tHf0chbw7PbmTJ16sB6f+KfkW+V2J8m+6i2hLikqGBy4/hhgF
+I0Tgi4Fzvv8q7rSljF54Hfrhj+T2YhT36Z5SPQhb2hdY7eT/DrLac1Cq+cIApro=
+=Zxv5
-----END PGP SIGNATURE-----
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
index 209aa35c2c..4178b43c3c 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 7e8a98f16a..062cec45ab 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=1631823362
+date=1631909695
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=c3b453f762e3406372c5d90bf35cdd32
+lstdigest=7372693490ea822a01b3f3980e9beec3
numpkg=4790
relstate=next
-version=7929
+version=7930
;;;;This configuration file is signed by a MiKTeX maintainer. The signature follows.
;;;;-----BEGIN MIKTEX SIGNATURE-----
-;;;; signature/miktex: coJlEDTriQt70/Fwo7Ztzq8DqRyNLeFpTQ4eOSkTzj1iaYpUSEqWt0GRI9niqjUmrOBZNQSk0xl/FdR71lTm+t2qDP1YXNxzfncQ8WjhmpjQqknCv0cNmBMBICooXmicMUiDN2w1lGMNFSZO+yu7yWiWSXQcB/L5qgo89BlT12+I0CV+3OVHJVLEN5Yk2AMMP6oazdwypgsdwn7jroCps+mOLzGnAJh91hk6I6c3BitLYdGfvwqGOkO/ad6+bBTnOr/pWAMAm/OTjLPnpGK/e4bNML+eZuo8Tq7zqHoJgL5+mBKnwAys1q39dSRYVZYda6C/UDF7g8sneNe7v4ZkSg==
+;;;; signature/miktex: l9HNo9B1svlHvEtKnlChcvZ2Fw20wdH2S4bIMqWcTrFiUOWn9Pp3PCfri6VGZpVRctMp9CbG6+5zBMXqlWJsm0/T+B2Jrq9N/ozyGEfzh9F9INLyud6mBdbQgT2rbANDJp5pjPkaGjFa0ASos7JVEKeY0hSABDgZhxIrtBmYSYX081elnmOdc50bxrTYqujiAO/qfEihbQt/f2KOZSq+5/hg7uiD9XHxXalqxqTFvsXI59VuJejBmEUwKb/At02Q/c85eG+Z3mOBj1FWCGnKwOeXjPTOzrOa9/YEv87O1Q/RA6UWuqkjgnDBi6qbezi69x9I7rWuXpyxqeWbEWR/wA==
;;;;-----END MIKTEX SIGNATURE-----
diff --git a/systems/win32/miktex/tm/packages/pr.ini b/systems/win32/miktex/tm/packages/pr.ini
index 9ed0a6ad7b..10ba9ed9d6 100644
--- a/systems/win32/miktex/tm/packages/pr.ini
+++ b/systems/win32/miktex/tm/packages/pr.ini
@@ -1,13 +1,13 @@
[repository]
-date=1631823082
+date=1631909472
lastupd=beamertheme-trigon beamertheme-trigon__doc beamertheme-trigon__source biblatex-gb7714-2015 biblatex-gb7714-2015__doc biblatex-gb7714-2015__source bithesis bithesis__doc bithesis__source circuitikz circuitikz__doc clicks clicks__doc clicks__source crumbs crumbs__doc crumbs__source csvsimple csvsimple__doc easybook
-lstdigest=5b343da344c016eb56c7fc61f9aad699
+lstdigest=34c2321e20352946799f418aa70fbf09
numpkg=4790
relstate=stable
-version=7929
+version=7930
;;;;This configuration file is signed by a MiKTeX maintainer. The signature follows.
;;;;-----BEGIN MIKTEX SIGNATURE-----
-;;;; signature/miktex: NUVec6l8uu7adLBppFYyZp/zB4VAOR+6YevtOsyvG2HOJ8QGTlEgUcUSyrY28O2a5vzMRBQftwsvtRofD1H70G2EzGc4qEd6hXiVZn9ZQtTVzDro2YSgZ7tNubuoXCMUEoahneDh3Deq6zT1zeL6JKxbslVi/L2zuuW48/N2sFnBXn1PqhvrHLa35hFvFjur6enwAyYLni8rVsHyy65Aoen06g2BKSMZHqQS178zqhxn0j8+/T+nUeJsVmz36K4aSF1MTPCQmaoJEhuPRoVwkFOFqovqndIZzJ3lJlSUtBpWPHOOwYodnl19/BDfPA5sBhUJJPvD7pyhhI+ueBVPtg==
+;;;; signature/miktex: IEhMQzNIxcp3KfoM3a9/pOZMZ68zGZYqvJ35ARv7ZC9VVARyTTJ5vnWk6zAkWnYp3rcpsQDGs36Q0KN3k/dMUHyKomt/EWeTEb+/HWB3hoArNz35rb0NPvOU47PRA6bixldqrO+mUaXV+je6fLIKff0vAB+bmEsQjWE1LckocuK3OIsylLPbuVC/uzcU0aIaE6IPqFaC4UNYvlSFOAnsX/2GBN6GZp+VDrPNoiH+H/lb5DMcSPYMhWPoKm5Sv2v0kbqB0U46de2wJ630u7+3a2dmJ/+8Nok6/vQldu+NVryUjwdulAfFQJ7hQUyrGgto1LKy9Tqmldc1f8UIKIS+Mw==
;;;;-----END MIKTEX SIGNATURE-----
diff --git a/timestamp b/timestamp
index 7064539d94..82870784a6 100644
--- a/timestamp
+++ b/timestamp
@@ -2,4 +2,4 @@
# The source CTAN of this site's material:
dante.ctan.org
# The year-month-day-hour-minute of this site's material:
-2021-09-17-02-02
+2021-09-18-02-02