diff options
43 files changed, 11140 insertions, 1982 deletions
diff --git a/FILES.byname b/FILES.byname index ddae46079e..a54e66678e 100644 --- a/FILES.byname +++ b/FILES.byname @@ -725,6 +725,14 @@ 2021/02/04 | 169673 | biblio/bibtex/contrib/gost/source/gost.dtx 2021/02/04 | 3791 | biblio/bibtex/contrib/gost/source/gost.ins 2021/02/04 | 4738784 | biblio/bibtex/contrib/gost.zip +2022/03/26 | 83708 | biblio/bibtex/contrib/ieejtran/IEEJtran.bst +2022/03/26 | 29797 | biblio/bibtex/contrib/ieejtran/ieejtran-en.pdf +2022/03/26 | 3497 | biblio/bibtex/contrib/ieejtran/ieejtran-en.tex +2022/03/26 | 114361 | biblio/bibtex/contrib/ieejtran/ieejtran.pdf +2022/03/26 | 13910 | biblio/bibtex/contrib/ieejtran/ieejtran.tex +2022/03/26 | 15101 | biblio/bibtex/contrib/ieejtran/mixej.py +2022/03/26 | 680 | biblio/bibtex/contrib/ieejtran/README +2022/03/27 | 169749 | biblio/bibtex/contrib/ieejtran.zip 2006/12/06 | 25702 | biblio/bibtex/contrib/ijqc/ijqc.bst 2006/12/06 | 722 | biblio/bibtex/contrib/ijqc/makefile 2006/12/06 | 34021 | biblio/bibtex/contrib/ijqc/mybib.bib @@ -755,6 +763,14 @@ 1999/04/08 | 35112 | biblio/bibtex/contrib/is-bst/is-unsrt.bst 1992/07/20 | 78415 | biblio/bibtex/contrib/is-bst/xbtxbst.doc 2005/10/15 | 56967 | biblio/bibtex/contrib/is-bst.zip +2022/03/26 | 83736 | biblio/bibtex/contrib/jieeetran/jIEEEtran.bst +2022/03/26 | 30028 | biblio/bibtex/contrib/jieeetran/jieeetran-en.pdf +2022/03/26 | 3526 | biblio/bibtex/contrib/jieeetran/jieeetran-en.tex +2022/03/26 | 116572 | biblio/bibtex/contrib/jieeetran/jieeetran.pdf +2022/03/26 | 13711 | biblio/bibtex/contrib/jieeetran/jieeetran.tex +2022/03/26 | 15101 | biblio/bibtex/contrib/jieeetran/mixej.py +2022/03/26 | 623 | biblio/bibtex/contrib/jieeetran/README +2022/03/27 | 172185 | biblio/bibtex/contrib/jieeetran.zip 1992/07/20 | 33144 | biblio/bibtex/contrib/jmb/jmb.bst 1992/07/20 | 4436 | biblio/bibtex/contrib/jmb/jmb.sty 2005/12/21 | 10940 | biblio/bibtex/contrib/jmb.zip @@ -5212,7 +5228,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 -2022/03/26 | 80215 | FILES.last07days +2022/03/27 | 70477 | 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 @@ -152249,21 +152265,21 @@ 2011/05/31 | 231925 | graphics/mathspic/perl/sourcecode113.html 2011/05/31 | 183530 | graphics/mathspic/perl/sourcecode113.nw 2011/05/31 | 2864043 | graphics/mathspic/perl/sourcecode113.pdf -2022/03/13 | 17740 | graphics/mcf2graph/CHANGELOG -2022/03/13 | 102090 | graphics/mcf2graph/mcf2graph.mp -2022/03/13 | 78732 | graphics/mcf2graph/mcf_exa_code.pdf -2022/03/13 | 3921 | graphics/mcf2graph/mcf_exa_code.tex -2022/03/13 | 431496 | graphics/mcf2graph/mcf_example.pdf -2022/03/13 | 2981 | graphics/mcf2graph/mcf_example.tex -2022/03/13 | 2178 | graphics/mcf2graph/mcf_exa_soc.mp -2022/03/13 | 100601 | graphics/mcf2graph/mcf_library.mcf -2022/03/13 | 43253 | graphics/mcf2graph/mcf_man_soc.mp -2022/03/13 | 289186 | graphics/mcf2graph/mcf_manual.pdf -2022/03/13 | 57471 | graphics/mcf2graph/mcf_manual.tex -2022/03/13 | 195576 | graphics/mcf2graph/mcf_mplib_exa.pdf -2022/03/13 | 14551 | graphics/mcf2graph/mcf_mplib_exa.tex -2022/03/13 | 3696 | graphics/mcf2graph/README -2022/03/13 | 1045445 | graphics/mcf2graph.zip +2022/03/26 | 17937 | graphics/mcf2graph/CHANGELOG +2022/03/27 | 101141 | graphics/mcf2graph/mcf2graph.mp +2022/03/27 | 79140 | graphics/mcf2graph/mcf_exa_code.pdf +2022/03/27 | 3830 | graphics/mcf2graph/mcf_exa_code.tex +2022/03/27 | 431296 | graphics/mcf2graph/mcf_example.pdf +2022/03/26 | 2984 | graphics/mcf2graph/mcf_example.tex +2022/03/26 | 2194 | graphics/mcf2graph/mcf_exa_soc.mp +2022/03/27 | 100595 | graphics/mcf2graph/mcf_library.mcf +2022/03/26 | 43352 | graphics/mcf2graph/mcf_man_soc.mp +2022/03/27 | 289251 | graphics/mcf2graph/mcf_manual.pdf +2022/03/27 | 57497 | graphics/mcf2graph/mcf_manual.tex +2022/03/27 | 196130 | graphics/mcf2graph/mcf_mplib_exa.pdf +2022/03/26 | 14575 | graphics/mcf2graph/mcf_mplib_exa.tex +2022/03/26 | 3660 | graphics/mcf2graph/README +2022/03/27 | 1046144 | graphics/mcf2graph.zip 2004/07/13 | 8567 | graphics/metaplot/axes.mp 2004/06/28 | 1122 | graphics/metaplot/examples/cap1.cc 2004/06/28 | 2178 | graphics/metaplot/examples/cap1.mp @@ -186161,7 +186177,7 @@ 2013/07/02 | 153964 | install/macros/plain/contrib/plstmary.tds.zip 2008/05/18 | 22279 | install/macros/plain/plnfss.tds.zip 2022/01/15 | 1403657 | install/macros/unicodetex/latex/fontspec.tds.zip -2021/04/12 | 1108170 | install/macros/unicodetex/latex/polyglossia.tds.zip +2022/03/27 | 1125239 | install/macros/unicodetex/latex/polyglossia.tds.zip 2016/02/13 | 111305 | install/macros/unicodetex/latex/realscripts.tds.zip 2021/02/09 | 4924350 | install/macros/unicodetex/latex/texnegar.tds.zip 2020/01/31 | 1873940 | install/macros/unicodetex/latex/unicode-math.tds.zip @@ -208771,11 +208787,11 @@ 2014/12/28 | 409523 | macros/latex/contrib/cookingsymbols/cookingsymbols.pdf 2014/12/28 | 494 | macros/latex/contrib/cookingsymbols/README 2014/12/28 | 386109 | macros/latex/contrib/cookingsymbols.zip -2021/06/10 | 347913 | macros/latex/contrib/cooking-units/cooking-units.dtx -2021/06/10 | 1655 | macros/latex/contrib/cooking-units/cooking-units.ins -2021/06/10 | 748443 | macros/latex/contrib/cooking-units/cooking-units.pdf -2021/06/10 | 1482 | macros/latex/contrib/cooking-units/README.md -2021/06/10 | 804682 | macros/latex/contrib/cooking-units.zip +2022/03/27 | 345944 | macros/latex/contrib/cooking-units/cooking-units.dtx +2022/03/27 | 1655 | macros/latex/contrib/cooking-units/cooking-units.ins +2022/03/27 | 738814 | macros/latex/contrib/cooking-units/cooking-units.pdf +2022/03/27 | 1482 | macros/latex/contrib/cooking-units/README.md +2022/03/27 | 795048 | macros/latex/contrib/cooking-units.zip 2006/12/09 | 68397 | macros/latex/contrib/cooking.zip 2009/10/12 | 24947 | macros/latex/contrib/cookybooky/cookybooky.dtx 2009/10/10 | 1719 | macros/latex/contrib/cookybooky/cookybooky.ins @@ -245550,12 +245566,12 @@ 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 -2022/03/19 | 19105 | macros/unicodetex/latex/njuthesis/LICENSE -2022/03/19 | 201852 | macros/unicodetex/latex/njuthesis/njuthesis.dtx -2022/03/19 | 2975 | macros/unicodetex/latex/njuthesis/njuthesis.ins -2022/03/19 | 1146496 | macros/unicodetex/latex/njuthesis/njuthesis.pdf -2022/03/19 | 1057 | macros/unicodetex/latex/njuthesis/README.md -2022/03/19 | 1199311 | macros/unicodetex/latex/njuthesis.zip +2022/03/27 | 19105 | macros/unicodetex/latex/njuthesis/LICENSE +2022/03/27 | 208888 | macros/unicodetex/latex/njuthesis/njuthesis.dtx +2022/03/27 | 3315 | macros/unicodetex/latex/njuthesis/njuthesis.ins +2022/03/27 | 1159001 | macros/unicodetex/latex/njuthesis/njuthesis.pdf +2022/03/27 | 1057 | macros/unicodetex/latex/njuthesis/README.md +2022/03/27 | 1214583 | 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 @@ -245567,10 +245583,10 @@ 2022/03/21 | 2276200 | macros/unicodetex/latex/nwafuthesis/nwafuthesis.pdf 2022/03/17 | 1557 | macros/unicodetex/latex/nwafuthesis/README.md 2022/03/21 | 3336913 | macros/unicodetex/latex/nwafuthesis.zip -2021/04/12 | 934533 | macros/unicodetex/latex/polyglossia/polyglossia.dtx -2021/04/12 | 341615 | macros/unicodetex/latex/polyglossia/polyglossia.pdf -2021/04/12 | 1942 | macros/unicodetex/latex/polyglossia/README.md -2021/04/12 | 545777 | macros/unicodetex/latex/polyglossia.zip +2022/03/27 | 955941 | macros/unicodetex/latex/polyglossia/polyglossia.dtx +2022/03/27 | 348164 | macros/unicodetex/latex/polyglossia/polyglossia.pdf +2022/03/27 | 1942 | macros/unicodetex/latex/polyglossia/README.md +2022/03/27 | 557142 | macros/unicodetex/latex/polyglossia.zip 2021/02/02 | 89634 | macros/unicodetex/latex/quran-bn/doc/quran-bn-doc.pdf 2021/02/02 | 6514 | macros/unicodetex/latex/quran-bn/doc/quran-bn-doc.tex 2021/02/02 | 47781 | macros/unicodetex/latex/quran-bn/doc/quran-bn-test.pdf @@ -298517,7 +298533,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 -2022/03/26 | 648433 | systems/win32/miktex/tm/packages/files.csv.lzma +2022/03/27 | 648433 | 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 @@ -300084,9 +300100,9 @@ 2018/01/12 | 157226 | systems/win32/miktex/tm/packages/miktex-zip-bin-x64.tar.lzma 2022/03/12 | 39680 | systems/win32/miktex/tm/packages/miktex-zlib-bin-2.9.tar.lzma 2022/03/12 | 43633 | systems/win32/miktex/tm/packages/miktex-zlib-bin-x64-2.9.tar.lzma -2022/03/26 | 271514 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma -2022/03/26 | 1438121 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma -2022/03/26 | 1328187 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma +2022/03/27 | 271521 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma +2022/03/27 | 1437996 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma +2022/03/27 | 1327988 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma 2022/03/12 | 13516 | systems/win32/miktex/tm/packages/miktex-zzip-bin-2.9.tar.lzma 2022/03/12 | 14387 | 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 @@ -300310,191 +300326,191 @@ 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 -2022/03/26 | 648367 | systems/win32/miktex/tm/packages/next/files.csv.lzma -2022/03/26 | 51556 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma -2022/03/26 | 57331 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma -2022/03/26 | 1021844 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma -2022/03/26 | 1156461 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma -2022/03/26 | 28798 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma -2022/03/26 | 31520 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma -2022/03/26 | 30146 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma -2022/03/26 | 35243 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma -2022/03/26 | 56616 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma -2022/03/26 | 65053 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma -2022/03/26 | 86758 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma -2022/03/26 | 95282 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma -2022/03/26 | 68873 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma -2022/03/26 | 77066 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma -2022/03/26 | 27248 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma -2022/03/26 | 31342 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma -2022/03/26 | 332412 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma -2022/03/26 | 394370 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma -2022/03/26 | 32954 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma -2022/03/26 | 37081 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma -2022/03/26 | 51486 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma -2022/03/26 | 57269 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma -2022/03/26 | 244961 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma -2022/03/26 | 270299 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma -2022/03/26 | 179875 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma -2022/03/26 | 196114 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma -2022/03/26 | 92917 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma -2022/03/26 | 103092 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma -2022/03/26 | 21314 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma -2022/03/26 | 24120 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma -2022/03/26 | 481497 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma -2022/03/26 | 46066 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma -2022/03/26 | 52093 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma -2022/03/26 | 285714 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma -2022/03/26 | 326661 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma -2022/03/26 | 41304 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma -2022/03/26 | 45825 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma -2022/03/26 | 120615 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma -2022/03/26 | 135376 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma -2022/03/26 | 1302484 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma -2022/03/26 | 1454761 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma -2022/03/26 | 99816 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma -2022/03/26 | 113052 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma -2022/03/26 | 43644 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma -2022/03/26 | 48824 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma -2022/03/26 | 25104 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma -2022/03/26 | 28568 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma -2022/03/26 | 56993 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma -2022/03/26 | 63309 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma -2022/03/26 | 135948 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma -2022/03/26 | 155497 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma -2022/03/26 | 73478 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma -2022/03/26 | 78973 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma -2022/03/26 | 72013 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma -2022/03/26 | 81458 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma -2022/03/26 | 259256 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma -2022/03/26 | 296037 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma -2022/03/26 | 22146 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma -2022/03/26 | 25059 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma -2022/03/26 | 97200 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma -2022/03/26 | 112587 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma -2022/03/26 | 64542 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma -2022/03/26 | 73146 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma -2022/03/26 | 96631 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma -2022/03/26 | 115656 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma -2022/03/26 | 38426 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma -2022/03/26 | 43825 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma -2022/03/26 | 484369 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma -2022/03/26 | 565928 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma -2022/03/26 | 203835 | systems/win32/miktex/tm/packages/next/miktex-hitex-bin.tar.lzma -2022/03/26 | 247331 | systems/win32/miktex/tm/packages/next/miktex-hitex-bin-x64.tar.lzma -2022/03/26 | 152027 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma -2022/03/26 | 168819 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma -2022/03/26 | 95433 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma -2022/03/26 | 109477 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma -2022/03/26 | 16503 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma -2022/03/26 | 18368 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma -2022/03/26 | 28421 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma -2022/03/26 | 30541 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma -2022/03/26 | 631280 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma -2022/03/26 | 681938 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma -2022/03/26 | 532454 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma -2022/03/26 | 598229 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma -2022/03/26 | 477847 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma -2022/03/26 | 528016 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma -2022/03/26 | 93959 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma -2022/03/26 | 103337 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma -2022/03/26 | 1752146 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma -2022/03/26 | 1982081 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma -2022/03/26 | 68007 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma -2022/03/26 | 74066 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma -2022/03/26 | 27589 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma -2022/03/26 | 32133 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma -2022/03/26 | 7752 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma -2022/03/26 | 8783 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma -2022/03/26 | 190504 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma -2022/03/26 | 208807 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma -2022/03/26 | 251128 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma -2022/03/26 | 286412 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma -2022/03/26 | 99257 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma -2022/03/26 | 104555 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma -2022/03/26 | 126531 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma -2022/03/26 | 139102 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma -2022/03/26 | 288197 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma -2022/03/26 | 325269 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma -2022/03/26 | 199829 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma -2022/03/26 | 181515 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma -2022/03/26 | 49769 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma -2022/03/26 | 55568 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma -2022/03/26 | 31411 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma -2022/03/26 | 35168 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma -2022/03/26 | 38560 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma -2022/03/26 | 43915 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma -2022/03/26 | 43360 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma -2022/03/26 | 47922 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma -2022/03/26 | 45739 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma -2022/03/26 | 52325 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma -2022/03/26 | 197035 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma -2022/03/26 | 213276 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma -2022/03/26 | 36047 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma -2022/03/26 | 41179 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma -2022/03/26 | 755742 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma -2022/03/26 | 824368 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma -2022/03/26 | 200396 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma -2022/03/26 | 202832 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma -2022/03/26 | 210274 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma -2022/03/26 | 245093 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma -2022/03/26 | 79024 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma -2022/03/26 | 88151 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma -2022/03/26 | 1181125 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma -2022/03/26 | 1322740 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma -2022/03/26 | 20184 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma -2022/03/26 | 23945 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma -2022/03/26 | 31588 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma -2022/03/26 | 37374 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma -2022/03/26 | 64709 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma -2022/03/26 | 72886 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma -2022/03/26 | 50797 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma -2022/03/26 | 58662 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma -2022/03/26 | 693067 | systems/win32/miktex/tm/packages/next/miktex-ptex-bin.tar.lzma -2022/03/26 | 758955 | systems/win32/miktex/tm/packages/next/miktex-ptex-bin-x64.tar.lzma -2022/03/26 | 1357072 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma -2022/03/26 | 1501237 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma -2022/03/26 | 42817 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma -2022/03/26 | 52478 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma -2022/03/26 | 57618 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma -2022/03/26 | 63738 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma -2022/03/26 | 25549 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma -2022/03/26 | 27635 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma -2022/03/26 | 16560 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma -2022/03/26 | 18492 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma -2022/03/26 | 64487 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma -2022/03/26 | 71006 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma -2022/03/26 | 156964 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma -2022/03/26 | 173007 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma -2022/03/26 | 58666 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma -2022/03/26 | 67254 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma -2022/03/26 | 100486 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma -2022/03/26 | 107705 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma -2022/03/26 | 2694876 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma -2022/03/26 | 2820686 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma -2022/03/26 | 55284 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma -2022/03/26 | 62381 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma -2022/03/26 | 37115 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma -2022/03/26 | 41202 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma -2022/03/26 | 28688 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma -2022/03/26 | 34051 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma -2022/03/26 | 67704 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma -2022/03/26 | 73528 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma -2022/03/26 | 316241 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma -2022/03/26 | 351696 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma -2022/03/26 | 55756 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin.tar.lzma -2022/03/26 | 57525 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin-x64.tar.lzma -2022/03/26 | 591567 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma -2022/03/26 | 629431 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma -2022/03/26 | 39726 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma -2022/03/26 | 43225 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma -2022/03/26 | 271518 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma -2022/03/26 | 1438662 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma -2022/03/26 | 1328683 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma -2022/03/26 | 13513 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma -2022/03/26 | 14411 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma +2022/03/27 | 648367 | systems/win32/miktex/tm/packages/next/files.csv.lzma +2022/03/27 | 51558 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma +2022/03/27 | 57330 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma +2022/03/27 | 1021845 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma +2022/03/27 | 1156463 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma +2022/03/27 | 28799 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma +2022/03/27 | 31520 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma +2022/03/27 | 30145 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma +2022/03/27 | 35242 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma +2022/03/27 | 56617 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma +2022/03/27 | 65055 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma +2022/03/27 | 86759 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma +2022/03/27 | 95284 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma +2022/03/27 | 68874 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma +2022/03/27 | 77067 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma +2022/03/27 | 27248 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma +2022/03/27 | 31343 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma +2022/03/27 | 332413 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma +2022/03/27 | 394370 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma +2022/03/27 | 32955 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma +2022/03/27 | 37080 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma +2022/03/27 | 51485 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma +2022/03/27 | 57269 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma +2022/03/27 | 244959 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma +2022/03/27 | 270298 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma +2022/03/27 | 179877 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma +2022/03/27 | 196117 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma +2022/03/27 | 92918 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma +2022/03/27 | 103092 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma +2022/03/27 | 21313 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma +2022/03/27 | 24120 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma +2022/03/27 | 481497 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma +2022/03/27 | 46066 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma +2022/03/27 | 52093 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma +2022/03/27 | 285714 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma +2022/03/27 | 326661 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma +2022/03/27 | 41303 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma +2022/03/27 | 45825 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma +2022/03/27 | 120616 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma +2022/03/27 | 135378 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma +2022/03/27 | 1302484 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma +2022/03/27 | 1454765 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma +2022/03/27 | 99817 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma +2022/03/27 | 113052 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma +2022/03/27 | 43646 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma +2022/03/27 | 48825 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma +2022/03/27 | 25107 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma +2022/03/27 | 28567 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma +2022/03/27 | 56992 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma +2022/03/27 | 63311 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma +2022/03/27 | 135949 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma +2022/03/27 | 155496 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma +2022/03/27 | 73477 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma +2022/03/27 | 78974 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma +2022/03/27 | 72013 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma +2022/03/27 | 81461 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma +2022/03/27 | 259256 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma +2022/03/27 | 296038 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma +2022/03/27 | 22147 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma +2022/03/27 | 25060 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma +2022/03/27 | 97202 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma +2022/03/27 | 112589 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma +2022/03/27 | 64542 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma +2022/03/27 | 73148 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma +2022/03/27 | 96634 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma +2022/03/27 | 115657 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma +2022/03/27 | 38427 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma +2022/03/27 | 43825 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma +2022/03/27 | 484370 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma +2022/03/27 | 565929 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma +2022/03/27 | 203837 | systems/win32/miktex/tm/packages/next/miktex-hitex-bin.tar.lzma +2022/03/27 | 247334 | systems/win32/miktex/tm/packages/next/miktex-hitex-bin-x64.tar.lzma +2022/03/27 | 152028 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma +2022/03/27 | 168820 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma +2022/03/27 | 95433 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma +2022/03/27 | 109478 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma +2022/03/27 | 16502 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma +2022/03/27 | 18369 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma +2022/03/27 | 28422 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma +2022/03/27 | 30542 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma +2022/03/27 | 631280 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma +2022/03/27 | 681939 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma +2022/03/27 | 532454 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma +2022/03/27 | 598229 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma +2022/03/27 | 477847 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma +2022/03/27 | 528018 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma +2022/03/27 | 93959 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma +2022/03/27 | 103338 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma +2022/03/27 | 1752148 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma +2022/03/27 | 1982083 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma +2022/03/27 | 68009 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma +2022/03/27 | 74069 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma +2022/03/27 | 27590 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma +2022/03/27 | 32134 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma +2022/03/27 | 7752 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma +2022/03/27 | 8784 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma +2022/03/27 | 190502 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma +2022/03/27 | 208808 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma +2022/03/27 | 251130 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma +2022/03/27 | 286414 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma +2022/03/27 | 99256 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma +2022/03/27 | 104557 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma +2022/03/27 | 126533 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma +2022/03/27 | 139103 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma +2022/03/27 | 288201 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma +2022/03/27 | 325268 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma +2022/03/27 | 199832 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma +2022/03/27 | 181515 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma +2022/03/27 | 49769 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma +2022/03/27 | 55568 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma +2022/03/27 | 31412 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma +2022/03/27 | 35169 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma +2022/03/27 | 38561 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma +2022/03/27 | 43916 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma +2022/03/27 | 43359 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma +2022/03/27 | 47923 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma +2022/03/27 | 45743 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma +2022/03/27 | 52327 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma +2022/03/27 | 197034 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma +2022/03/27 | 213277 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma +2022/03/27 | 36049 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma +2022/03/27 | 41182 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma +2022/03/27 | 755743 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma +2022/03/27 | 824370 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma +2022/03/27 | 200399 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma +2022/03/27 | 202836 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma +2022/03/27 | 210276 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma +2022/03/27 | 245097 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma +2022/03/27 | 79025 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma +2022/03/27 | 88151 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma +2022/03/27 | 1181127 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma +2022/03/27 | 1322741 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma +2022/03/27 | 20184 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma +2022/03/27 | 23942 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma +2022/03/27 | 31588 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma +2022/03/27 | 37372 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma +2022/03/27 | 64708 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma +2022/03/27 | 72883 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma +2022/03/27 | 50799 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma +2022/03/27 | 58662 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma +2022/03/27 | 693068 | systems/win32/miktex/tm/packages/next/miktex-ptex-bin.tar.lzma +2022/03/27 | 758953 | systems/win32/miktex/tm/packages/next/miktex-ptex-bin-x64.tar.lzma +2022/03/27 | 1357071 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma +2022/03/27 | 1501236 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma +2022/03/27 | 42817 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma +2022/03/27 | 52478 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma +2022/03/27 | 57619 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma +2022/03/27 | 63739 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma +2022/03/27 | 25552 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma +2022/03/27 | 27636 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma +2022/03/27 | 16560 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma +2022/03/27 | 18492 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma +2022/03/27 | 64489 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma +2022/03/27 | 71006 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma +2022/03/27 | 156963 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma +2022/03/27 | 173006 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma +2022/03/27 | 58666 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma +2022/03/27 | 67254 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma +2022/03/27 | 100486 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma +2022/03/27 | 107705 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma +2022/03/27 | 2694875 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma +2022/03/27 | 2820687 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma +2022/03/27 | 55285 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma +2022/03/27 | 62381 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma +2022/03/27 | 37116 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma +2022/03/27 | 41203 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma +2022/03/27 | 28691 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma +2022/03/27 | 34052 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma +2022/03/27 | 67705 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma +2022/03/27 | 73529 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma +2022/03/27 | 316242 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma +2022/03/27 | 351696 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma +2022/03/27 | 55758 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin.tar.lzma +2022/03/27 | 57525 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin-x64.tar.lzma +2022/03/27 | 591569 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma +2022/03/27 | 629432 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma +2022/03/27 | 39727 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma +2022/03/27 | 43223 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma +2022/03/27 | 271533 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma +2022/03/27 | 1437693 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma +2022/03/27 | 1328020 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma +2022/03/27 | 13513 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma +2022/03/27 | 14410 | 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 -2022/03/26 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini +2022/03/27 | 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 @@ -300955,7 +300971,7 @@ 2022/02/22 | 6917 | 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 -2022/03/26 | 997 | systems/win32/miktex/tm/packages/pr.ini +2022/03/27 | 997 | 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 @@ -302754,7 +302770,7 @@ 2004/06/04 | 404 | tds/tds.sed 2004/06/23 | 65418 | tds/tds.tex 2019/05/29 | 304264 | tds.zip -2022/03/27 | 186 | timestamp +2022/03/28 | 186 | timestamp 2002/08/26 | 61898 | usergrps/dante/antrag.pdf 2002/08/26 | 118217 | usergrps/dante/antrag.ps 2021/11/11 | 917 | usergrps/dante/dtk/doc/beispiel.bib diff --git a/FILES.byname.gz b/FILES.byname.gz Binary files differindex 9b18756c30..a1c0526886 100644 --- a/FILES.byname.gz +++ b/FILES.byname.gz diff --git a/FILES.last07days b/FILES.last07days index 5233d557c9..722162e0fe 100644 --- a/FILES.last07days +++ b/FILES.last07days @@ -1,201 +1,248 @@ -2022/03/26 | 99816 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma -2022/03/26 | 997 | systems/win32/miktex/tm/packages/pr.ini -2022/03/26 | 99257 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma -2022/03/26 | 97200 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma -2022/03/26 | 96631 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma -2022/03/26 | 95433 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma -2022/03/26 | 95282 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma -2022/03/26 | 93959 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma -2022/03/26 | 92917 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma -2022/03/26 | 88151 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma -2022/03/26 | 8783 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma -2022/03/26 | 86758 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma -2022/03/26 | 824368 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma -2022/03/26 | 81458 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma -2022/03/26 | 79024 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma -2022/03/26 | 78973 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma -2022/03/26 | 7752 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma -2022/03/26 | 77066 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma -2022/03/26 | 758955 | systems/win32/miktex/tm/packages/next/miktex-ptex-bin-x64.tar.lzma -2022/03/26 | 755742 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma -2022/03/26 | 74066 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma -2022/03/26 | 73528 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma -2022/03/26 | 73478 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma -2022/03/26 | 73146 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma -2022/03/26 | 72886 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma -2022/03/26 | 72013 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma -2022/03/26 | 71006 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma -2022/03/26 | 693067 | systems/win32/miktex/tm/packages/next/miktex-ptex-bin.tar.lzma -2022/03/26 | 68873 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma -2022/03/26 | 681938 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma -2022/03/26 | 68007 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma -2022/03/26 | 67704 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma -2022/03/26 | 67254 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma -2022/03/26 | 65053 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma -2022/03/26 | 648433 | systems/win32/miktex/tm/packages/files.csv.lzma -2022/03/26 | 648367 | systems/win32/miktex/tm/packages/next/files.csv.lzma -2022/03/26 | 64709 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma -2022/03/26 | 64542 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma -2022/03/26 | 64487 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma -2022/03/26 | 63738 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma -2022/03/26 | 63309 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma -2022/03/26 | 631280 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma -2022/03/26 | 629431 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma -2022/03/26 | 62381 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma -2022/03/26 | 598229 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma -2022/03/26 | 591567 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma -2022/03/26 | 58666 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma -2022/03/26 | 58662 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma -2022/03/26 | 57618 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma -2022/03/26 | 57525 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin-x64.tar.lzma -2022/03/26 | 57331 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma -2022/03/26 | 57269 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma -2022/03/26 | 56993 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma -2022/03/26 | 56616 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma -2022/03/26 | 565928 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma -2022/03/26 | 55756 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin.tar.lzma -2022/03/26 | 55568 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma -2022/03/26 | 55284 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma -2022/03/26 | 532454 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma -2022/03/26 | 528016 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma -2022/03/26 | 52478 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma -2022/03/26 | 52325 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma -2022/03/26 | 52093 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma -2022/03/26 | 51556 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma -2022/03/26 | 51486 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma -2022/03/26 | 50797 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma -2022/03/26 | 49769 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma -2022/03/26 | 48824 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma -2022/03/26 | 484369 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma -2022/03/26 | 481497 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma -2022/03/26 | 47922 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma -2022/03/26 | 477847 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma -2022/03/26 | 46066 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma +2022/03/27 | 99817 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma +2022/03/27 | 997 | systems/win32/miktex/tm/packages/pr.ini +2022/03/27 | 99256 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma +2022/03/27 | 97202 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma +2022/03/27 | 96634 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma +2022/03/27 | 955941 | macros/unicodetex/latex/polyglossia/polyglossia.dtx +2022/03/27 | 95433 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma +2022/03/27 | 95284 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma +2022/03/27 | 93959 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma +2022/03/27 | 92918 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma +2022/03/27 | 88151 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma +2022/03/27 | 8784 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma +2022/03/27 | 86759 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma +2022/03/27 | 824370 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma +2022/03/27 | 81461 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma +2022/03/27 | 795048 | macros/latex/contrib/cooking-units.zip +2022/03/27 | 79140 | graphics/mcf2graph/mcf_exa_code.pdf +2022/03/27 | 79025 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma +2022/03/27 | 78974 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma +2022/03/27 | 7752 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma +2022/03/27 | 77067 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma +2022/03/27 | 758953 | systems/win32/miktex/tm/packages/next/miktex-ptex-bin-x64.tar.lzma +2022/03/27 | 755743 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma +2022/03/27 | 74069 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma +2022/03/27 | 738814 | macros/latex/contrib/cooking-units/cooking-units.pdf +2022/03/27 | 73529 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma +2022/03/27 | 73477 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma +2022/03/27 | 73148 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma +2022/03/27 | 72883 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma +2022/03/27 | 72013 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma +2022/03/27 | 71006 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma +2022/03/27 | 693068 | systems/win32/miktex/tm/packages/next/miktex-ptex-bin.tar.lzma +2022/03/27 | 68874 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma +2022/03/27 | 681939 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma +2022/03/27 | 68009 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma +2022/03/27 | 67705 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma +2022/03/27 | 67254 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma +2022/03/27 | 65055 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma +2022/03/27 | 648433 | systems/win32/miktex/tm/packages/files.csv.lzma +2022/03/27 | 648367 | systems/win32/miktex/tm/packages/next/files.csv.lzma +2022/03/27 | 64708 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma +2022/03/27 | 64542 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma +2022/03/27 | 64489 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma +2022/03/27 | 63739 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma +2022/03/27 | 63311 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma +2022/03/27 | 631280 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma +2022/03/27 | 629432 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma +2022/03/27 | 62381 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma +2022/03/27 | 598229 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma +2022/03/27 | 591569 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma +2022/03/27 | 58666 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma +2022/03/27 | 58662 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma +2022/03/27 | 57619 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma +2022/03/27 | 57525 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin-x64.tar.lzma +2022/03/27 | 57497 | graphics/mcf2graph/mcf_manual.tex +2022/03/27 | 57330 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma +2022/03/27 | 57269 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma +2022/03/27 | 56992 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma +2022/03/27 | 56617 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma +2022/03/27 | 565929 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma +2022/03/27 | 55758 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin.tar.lzma +2022/03/27 | 557142 | macros/unicodetex/latex/polyglossia.zip +2022/03/27 | 55568 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma +2022/03/27 | 55285 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma +2022/03/27 | 532454 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma +2022/03/27 | 528018 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma +2022/03/27 | 52478 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma +2022/03/27 | 52327 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma +2022/03/27 | 52093 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma +2022/03/27 | 51558 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma +2022/03/27 | 51485 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma +2022/03/27 | 50799 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma +2022/03/27 | 49769 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma +2022/03/27 | 48825 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma +2022/03/27 | 484370 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma +2022/03/27 | 481497 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma +2022/03/27 | 47923 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma +2022/03/27 | 477847 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma +2022/03/27 | 46066 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma +2022/03/27 | 45825 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma +2022/03/27 | 45743 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma +2022/03/27 | 43916 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma +2022/03/27 | 43825 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma +2022/03/27 | 43646 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma +2022/03/27 | 43359 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma +2022/03/27 | 43223 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma +2022/03/27 | 431296 | graphics/mcf2graph/mcf_example.pdf +2022/03/27 | 42817 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma +2022/03/27 | 41303 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma +2022/03/27 | 41203 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma +2022/03/27 | 41182 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma +2022/03/27 | 39727 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma +2022/03/27 | 394370 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma +2022/03/27 | 38561 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma +2022/03/27 | 38427 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma +2022/03/27 | 3830 | graphics/mcf2graph/mcf_exa_code.tex +2022/03/27 | 37372 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma +2022/03/27 | 37116 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma +2022/03/27 | 37080 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma +2022/03/27 | 36049 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma +2022/03/27 | 35242 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma +2022/03/27 | 35169 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma +2022/03/27 | 351696 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma +2022/03/27 | 348164 | macros/unicodetex/latex/polyglossia/polyglossia.pdf +2022/03/27 | 345944 | macros/latex/contrib/cooking-units/cooking-units.dtx +2022/03/27 | 34052 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma +2022/03/27 | 332413 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma +2022/03/27 | 3315 | macros/unicodetex/latex/njuthesis/njuthesis.ins +2022/03/27 | 32955 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma +2022/03/27 | 326661 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma +2022/03/27 | 325268 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma +2022/03/27 | 32134 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma +2022/03/27 | 316242 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma +2022/03/27 | 31588 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma +2022/03/27 | 31520 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma +2022/03/27 | 31412 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma +2022/03/27 | 31343 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma +2022/03/27 | 30542 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma +2022/03/27 | 30145 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma +2022/03/27 | 296038 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma +2022/03/27 | 289251 | graphics/mcf2graph/mcf_manual.pdf +2022/03/27 | 288201 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma +2022/03/27 | 28799 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma +2022/03/27 | 28691 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma +2022/03/27 | 286414 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma +2022/03/27 | 285714 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma +2022/03/27 | 28567 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma +2022/03/27 | 28422 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma +2022/03/27 | 2820687 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma +2022/03/27 | 27636 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma +2022/03/27 | 27590 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma +2022/03/27 | 27248 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma +2022/03/27 | 271533 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma +2022/03/27 | 271521 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma +2022/03/27 | 270298 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma +2022/03/27 | 2694875 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma +2022/03/27 | 259256 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma +2022/03/27 | 25552 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma +2022/03/27 | 251130 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma +2022/03/27 | 25107 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma +2022/03/27 | 25060 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma +2022/03/27 | 247334 | systems/win32/miktex/tm/packages/next/miktex-hitex-bin-x64.tar.lzma +2022/03/27 | 245097 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma +2022/03/27 | 244959 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma +2022/03/27 | 24120 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma +2022/03/27 | 23942 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma +2022/03/27 | 22147 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma +2022/03/27 | 213277 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma +2022/03/27 | 21313 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma +2022/03/27 | 210276 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma +2022/03/27 | 208888 | macros/unicodetex/latex/njuthesis/njuthesis.dtx +2022/03/27 | 208808 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma +2022/03/27 | 203837 | systems/win32/miktex/tm/packages/next/miktex-hitex-bin.tar.lzma +2022/03/27 | 202836 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma +2022/03/27 | 20184 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma +2022/03/27 | 200399 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma +2022/03/27 | 199832 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma +2022/03/27 | 1982083 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma +2022/03/27 | 197034 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma +2022/03/27 | 196130 | graphics/mcf2graph/mcf_mplib_exa.pdf +2022/03/27 | 196117 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma +2022/03/27 | 1942 | macros/unicodetex/latex/polyglossia/README.md +2022/03/27 | 19105 | macros/unicodetex/latex/njuthesis/LICENSE +2022/03/27 | 190502 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma +2022/03/27 | 18492 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma +2022/03/27 | 18369 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma +2022/03/27 | 181515 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma +2022/03/27 | 179877 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma +2022/03/27 | 1752148 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma +2022/03/27 | 173006 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma +2022/03/27 | 172185 | biblio/bibtex/contrib/jieeetran.zip +2022/03/27 | 169749 | biblio/bibtex/contrib/ieejtran.zip +2022/03/27 | 168820 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma +2022/03/27 | 16560 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma +2022/03/27 | 1655 | macros/latex/contrib/cooking-units/cooking-units.ins +2022/03/27 | 16502 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma +2022/03/27 | 156963 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma +2022/03/27 | 155496 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma +2022/03/27 | 152028 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma +2022/03/27 | 1501236 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma +2022/03/27 | 1482 | macros/latex/contrib/cooking-units/README.md +2022/03/27 | 1454765 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma +2022/03/27 | 14410 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma +2022/03/27 | 1437996 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma +2022/03/27 | 1437693 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma +2022/03/27 | 139103 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma +2022/03/27 | 135949 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma +2022/03/27 | 1357071 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma +2022/03/27 | 135378 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma +2022/03/27 | 13513 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma +2022/03/27 | 1328020 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma +2022/03/27 | 1327988 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma +2022/03/27 | 1322741 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma +2022/03/27 | 1302484 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma +2022/03/27 | 126533 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma +2022/03/27 | 1214583 | macros/unicodetex/latex/njuthesis.zip +2022/03/27 | 120616 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma +2022/03/27 | 1181127 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma +2022/03/27 | 1159001 | macros/unicodetex/latex/njuthesis/njuthesis.pdf +2022/03/27 | 115657 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma +2022/03/27 | 1156463 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma +2022/03/27 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini +2022/03/27 | 113052 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma +2022/03/27 | 112589 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma +2022/03/27 | 1125239 | install/macros/unicodetex/latex/polyglossia.tds.zip +2022/03/27 | 109478 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma +2022/03/27 | 107705 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma +2022/03/27 | 1057 | macros/unicodetex/latex/njuthesis/README.md +2022/03/27 | 1046144 | graphics/mcf2graph.zip +2022/03/27 | 104557 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma +2022/03/27 | 103338 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma +2022/03/27 | 103092 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma +2022/03/27 | 1021845 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma +2022/03/27 | 101141 | graphics/mcf2graph/mcf2graph.mp +2022/03/27 | 100595 | graphics/mcf2graph/mcf_library.mcf +2022/03/27 | 100486 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma +2022/03/26 | 83736 | biblio/bibtex/contrib/jieeetran/jIEEEtran.bst +2022/03/26 | 83708 | biblio/bibtex/contrib/ieejtran/IEEJtran.bst +2022/03/26 | 680 | biblio/bibtex/contrib/ieejtran/README +2022/03/26 | 623 | biblio/bibtex/contrib/jieeetran/README 2022/03/26 | 458833 | macros/latex/contrib/msu-thesis.zip -2022/03/26 | 45825 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma -2022/03/26 | 45739 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma -2022/03/26 | 43915 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma -2022/03/26 | 43825 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma -2022/03/26 | 43644 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma -2022/03/26 | 43360 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma -2022/03/26 | 43225 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma -2022/03/26 | 42817 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma -2022/03/26 | 41304 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma -2022/03/26 | 41202 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma -2022/03/26 | 41179 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma -2022/03/26 | 39726 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma -2022/03/26 | 394370 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma -2022/03/26 | 38560 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma -2022/03/26 | 38426 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma -2022/03/26 | 37374 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma -2022/03/26 | 37115 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma -2022/03/26 | 37081 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma -2022/03/26 | 36047 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma -2022/03/26 | 35243 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma -2022/03/26 | 351696 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma -2022/03/26 | 35168 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma -2022/03/26 | 34051 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma -2022/03/26 | 332412 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma -2022/03/26 | 32954 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma -2022/03/26 | 326661 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma -2022/03/26 | 325269 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma -2022/03/26 | 32133 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma -2022/03/26 | 316241 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma -2022/03/26 | 31588 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma -2022/03/26 | 31520 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma -2022/03/26 | 31411 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma -2022/03/26 | 31342 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma -2022/03/26 | 30541 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma +2022/03/26 | 43352 | graphics/mcf2graph/mcf_man_soc.mp +2022/03/26 | 3660 | graphics/mcf2graph/README +2022/03/26 | 3526 | biblio/bibtex/contrib/jieeetran/jieeetran-en.tex +2022/03/26 | 3497 | biblio/bibtex/contrib/ieejtran/ieejtran-en.tex 2022/03/26 | 3043 | macros/latex/contrib/biblatex-contrib/biblatex-lncs/biblatex-lncs-test.bib -2022/03/26 | 30146 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma -2022/03/26 | 296037 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma -2022/03/26 | 288197 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma -2022/03/26 | 28798 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma -2022/03/26 | 28688 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma -2022/03/26 | 286412 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma -2022/03/26 | 285714 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma -2022/03/26 | 28568 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma -2022/03/26 | 28421 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma -2022/03/26 | 2820686 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma -2022/03/26 | 27635 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma -2022/03/26 | 27589 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma -2022/03/26 | 27248 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma -2022/03/26 | 271518 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma -2022/03/26 | 271514 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma -2022/03/26 | 270299 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma -2022/03/26 | 2694876 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma -2022/03/26 | 259256 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma -2022/03/26 | 25549 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma -2022/03/26 | 251128 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma -2022/03/26 | 25104 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma -2022/03/26 | 25059 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma -2022/03/26 | 247331 | systems/win32/miktex/tm/packages/next/miktex-hitex-bin-x64.tar.lzma -2022/03/26 | 245093 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma -2022/03/26 | 244961 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma -2022/03/26 | 24120 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma -2022/03/26 | 23945 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma -2022/03/26 | 22146 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma +2022/03/26 | 30028 | biblio/bibtex/contrib/jieeetran/jieeetran-en.pdf +2022/03/26 | 2984 | graphics/mcf2graph/mcf_example.tex +2022/03/26 | 29797 | biblio/bibtex/contrib/ieejtran/ieejtran-en.pdf 2022/03/26 | 2206 | macros/latex/contrib/biblatex-contrib/biblatex-lncs/biblatex-lncs-test.tex -2022/03/26 | 213276 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma -2022/03/26 | 21314 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma -2022/03/26 | 210274 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma -2022/03/26 | 208807 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma -2022/03/26 | 203835 | systems/win32/miktex/tm/packages/next/miktex-hitex-bin.tar.lzma -2022/03/26 | 202832 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma -2022/03/26 | 20184 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma -2022/03/26 | 200396 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma -2022/03/26 | 199829 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma -2022/03/26 | 1982081 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma -2022/03/26 | 197035 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma -2022/03/26 | 196114 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma -2022/03/26 | 190504 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma +2022/03/26 | 2194 | graphics/mcf2graph/mcf_exa_soc.mp 2022/03/26 | 19039 | macros/latex/contrib/biblatex-contrib/biblatex-lncs/LICENSE 2022/03/26 | 184 | macros/latex/contrib/biblatex-contrib/biblatex-lncs/lncs.dbx -2022/03/26 | 18492 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma -2022/03/26 | 18368 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma -2022/03/26 | 181515 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma -2022/03/26 | 179875 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma -2022/03/26 | 1752146 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma -2022/03/26 | 173007 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma -2022/03/26 | 168819 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma -2022/03/26 | 16560 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma -2022/03/26 | 16503 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma -2022/03/26 | 156964 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma -2022/03/26 | 155497 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma +2022/03/26 | 17937 | graphics/mcf2graph/CHANGELOG 2022/03/26 | 153 | macros/latex/contrib/biblatex-contrib/biblatex-lncs/lncs.cbx -2022/03/26 | 152027 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma -2022/03/26 | 1501237 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma -2022/03/26 | 1454761 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma -2022/03/26 | 14411 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma -2022/03/26 | 1438662 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma -2022/03/26 | 1438121 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma +2022/03/26 | 15101 | biblio/bibtex/contrib/jieeetran/mixej.py +2022/03/26 | 15101 | biblio/bibtex/contrib/ieejtran/mixej.py +2022/03/26 | 14575 | graphics/mcf2graph/mcf_mplib_exa.tex 2022/03/26 | 1395 | macros/latex/contrib/biblatex-contrib/biblatex-lncs/README.md -2022/03/26 | 139102 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma -2022/03/26 | 135948 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma -2022/03/26 | 1357072 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma -2022/03/26 | 135376 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma -2022/03/26 | 13513 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma -2022/03/26 | 1328683 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma -2022/03/26 | 1328187 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma -2022/03/26 | 1322740 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma -2022/03/26 | 1302484 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma +2022/03/26 | 13910 | biblio/bibtex/contrib/ieejtran/ieejtran.tex +2022/03/26 | 13711 | biblio/bibtex/contrib/jieeetran/jieeetran.tex 2022/03/26 | 12928 | macros/latex/contrib/biblatex-contrib/biblatex-lncs.zip -2022/03/26 | 126531 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma -2022/03/26 | 120615 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma -2022/03/26 | 1181125 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma -2022/03/26 | 115656 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma -2022/03/26 | 1156461 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma -2022/03/26 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini -2022/03/26 | 113052 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma -2022/03/26 | 112587 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma -2022/03/26 | 109477 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma -2022/03/26 | 107705 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma -2022/03/26 | 104555 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma -2022/03/26 | 103337 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma -2022/03/26 | 103092 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma +2022/03/26 | 116572 | biblio/bibtex/contrib/jieeetran/jieeetran.pdf +2022/03/26 | 114361 | biblio/bibtex/contrib/ieejtran/ieejtran.pdf 2022/03/26 | 10303 | macros/latex/contrib/biblatex-contrib/biblatex-lncs/lncs.bbx -2022/03/26 | 1021844 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma -2022/03/26 | 100486 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma 2022/03/25 | 9813840 | support/latexindent/latexindent.exe 2022/03/25 | 9537 | support/latexindent/LatexIndent/IfElseFi.pm 2022/03/25 | 9510 | macros/latex/contrib/msu-thesis/samples/MSU-thesis-testfile.tex @@ -795,70 +842,3 @@ 2022/03/21 | 10421 | biblio/citation-style-language/citeproc-element.lua 2022/03/21 | 10078 | macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa-mecheng.sty 2022/03/21 | 1006 | macros/latex/contrib/biblatex-contrib/biblatex-iso690/slovak-iso.lbx -2022/03/20 | 9660 | macros/latex/contrib/seu-ml-assign/seu-ml-assign-doc.tex -2022/03/20 | 92843 | language/japanese/BX/bxjscls/bxjscls-manual.tex -2022/03/20 | 9193 | macros/luatex/generic/luatexko/ChangeLog -2022/03/20 | 8601 | macros/luatex/generic/lua-widow-control/lwc-documentation.mkxl -2022/03/20 | 855 | macros/latex/contrib/seu-ml-assign/README.md -2022/03/20 | 855 | language/japanese/BX/bxjscls/bxjscls.ins -2022/03/20 | 8464 | systems/texlive/tlnet/archive/create-theorem.r62806.tar.xz -2022/03/20 | 8116 | macros/luatex/generic/lua-widow-control/lua-widow-control.sty -2022/03/20 | 789419 | macros/unicodetex/latex/simplivre.zip -2022/03/20 | 733414 | macros/unicodetex/latex/beaulivre.zip -2022/03/20 | 73323 | macros/luatex/generic/luatexko/luatexko.lua -2022/03/20 | 711 | macros/luatex/generic/lua-widow-control/lua-widow-control.opm -2022/03/20 | 6996 | systems/texlive/tlnet/archive/functional.r62805.tar.xz -2022/03/20 | 6444 | macros/luatex/generic/luatexko/luatexko-normalize.lua -2022/03/20 | 611922 | support/TeX4ht/source/tex4ht-html4.tex -2022/03/20 | 6102 | language/japanese/BX/bxjscls/README.md -2022/03/20 | 608687 | macros/unicodetex/latex/lebhart.zip -2022/03/20 | 567631 | macros/unicodetex/latex/einfart.zip -2022/03/20 | 499 | systems/win32/miktex/source/miktex-22.3.tar.xz.asc -2022/03/20 | 489412 | macros/latex/contrib/seu-ml-assign.zip -2022/03/20 | 483948 | macros/latex/contrib/seu-ml-assign/seu-ml-assign-doc.pdf -2022/03/20 | 47528 | systems/texlive/tlnet/archive/njuthesis.source.r62814.tar.xz -2022/03/20 | 46948 | systems/texlive/tlnet/archive/thuthesis.source.r62810.tar.xz -2022/03/20 | 43324 | systems/texlive/tlnet/archive/gzt.source.r62808.tar.xz -2022/03/20 | 42668 | systems/texlive/tlnet/archive/thuthesis.r62810.tar.xz -2022/03/20 | 411777 | language/japanese/BX/bxjscls/bxjscls.dtx -2022/03/20 | 399792 | systems/texlive/tlnet/archive/functional.doc.r62805.tar.xz -2022/03/20 | 396121 | language/japanese/BX/bxjscls/bxjscls-manual.pdf -2022/03/20 | 3895 | macros/luatex/generic/lua-widow-control/lwc-sample.tex -2022/03/20 | 380794 | install/macros/luatex/generic/lua-widow-control.tds.zip -2022/03/20 | 3783 | macros/luatex/generic/luatexko/luatexko-uhc2utf8.lua -2022/03/20 | 376801 | macros/luatex/generic/lua-widow-control/lua-widow-control.pdf -2022/03/20 | 376768 | macros/luatex/generic/luatexko.zip -2022/03/20 | 3720 | macros/luatex/generic/luatexko/README -2022/03/20 | 3639 | support/TeX4ht/source/update-htfonts -2022/03/20 | 35829 | macros/luatex/generic/luatexko/luatexko-doc.tex -2022/03/20 | 34380 | systems/texlive/tlnet/archive/gzt.r62808.tar.xz -2022/03/20 | 339172 | macros/luatex/generic/luatexko/luatexko-doc.pdf -2022/03/20 | 33343 | systems/win32/miktex/source/CHANGELOG.md -2022/03/20 | 32850 | macros/luatex/generic/luatexko/luatexko.sty -2022/03/20 | 29411 | macros/luatex/generic/lua-widow-control/lwc-documentation.tex -2022/03/20 | 28429492 | systems/win32/miktex/source/miktex-22.3.tar.xz -2022/03/20 | 27496 | systems/texlive/tlnet/archive/texdoc.r62816.tar.xz -2022/03/20 | 27082 | support/TeX4ht/source/Makefile -2022/03/20 | 2699 | macros/luatex/generic/lua-widow-control/lua-widow-control-2022-02-22.sty -2022/03/20 | 2690 | macros/luatex/generic/lua-widow-control/t-lua-widow-control.mkxl -2022/03/20 | 2690 | macros/luatex/generic/lua-widow-control/t-lua-widow-control.mkiv -2022/03/20 | 2629 | macros/luatex/generic/lua-widow-control/README.md -2022/03/20 | 259821 | macros/luatex/generic/luaaddplot.zip -2022/03/20 | 207828 | support/TeX4ht/source/tex4ht-fonts-opensans.tex -2022/03/20 | 20614 | macros/luatex/generic/lua-widow-control/lua-widow-control.lua -2022/03/20 | 1812 | macros/luatex/generic/lua-widow-control/lua-widow-control.tex -2022/03/20 | 1698490 | language/japanese/BX/bxjscls.zip -2022/03/20 | 16027 | language/japanese/BX/bxjscls/README-ja.md -2022/03/20 | 1492 | macros/luatex/generic/lua-widow-control/lwc-documentation.bib -2022/03/20 | 1461 | language/japanese/BX/bxjscls/LICENSE -2022/03/20 | 1411124 | systems/texlive/tlnet/archive/thuthesis.doc.r62810.tar.xz -2022/03/20 | 135768 | systems/texlive/tlnet/archive/texdoc.doc.r62816.tar.xz -2022/03/20 | 131505 | macros/latex/contrib/minimalist.zip -2022/03/20 | 127784 | systems/texlive/tlnet/archive/create-theorem.doc.r62806.tar.xz -2022/03/20 | 12508 | systems/texlive/tlnet/archive/njuthesis.r62814.tar.xz -2022/03/20 | 12406 | macros/latex/contrib/seu-ml-assign/seu-ml-assign-sample.tex -2022/03/20 | 122779 | macros/latex/contrib/colorist.zip -2022/03/20 | 1186301 | language/japanese/BX/bxjscls/bxjscls.pdf -2022/03/20 | 1180752 | systems/texlive/tlnet/archive/gzt.doc.r62808.tar.xz -2022/03/20 | 1144544 | systems/texlive/tlnet/archive/njuthesis.doc.r62814.tar.xz -2022/03/20 | 11392 | macros/latex/contrib/seu-ml-assign/seu-ml-assign.cls diff --git a/biblio/bibtex/contrib/ieejtran/IEEJtran.bst b/biblio/bibtex/contrib/ieejtran/IEEJtran.bst new file mode 100644 index 0000000000..ae93901036 --- /dev/null +++ b/biblio/bibtex/contrib/ieejtran/IEEJtran.bst @@ -0,0 +1,3192 @@ +%% +%% IEEJtran.bst +%% BibTeX Bibliography Style file for IEEJ Journals and Conferences (unsorted) +%% +%% Version 0.18 (2022/03/26) +%% +%% Copyright (c) 2020-2022 Haruki Ejiri and Yoshi Ri +%% +%% Original starting code base and algorithms obtained from the output of +%% Patrick W. Daly's makebst package as well as from prior versions of +%% IEEE BibTeX styles: +%% +%% 1. Howard Trickey and Oren Patashnik's ieeetr.bst (1985/1988) +%% 2. Silvano Balemi and Richard H. Roy's IEEEbib.bst (1993) +%% 3. Michael Shell's IEEEtran.bst (2003-2015) +%% +%% Support sites: +%% http://www.michaelshell.org/tex/ieeetran/ +%% http://www.ctan.org/pkg/ieeetran +%% and/or +%% http://www.ieee.org/ +%% and/or +%% https://github.com/ehki/jIEEEtran/ +%% +%% For use with pbibtex version 0.99d-j0.33 or later +%% +%% This is a numerical citation style. +%% +%%************************************************************************* +%% Legal Notice: +%% This code is offered as-is without any warranty either expressed or +%% implied; without even the implied warranty of MERCHANTABILITY or +%% FITNESS FOR A PARTICULAR PURPOSE! +%% User assumes all risk. +%% In no event shall the IEEE/IEEJ or any contributor to this code be liable for +%% any damages or losses, including, but not limited to, incidental, +%% consequential, or any other damages, resulting from the use or misuse +%% of any information contained here. +%% +%% All comments are the opinions of their respective authors and are not +%% necessarily endorsed by the IEEE/IEEJ. +%% +%% The original version of this code, i.e. IEEEtran.bst by, Michael Shell +%% was distributed under the LaTeX Project Public License (LPPL) +%% ( http://www.latex-project.org/ ) version 1.3, and may be freely used, +%% distributed and modified. A copy of the LPPL, version 1.3, is included +%% in the base LaTeX documentation of all distributions of LaTeX released +%% 2003/12/01 or later. +%% Retain all contribution notices and credits. +%% ** Modified files should be clearly indicated as such, including ** +%% ** renaming them and changing author support contact information. ** +%%************************************************************************* +%% +%% 日本人の電気系LaTeXユーザのためのBibTeXスタイルファイルです。本ファイル +%% は電気学会形式での引用スタイルで、オプションを変更することでIEEE形式へ +%% と変更することが可能です。 +%% 電気学会形式のIEEJtran.bst/IEEE形式のjIEEEtran.bstともに非公式です。 +%% ファイルの破損、データの損失、本コードを使用したことによるリジェクトなど +%% いかなる問題が生じた場合でも作者らは責任を負うことができません。 +%% コードはGitHub上で開発していますので、問題がありましたらIssueを立て、 +%% コミットをし、プルリクエストを投げてくださると嬉しいです。 +%% + + + +% +% Terminalに表示されるログメッセージのファイル名やURLの設定 +% + +FUNCTION{bst.file.name} { "IEEJtran.bst" } +FUNCTION{bst.file.version} { "0.18" } +FUNCTION{bst.file.date} { "2022/03/26" } +FUNCTION{bst.file.website} { "https://github.com/ehki/jIEEEtran/" } +FUNCTION{bst.file.author} { "Haruki Ejiri and Yoshi Ri" } + + +%% オプション & 設定 + +% 電気学会形式の引用フォーマットを使用するかの設定 +% #0 : IEEEフォーマットで引用する。 +% 日本語が含まれるエントリでは、日本語の不自然な扱いを解消する。 +% 日本語が含まれないエントリでは、Languageフィールドの取り扱いを除き +% オリジナルのIEEEtran.bst通りの出力となる。 +% #1 : 電気学会フォーマットで引用する。 +% 日本語が含まれるエントリも、日本語が含まれないエントリも、 +% 全ての文献に電気学会形式に合わせて引用する。 +FUNCTION {use.ieej.setting} { #1 } + + +% 電気学会形式の場合に短縮表記をするかどうかの設定 +% #0 : 短縮しない +% #1 : 短縮する +FUNCTION {default.use.ieej.abbrev} { #0 } + + +% 電気学会形式の発行年の指定 +% default: {bbl.ieej.jp.year.pre} { "(" } +% {bbl.ieej.jp.year.aft} { ")" } +% {bbl.ieej.en.year.pre} { "(" } +% {bbl.ieej.en.year.aft} { ")" } +FUNCTION {bbl.ieej.jp.year.pre} { "(" } +FUNCTION {bbl.ieej.jp.year.aft} { ")" } +FUNCTION {bbl.ieej.en.year.pre} { "(" } +FUNCTION {bbl.ieej.en.year.aft} { ")" } + + +% 電気学会形式において、発行年の前にカンマを打つかの指定 +% #0 : 打たない +% #1 : 打つ +% default: { #0 } +FUNCTION {ieej.setting.comma.year.pre} { #0 } + + +% 電気学会形式において、発行年の後にピリオドを打つかの指定 +% #0 : 打たない +% #1 : 打つ +% default: { #0 } +FUNCTION {ieej.setting.punct.year.aft} { #0 } + + +% 電気学会形式において、英語の書籍名と雑誌名をemphasizeするかの指定 +% #0 : emphasize しない +% #1 : emphasize する +% default: {ieej.en.setting.emph.journal} { #1 } +% : {ieej.en.setting.emph.booktitle} { #0 } +FUNCTION {ieej.en.setting.emph.journal} { #1 } +FUNCTION {ieej.en.setting.emph.booktitle} { #0 } + + +% 電気学会形式において、日本語の書籍名と雑誌名をemphasizeするかの指定 +% #0 : emphasize しない +% #1 : emphasize する +% default: {ieej.jp.setting.emph.journal} { #0 } +% : {ieej.jp.setting.emph.booktitle} { #0 } +FUNCTION {ieej.jp.setting.emph.journal} { #0 } +FUNCTION {ieej.jp.setting.emph.booktitle} { #0 } + + +% IEEE形式において、日本語の書籍名と雑誌名をemphasizeするかの指定 +% #0 : emphasize しない +% #1 : emphasize する +% default: { #0 } +FUNCTION {ieee.jp.setting.emph.title} { #0 } + + +% 電気学会形式において、タイトル前後の文字を指定 +% default: {bbl.ieej.jp.title.pre} { "「" } +% {bbl.ieej.jp.title.aft} { "」" } +% {bbl.ieej.en.title.pre} { "``" } +% {bbl.ieej.en.title.aft} { "''" } +FUNCTION {bbl.ieej.jp.title.pre} { "「" } +FUNCTION {bbl.ieej.jp.title.aft} { "」" } +FUNCTION {bbl.ieej.en.title.pre} { "``" } +FUNCTION {bbl.ieej.en.title.aft} { "''" } + + +% 電気学会形式形式において、著者とタイトルの間の文字の指定 +% default: {bbl.ieej.jp.author.title.sep.F} { ":" } +% {bbl.ieej.en.author.title.sep.F} { ":" } +% {bbl.ieej.jp.author.title.sep.A} { "," } +% {bbl.ieej.en.author.title.sep.A} { "," } +FUNCTION {bbl.ieej.jp.author.title.sep.F} { ":" } +FUNCTION {bbl.ieej.en.author.title.sep.F} { ":" } +FUNCTION {bbl.ieej.jp.author.title.sep.A} { "," } +FUNCTION {bbl.ieej.en.author.title.sep.A} { "," } + + +% 日本語文献において、vol. の表記法の設定 +% .Fは非省略表記、.Aは省略表記 +% default: {bbl.ieej.vol.F} { "Vol." } +% {bbl.ieej.vol.A} { "\textbf{" } +FUNCTION {bbl.ieej.vol.F} { "Vol." } +FUNCTION {bbl.ieej.vol.A} { "\textbf{" } + + +% 日本語文献において、vol. を記載した後、 +% カンマの前に記載する文字列の指定 +% .Fは非省略表記、.Aは省略表記 +% default: {bbl.ieej.vol.aft.F} { "" } +% {bbl.ieej.vol.aft.A} { "}" } +FUNCTION {bbl.ieej.vol.aft.F} { "" } +FUNCTION {bbl.ieej.vol.aft.A} { "}" } + + +% 日本語文献において、no. の表記法の設定 +% .Fは非省略表記、.Aは省略表記 +% default: {bbl.ieej.no.F} { "No." } +% {bbl.ieej.no.A} { "(" } +FUNCTION {bbl.ieej.no.F} { "No." } +FUNCTION {bbl.ieej.no.A} { "(" } + + +% 日本語文献において、no. を記載した後、 +% カンマの前に記載する文字列の指定 +% .Fは非省略表記、.Aは省略表記 +% default: {bbl.ieej.no.aft.F} { "" } +% {bbl.ieej.no.aft.A} { ")" } +FUNCTION {bbl.ieej.no.aft.F} { "" } +FUNCTION {bbl.ieej.no.aft.A} { ")" } + + +% 日本語文献における、pp. の表記法の設定。 +% .Fは非省略表記、.Aは省略表記 +% default: {bbl.ieej.pages.F} { "pp." } +% {bbl.ieej.pages.A} { "" } +FUNCTION {bbl.ieej.pages.F} { "pp." } +FUNCTION {bbl.ieej.pages.A} { "" } + + +% 日本語文献における、p. の表記法の設定。 +% .Fは非省略表記、.Aは省略表記 +% default: {bbl.ieej.page.F} { "p." } +% {bbl.ieej.page.A} { "" } +FUNCTION {bbl.ieej.page.F} { "p." } +FUNCTION {bbl.ieej.page.A} { "" } + + +% 日本語と英語の etal の表記の設定 +% default: {bbl.etal.jp} { "他" } +% {bbl.etal.en} { "et~al." } +FUNCTION {bbl.etal.jp} { "他" } +FUNCTION {bbl.etal.en} { "et~al." } + + +% 電気学会形式において、日本語/英語文献の章番号前後文字、チルダ(~)を使用するかの設定 +% default: {bbl.ieej.jp.chapter.pre} { "第" } +% {bbl.ieej.jp.chapter.aft} { "章" } +% {bbl.ieej.jp.chapter.tie.pre} { #0 } +% {bbl.ieej.jp.chapter.tie.aft} { #0 } +% {bbl.ieej.en.chapter.pre} { "Chap." } +% {bbl.ieej.en.chapter.aft} { "" } +% {bbl.ieej.en.chapter.tie.pre} { #0 } +% {bbl.ieej.en.chapter.tie.aft} { #0 } +FUNCTION {bbl.ieej.jp.chapter.pre} { "第" } +FUNCTION {bbl.ieej.jp.chapter.aft} { "章" } +FUNCTION {bbl.ieej.jp.chapter.tie.pre} { #0 } % 章番号前文字と章番号の間にチルダを挿入しない +FUNCTION {bbl.ieej.jp.chapter.tie.aft} { #0 } % 章番号と章番号後文字との間にチルダを挿入しない +FUNCTION {bbl.ieej.en.chapter.pre} { "Chap." } +FUNCTION {bbl.ieej.en.chapter.aft} { "" } +FUNCTION {bbl.ieej.en.chapter.tie.pre} { #0 } % 章番号前文字と章番号の間にチルダを挿入する +FUNCTION {bbl.ieej.en.chapter.tie.aft} { #0 } % 章番号と章番号後文字との間にチルダを挿入しない + + +% 日本語文献において、著者間の仕切り文字の設定 +% default: {bbl.ieej.jp.author.sep} { "・" } +% {bbl.ieej.en.author.sep} { ", " } +FUNCTION {bbl.ieej.jp.author.sep} { "・" } +FUNCTION {bbl.ieej.en.author.sep} { ", " } + + +% 電気学会形式において、発行年と発行月の区切り文字の指定 +% default: { "-" } +FUNCTION {bbl.ieej.year.month.sep} { "-" } + + +% 電気学会形式において、発行月の表示形式の指定 +% #0 : "1", "2", ..., "12" のように数字で表示 +% #1 : "Jan", "Feb.", ..., "Dec." のようにアルファベットで表示 +% default: { #0 } +FUNCTION {format.month.ieej} { #0 } + + +% IEEE形式において、発行月の表示形式の指定 +% #0 : "1", "2", ..., "12" のように数字で表示 +% #1 : "Jan", "Feb.", ..., "Dec." のようにアルファベットで表示 +% default: { #1 } +FUNCTION {format.month.ieee} { #1 } + + +% 電気学会形式において、 +% 「手法Aと手法B、どちらが正しいのか?」 +% "Method A and B - Which is correct?" +% のように、?や.など文区切り文字がタイトル最後にきた場合でも +% 「手法Aと手法B、どちらが正しいのか?」,学会名 +% "Method A and B - Which is correct?", Journal title +% のように"の後にカンマを打つかの設定 +% #0: カンマを打たない, #1: カンマを打つ +% default: { #1 } +FUNCTION { bbl.ieej.force.punct.aft.quote } { #1 } + + +% languageにJapaneseやFrenchの指定がある場合に +% (in Language)を表記するかの設定 +% #0 言語表記しない +% #1 IEEE-Reference-Guideの通りに言語表記する +% https://ieeeauthorcenter.ieee.org/wp-content/uploads/IEEE-Reference-Guide.pdf +% #2 文献末尾に言語表記する +% default : {bbl.format.language.ieej} { #2 } +% {bbl.format.language.ieee} { #1 } +FUNCTION {bbl.format.language.ieej} { #2 } +FUNCTION {bbl.format.language.ieee} { #1 } +FUNCTION {bbl.format.language} +{ use.ieej.setting #1 = + { bbl.format.language.ieej } + { bbl.format.language.ieee } + if$ +} + + +% language表記の後にピリオドを打つかの設定 +% default : { #1 } % for jIEEEtran.bst (デフォルト通りで強制しない) +% { #0 } % for IEEJtran.bst (ピリオドを強制的に打たせない) +FUNCTION {bbl.format.language.punct.ieej} { #0 } +FUNCTION {bbl.format.language.punct.ieee} { #1 } +FUNCTION {bbl.format.language.punct} +{ use.ieej.setting #1 = + { bbl.format.language.punct.ieej } + { bbl.format.language.punct.ieee } + if$ +} + + +% select.language関数を用いてタイトルジャーナル名に +% \BIBforeignlanguage{Japanese} +% などのhyphenation設定の処理を行うかの設定。 +% { #1 } : hyphenation設定を行う(設定していないとWARNINGが出る。 +% { #0 } : hyphenation設定を行わない +% default : { #0 } +FUNCTION {bbl.use.select.language} { #0 } + + +% URLの表記をするかどうかの設定 +% default : {default.is.use.url.ieej} {#0} 電気学会形式ではURLを書かない +% {default.is.use.url.ieee} {#1} IEEE形式ではURLがあれば書く +FUNCTION {default.is.use.url.ieej} {#0} +FUNCTION {default.is.use.url.ieee} {#1} + + +% 同一著者の文献が連続した場合に著者名を長ダッシュで代用するかの設定 +% 電気学会形式では長ダッシュで代用はしない +% IEEE形式では長ダッシュで代用する +% default : { default.is.dash.repeated.names.ieej } { #0 } +% { default.is.dash.repeated.names.ieee } { #1 } +FUNCTION { default.is.dash.repeated.names.ieej } { #0 } +FUNCTION { default.is.dash.repeated.names.ieee } { #1 } + + +% IEEEtran.bstに元からあるオプション群 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% DEFAULTS FOR THE CONTROLS OF THE BST STYLE %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% These are the defaults for the user adjustable controls. The values used +% here can be overridden by the user via IEEEtranBSTCTL entry type. + +% NOTE: The recommended LaTeX command to invoke a control entry type is: +% +%\makeatletter +%\def\bstctlcite{\@ifnextchar[{\@bstctlcite}{\@bstctlcite[@auxout]}} +%\def\@bstctlcite[#1]#2{\@bsphack +% \@for\@citeb:=#2\do{% +% \edef\@citeb{\expandafter\@firstofone\@citeb}% +% \if@filesw\immediate\write\csname #1\endcsname{\string\citation{\@citeb}}\fi}% +% \@esphack} +%\makeatother +% +% It is called at the start of the document, before the first \cite, like: +% \bstctlcite{IEEEexample:BSTcontrol} +% +% IEEEtran.cls V1.6 and later does provide this command. + + +% #0 turns off the display of the number for articles. +% #1 enables +FUNCTION {default.is.use.number.for.article} { #1 } + + +% #0 turns off the display of the paper and type fields in @inproceedings. +% #1 enables +FUNCTION {default.is.use.paper} { #1 } + + +% #0 turns off the display of urls +% #1 enables +FUNCTION {default.is.use.url} +{ use.ieej.setting #1 = + { default.is.use.url.ieej } + { default.is.use.url.ieee } + if$ +} + + +% #0 turns off the forced use of "et al." +% #1 enables +FUNCTION {default.is.forced.et.al} +{ % Note: "and" function is not declared yet + use.ieej.setting #1 = + { default.use.ieej.abbrev #1 = + { #1 } + { #0 } + if$ + } + { #0 } + if$ +} + + +% The maximum number of names that can be present beyond which an "et al." +% usage is forced. Be sure that num.names.shown.with.forced.et.al (below) +% is not greater than this value! +% Note: There are many instances of references in IEEE journals which have +% a very large number of authors as well as instances in which "et al." is +% used profusely. +FUNCTION {default.max.num.names.before.forced.et.al} +{ % Note: "and" function is not declared yet + use.ieej.setting #1 = + { default.use.ieej.abbrev #1 = + { #2 } % two authors are shown without et al. + { #10 } + if$ + } + { #10 } + if$ +} + + +% The number of names that will be shown with a forced "et al.". +% Must be less than or equal to max.num.names.before.forced.et.al +FUNCTION {default.num.names.shown.with.forced.et.al} { #1 } + + +% #0 turns off the alternate interword spacing for entries with URLs. +% #1 enables +FUNCTION {default.is.use.alt.interword.spacing} { #1 } + + +% If alternate interword spacing for entries with URLs is enabled, this is +% the interword spacing stretch factor that will be used. For example, the +% default "4" here means that the interword spacing in entries with URLs can +% stretch to four times normal. Does not have to be an integer. Note that +% the value specified here can be overridden by the user in their LaTeX +% code via a command such as: +% "\providecommand\BIBentryALTinterwordstretchfactor{1.5}" in addition to +% that via the IEEEtranBSTCTL entry type. +FUNCTION {default.ALTinterwordstretchfactor} { "4" } + + +% #0 turns off the "dashification" of repeated (i.e., identical to those +% of the previous entry) names. The IEEE normally does this. +% #1 enables +FUNCTION {default.is.dash.repeated.names} { + use.ieej.setting #1 = + { default.is.dash.repeated.names.ieej } + { default.is.dash.repeated.names.ieee } + if$ +} + + +% The default name format control string. %change based on japanese +FUNCTION {default.name.format.en.string}{ "{f.~}{vv~}{ll}{, jj}" } +FUNCTION {default.name.format.jp.string}{ "{ff}~{vv~}{ll}{, jj}" } + + +% The default LaTeX font command for the names. +FUNCTION {default.name.latex.cmd}{ "" } + + +% The default URL prefix. +FUNCTION {default.name.url.prefix}{ "[Online]. Available:" } + + +% Other controls that cannot be accessed via IEEEtranBSTCTL entry type. + +% #0 turns off the terminal startup banner/completed message so as to +% operate more quietly. +% #1 enables +FUNCTION {is.print.banners.to.terminal} { #1 } + + + + +%%%%%%%%%%%% +%% BANNER %% +%%%%%%%%%%%% + +FUNCTION {banner.message} +{ is.print.banners.to.terminal + { "-- " bst.file.name * " " * bst.file.version * + " (" * bst.file.date * ") " * "by " * bst.file.author * "." * + top$ + "-- " bst.file.website * + top$ + "-- See the " quote$ * "IEEEtran_bst_HOWTO.pdf" * quote$ * + " manual for usage information for IEEEtran.bst." * + top$ + "-- See also " quote$ * "howtouse.pdf" * quote$ * + " manual for usase information for jIEEEtran.bst and IEEJtran.bst." * + top$ + } + { skip$ } + if$ +} + +FUNCTION {completed.message} +{ is.print.banners.to.terminal + { "" + top$ + "Done." + top$ + } + { skip$ } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%%%% +%% STRING CONSTANTS %% +%%%%%%%%%%%%%%%%%%%%%% +FUNCTION {bbl.a}{ "A" } +FUNCTION {bbl.an}{ "An" } +FUNCTION {bbl.and}{ "and" } +%FUNCTION {bbl.etal}{ "et~al." } +FUNCTION {bbl.editors}{ "eds." } +FUNCTION {bbl.editor}{ "ed." } +FUNCTION {bbl.edition}{ "ed." } +FUNCTION {bbl.volume}{ "vol." } +FUNCTION {bbl.of}{ "of" } +FUNCTION {bbl.number}{ "no." } +FUNCTION {bbl.in}{ "in" } +FUNCTION {bbl.pages}{ "pp." } +FUNCTION {bbl.page}{ "p." } +FUNCTION {bbl.chapter}{ "ch." } +FUNCTION {bbl.paper}{ "paper" } +FUNCTION {bbl.part}{ "pt." } +FUNCTION {bbl.patent}{ "Patent" } +FUNCTION {bbl.patentUS}{ "U.S." } +FUNCTION {bbl.revision}{ "Rev." } +FUNCTION {bbl.series}{ "ser." } +FUNCTION {bbl.standard}{ "Std." } +FUNCTION {bbl.techrep}{ "Tech. Rep." } +FUNCTION {bbl.the}{ "The" } +FUNCTION {bbl.mthesis}{ "Master's thesis" } +FUNCTION {bbl.phdthesis}{ "Ph.D. dissertation" } +FUNCTION {bbl.st}{ "st" } +FUNCTION {bbl.nd}{ "nd" } +FUNCTION {bbl.rd}{ "rd" } +FUNCTION {bbl.th}{ "th" } + + +% This is the LaTeX spacer that is used when a larger than normal space +% is called for (such as just before the address:publisher). +FUNCTION {large.space} { "\hskip 1em plus 0.5em minus 0.4em\relax " } + +% The LaTeX code for dashes that are used to represent repeated names. +% Note: Some older IEEE journals used something like +% "\rule{0.275in}{0.5pt}\," which is fairly thick and runs right along +% the baseline. However, the IEEE now uses a thinner, above baseline, +% six dash long sequence. +FUNCTION {repeated.name.dashes} { "------" } + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% PREDEFINED STRING MACROS %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +MACRO {jan} {"Jan."} +MACRO {feb} {"Feb."} +MACRO {mar} {"Mar."} +MACRO {apr} {"Apr."} +MACRO {may} {"May"} +MACRO {jun} {"Jun."} +MACRO {jul} {"Jul."} +MACRO {aug} {"Aug."} +MACRO {sep} {"Sep."} +MACRO {oct} {"Oct."} +MACRO {nov} {"Nov."} +MACRO {dec} {"Dec."} + + + +%%%%%%%%%%%%%%%%%% +%% ENTRY FIELDS %% +%%%%%%%%%%%%%%%%%% + +ENTRY + { address + assignee + author + booktitle + chapter + day + dayfiled + edition + editor + howpublished + institution + intype + journal + key + language + month + monthfiled + nationality + note + number + organization + pages + paper + publisher + school + series + revision + title + type + url + volume + year + yearfiled + CTLuse_article_number + CTLuse_paper + CTLuse_url + CTLuse_forced_etal + CTLmax_names_forced_etal + CTLnames_show_etal + CTLuse_alt_spacing + CTLalt_stretch_factor + CTLdash_repeated_names + CTLname_format_string + CTLname_latex_cmd + CTLname_url_prefix + CTLuse_ieej_abbrev + } + {} + { label } + + + + +%%%%%%%%%%%%%%%%%%%%%%% +%% INTEGER VARIABLES %% +%%%%%%%%%%%%%%%%%%%%%%% + +INTEGERS { prev.status.punct this.status.punct punct.std + punct.no punct.comma punct.period + prev.status.space this.status.space space.std + space.no space.normal space.large + prev.status.quote this.status.quote quote.std + quote.no quote.close + prev.status.nline this.status.nline nline.std + nline.no nline.newblock + status.cap cap.std + cap.no cap.yes + japanese.flag} + +INTEGERS { longest.label.width multiresult nameptr namesleft number.label numnames } + +INTEGERS { is.use.number.for.article + is.use.paper + is.use.url + is.forced.et.al + max.num.names.before.forced.et.al + num.names.shown.with.forced.et.al + is.use.alt.interword.spacing + is.dash.repeated.names + use.ieej.abbrev} + + +%%%%%%%%%%%%%%%%%%%%%% +%% STRING VARIABLES %% +%%%%%%%%%%%%%%%%%%%%%% + +STRINGS { bibinfo + longest.label + oldname + s + t + ALTinterwordstretchfactor + name.format.string + name.latex.cmd + name.url.prefix} + + + + +%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOW LEVEL FUNCTIONS %% +%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {initialize.controls} +{ default.is.use.number.for.article 'is.use.number.for.article := + default.is.use.paper 'is.use.paper := + default.is.use.url 'is.use.url := + default.is.forced.et.al 'is.forced.et.al := + default.max.num.names.before.forced.et.al 'max.num.names.before.forced.et.al := + default.num.names.shown.with.forced.et.al 'num.names.shown.with.forced.et.al := + default.is.use.alt.interword.spacing 'is.use.alt.interword.spacing := + default.is.dash.repeated.names 'is.dash.repeated.names := + default.ALTinterwordstretchfactor 'ALTinterwordstretchfactor := + default.name.format.en.string 'name.format.string := + default.name.latex.cmd 'name.latex.cmd := + default.name.url.prefix 'name.url.prefix := + default.use.ieej.abbrev 'use.ieej.abbrev := +} + + +% This IEEEtran.bst features a very powerful and flexible mechanism for +% controlling the capitalization, punctuation, spacing, quotation, and +% newlines of the formatted entry fields. (Note: IEEEtran.bst does not need +% or use the newline/newblock feature, but it has been implemented for +% possible future use.) The output states of IEEEtran.bst consist of +% multiple independent attributes and, as such, can be thought of as being +% vectors, rather than the simple scalar values ("before.all", +% "mid.sentence", etc.) used in most other .bst files. +% +% The more flexible and complex design used here was motivated in part by +% the IEEE's rather unusual bibliography style. For example, the IEEE ends the +% previous field item with a period and large space prior to the publisher +% address; the @electronic entry types use periods as inter-item punctuation +% rather than the commas used by the other entry types; and URLs are never +% followed by periods even though they are the last item in the entry. +% Although it is possible to accommodate these features with the conventional +% output state system, the seemingly endless exceptions make for convoluted, +% unreliable and difficult to maintain code. +% +% IEEEtran.bst's output state system can be easily understood via a simple +% illustration of two most recently formatted entry fields (on the stack): +% +% CURRENT_ITEM +% "PREVIOUS_ITEM +% +% which, in this example, is to eventually appear in the bibliography as: +% +% "PREVIOUS_ITEM," CURRENT_ITEM +% +% It is the job of the output routine to take the previous item off of the +% stack (while leaving the current item at the top of the stack), apply its +% trailing punctuation (including closing quote marks) and spacing, and then +% to write the result to BibTeX's output buffer: +% +% "PREVIOUS_ITEM," +% +% Punctuation (and spacing) between items is often determined by both of the +% items rather than just the first one. The presence of quotation marks +% further complicates the situation because, in standard English, trailing +% punctuation marks are supposed to be contained within the quotes. +% +% IEEEtran.bst maintains two output state (aka "status") vectors which +% correspond to the previous and current (aka "this") items. Each vector +% consists of several independent attributes which track punctuation, +% spacing, quotation, and newlines. Capitalization status is handled by a +% separate scalar because the format routines, not the output routine, +% handle capitalization and, therefore, there is no need to maintain the +% capitalization attribute for both the "previous" and "this" items. +% +% When a format routine adds a new item, it copies the current output status +% vector to the previous output status vector and (usually) resets the +% current (this) output status vector to a "standard status" vector. Using a +% "standard status" vector in this way allows us to redefine what we mean by +% "standard status" at the start of each entry handler and reuse the same +% format routines under the various inter-item separation schemes. For +% example, the standard status vector for the @book entry type may use +% commas for item separators, while the @electronic type may use periods, +% yet both entry handlers exploit many of the exact same format routines. +% +% Because format routines have write access to the output status vector of +% the previous item, they can override the punctuation choices of the +% previous format routine! Therefore, it becomes trivial to implement rules +% such as "Always use a period and a large space before the publisher." By +% pushing the generation of the closing quote mark to the output routine, we +% avoid all the problems caused by having to close a quote before having all +% the information required to determine what the punctuation should be. +% +% The IEEEtran.bst output state system can easily be expanded if needed. +% For instance, it is easy to add a "space.tie" attribute value if the +% bibliography rules mandate that two items have to be joined with an +% unbreakable space. + +FUNCTION {initialize.status.constants} +{ #0 'punct.no := + #1 'punct.comma := + #2 'punct.period := + #0 'space.no := + #1 'space.normal := + #2 'space.large := + #0 'quote.no := + #1 'quote.close := + #0 'cap.no := + #1 'cap.yes := + #0 'nline.no := + #1 'nline.newblock := + #0 'japanese.flag := +} + +FUNCTION {std.status.using.comma} +{ punct.comma 'punct.std := + space.normal 'space.std := + quote.no 'quote.std := + nline.no 'nline.std := + cap.no 'cap.std := +} + +FUNCTION {std.status.using.period} +{ punct.period 'punct.std := + space.normal 'space.std := + quote.no 'quote.std := + nline.no 'nline.std := + cap.yes 'cap.std := +} + +FUNCTION {initialize.prev.this.status} +{ punct.no 'prev.status.punct := + space.no 'prev.status.space := + quote.no 'prev.status.quote := + nline.no 'prev.status.nline := + punct.no 'this.status.punct := + space.no 'this.status.space := + quote.no 'this.status.quote := + nline.no 'this.status.nline := + cap.yes 'status.cap := +} + +FUNCTION {this.status.std} +{ punct.std 'this.status.punct := + space.std 'this.status.space := + quote.std 'this.status.quote := + nline.std 'this.status.nline := +} + +FUNCTION {cap.status.std}{ cap.std 'status.cap := } + +FUNCTION {this.to.prev.status} +{ this.status.punct 'prev.status.punct := + this.status.space 'prev.status.space := + this.status.quote 'prev.status.quote := + this.status.nline 'prev.status.nline := +} + + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ { skip$ } + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + { skip$ } + if$ +} + + +% convert the strings "yes" or "no" to #1 or #0 respectively +FUNCTION {yes.no.to.int} +{ "l" change.case$ duplicate$ + "yes" = + { pop$ #1 } + { duplicate$ "no" = + { pop$ #0 } + { "unknown boolean " quote$ * swap$ * quote$ * + " in " * cite$ * warning$ + #0 + } + if$ + } + if$ +} + + +% pushes true if the single char string on the stack is in the +% range of "0" to "9" +FUNCTION {is.num} +{ chr.to.int$ + duplicate$ "0" chr.to.int$ < not + swap$ "9" chr.to.int$ > not and +} + +% multiplies the integer on the stack by a factor of 10 +FUNCTION {bump.int.mag} +{ #0 'multiresult := + { duplicate$ #0 > } + { #1 - + multiresult #10 + + 'multiresult := + } + while$ +pop$ +multiresult +} + +% converts a single character string on the stack to an integer +FUNCTION {char.to.integer} +{ duplicate$ + is.num + { chr.to.int$ "0" chr.to.int$ - } + {"noninteger character " quote$ * swap$ * quote$ * + " in integer field of " * cite$ * warning$ + #0 + } + if$ +} + +% converts a string on the stack to an integer +FUNCTION {string.to.integer} +{ duplicate$ text.length$ 'namesleft := + #1 'nameptr := + #0 'numnames := + { nameptr namesleft > not } + { duplicate$ nameptr #1 substring$ + char.to.integer numnames bump.int.mag + + 'numnames := + nameptr #1 + + 'nameptr := + } + while$ +pop$ +numnames +} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% JAPANESE WORD TOGGLER %% +%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +FUNCTION {bbl.ieej.year.pre} +{ japanese.flag #1 = + { bbl.ieej.jp.year.pre } + { bbl.ieej.en.year.pre } + if$ +} +FUNCTION {bbl.ieej.year.aft} +{ japanese.flag #1 = + { bbl.ieej.jp.year.aft } + { bbl.ieej.en.year.aft } + if$ +} +FUNCTION {bbl.ieej.title.pre} +{ japanese.flag #1 = + { bbl.ieej.jp.title.pre } + { bbl.ieej.en.title.pre } + if$ +} +FUNCTION {bbl.ieej.title.aft} +{ japanese.flag #1 = + { bbl.ieej.jp.title.aft } + { bbl.ieej.en.title.aft } + if$ +} +FUNCTION {bbl.ieej.chapter.pre} +{ japanese.flag #1 = + { bbl.ieej.jp.chapter.pre } + { bbl.ieej.en.chapter.pre } + if$ +} +FUNCTION {bbl.ieej.chapter.aft} +{ japanese.flag #1 = + { bbl.ieej.jp.chapter.aft } + { bbl.ieej.en.chapter.aft } + if$ +} +FUNCTION {bbl.ieej.chapter.tie.pre} +{ japanese.flag #1 = + { bbl.ieej.jp.chapter.tie.pre } + { bbl.ieej.en.chapter.tie.pre } + if$ +} +FUNCTION {bbl.ieej.chapter.tie.aft} +{ japanese.flag #1 = + { bbl.ieej.jp.chapter.tie.aft } + { bbl.ieej.en.chapter.tie.aft } + if$ +} +FUNCTION {bbl.etal} +{ japanese.flag #1 = + { bbl.etal.jp } + { bbl.etal.en } + if$ +} +FUNCTION {bbl.ieej.jp.author.title.sep} +{ use.ieej.abbrev #0 = + { bbl.ieej.jp.author.title.sep.F } + { bbl.ieej.jp.author.title.sep.A } + if$ +} +FUNCTION {bbl.ieej.en.author.title.sep} +{ use.ieej.abbrev #0 = + { bbl.ieej.en.author.title.sep.F } + { bbl.ieej.en.author.title.sep.A } + if$ +} +FUNCTION {bbl.ieej.author.title.sep} +{ japanese.flag #1 = + { bbl.ieej.jp.author.title.sep } + { bbl.ieej.en.author.title.sep } + if$ +} +FUNCTION {bbl.ieej.vol} +{ use.ieej.abbrev #0 = + { bbl.ieej.vol.F } + { bbl.ieej.vol.A } + if$ +} +FUNCTION {bbl.ieej.vol.aft} +{ use.ieej.abbrev #0 = + { bbl.ieej.vol.aft.F } + { bbl.ieej.vol.aft.A } + if$ +} +FUNCTION {bbl.ieej.no} +{ use.ieej.abbrev #0 = + { bbl.ieej.no.F } + { bbl.ieej.no.A } + if$ +} +FUNCTION {bbl.ieej.no.aft} +{ use.ieej.abbrev #0 = + { bbl.ieej.no.aft.F } + { bbl.ieej.no.aft.A } + if$ +} +FUNCTION {bbl.ieej.pages} +{ use.ieej.abbrev #0 = + { bbl.ieej.pages.F } + { bbl.ieej.pages.A } + if$ +} +FUNCTION {bbl.ieej.page} +{ use.ieej.abbrev #0 = + { bbl.ieej.page.F } + { bbl.ieej.page.A } + if$ +} + + + +% The output routines write out the *next* to the top (previous) item on the +% stack, adding punctuation and such as needed. Since IEEEtran.bst maintains +% the output status for the top two items on the stack, these output +% routines have to consider the previous output status (which corresponds to +% the item that is being output). Full independent control of punctuation, +% closing quote marks, spacing, and newblock is provided. +% +% "output.nonnull" does not check for the presence of a previous empty +% item. +% +% "output" does check for the presence of a previous empty item and will +% remove an empty item rather than outputing it. +% +% "output.warn" is like "output", but will issue a warning if it detects +% an empty item. + +FUNCTION {output.nonnull} +{ swap$ + prev.status.quote quote.close = + { use.ieej.setting #1 = + { bbl.ieej.title.aft * } + { japanese.flag #1 = { "''" * } { skip$ } if$ } + if$ + } + { skip$ } + if$ + prev.status.punct punct.comma = + { japanese.flag #0 = { "," * } { "," * } if$ } + { skip$ } + if$ + prev.status.punct punct.period = + { japanese.flag #0 = { add.period$ } { "." * } if$ } + { skip$ } + if$ + use.ieej.setting #0 = japanese.flag #0 = and + { prev.status.quote quote.close = { "''" * } { skip$ } if$ } + { skip$ } + if$ + prev.status.space space.normal = + { japanese.flag #0 = { " " * } { skip$ } if$ } + { skip$ } + if$ + prev.status.space space.large = + { large.space * } + { skip$ } + if$ + write$ + prev.status.nline nline.newblock = + { newline$ "\newblock " write$ } + { skip$ } + if$ +} + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {output.warn} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} + + +% "fin.entry" is the output routine that handles the last item of the entry +% (which will be on the top of the stack when "fin.entry" is called). + +FUNCTION {fin.entry} +{ this.status.punct punct.no = + { skip$ } + { japanese.flag #0 = { add.period$ } { "." * } if$ } + if$ + this.status.quote quote.close = + { "''" * } + { skip$ } + if$ + write$ + newline$ + %% for JP setting + #0 'japanese.flag := + default.name.format.en.string 'name.format.string := +} + + +FUNCTION {is.last.char.not.punct} +{ duplicate$ + "}" * add.period$ + #-1 #1 substring$ "." = +} + +FUNCTION {is.multiple.pages} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} + +FUNCTION {capitalize}{ "u" change.case$ "t" change.case$ } + +FUNCTION {emphasize} +{ duplicate$ empty$ + { pop$ "" } + { "\emph{" swap$ * "}" * } + if$ +} + +FUNCTION {do.name.latex.cmd} +{ name.latex.cmd + empty$ + { skip$ } + { name.latex.cmd "{" * swap$ * "}" * } + if$ +} + +% IEEEtran.bst uses its own \BIBforeignlanguage command which directly +% invokes the TeX hyphenation patterns without the need of the Babel +% package. Babel does a lot more than switch hyphenation patterns and +% its loading can cause unintended effects in many class files (such as +% IEEEtran.cls). +FUNCTION {select.language} +{ duplicate$ empty$ 'pop$ + { language empty$ bbl.use.select.language #0 = or 'skip$ + { "\BIBforeignlanguage{" language * "}{" * swap$ * "}" * } + if$ + } + if$ +} + +FUNCTION {tie.or.space.prefix} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ +} + +FUNCTION {get.bbl.editor} +{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } + +FUNCTION {space.word} +{ " " swap$ * " " * } + + +% Field Conditioners, Converters, Checkers and External Interfaces + +FUNCTION {empty.field.to.null.string} +{ duplicate$ empty$ + { pop$ "" } + { skip$ } + if$ +} + +FUNCTION {either.or.check} +{ empty$ + { pop$ } + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} + +FUNCTION {empty.entry.warn} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ url empty$ + and and and and and and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} + + +% The bibinfo system provides a way for the electronic parsing/acquisition +% of a bibliography's contents as is done by ReVTeX. For example, a field +% could be entered into the bibliography as: +% \bibinfo{volume}{2} +% Only the "2" would show up in the document, but the LaTeX \bibinfo command +% could do additional things with the information. IEEEtran.bst does provide +% a \bibinfo command via "\providecommand{\bibinfo}[2]{#2}". However, it is +% currently not used as the bogus bibinfo functions defined here output the +% entry values directly without the \bibinfo wrapper. The bibinfo functions +% themselves (and the calls to them) are retained for possible future use. +% +% bibinfo.check avoids acting on missing fields while bibinfo.warn will +% issue a warning message if a missing field is detected. Prior to calling +% the bibinfo functions, the user should push the field value and then its +% name string, in that order. + +FUNCTION {bibinfo.check} +{ swap$ duplicate$ missing$ + { pop$ pop$ "" } + { duplicate$ empty$ + { swap$ pop$ } + { swap$ pop$ } + if$ + } + if$ +} + +FUNCTION {bibinfo.warn} +{ swap$ duplicate$ missing$ + { swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ "" } + { duplicate$ empty$ + { swap$ "empty " swap$ * " in " * cite$ * warning$ } + { swap$ pop$ } + if$ + } + if$ +} + + +% The IEEE separates large numbers with more than 4 digits into groups of +% three. The IEEE uses a small space to separate these number groups. +% Typical applications include patent and page numbers. + +% number of consecutive digits required to trigger the group separation. +FUNCTION {large.number.trigger}{ #5 } + +% For numbers longer than the trigger, this is the blocksize of the groups. +% The blocksize must be less than the trigger threshold, and 2 * blocksize +% must be greater than the trigger threshold (can't do more than one +% separation on the initial trigger). +FUNCTION {large.number.blocksize}{ #3 } + +% What is actually inserted between the number groups. +FUNCTION {large.number.separator}{ "\," } + +% So as to save on integer variables by reusing existing ones, numnames +% holds the current number of consecutive digits read and nameptr holds +% the number that will trigger an inserted space. +FUNCTION {large.number.separate} +{ 't := + "" + #0 'numnames := + large.number.trigger 'nameptr := + { t empty$ not } + { t #-1 #1 substring$ is.num + { numnames #1 + 'numnames := } + { #0 'numnames := + large.number.trigger 'nameptr := + } + if$ + t #-1 #1 substring$ swap$ * + t #-2 global.max$ substring$ 't := + numnames nameptr = + { duplicate$ #1 nameptr large.number.blocksize - substring$ swap$ + nameptr large.number.blocksize - #1 + global.max$ substring$ + large.number.separator swap$ * * + nameptr large.number.blocksize - 'numnames := + large.number.blocksize #1 + 'nameptr := + } + { skip$ } + if$ + } + while$ +} + +% Converts all single dashes "-" to double dashes "--". +FUNCTION {n.dashify} +{ large.number.separate + 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + + +% This function detects entries with names that are identical to that of +% the previous entry and replaces the repeated names with dashes (if the +% "is.dash.repeated.names" user control is nonzero). +FUNCTION {name.or.dash} +{ 's := + oldname empty$ + { s 'oldname := s } + { s oldname = + { is.dash.repeated.names + { repeated.name.dashes } + { s 'oldname := s } + if$ + } + { s 'oldname := s } + if$ + } + if$ +} + +% Converts the number string on the top of the stack to +% "numerical ordinal form" (e.g., "7" to "7th"). There is +% no artificial limit to the upper bound of the numbers as the +% two least significant digits determine the ordinal form. +FUNCTION {num.to.ordinal} +{ duplicate$ #-2 #1 substring$ "1" = + { bbl.th * } + { duplicate$ #-1 #1 substring$ "1" = + { bbl.st * } + { duplicate$ #-1 #1 substring$ "2" = + { bbl.nd * } + { duplicate$ #-1 #1 substring$ "3" = + { bbl.rd * } + { bbl.th * } + if$ + } + if$ + } + if$ + } + if$ +} + +% If the string on the top of the stack begins with a number, +% (e.g., 11th) then replace the string with the leading number +% it contains. Otherwise retain the string as-is. s holds the +% extracted number, t holds the part of the string that remains +% to be scanned. +FUNCTION {extract.num} +{ duplicate$ 't := + "" 's := + { t empty$ not } + { t #1 #1 substring$ + t #2 global.max$ substring$ 't := + duplicate$ is.num + { s swap$ * 's := } + { pop$ "" 't := } + if$ + } + while$ + s empty$ + 'skip$ + { pop$ s } + if$ +} + +% Converts the word number string on the top of the stack to +% Arabic string form. Will be successful up to "tenth". +FUNCTION {word.to.num} +{ duplicate$ "l" change.case$ 's := + s "first" = + { pop$ "1" } + { skip$ } + if$ + s "second" = + { pop$ "2" } + { skip$ } + if$ + s "third" = + { pop$ "3" } + { skip$ } + if$ + s "fourth" = + { pop$ "4" } + { skip$ } + if$ + s "fifth" = + { pop$ "5" } + { skip$ } + if$ + s "sixth" = + { pop$ "6" } + { skip$ } + if$ + s "seventh" = + { pop$ "7" } + { skip$ } + if$ + s "eighth" = + { pop$ "8" } + { skip$ } + if$ + s "ninth" = + { pop$ "9" } + { skip$ } + if$ + s "tenth" = + { pop$ "10" } + { skip$ } + if$ +} + + +FUNCTION {month.word.to.num} +{ duplicate$ "l" change.case$ 's := + s "jan." = s "jan" = s "january" = or or { pop$ "1" } { skip$ } if$ + s "feb." = s "feb" = s "febuary" = or or { pop$ "2" } { skip$ } if$ + s "mar." = s "mar" = s "march" = or or { pop$ "3" } { skip$ } if$ + s "apr." = s "apr" = s "april" = or or { pop$ "4" } { skip$ } if$ + s "may." = s "may" = s "may" = or or { pop$ "5" } { skip$ } if$ + s "jun." = s "jun" = s "june" = or or { pop$ "6" } { skip$ } if$ + s "jul." = s "jul" = s "july" = or or { pop$ "7" } { skip$ } if$ + s "aug." = s "aug" = s "august" = or or { pop$ "8" } { skip$ } if$ + s "sep." = s "sep" = s "september" = or or { pop$ "9" } { skip$ } if$ + s "oct." = s "oct" = s "october" = or or { pop$ "10" } { skip$ } if$ + s "nov." = s "nov" = s "november" = or or { pop$ "11" } { skip$ } if$ + s "dec." = s "dec" = s "december" = or or { pop$ "12" } { skip$ } if$ +} + + +FUNCTION {month.num.to.word} +{ duplicate$ "l" change.case$ 's := + s "1" = { pop$ "Jan." } { skip$ } if$ + s "2" = { pop$ "Feb." } { skip$ } if$ + s "3" = { pop$ "Mar." } { skip$ } if$ + s "4" = { pop$ "Apr." } { skip$ } if$ + s "5" = { pop$ "May" } { skip$ } if$ + s "6" = { pop$ "June" } { skip$ } if$ + s "7" = { pop$ "July" } { skip$ } if$ + s "8" = { pop$ "Aug." } { skip$ } if$ + s "9" = { pop$ "Sep." } { skip$ } if$ + s "10" = { pop$ "Oct." } { skip$ } if$ + s "11" = { pop$ "Nov." } { skip$ } if$ + s "12" = { pop$ "Dec." } { skip$ } if$ +} + +% Converts the string on the top of the stack to numerical +% ordinal (e.g., "11th") form. +FUNCTION {convert.edition} +{ duplicate$ empty$ 'skip$ + { duplicate$ #1 #1 substring$ is.num + { extract.num + num.to.ordinal + } + { word.to.num + duplicate$ #1 #1 substring$ is.num + { num.to.ordinal } + { "edition ordinal word " quote$ * edition * quote$ * + " may be too high (or improper) for conversion" * " in " * cite$ * warning$ + } + if$ + } + if$ + } + if$ +} + + +%%%%%%%%%%%%%%%%%%%%%% +%% JAPANESE HANDLER %% +%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {chk.jp.kanji.str} +% pbibtexで用意されている is.kanji.str$ 関数を使用して日本語エントリか確認 +{ duplicate$ empty$ + { pop$ #0 } % フィールドが空ならチェックせず #0 を返す + { is.kanji.str$ #1 = { #1 } { #0 } if$ } + if$ +} + + +FUNCTION {chk.jp.entry.pbibtex} +% author, title, journal, publisher のフィールドについて +% 日本語文字を探索し、どれか一つでも日本語が含まれていたら +% japanese.flag に #1 を代入、名前フォーマットも上書き +{ author chk.jp.kanji.str #1 = + title chk.jp.kanji.str #1 = or + journal chk.jp.kanji.str #1 = or + publisher chk.jp.kanji.str #1 = or + { #1 'japanese.flag := + default.name.format.jp.string 'name.format.string := } + { skip$ } + if$ +} + + +FUNCTION {emphasize.title} +% タイトルの強調表示設定、emphasize すると \emph{} 内に入れるため、英語では斜体になる。 +% 日本語ではゴシック体となるが、不自然なためデフォルトでは \emph{} に入れる処理をスキップ。 +{ 's := + use.ieej.setting #0 = + { japanese.flag #1 = + % IEEE/JP は 設定により emphasize (斜体ではなく太字になり不自然なため) + { ieee.jp.setting.emph.title #1 = { emphasize } { skip$ } if$ } + % IEEE/EN は emphasize + { emphasize } + if$ + } + { japanese.flag #1 = + % 電気学会では、日本語も英語も設定で変更。 + { ieej.jp.setting.emph.journal #1 = s "journal" = and { #1 } { #0 } if$ + ieej.jp.setting.emph.booktitle #1 = s "booktitle" = and { #1 } { #0 } if$ + or { emphasize } { skip$ } if$ + } + { ieej.en.setting.emph.journal #1 = s "journal" = and { #1 } { #0 } if$ + ieej.en.setting.emph.booktitle #1 = s "booktitle" = and { #1 } { #0 } if$ + or { emphasize } { skip$ } if$ + } + if$ + } + if$ +} + + +FUNCTION {format.jp.edition} +% 版情報の整形 +% 日本語では 第n版 と、第と版で挟む。第1版は初版へと変更する。 +% 英語では 1st ed. 2nd ed. 等へと整形する。 +{ use.ieej.setting #1 = japanese.flag #1 = and + { duplicate$ "1" = { pop$ "初版" * } { "第" swap$ * * "版" * } if$ } + { convert.edition "l" change.case$ * "~" * bbl.edition * } + if$ +} + + +FUNCTION {bbl.title.edition.sep} +% 本のタイトルと版情報の間の区切り文字を制御。 +{ japanese.flag #1 = { "," * } { ", " * } if$ } + + +FUNCTION {format.jp.year} +% 電気学会形式では、出版社は ( と ) で挟む +% ただしオプションで変更可 +{ use.ieej.setting #1 = + { bbl.ieej.year.aft * bbl.ieej.year.pre swap$ * * } + { * } + if$ +} + + +FUNCTION {format.jp.title} +% 電気学会形式かつ日本語文献のときは、タイトルを 「 と 」 で挟む +% ただしオプションで変更可 +{ use.ieej.setting #1 = japanese.flag #1 = and + { bbl.ieej.title.pre swap$ * bbl.ieej.title.aft * } + { skip$ } + if$ +} + + +FUNCTION {author.sep} +% IEEEでも電気学会でも、最後の著者以外は +% 所定文字を場合分けして挿入する +{ use.ieej.setting #0 = + { japanese.flag #1 = { "," } { ", " } if$ } + { japanese.flag #1 = { bbl.ieej.jp.author.sep } { bbl.ieej.en.author.sep } if$ } + if$ +} + + +FUNCTION {author.sep.last} +{ use.ieej.setting #0 = + { japanese.flag #0 = % IEEE 形式の場合、and の取り扱いに注意 + { ", " * bbl.and space.word } % 英語ではカンマの後 and を挿入 + { "," } % 日本語では他と同様に全角カンマのみ + if$ + } + { japanese.flag #0 = % 電気学会形式の場合、and を使用せず、予め設定したものを返す + { bbl.ieej.en.author.sep } + { bbl.ieej.jp.author.sep } + if$ + } + if$ +} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LATEX BIBLIOGRAPHY CODE %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {start.entry} +{ newline$ + "\bibitem{" write$ + cite$ write$ + "}" write$ + newline$ + "" + initialize.prev.this.status + chk.jp.entry.pbibtex +} + +% Here we write out all the LaTeX code that we will need. The most involved +% code sequences are those that control the alternate interword spacing and +% foreign language hyphenation patterns. The heavy use of \providecommand +% gives users a way to override the defaults. Special thanks to Javier Bezos, +% Johannes Braams, Robin Fairbairns, Heiko Oberdiek, Donald Arseneau and all +% the other gurus on comp.text.tex for their help and advice on the topic of +% \selectlanguage, Babel and BibTeX. +FUNCTION {begin.bib} +{ "% Generated by " bst.file.name * ", version: " * + bst.file.version * " (" * bst.file.date * ")" * + write$ newline$ + preamble$ empty$ 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" longest.label * "}" * + write$ newline$ + "\providecommand{\url}[1]{#1}" + write$ newline$ + "\csname url@samestyle\endcsname" + write$ newline$ + "\providecommand{\newblock}{\relax}" + write$ newline$ + "\providecommand{\bibinfo}[2]{#2}" + write$ newline$ + "\providecommand{\BIBentrySTDinterwordspacing}{\spaceskip=0pt\relax}" + write$ newline$ + "\providecommand{\BIBentryALTinterwordstretchfactor}{" + ALTinterwordstretchfactor * "}" * + write$ newline$ + "\providecommand{\BIBentryALTinterwordspacing}{\spaceskip=\fontdimen2\font plus " + write$ newline$ + "\BIBentryALTinterwordstretchfactor\fontdimen3\font minus \fontdimen4\font\relax}" + write$ newline$ + "\providecommand{\BIBforeignlanguage}[2]{{%" + write$ newline$ + "\expandafter\ifx\csname l@#1\endcsname\relax" + write$ newline$ + "\typeout{** WARNING: " bst.file.name * ": No hyphenation pattern has been}%" * + write$ newline$ + "\typeout{** loaded for the language `#1'. Using the pattern for}%" + write$ newline$ + "\typeout{** the default language instead.}%" + write$ newline$ + "\else" + write$ newline$ + "\language=\csname l@#1\endcsname" + write$ newline$ + "\fi" + write$ newline$ + "#2}}" + write$ newline$ + "\providecommand{\BIBdecl}{\relax}" + write$ newline$ + "\BIBdecl" + write$ newline$ +} + +FUNCTION {end.bib} +{ newline$ "\end{thebibliography}" write$ newline$ } + +FUNCTION {if.url.alt.interword.spacing} +{ is.use.alt.interword.spacing + { is.use.url + { url empty$ 'skip$ {"\BIBentryALTinterwordspacing" write$ newline$} if$ } + { skip$ } + if$ + } + { skip$ } + if$ +} + +FUNCTION {if.url.std.interword.spacing} +{ is.use.alt.interword.spacing + { is.use.url + { url empty$ 'skip$ {"\BIBentrySTDinterwordspacing" write$ newline$} if$ } + { skip$ } + if$ + } + { skip$ } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%%%%%% +%% LONGEST LABEL PASS %% +%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #1 'number.label := + #0 'longest.label.width := +} + +FUNCTION {longest.label.pass} +{ type$ "ieeetranbstctl" = + { skip$ } + { number.label int.to.str$ 'label := + number.label #1 + 'number.label := + label width$ longest.label.width > + { label 'longest.label := + label width$ 'longest.label.width := + } + { skip$ } + if$ + } + if$ +} + + + +%%%%%%%%%%%%%%%%%%%%% +%% FORMAT HANDLERS %% +%%%%%%%%%%%%%%%%%%%%% + +%% Lower Level Formats (used by higher level formats) + +FUNCTION {format.pub} +{ 't := + "" + t empty$ + { skip$ } + { this.to.prev.status + this.status.std + cap.status.std + t * + } + if$ +} + +FUNCTION {format.address.org.or.pub.date} +{ 't := + "" + year empty$ + { "empty year in " cite$ * warning$ } + { skip$ } + if$ + address empty$ t empty$ and + year empty$ and month empty$ and + { skip$ } + { this.to.prev.status + this.status.std + cap.status.std + address "address" bibinfo.check * + t empty$ + { skip$ } + { japanese.flag #1 = + { punct.no 'prev.status.punct := } + { punct.period 'prev.status.punct := } + if$ + space.large 'prev.status.space := + address empty$ + { skip$ } + { ": " * } + if$ + t * + } + if$ + language empty.field.to.null.string + duplicate$ empty$ bbl.format.language #1 = not or + { * } + { capitalize " (in " swap$ * ")" * * } + if$ + year empty$ month empty$ and + { skip$ } + { t empty$ address empty$ and + { skip$ } + { use.ieej.setting #1 = + { japanese.flag #1 = { skip$ } { " " * } if$ } + { japanese.flag #1 = { "," * } { ", " * } if$ } + if$ + } + if$ + month empty$ + { year empty$ + { skip$ } + { year "year" bibinfo.check format.jp.year } + if$ + } + { month "month" bibinfo.check month.word.to.num + use.ieej.setting #1 = + { format.month.ieej #1 = { month.num.to.word } { skip$ } if$ } + { format.month.ieee #1 = { month.num.to.word } { skip$ } if$ } + if$ + * + year empty$ + { skip$ } + { " " * year "year" bibinfo.check * } + if$ + } + if$ + } + if$ + } + if$ +} + +FUNCTION {format.names} +{ 'bibinfo := + duplicate$ empty$ 'skip$ { + this.to.prev.status + this.status.std + 's := + japanese.flag #1 = { s purify$ 's := } { skip$ } if$ + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr name.format.string format.name$ + s nameptr "~{ll}" format.name$ = % check for insititution(s) without space + { s nameptr "{ll}" format.name$ } % for institution(s) without space + { s nameptr name.format.string format.name$ } % for usual author(s) + if$ + bibinfo bibinfo.check + 't := + nameptr #1 > + { nameptr num.names.shown.with.forced.et.al #1 + = + numnames max.num.names.before.forced.et.al > + is.forced.et.al and and + { "others" 't := #1 'namesleft := } + { skip$ } + if$ + namesleft #1 > + { author.sep * t do.name.latex.cmd * } + { s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + t "others" = + { japanese.flag #1 = + { "・" * bbl.etal } + { " " * bbl.etal emphasize } + if$ * + } + { author.sep.last * t do.name.latex.cmd * } + if$ + } + if$ + } + { t do.name.latex.cmd } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + cap.status.std + } if$ +} + + + + +%% Higher Level Formats + +%% addresses/locations + +FUNCTION {format.address} +{ address duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + + + +%% author/editor names + +FUNCTION {format.authors} +{ author "author" format.names + use.ieej.setting #1 = + { bbl.ieej.author.title.sep * + punct.no 'this.status.punct := } + { skip$ } + if$ +} + +FUNCTION {format.editors} +{ editor "editor" format.names duplicate$ empty$ 'skip$ + { ", " * + get.bbl.editor + capitalize + * + } + if$ +} + + + +%% date + +FUNCTION {format.date} +{ month "month" bibinfo.check month.word.to.num + use.ieej.setting #1 = + { format.month.ieej #1 = { month.num.to.word } { skip$ } if$ } + { format.month.ieee #1 = { month.num.to.word } { skip$ } if$ } + if$ + duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { swap$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + "there's a month but no year in " cite$ * warning$ } + if$ + * + } + { this.to.prev.status + this.status.std + cap.status.std + use.ieej.setting #1 = + { swap$ + { * } + { use.ieej.abbrev #1 = + { swap$ pop$ } + { bbl.ieej.year.month.sep * swap$ * } + if$ + } + if$ + } + { swap$ 'skip$ { swap$ " " * swap$ } if$ * } + if$ + use.ieej.setting #1 = + { bbl.ieej.year.aft * bbl.ieej.year.pre swap$ * + ieej.setting.punct.year.aft #0 = + { punct.no 'this.status.punct := } + { skip$ } + if$ + ieej.setting.comma.year.pre #0 = + { punct.no 'prev.status.punct := } + { skip$ } + if$ + } + { skip$ } + if$ + } + if$ +} + +FUNCTION {format.date.electronic} +{ month "month" bibinfo.check duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { swap$ + { pop$ } + { "there's a month but no year in " cite$ * warning$ + pop$ ")" * "(" swap$ * + this.to.prev.status + punct.no 'this.status.punct := + space.normal 'this.status.space := + quote.no 'this.status.quote := + cap.yes 'status.cap := + } + if$ + } + { swap$ + { swap$ pop$ ")" * "(" swap$ * } + { "(" swap$ * ", " * swap$ * ")" * } + if$ + this.to.prev.status + punct.no 'this.status.punct := + space.normal 'this.status.space := + quote.no 'this.status.quote := + cap.yes 'status.cap := + } + if$ +} + + + +%% edition/title + +% Note: The IEEE considers the edition to be closely associated with +% the title of a book. So, in IEEEtran.bst the edition is normally handled +% within the formatting of the title. The format.edition function is +% retained here for possible future use. +FUNCTION {format.edition} +{ edition duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + convert.edition + status.cap + { "t" } + { "l" } + if$ change.case$ + "edition" bibinfo.check + "~" * bbl.edition * + cap.status.std + } + if$ +} + +% This is used to format the booktitle of a conference proceedings. +% Here we use the "intype" field to provide the user a way to +% override the word "in" (e.g., with things like "presented at") +% Use of intype stops the emphasis of the booktitle to indicate that +% we no longer mean the written conference proceedings, but the +% conference itself. +FUNCTION {format.in.booktitle} +{ booktitle "booktitle" bibinfo.check duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + select.language + intype missing$ + { japanese.flag #1 = + { "" } + { "booktitle" emphasize.title bbl.in " " * } + if$ + } + { intype " " * } + if$ + swap$ * + cap.status.std + } + if$ +} + + +% This is used to format the booktitle of collection. +% Here the "intype" field is not supported, but "edition" is. +FUNCTION {format.in.booktitle.edition} +{ booktitle "booktitle" bibinfo.check duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + select.language + japanese.flag #1 = + { punct.comma 'prev.status.punct := } + { skip$ } + if$ + "booktitle" emphasize.title + edition empty$ + { skip$ } + { bbl.title.edition.sep edition format.jp.edition } + if$ + japanese.flag #1 = + { space.normal 'prev.status.space := } + { bbl.in " " * swap$ *} + if$ + cap.status.std + } + if$ +} + +FUNCTION {format.article.title} +{ title duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + "t" change.case$ + } + if$ + "title" bibinfo.check + duplicate$ empty$ 'skip$ + { quote.close 'this.status.quote := + is.last.char.not.punct + { punct.std 'this.status.punct := } + { use.ieej.setting #1 = bbl.ieej.force.punct.aft.quote #1 = and + { punct.std 'this.status.punct := } + { punct.no 'this.status.punct := } + if$ + } + if$ + select.language + use.ieej.setting #1 = + { bbl.ieej.title.pre swap$ * } + { "``" swap$ * } + if$ + cap.status.std + } + if$ +} + +FUNCTION {format.article.title.electronic} +{ title duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + "t" change.case$ + } + if$ + "title" bibinfo.check + duplicate$ empty$ + { skip$ } + { select.language } + if$ +} + +FUNCTION {format.book.title.edition} +{ title "title" bibinfo.check + duplicate$ empty$ + { "empty title in " cite$ * warning$ } + { this.to.prev.status + this.status.std + select.language + format.jp.title + "booktitle" emphasize.title + edition empty$ + { skip$ } + { bbl.title.edition.sep edition format.jp.edition } + if$ + use.ieej.setting #1 = + { space.normal 'prev.status.space := } + { skip$ } + if$ + cap.status.std + punct.comma 'this.status.punct := + use.ieej.setting #1 = + { skip$ } + { punct.comma 'prev.status.punct := } + if$ + } + if$ +} + +FUNCTION {format.book.title} +{ title "title" bibinfo.check + duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + select.language + format.jp.title + "booktitle" emphasize.title + } + if$ +} + + + +%% journal + +FUNCTION {format.journal} +{ journal duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + select.language + "journal" emphasize.title + } + if$ +} + + + +%% how published + +FUNCTION {format.howpublished} +{ howpublished duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + + + +%% institutions/organization/publishers/school + +FUNCTION {format.institution} +{ institution duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + +FUNCTION {format.organization} +{ organization duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + +FUNCTION {format.publisher} +{ publisher "publisher" bibinfo.warn format.pub } + +FUNCTION {format.address.publisher.date} +{ publisher "publisher" bibinfo.warn format.address.org.or.pub.date } + +FUNCTION {format.address.publisher.date.nowarn} +{ publisher "publisher" bibinfo.check format.address.org.or.pub.date } + +FUNCTION {format.address.organization.date} +{ organization "organization" bibinfo.check format.address.org.or.pub.date } + +FUNCTION {format.school} +{ school duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + +FUNCTION {format.language} +{ language empty.field.to.null.string + duplicate$ empty$ bbl.format.language #0 = or 'skip$ + { this.to.prev.status + this.status.std + capitalize + punct.comma 'this.status.punct := + bbl.format.language.punct #0 = + { punct.no 'this.status.punct := } + { skip$ } + if$ + "(in " swap$ * ")" * + cap.status.std + } + if$ +} + + +%% volume/number/series/chapter/pages + +FUNCTION {format.volume} +{ volume empty.field.to.null.string + duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + use.ieej.setting #1 = + { bbl.ieej.vol swap$ "volume" bibinfo.check * bbl.ieej.vol.aft * + use.ieej.abbrev #1 = + { punct.no 'this.status.punct := + space.no 'this.status.space := + } + { skip$ } + if$ + } + { bbl.volume + status.cap + { capitalize } + { skip$ } + if$ + swap$ tie.or.space.prefix + "volume" bibinfo.check + * * + cap.status.std + } + if$ + } + if$ +} + +FUNCTION {format.number} +{ number empty.field.to.null.string + duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + use.ieej.setting #1 = + { bbl.ieej.no swap$ "number" bibinfo.check * bbl.ieej.no.aft * } + { status.cap + { bbl.number capitalize } + { bbl.number } + if$ + swap$ tie.or.space.prefix + "number" bibinfo.check + * * + cap.status.std + } + if$ + } + if$ +} + +FUNCTION {format.number.if.use.for.article} +{ is.use.number.for.article + { format.number } + { "" } + if$ +} + +% The IEEE does not seem to tie the series so closely with the volume +% and number as is done in other bibliography styles. Instead the +% series is treated somewhat like an extension of the title. +FUNCTION {format.series} +{ series empty$ + { "" } + { this.to.prev.status + this.status.std + bbl.series " " * + series "series" bibinfo.check * + cap.status.std + } + if$ +} + + +FUNCTION {format.chapter} +{ chapter empty$ + { "" } + { this.to.prev.status + this.status.std + use.ieej.setting #0 = + { type empty$ + { bbl.chapter } + { type "l" change.case$ + "type" bibinfo.check + } + if$ + chapter tie.or.space.prefix + "chapter" bibinfo.check + * * + cap.status.std + } + { type empty$ + { bbl.ieej.chapter.pre } + { type "l" change.case$ + "type" bibinfo.check + } + if$ + chapter + bbl.ieej.chapter.tie.pre #1 = + { tie.or.space.prefix } + { "" } + if$ + "chapter" bibinfo.check + * * + bbl.ieej.chapter.aft + bbl.ieej.chapter.tie.aft #1 = + { tie.or.space.prefix } + { "" } + if$ + "chapter" bibinfo.check + * * + cap.status.std + } + if$ + } + if$ +} + + +% The intended use of format.paper is for paper numbers of inproceedings. +% The paper type can be overridden via the type field. +% We allow the type to be displayed even if the paper number is absent +% for things like "postdeadline paper" +FUNCTION {format.paper} +{ is.use.paper + { paper empty$ + { type empty$ + { "" } + { this.to.prev.status + this.status.std + type "type" bibinfo.check + cap.status.std + } + if$ + } + { this.to.prev.status + this.status.std + type empty$ + { bbl.paper } + { type "type" bibinfo.check } + if$ + " " * paper + "paper" bibinfo.check + * + cap.status.std + } + if$ + } + { "" } + if$ +} + + +FUNCTION {format.pages} +{ pages duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + duplicate$ is.multiple.pages + { use.ieej.setting #1 = + { bbl.ieej.pages swap$ } + { bbl.pages swap$ } + if$ + n.dashify + } + { use.ieej.setting #1 = + { bbl.ieej.page swap$ } + { bbl.page swap$ } + if$ + } + if$ + use.ieej.setting #1 = { "" } { tie.or.space.prefix } if$ + "pages" bibinfo.check + * * + cap.status.std + } + if$ +} + + + +%% technical report number + +FUNCTION {format.tech.report.number} +{ number "number" bibinfo.check + this.to.prev.status + this.status.std + cap.status.std + type duplicate$ empty$ + { pop$ + bbl.techrep + } + { skip$ } + if$ + "type" bibinfo.check + swap$ duplicate$ empty$ + { pop$ } + { tie.or.space.prefix * * } + if$ +} + + + +%% note + +FUNCTION {format.note} +{ note empty$ + { "" } + { this.to.prev.status + this.status.std + punct.period 'this.status.punct := + note #1 #1 substring$ + duplicate$ "{" = + { skip$ } + { status.cap + { "u" } + { "l" } + if$ + change.case$ + } + if$ + note #2 global.max$ substring$ * "note" bibinfo.check + cap.yes 'status.cap := + } + if$ +} + + + +%% patent + +FUNCTION {format.patent.date} +{ this.to.prev.status + this.status.std + year empty$ + { monthfiled duplicate$ empty$ + { "monthfiled" bibinfo.check pop$ "" } + { "monthfiled" bibinfo.check } + if$ + dayfiled duplicate$ empty$ + { "dayfiled" bibinfo.check pop$ "" * } + { "dayfiled" bibinfo.check + monthfiled empty$ + { "dayfiled without a monthfiled in " cite$ * warning$ + * + } + { " " swap$ * * } + if$ + } + if$ + yearfiled empty$ + { "no year or yearfiled in " cite$ * warning$ } + { yearfiled "yearfiled" bibinfo.check + swap$ + duplicate$ empty$ + { pop$ } + { ", " * swap$ * } + if$ + } + if$ + } + { month duplicate$ empty$ + { "month" bibinfo.check pop$ "" } + { "month" bibinfo.check } + if$ + day duplicate$ empty$ + { "day" bibinfo.check pop$ "" * } + { "day" bibinfo.check + month empty$ + { "day without a month in " cite$ * warning$ + * + } + { " " swap$ * * } + if$ + } + if$ + year "year" bibinfo.check + swap$ + duplicate$ empty$ + { pop$ } + { ", " * swap$ * } + if$ + } + if$ + cap.status.std +} + +FUNCTION {format.patent.nationality.type.number} +{ this.to.prev.status + this.status.std + nationality duplicate$ empty$ + { "nationality" bibinfo.warn pop$ "" } + { "nationality" bibinfo.check + duplicate$ "l" change.case$ "united states" = + { pop$ bbl.patentUS } + { skip$ } + if$ + " " * + } + if$ + type empty$ + { bbl.patent "type" bibinfo.check } + { type "type" bibinfo.check } + if$ + * + number duplicate$ empty$ + { "number" bibinfo.warn pop$ } + { "number" bibinfo.check + large.number.separate + swap$ " " * swap$ * + } + if$ + cap.status.std +} + + + +%% standard + +FUNCTION {format.organization.institution.standard.type.number} +{ this.to.prev.status + this.status.std + organization duplicate$ empty$ + { pop$ + institution duplicate$ empty$ + { "institution" bibinfo.warn } + { "institution" bibinfo.warn " " * } + if$ + } + { "organization" bibinfo.warn " " * } + if$ + type empty$ + { bbl.standard "type" bibinfo.check } + { type "type" bibinfo.check } + if$ + * + number duplicate$ empty$ + { "number" bibinfo.check pop$ } + { "number" bibinfo.check + large.number.separate + swap$ " " * swap$ * + } + if$ + cap.status.std +} + +FUNCTION {format.revision} +{ revision empty$ + { "" } + { this.to.prev.status + this.status.std + bbl.revision + revision tie.or.space.prefix + "revision" bibinfo.check + * * + cap.status.std + } + if$ +} + + +%% thesis + +FUNCTION {format.master.thesis.type} +{ this.to.prev.status + this.status.std + type empty$ + { + bbl.mthesis + } + { + type "type" bibinfo.check + } + if$ +cap.status.std +} + +FUNCTION {format.phd.thesis.type} +{ this.to.prev.status + this.status.std + type empty$ + { + bbl.phdthesis + } + { + type "type" bibinfo.check + } + if$ +cap.status.std +} + + + +%% URL + +FUNCTION {format.url} +{ is.use.url + { url empty$ + { "" } + { this.to.prev.status + this.status.std + cap.yes 'status.cap := + name.url.prefix " " * + "\url{" * url * "}" * + punct.no 'this.status.punct := + punct.period 'prev.status.punct := + space.normal 'this.status.space := + space.normal 'prev.status.space := + quote.no 'this.status.quote := + } + if$ + } + { "" } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%% +%% ENTRY HANDLERS %% +%%%%%%%%%%%%%%%%%%%% + + +% Note: In many journals, the IEEE (or the authors) tend not to show the number +% for articles, so the display of the number is controlled here by the +% switch "is.use.number.for.article" +FUNCTION {article} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + use.ieej.abbrev #1 = + { skip$ } + { format.article.title "title" output.warn } + if$ + bbl.format.language #1 = { format.language output } 'skip$ if$ + format.journal "journal" bibinfo.check "journal" output.warn + format.volume output + format.number.if.use.for.article output + format.pages output + format.date "year" output.warn + format.note output + format.url output + bbl.format.language #2 = { format.language output } 'skip$ if$ + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {book} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + author empty$ + { format.editors "author and editor" output.warn } + { format.authors output.nonnull } + if$ + name.or.dash + format.book.title.edition output + format.series output + author empty$ + { skip$ } + { format.editors output } + if$ + use.ieej.setting #1 = + { format.publisher output } + { format.address.publisher.date output } + if$ + format.volume output + format.number output + format.note output + use.ieej.setting #0 = 'skip$ { format.date output } if$ + format.url output + bbl.format.language #2 = { format.language output } 'skip$ if$ + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {booklet} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.article.title "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.date output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {electronic} +{ std.status.using.period + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.date.electronic output + format.article.title.electronic output + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.note output + format.url output + fin.entry + empty.entry.warn + if.url.std.interword.spacing +} + +FUNCTION {inbook} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + author empty$ + { format.editors "author and editor" output.warn } + { format.authors output.nonnull } + if$ + name.or.dash + format.book.title.edition output + format.series output + use.ieej.setting #1 = + { format.publisher output } + { format.address.publisher.date output } + if$ + format.volume output + format.number output + format.chapter output + format.pages output + format.note output + use.ieej.setting #0 = 'skip$ { format.date output } if$ + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {incollection} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.in.booktitle.edition "booktitle" output.warn + format.series output + format.editors output + use.ieej.setting #1 = + { format.publisher output } + { format.address.publisher.date output } + if$ + format.volume output + format.number output + format.chapter output + format.pages output + format.note output + use.ieej.setting #0 = 'skip$ { format.date output } if$ + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {inproceedings} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + use.ieej.abbrev #1 = + { skip$ } + { format.article.title "title" output.warn } + if$ + format.in.booktitle "booktitle" output.warn + format.series output + format.editors output + format.volume output + format.number output + use.ieej.setting #1 = + { format.paper output + format.pages output + use.ieej.abbrev #1 = + { skip$ } + { format.address output } + if$ + } + { publisher empty$ + { format.address.organization.date output } + { format.organization "organization" bibinfo.check output + format.address.publisher.date output + } + if$ + format.paper output + format.pages output + } + if$ + format.note output + use.ieej.setting #0 = 'skip$ { format.date output } if$ + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {manual} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.book.title.edition "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.date output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {mastersthesis} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.master.thesis.type output.nonnull + format.school "school" bibinfo.warn output + format.address "address" bibinfo.check output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {misc} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.article.title output + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.pages output + format.date output + format.note output + format.url output + fin.entry + empty.entry.warn + if.url.std.interword.spacing +} + +FUNCTION {patent} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.article.title output + format.patent.nationality.type.number output + format.patent.date output + format.note output + format.url output + fin.entry + empty.entry.warn + if.url.std.interword.spacing +} + +FUNCTION {periodical} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.editors output + name.or.dash + format.book.title "title" output.warn + format.series output + format.volume output + format.number output + format.organization "organization" bibinfo.check output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {phdthesis} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.phd.thesis.type output.nonnull + format.school "school" bibinfo.warn output + format.address "address" bibinfo.check output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {proceedings} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.editors output + name.or.dash + format.book.title "title" output.warn + format.series output + format.volume output + format.number output + publisher empty$ + { format.address.organization.date output } + { format.organization "organization" bibinfo.check output + format.address.publisher.date output + } + if$ + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {standard} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.book.title "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.organization.institution.standard.type.number output + format.revision output + format.date output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {techreport} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.institution "institution" bibinfo.warn output + format.address "address" bibinfo.check output + format.tech.report.number output.nonnull + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {unpublished} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.date output + format.note "note" output.warn + format.url output + fin.entry + if.url.std.interword.spacing +} + + +% The special entry type which provides the user interface to the +% BST controls +FUNCTION {IEEEtranBSTCTL} +{ is.print.banners.to.terminal + { "** IEEEtran BST control entry " quote$ * cite$ * quote$ * " detected." * + top$ + } + { skip$ } + if$ + CTLuse_article_number + empty$ + { skip$ } + { CTLuse_article_number + yes.no.to.int + 'is.use.number.for.article := + } + if$ + CTLuse_paper + empty$ + { skip$ } + { CTLuse_paper + yes.no.to.int + 'is.use.paper := + } + if$ + CTLuse_url + empty$ + { skip$ } + { CTLuse_url + yes.no.to.int + 'is.use.url := + } + if$ + CTLuse_forced_etal + empty$ + { skip$ } + { CTLuse_forced_etal + yes.no.to.int + 'is.forced.et.al := + } + if$ + CTLmax_names_forced_etal + empty$ + { skip$ } + { CTLmax_names_forced_etal + string.to.integer + 'max.num.names.before.forced.et.al := + } + if$ + CTLnames_show_etal + empty$ + { skip$ } + { CTLnames_show_etal + string.to.integer + 'num.names.shown.with.forced.et.al := + } + if$ + CTLuse_alt_spacing + empty$ + { skip$ } + { CTLuse_alt_spacing + yes.no.to.int + 'is.use.alt.interword.spacing := + } + if$ + CTLalt_stretch_factor + empty$ + { skip$ } + { CTLalt_stretch_factor + 'ALTinterwordstretchfactor := + "\renewcommand{\BIBentryALTinterwordstretchfactor}{" + ALTinterwordstretchfactor * "}" * + write$ newline$ + } + if$ + CTLdash_repeated_names + empty$ + { skip$ } + { CTLdash_repeated_names + yes.no.to.int + 'is.dash.repeated.names := + } + if$ + CTLname_format_string + empty$ + { skip$ } + { CTLname_format_string + 'name.format.string := + } + if$ + CTLname_latex_cmd + empty$ + { skip$ } + { CTLname_latex_cmd + 'name.latex.cmd := + } + if$ + CTLname_url_prefix + missing$ + { skip$ } + { CTLname_url_prefix + 'name.url.prefix := + } + if$ + CTLuse_ieej_abbrev + empty$ + { skip$ } + { CTLuse_ieej_abbrev + yes.no.to.int + 'use.ieej.abbrev := + use.ieej.setting #1 = + { use.ieej.abbrev 'is.forced.et.al := } + { skip$ } + if$ + } + if$ + + num.names.shown.with.forced.et.al max.num.names.before.forced.et.al > + { "CTLnames_show_etal cannot be greater than CTLmax_names_forced_etal in " cite$ * warning$ + max.num.names.before.forced.et.al 'num.names.shown.with.forced.et.al := + } + { skip$ } + if$ +} + + +%%%%%%%%%%%%%%%%%%% +%% ENTRY ALIASES %% +%%%%%%%%%%%%%%%%%%% +FUNCTION {conference}{inproceedings} +FUNCTION {online}{electronic} +FUNCTION {internet}{electronic} +FUNCTION {webpage}{electronic} +FUNCTION {www}{electronic} +FUNCTION {default.type}{misc} + + + +%%%%%%%%%%%%%%%%%% +%% MAIN PROGRAM %% +%%%%%%%%%%%%%%%%%% + +READ + +EXECUTE {initialize.controls} +EXECUTE {initialize.status.constants} +EXECUTE {banner.message} + +EXECUTE {initialize.longest.label} +ITERATE {longest.label.pass} + +EXECUTE {begin.bib} +ITERATE {call.type$} +EXECUTE {end.bib} + +EXECUTE{completed.message} + + +%% That's all folks, mds. diff --git a/biblio/bibtex/contrib/ieejtran/README b/biblio/bibtex/contrib/ieejtran/README new file mode 100644 index 0000000000..643f36b7be --- /dev/null +++ b/biblio/bibtex/contrib/ieejtran/README @@ -0,0 +1,22 @@ +March 26, 2021 + + +IEEJtran is an UNOFFICIAL BibTeX style for authors of the Institute of +Electrical Engineers of Japan (IEEJ) transactions journals and conferences. +IEEJtran is an expansion package of Michael Shell's IEEEtran package. +The latest version of the IEEJtran package can be found at CTAN: + +http://www.ctan.org/pkg/ieejtran + +Problems, requests, tips, beta releases, and other support, can be seen +in IEEJtran's GitHub page: + +https://github.com/ehki/jIEEEtran + +NOTE: The author also developing jIEEEtran.bst in the same repository. + +IEEJtran may be distributed and/or modified under the terms of MIT license. + +Best wishes for all your publication endeavors, + +Haruki Ejiri diff --git a/biblio/bibtex/contrib/ieejtran/ieejtran-en.pdf b/biblio/bibtex/contrib/ieejtran/ieejtran-en.pdf Binary files differnew file mode 100644 index 0000000000..70f66605ad --- /dev/null +++ b/biblio/bibtex/contrib/ieejtran/ieejtran-en.pdf diff --git a/biblio/bibtex/contrib/ieejtran/ieejtran-en.tex b/biblio/bibtex/contrib/ieejtran/ieejtran-en.tex new file mode 100644 index 0000000000..2fa8a6af27 --- /dev/null +++ b/biblio/bibtex/contrib/ieejtran/ieejtran-en.tex @@ -0,0 +1,86 @@ +\documentclass[11pt, a4paper, dvipdfmx]{article} + +\usepackage{bxtexlogo} + +\begin{filecontents}[overwrite]{library.bib} +@misc{IEEEtran, + author = {Michael Shell}, + url = {https://www.ctan.org/tex-archive/macros/latex/contrib/IEEEtran/bibtex}, + title = {{IEEEtran}}, + month = {August}, + year = {2015} +} +@misc{jIEEEtran, + author = {ehki}, + url = {https://github.com/ehki/jIEEEtran}, + title = {{jIEEEtran}}, + month = {March}, + year = {2020} +} +@misc{jeconbst, + author = {ShiroTakeda}, + url = {http://shirotakeda.org/ja/tex-ja/jecon-ja.html}, + title = {{jecon.bst}}, + month = {August}, + year = {2019} +} +\end{filecontents} + + +\title{\texttt{IEEJtran.bst}:\\Unofficial IEEJ \BibTeX\ style\\(ver. 0.18)} +\author{Haruki EJIRI} + +\begin{document} + +\maketitle + +\begin{abstract} +The IEEJtran \BibTeX\ style is an unofficial citation format for Institute of Electrical Engineers of Japan transactions. +It is a customization of Michael Shell's IEEEtran.bst. +A Python script named mixej.py enables one content with both English and Japanese format to be handled properly. +\end{abstract} + + +\section{Introduction} + +IEEJtran.bst is an unofficial \BibTeX-style (.bst) file in IEEJ format developed for Japanese users engaging in electrical engineering. +YoshiRi implemented natural Japanese notation based on Michael Shell's IEEEtran.bst[?]. +And now the author develops it in GitHub repository [?] after taking it over. +Please note IEEJtran.bst is unofficial. +The author does not guarantee that it will work in all environments. +We cannot be held responsible for any problems that may occur. +We recommend platex/pbibtex or uplatex/upbibtex as \TeX\ engines. + + +\section{Configuration} + +If IEEJtran.bst has been installed by \TeX\ Live package manager, etc., and placed under PATH, write \texttt{\string\bibliographystyle\string{IEEJtran\string}} in the preamble to complete the setup. +In the case that IEEJtran.bst is individually downloaded and placed in the same directory as the main \TeX\ file such a reason for customization, state \texttt{\string\bibliographystyle\string{IEEJtran\string}} in the preamble in the same way to complete the setting. +In the .bib file containing bibliographic information, Japanese authors' names should be written as: +\begin{center} +\texttt{author = \string{\string{Yamada Taro\string} and \string{Sato Jiro\string}\string}}, +\end{center} +or +\begin{center} +\texttt{author = \string{Yamada, Taro and Sato, Jiro\string}}. +\end{center} + + +\section{Combine English and Japanese entries} + +Japanese users are sometimes required to write both English and Japanese citation formats as one bibliography entry. +A python script named \texttt{mixej.py} included in the \texttt{ieejtran} package enables combining English and Japanese entries. +To combine two entries of enkey and jpkey, users have to cite as \texttt{\string\cite\string{enkye/ej/jpkey\string}}, where enkey and jpkey are English and Japanese citation keys, respectively. +Then compile by the following seven steps: +\begin{center} + \texttt{uplatex → python mixej.py → upbibtex → python mixej.py\\→ uplatex → uplatex → dvipdfmx} +\end{center} +instead of the typical five steps: +\begin{center} + \texttt{uplatex → upbibtex → uplatex → uplatex → dvipdfmx}. +\end{center} +Note that the uplatex command is Unicode and Japanese compatible latex command. + +The Japanese version of this document, \texttt{ieejtran.pdf}, shows examples for English and Japanese combined citations. + +\end{document} diff --git a/biblio/bibtex/contrib/ieejtran/ieejtran.pdf b/biblio/bibtex/contrib/ieejtran/ieejtran.pdf Binary files differnew file mode 100644 index 0000000000..0d0184d6d1 --- /dev/null +++ b/biblio/bibtex/contrib/ieejtran/ieejtran.pdf diff --git a/biblio/bibtex/contrib/ieejtran/ieejtran.tex b/biblio/bibtex/contrib/ieejtran/ieejtran.tex new file mode 100644 index 0000000000..042595eb11 --- /dev/null +++ b/biblio/bibtex/contrib/ieejtran/ieejtran.tex @@ -0,0 +1,378 @@ +\documentclass[11pt, a4paper, dvipdfmx, uplatex]{jsarticle} +\bibliographystyle{IEEJtran} + +\usepackage{listings, jlisting} +\lstdefinestyle{onecol}{ + basicstyle={\scriptsize\ttfamily}, + identifierstyle={\footnotesize}, + commentstyle={\footnotesizeitshape}, + keywordstyle={\footnotesize\bfseries}, + ndkeywordstyle={\footnotesize}, + stringstyle={\footnotesize\ttfamily}, + breaklines=true, + columns=[l]{fullflexible} +} + +\begin{filecontents}[overwrite]{library.bib} +@misc{IEEEtran, + author = {Michael Shell}, + url = {https://www.ctan.org/tex-archive/macros/latex/contrib/IEEEtran/bibtex}, + title = {{IEEEtran}}, + month = {August}, + year = {2015} +} +@misc{jIEEEtran, + author = {ehki}, + url = {https://github.com/ehki/jIEEEtran}, + title = {{jIEEEtran}}, + month = {March}, + year = {2020} +} +@misc{jeconbst, + author = {ShiroTakeda}, + url = {http://shirotakeda.org/ja/tex-ja/jecon-ja.html}, + title = {{jecon.bst}}, + month = {August}, + year = {2019} +} +@article{jpArticle1, + author = {山田 一郎 and 山田 次郎 and 山田 三郎 and 山田 四郎}, + year = {2019}, + journal = {日本語学会}, + title = {文献1}, + number = {10}, + pages = {20--30}, + volume = {15}, + month = {3} +} +@article{jpArticle2, + author = {{山田 五郎} and {山田 六郎}}, + year = {2019}, + journal = {日本語学会}, + title = {文献2}, + number = {10}, + pages = {21}, + volume = {15}, + month = {12} +} +@article{jpArticle3, + author = {{山田 八郎} and {山田 六郎}}, + year = {2010}, + journal = {日本語学会}, + title = {手法1と手法2の比較検討}, + number = {1}, + pages = {15}, + volume = {5} +} +@article{enArticle1, + author = {Ichiro Yamada and Jiro Yamada and Saburo Yamada and Shiro Yamada}, + year = {2019}, + journal = {Japanese Journal}, + title = {Title1}, + number = {10}, + pages = {20--30}, + volume = {15}, + month = {march}, + language = {Japanese} +} +@article{enArticle2, + author = {Goro Yamada and Rokuro Yamada}, + year = {2019}, + journal = {Japanese Journal}, + title = {Title2}, + volume = {15}, + number = {10}, + pages = {21}, + month = {dec.}, + language = {Japanese} +} +@article{enArticle3, + author = {Hachiro Yamada and Rokuro Yamada}, + year = {2010}, + journal = {Japanese Journal}, + title = {Comparison Between Method 1 and Method 2}, + number = {1}, + pages = {15}, + volume = {5} +} +@inproceedings{jpInproceedings1, + author = {山田, 一郎 and 山田, 次郎}, + title = {文献タイトル}, + booktitle = {令和2年日本語大会}, + address = {大阪}, + year = {2010}, + month = {3}, + number = {10}, + pages = {20--30} +} +@inproceedings{jpInproceedings2, + author = {山田, 三郎 and 佐藤, 四郎}, + title = {タイトル}, + booktitle = {第30回部門大会}, + address = {東京}, + year = {2005}, + month = {2}, + number = {2}, + pages = {15--19} +} +@inproceedings{enInproceedings1, + author = {Hayashi, Shinji and Ogura, Yasuhiro}, + title = {Sample Conference Article Title}, + booktitle = {Proc. 5th Internatinoal Sample Conference (ISC)}, + address = {Tokyo, Japan}, + month = {jan}, + year = {1997}, + pages = {290-294}, + number = {2} +} +@inproceedings{enInproceedings2, + author = {Yamada, Sabuso and Sato, Shiro}, + title = {Title}, + booktitle = {Proc. 30th Society Conference}, + address = {Tokyo}, + year = {2005}, + month = {2}, + number = {2}, + pages = {15--19}, + language = {Japanese} +} +@incollection{jpIncollection1, + author = {{佐藤 二郎} and {林 三郎}}, + year = {2012}, + publisher = {日本語出版}, + address = {東京}, + title = {日本語本2の中の抜粋}, + booktitle = {日本語本2}, + edition = {2}, + pages = {100--200} +} +@incollection{jpIncollection2, + author = {山田, 一郎}, + year = {1900}, + publisher = {出版会社}, + address = {東京}, + title = {タイトル}, + booktitle = {日本語本3}, + chapter = {3}, + edition = {1}, + pages = {100--150}, +} +@incollection{enIncollection1, + address = {Tokyo, Japan}, + publisher = {JP Press}, + author = {Sato, Jiro and Hayashi, Saburo}, + booktitle = {Jpbook2}, + title = {Part of Jpbook2}, + pages = {100--200}, + edition = {2}, + year = {2012}, +} +@book{jpBook1, + author = {佐藤, 一郎}, + year = {2010}, + publisher = {日本語出版}, + address = {東京}, + title = {日本語本}, + edition = {1}, + pages = {100--200} +} +@book{jpBook2, + author = {佐藤, 二郎 and 佐藤, 三郎}, + year = {2012}, + publisher = {日本語出版}, + address = {東京}, + title = {日本語本2}, + edition = {2}, + pages = {100--200} +} +@book{jpBook3, + author = {学会委員会}, + year = {2020}, + publisher = {学会出版}, + title = {学会本}, + edition = {1} +} +@book{enBook1, + address = {City, Country}, + publisher = {Publisher}, + author = {Sato, Jiro and Hayashi, Saburo}, + year = {2000}, + title = {Title, not booktitle}, + edition = {3}, + pages = {1-10}, +} +@book{enjBook1, + author = {Ichiro Sato}, + year = {2010}, + publisher = {Japanese Publisher}, + address = {Tokyo}, + title = {Japanese Book title}, + edition = {1}, + pages = {100--200}, + language = {japaneese} +} +@book{jpjBook1, + author = {佐藤 一郎}, + year = {2010}, + publisher = {日本語出版}, + address = {東京}, + title = {日本語本}, + edition = {1}, + pages = {100--200} +} +\end{filecontents} + + +\title{\texttt{IEEJtran.bst}:\\電気学会非公式\BibTeX スタイル\\(ver. 0.18)} +\author{江尻 開} + +\begin{document} + +\maketitle + +\begin{abstract} +IEEJtranは電気学会形式の非公式\BibTeX スタイルです。 +Michael Shell氏のIEEEtran.bstを基に開発されています。 +一つのエントリに英語と日本語を併記可能とするPythonスクリプトmixej.pyも提供します。 +\end{abstract} + + +\section{はじめに} + +\texttt{IEEJtran.bst}は電気系の論文を執筆する日本人ユーザ向けに開発された電気学会形式の非公式\BibTeX スタイル(\texttt{.bst})ファイルです。 +電気学会論文誌の下書きや卒業論文,修士論文など,\LaTeX を使用した文献管理の一助になることを目的としています。 +Michael Shell氏による\texttt{IEEEtran.bst}\cite{IEEEtran}をもとにYoshiRi氏が日本語の自然な表記を実装し,現在は著者がリポジトリを譲渡していただきGitHub上\cite{jIEEEtran}で継続して開発しています。 +同レポジトリではIEEEの引用スタイルを保ったまま日本語の取り扱いを自然にした\BibTeX スタイルである\texttt{jIEEEtran.bst}も取り扱っています。 +オプションの追記方法や日本語の判別方法については,武田氏らによる\texttt{jecon.bst}\cite{jeconbst}を参考にしています。 +\TeX Live 2019以降の使用を想定しています。 +\texttt{w32tex}や古い\TeX Liveでの動作は確認していません。 +\TeX エンジンとしてplatex/pbibtexもしくはuplatex/upbibtexを推奨し,本マニュアルはuplatexでコンパイルしています。 +\TeX エンジンが出力する中間ファイルの改変にPythonを使用します。 +Pythonは\texttt{3.7}以降での動作を確認しています。 + + +\section{使用方法} + +\texttt{IEEJtran.bst}が\TeX Liveのパッケージマネージャ等でインストールされ,PATHの通った場所に配置されている場合,プリアンブルに\texttt{\string\bibliographystyle\string{IEEJtran\string}}と記載すれば設定は完了です。 +後述のカスタマイズ等の目的で\texttt{IEEJtran.bst}を個別にダウンロードして配置する場合,メインの\TeX ファイルと同じディレクトリに格納し,同様にプリアンブルに\texttt{\string\bibliographystyle\string{IEEJtran\string}}と記載すれば設定は完了です。 + +文献情報が記載される\texttt{.bib}ファイル上では,日本人著者は +\begin{center} + \texttt{author = \string{\string{\textgt{姓姓 名名}\string} and \string{\textgt{姓姓 名名}\string}\string}} +\end{center} +と,\texttt{\string{\string}}で挟むか, +\begin{center} + \texttt{author = \string{姓姓, 名名 and 姓姓, 名名\string}} +\end{center} +と,\texttt{\string{\string}}で挟まず半角カンマを挿入して記入してください。 + + +\section{カスタマイズ} +\texttt{IEEJtran}はテキストファイルである\texttt{IEEJtran.bst}を直接変更することでカスタマイズが可能です。 +例えば、著者とタイトルの間に挿入される文字を「かぎ括弧」から『二重かぎ括弧』に変更する場合、\texttt{IEEJtran.bst}の +\begin{center} + \texttt{FUNCTION \string{bbl.ieej.jp.title.pre\string} \string{ \string"「\string" \string}}\par + \texttt{FUNCTION \string{bbl.ieej.jp.title.aft\string} \string{ \string"」\string" \string}} +\end{center} +を +\begin{center} + \texttt{FUNCTION \string{bbl.ieej.jp.title.pre\string} \string{ \string"『\string" \string}}\par + \texttt{FUNCTION \string{bbl.ieej.jp.title.aft\string} \string{ \string"』\string" \string}} +\end{center} +に変更します。 +他の設定項目は\texttt{IEEJtran.bst}を直接ご確認ください。 + + +\section{英語と日本語の併記方法} + +電気学会の引用スタイルで求められているように,一つの文献エントリに英語と日本語の情報を併記する場合,\texttt{.tex}ファイルには次のように記載してください。 +\begin{center} + \texttt{\string\cite\string{enArticle1/ej/jpArticle1\string}} +\end{center} +加えて,外部pythonファイルの\texttt{mixej.py}を用いて\texttt{.aux}ファイルと\texttt{.bbl}ファイルを改変する必要があります。 +具体的には,\BibTeX コマンドの実行前に\texttt{enArticle1/ej/jpArticle1\string}を\texttt{enArticle1}と\texttt{jpArticle1}の2つのエントリに分け,\BibTeX コマンドが文献情報を書き出した後に再度結合させる操作を行います。 + + +\subsection{コンパイル手順} + +英語と日本語の併記を行わない場合,通常通りのコンパイル手順で\texttt{.pdf}を生成することができます。 +例えば\texttt{uplatex}で\texttt{.dvi}を生成し,\texttt{.dvi}から\texttt{.pdf}を生成,\BibTeX コマンドには\texttt{upbibtex}を使う場合, +\begin{center} +\texttt{uplatex → upbibtex → uplatex → uplatex → dvipdfmx} +\end{center} +という手順です。 + +英語と日本語の併記を行う場合,通常のコンパイル手順での\texttt{upbibtex}前後に\texttt{python}による\texttt{mixej.py}の処理を一回ずつ挟みます。 +前と同様に,\texttt{uplatex}で\texttt{.dvi}を生成し,\texttt{.dvi}から\texttt{.pdf}を生成,\BibTeX コマンドには\texttt{upbibtex}を使う場合, +\begin{center} +\texttt{uplatex → python mixej.py → upbibtex → python mixej.py\\→ uplatex → uplatex → dvipdfmx} +\end{center} +という手順に変更されます。 + + +\subsection{コンパイラの設定の例} + +Latexmkを使用している場合,MacやLinuxなどのUNIX系列では\texttt{.latexmkrc}に対して次のように設定することで実現可能です。 + +\noindent\makebox[\linewidth]{\rule{\linewidth}{0.4pt}}\vspace{-0.5zw} +\begin{lstlisting}[style=onecol] +#!/usr/bin/perl + +$latex = 'uplatex %O -synctex=1 -interaction=nonstopmode -kanji=utf8 -file-line-error %S'; +$bibtex = 'python mixej.py %B; upbibtex %O %B; python mixej.py %B'; +$dvipdf = 'dvipdfmx -V 7 %O -o %D %S'; +$pdf_previewer = "open -ga /Applications/Skim.app"; +\end{lstlisting}\vspace{-1.8zw} +\noindent\makebox[\linewidth]{\rule{\linewidth}{0.4pt}}\vspace{0.5zw}\par + +\noindent +Windowsでは,cmd, powershellともに\texttt{bibtex}の設定を次のようにすれば動きます。ただし,\texttt{\&}前後の半角スペースを忘れずに記入してください。 + +\noindent\makebox[\linewidth]{\rule{\linewidth}{0.4pt}}\vspace{-0.5zw} +\begin{lstlisting}[style=onecol] +$bibtex = '@cd & python mixej.py %B & upbibtex %B & python mixej.py %B'; +\end{lstlisting}\vspace{-1.8zw} +\noindent\makebox[\linewidth]{\rule{\linewidth}{0.4pt}}\vspace{0.5zw}\par + + +最近ではVisual Studio Codeを使用している方が多いと思いますが,MacやLinuxでのVSCodeのLaTeX Workshop Extension用の設定は次のように書けます。Windowsの場合は\texttt{.latexmkrc}の場合と同様に\texttt{bibtex}コマンドを書き換えてください。 + +\noindent\makebox[\linewidth]{\rule{\linewidth}{0.4pt}}\vspace{-0.5zw} +\begin{lstlisting}[style=onecol] +"latex-workshop.latex.tools": [ + { + "command": "latexmk", + "name": "latexmk uplatex/upbibtex/mixej", + "args": [ + "-e", "$latex='uplatex %O -synctex=1 -interaction=nonstopmode -kanji=utf8 -file-line-error %S'", + "-e", "$bibtex='python mixej.py %B; upbibtex %O %B; python mixej.py %B'", + "-e", "$dvipdf='dvipdfmx -V 7 %O -o %D %S'", + "-norc", "-pdfdvi", "%DOC%" + ], + } +], +"latex-workshop.latex.recipes": [ + { "name": "latexmk uplatex/upbibtex/mixej", "tools": [ "latexmk uplatex/upbibtex/mixej" ] } +], +\end{lstlisting}\vspace{-1.8zw} +\noindent\makebox[\linewidth]{\rule{\linewidth}{0.4pt}}\vspace{0.5zw}\par + + +\subsection{引用例} + +いくつかの引用例を示します。 +英語Articleの例\cite{enArticle1}。 +日本語Articleの例\cite{jpArticle1}。 +英語と日本語を併記したArticleの例\cite{enArticle2/ej/jpArticle2,enArticle3/ej/jpArticle3}。 +英語Inproceedingsの例\cite{enInproceedings1}。 +日本語Inproceedingsの例\cite{jpInproceedings1}。 +英語と日本語を併記したInproceedingsの例\cite{enInproceedings2/ej/jpInproceedings2}。 +英語Incollectionの例\cite{enIncollection1}。 +日本語Incollectionの例\cite{jpIncollection1,jpIncollection2}。 +英語Bookの例\cite{enBook1}。 +日本語Bookの例\cite{jpBook1,jpBook2,jpBook3}。 +英語と日本語を併記したBookの例\cite{enjBook1/ej/jpjBook1}。 + +\bibliography{library.bib} + +\end{document} diff --git a/biblio/bibtex/contrib/ieejtran/mixej.py b/biblio/bibtex/contrib/ieejtran/mixej.py new file mode 100644 index 0000000000..f96dbf6f48 --- /dev/null +++ b/biblio/bibtex/contrib/ieejtran/mixej.py @@ -0,0 +1,486 @@ +import sys +import platform +import json +import logging + + +SPLIT_KEY = '/ej/' +ITEM_SEP = '\\hspace{0mm}\\\\' + +FILE_VERSION = '0.18' +FILE_DATE = '2022/03/26' +FILE_AUTHOR = 'Haruki Ejiri' +FILE_URL = 'https://github.com/ehki/jIEEEtran/' + +logger = logging.getLogger(__name__) + + +def check_load_file(fn, asjson=False): + """load file if exist else return -1. + + This code load text and json file if exist. + If the file not exist, return -1 + + Parameters + ---------- + fn : str + Path to the file to load + asjson : bool + whether the fn should be loaded using json or normal text file + + Returns + ------- + int + 0 if success + """ + + logger.info('-- Checking file %s, ' % fn) + try: + with open(fn, 'r', encoding='utf-8') as f: + logger.info('exist, load.') + if asjson: + return json.load(f) + else: + return f.read() + except FileNotFoundError: + logger.info('not found.') + return -1 + + +def save_pairs(fn, pairs): + """save pairs to the JSON format file with the extensions of ".ejp". + + This code save the pairs to the file in JSON format. + + Parameters + ---------- + fn : str + Path to the file to write pairs + pairs : list of two strings + for example: [["en1", "jp1"], ["en2", "jp2"], ["en3", "jp3"]] + + Returns + ------- + int + 0 if success + """ + + logger.info('-- Saving found pairs to %s, ' % fn) + with open(fn, 'w', encoding='utf-8') as f: + json.dump(pairs, f) + logger.info('done.') + return 0 + + +def divide_aux(fn, pairs): + """divide comined citation(s) and bibcite(s) in aux file. + + This code divide the combined key(s) in aux file. + For example, the following citation(s) and bibcite(s) in aux file + -- + \\citation{englishTest7/ej/japaneseTest7} + + \\bibcite{englishTest7/ej/japaneseTest7}{16} + -- + will be converted to the following two divided citations and bibitems. + -- + \\citation{englishTest7,japaneseTest7} + + \\bibcite{englishTest7,japaneseTest7}{16} + -- + + Parameters + ---------- + fn : str + Path to the aux file to proceess + pairs : list of two strings + for example: [["en1", "jp1"], ["en2", "jp2"], ["en3", "jp3"]] + + Returns + ------- + int + -1 if the file to process not found, 0 if success + """ + + aux = check_load_file(fn) + if aux == -1: # file not found + return -1 # failed + for k1, k2 in pairs: + combi = SPLIT_KEY.join([k1, k2]) + # for example, combi is "engkey/ej/jpkey", wehere SPLIT_KEY is "/ej/" + logger.info('-- Dividing %s into %s and %s' % (combi, k1, k2)) + aux = aux.replace('%s' % combi, + '%s,%s' % (k1, k2)) + with open(fn, 'w', encoding='utf-8') as f: + f.write(aux) + return 0 + + +def divide_bbl(fn, pairs): + """divide comined bibitem(s) in bbl file. + + This code divide the combined key(s) in bbl file. + For example, the following combined bibitem(s) in bbl file + -- + \\bibitem{englishTest5/ej/japaneseTest5} + I.~Yamada, J.~Sato, S.~Tanaka, S.~Suzuki: ``Article title'', Japanese + Transaction, Vol.10, No.5, pp.45--60 (2016-3)\\hspace{0mm}\\\\ + 山田~一郎・佐藤~次郎・田中~三郎・鈴木~四郎:「文献タイトル」, + 日本語学会,Vol.10,No.5,pp.45--60(2016-3) + -- + will be converted to the following two divided bibitems. + -- + \\bibitem{englishTest5} + I.~Yamada, J.~Sato, S.~Tanaka, S.~Suzuki: ``Article title'', Japanese + Transaction, Vol.10, No.5, pp.45--60 (2016-3) + + \\bibitem{japaneseTest5} + 山田~一郎・佐藤~次郎・田中~三郎・鈴木~四郎:「文献タイトル」, + 日本語学会,Vol.10,No.5,pp.45--60(2016-3) + -- + + Parameters + ---------- + fn : str + Path to the bbl file to proceess + pairs : list of two strings + for example: [["en1", "jp1"], ["en2", "jp2"], ["en3", "jp3"]] + + Returns + ------- + int + -1 if the file to process not found, 0 if success + """ + + bbl = check_load_file(fn) + if bbl == -1: # file not found + return -1 # failed + for k1, k2 in pairs: + combi = SPLIT_KEY.join([k1, k2]) + # for example, combi is "engkey/ej/jpkey", wehere SPLIT_KEY is "/ej/" + logger.info('-- Dividing %s into %s and %s' % (combi, k1, k2)) + bbl = bbl.replace(ITEM_SEP, '\n\n\\bibitem{%s}' % k2) + bbl = bbl.replace('\\bibitem{%s}' % combi, '\\bibitem{%s}' % k1) + logger.info('-- Saving divided bbl to %s, ' % fn) + with open(fn, 'w', encoding='utf-8') as f: + f.write(bbl) + logger.info('done.') + return 0 # successfully finished + + +def find_pairs(fn, aux): + """find english/japanese pair from string in aux. + + This code find and store english/japanese pair. + Reading each line in aux strings, the engligh and japanese keys + are extracted if SPLIT_KEY is in the line. + If the combined english/japanese keys in the aux file, + the pairs are stored to the external JSON file + + Parameters + ---------- + fn : str + Path to the aux file to proceess + aux : strings in aux file + loaded string + + Returns + ------- + int + 0 if no combined keys found + num-of-pairs if successfully processed + """ + + pairs = [] + logger.info('-- ') + for line in aux.split('\n'): + if SPLIT_KEY not in line or '\\citation' not in line: + continue + # the line contains \citation and /ej/ + for ln in line.replace('\\citation{', '').replace('}', '').split(','): + # convert '\citation{hoge1/ej/hoge2}' to 'hoge1/ej/hoge2' + if len(ln.split(SPLIT_KEY)) == 2: + pairs.append(ln.split(SPLIT_KEY)) + # store as ['hoge1', 'hoge2'] pairs + logger.info('%s' % str(ln.split(SPLIT_KEY))) + if len(pairs) == 0: + logger.info('No combined keys found.') + ret = 0 + if len(pairs) > 0: + logger.info(' %d combined keys found.' % len(pairs)) + ret = pairs + save_pairs(fn, pairs) + return ret + + +def combine_aux(fn, pairs): + """combine divided citation(s) and bibcite(s) in aux file. + + This code combine the divided key(s) in aux file. + For example, the following two divided citation(s) and bibcite(s) + in aux file + -- + \\citation{englishTest7,japaneseTest7} + + \\bibcite{englishTest7,japaneseTest7}{16} + -- + will be converted to the following combined citations and bibitems. + -- + \\citation{englishTest7/ej/japaneseTest7} + + \\bibcite{englishTest7/ej/japaneseTest7}{16} + -- + + Parameters + ---------- + fn : str + Path to the aux file to proceess + pairs : list of two strings + for example: [["en1", "jp1"], ["en2", "jp2"], ["en3", "jp3"]] + + Returns + ------- + int + -1 if the file to process not found, 0 if success + """ + + aux = check_load_file(fn) + if aux == -1: # file not found + return -1 # failed + for k1, k2 in pairs: + combi = SPLIT_KEY.join([k1, k2]) + # for example, combi is "engkey/ej/jpkey", wehere SPLIT_KEY is "/ej/" + logger.info('-- Combining %s and %s to %s' % (k1, k2, combi)) + aux = aux.replace('%s,%s' % (k1, k2), '%s' % combi) + logger.info('-- Saving combined aux to %s, ' % fn) + with open(fn, 'w', encoding='utf-8') as f: + f.write(aux) + logger.info('done.') + + +def combine_bbl(fn, pairs): + """combine divided bibitem(s) in bbl file. + + This code divide the combined key(s) in bbl file. + For example, the following two divided bibitem(s) in bbl file + -- + \\bibitem{englishTest5} + I.~Yamada, J.~Sato, S.~Tanaka, S.~Suzuki: ``Article title'', Japanese + Transaction, Vol.10, No.5, pp.45--60 (2016-3) + + \\bibitem{japaneseTest5} + 山田~一郎・佐藤~次郎・田中~三郎・鈴木~四郎:「文献タイトル」, + 日本語学会,Vol.10,No.5,pp.45--60(2016-3) + -- + will be converted to the following combined citations and bibitems. + -- + \\bibitem{englishTest5/ej/japaneseTest5} + I.~Yamada, J.~Sato, S.~Tanaka, S.~Suzuki: ``Article title'', Japanese + Transaction, Vol.10, No.5, pp.45--60 (2016-3)\\hspace{0mm}\\\\ + 山田~一郎・佐藤~次郎・田中~三郎・鈴木~四郎:「文献タイトル」, + 日本語学会,Vol.10,No.5,pp.45--60(2016-3) + -- + + Parameters + ---------- + fn : str + Path to the aux file to proceess + pairs : list of two strings + for example: [["en1", "jp1"], ["en2", "jp2"], ["en3", "jp3"]] + + Returns + ------- + int + -1 if the file to process not found, 0 if success + """ + + bbl = check_load_file(fn) + if bbl == -1: # file not found + return -1 # failed + for k1, k2 in pairs: + combi = SPLIT_KEY.join([k1, k2]) + # for example, combi is "engkey/ej/jpkey", wehere SPLIT_KEY is "/ej/" + logger.info('-- Combining %s and %s to %s' % (k1, k2, combi)) + bbl = bbl.replace('\n\n\\bibitem{%s}' % k2, ITEM_SEP) + bbl = bbl.replace('\\bibitem{%s}' % k1, + '\\bibitem{%s}' % combi) + logger.info('-- Saving combined bbl to %s, ' % fn) + with open(fn, 'w', encoding='utf-8') as f: + f.write(bbl) + logger.info('done.') + + +def divide_ej_key(bn): + """divide combined english and japanese bibiteems in bbl and aux file. + + This code divide the combined key(s) in aux and bbl file. + For example, the following combined bibitem(s) in bbl file + -- + \\bibitem{englishTest5/ej/japaneseTest5} + I.~Yamada, J.~Sato, S.~Tanaka, S.~Suzuki: ``Article title'', Japanese + Transaction, Vol.10, No.5, pp.45--60 (2016-3)\\hspace{0mm}\\\\ + 山田~一郎・佐藤~次郎・田中~三郎・鈴木~四郎:「文献タイトル」, + 日本語学会,Vol.10,No.5,pp.45--60(2016-3) + -- + will be converted to the following two divided bibitems. + -- + \\bibitem{englishTest5} + I.~Yamada, J.~Sato, S.~Tanaka, S.~Suzuki: ``Article title'', Japanese + Transaction, Vol.10, No.5, pp.45--60 (2016-3) + + \\bibitem{japaneseTest5} + 山田~一郎・佐藤~次郎・田中~三郎・鈴木~四郎:「文献タイトル」, + 日本語学会,Vol.10,No.5,pp.45--60(2016-3) + -- + The following two combined citation(s) and bibcite(s) in aux file + -- + \\citation{englishTest7/ej/japaneseTest7} + + \\bibcite{englishTest7/ej/japaneseTest7}{16} + -- + will also be converted to the following combined citations and bibitems. + -- + \\citation{englishTest7} + \\citation{japaneseTest7} + + \\bibcite{englishTest7}{1} + \\bibcite{japaneseTest7}{16} + -- + The first process during LaTeX compile, there would no bbl file. + If the bbl file not exist, the dividing process would be skipped. + A list of english/japanese pairs will be extracted from aux file, + and if will be saved in the JSON file with + ".ejp" (english-japanese-pair) extension + + Parameters + ---------- + bn : str + Target file to process without extension. + if your target tex file is '/DIRNAME/main.tex' + the bn would be '/DIRNAME/main' + + Returns + ------- + int + -1 if the file to process not found + 0 if no combined keys found + num-of-pairs if successfully processed + """ + + logger.info('--') + logger.info('-- Dividing combinecd keys.') + aux = check_load_file(bn + '.aux') + if aux == -1: # aux file not found + return -1 # abort + logger.info('-- Search combined keys from %s.aux.' % bn) + pairs = find_pairs(bn + '.ejp', aux) + if pairs == 0: # no combined keys + return 0 # probably already divided + divide_aux(bn + '.aux', pairs) + divide_bbl(bn + '.bbl', pairs) + return len(pairs) + + +def combine_ej_key(bn): + """combine english and japanese bibiteems in bbl and aux file. + + This code combine the divided key(s) in aux and bbl file. + For example, the following divided bibitem(s) in bbl file + -- + \\bibitem{englishTest5} + I.~Yamada, J.~Sato, S.~Tanaka, S.~Suzuki: ``Article title'', Japanese + Transaction, Vol.10, No.5, pp.45--60 (2016-3) + + \\bibitem{japaneseTest5} + 山田~一郎・佐藤~次郎・田中~三郎・鈴木~四郎:「文献タイトル」, + 日本語学会,Vol.10,No.5,pp.45--60(2016-3) + -- + will be converted to the following two divided bibitems. + -- + \\bibitem{englishTest5/ej/japaneseTest5} + I.~Yamada, J.~Sato, S.~Tanaka, S.~Suzuki: ``Article title'', Japanese + Transaction, Vol.10, No.5, pp.45--60 (2016-3)\\hspace{0mm}\\\\ + 山田~一郎・佐藤~次郎・田中~三郎・鈴木~四郎:「文献タイトル」, + 日本語学会,Vol.10,No.5,pp.45--60(2016-3) + -- + The following two divided citation(s) and bibcite(s) in aux file + -- + \\citation{englishTest7} + \\citation{japaneseTest7} + + \\bibcite{englishTest7}{1} + \\bibcite{japaneseTest7}{16} + -- + will also be converted to the following combined citations and bibitems. + -- + \\citation{englishTest7/ej/japaneseTest7} + + \\bibcite{englishTest7/ej/japaneseTest7}{16} + -- + + Parameters + ---------- + bn : str + Target file to process without extension. + if your target tex file is '/DIRNAME/main.tex' + the bn would be '/DIRNAME/main' + + Returns + ------- + int + -1 if the file to process not found + 0 if no combined keys found + num-of-pairs if successfully processed + """ + + logger.info('--') + logger.info('-- Combining divided keys.') + pairs = check_load_file(bn + '.ejp', asjson=True) + if pairs == -1: # file not found + return -1 + if len(pairs) == 0: # no combined keys + return 0 + combine_aux(bn + '.aux', pairs) + combine_bbl(bn + '.bbl', pairs) + return len(pairs) + + +if __name__ == '__main__': + + logger = logging.getLogger() + logger.setLevel(logging.INFO) + + sh = logging.StreamHandler() + logger.addHandler(sh) + + logger.info( + 'This is python version %s ' % platform.python_version()) + logger.info( + 'mixje.py version %s (%s) by %s.' % + (FILE_VERSION, FILE_DATE, FILE_AUTHOR) + ) + logger.info('See web site: %s' % FILE_URL) + try: + fname = sys.argv[1] + logger.info('Target: %s' % fname) + except IndexError: + logger.info('Fatal error: You must assign target.') + sys.exit(0) + + sk = divide_ej_key(fname) + if sk > 0: # combined keys existed + logger.info('-- Fin, %d keys were divided.' % sk) + sys.exit(0) + elif sk < 0: # Abort + sys.exit(0) + + ck = combine_ej_key(fname) + if ck != 0: + # print('-- %d divided citation keys were successfully combined' % ck) + logger.info('-- Fin, %d keys were combined.' % ck) + sys.exit(0) + with open(sys.argv[1] + '.ejp', 'w', encoding='utf-8') as f: + json.dump([], f) + logger.info( + '-- No cmobined nor divided citation key in the aux file') + sys.exit(0) diff --git a/biblio/bibtex/contrib/jieeetran/README b/biblio/bibtex/contrib/jieeetran/README new file mode 100644 index 0000000000..b336ef5145 --- /dev/null +++ b/biblio/bibtex/contrib/jieeetran/README @@ -0,0 +1,20 @@ +March 26, 2021 + + +jIEEEtran is an UNOFFICIAL BibTeX style for authors trying to cite Japanese +articles in the Institute of Electrical and Electronics Engineers (IEEE) format. +jIEEEtran is an expansion package of Michael Shell's IEEEtran package. +The latest version of the jIEEEtran package can be found at CTAN: + +http://www.ctan.org/pkg/jieeetran + +Problems, requests, tips, beta releases, and other support, can be seen +in jIEEEtran's GitHub page: + +https://github.com/ehki/jIEEEtran + +jIEEEtran may be distributed and/or modified under the terms of MIT license. + +Best wishes for all your publication endeavors, + +Haruki Ejiri diff --git a/biblio/bibtex/contrib/jieeetran/jIEEEtran.bst b/biblio/bibtex/contrib/jieeetran/jIEEEtran.bst new file mode 100644 index 0000000000..1e2a025c5d --- /dev/null +++ b/biblio/bibtex/contrib/jieeetran/jIEEEtran.bst @@ -0,0 +1,3192 @@ +%% +%% jIEEEtran.bst +%% BibTeX Bibliography Style file for IEEE Journals and Conferences (unsorted) for Japanese users +%% +%% Version 0.18 (2022/03/26) +%% +%% Copyright (c) 2020-2022 Haruki Ejiri and Yoshi Ri +%% +%% Original starting code base and algorithms obtained from the output of +%% Patrick W. Daly's makebst package as well as from prior versions of +%% IEEE BibTeX styles: +%% +%% 1. Howard Trickey and Oren Patashnik's ieeetr.bst (1985/1988) +%% 2. Silvano Balemi and Richard H. Roy's IEEEbib.bst (1993) +%% 3. Michael Shell's IEEEtran.bst (2003-2015) +%% +%% Support sites: +%% http://www.michaelshell.org/tex/ieeetran/ +%% http://www.ctan.org/pkg/ieeetran +%% and/or +%% http://www.ieee.org/ +%% and/or +%% https://github.com/ehki/jIEEEtran/ +%% +%% For use with pbibtex version 0.99d-j0.33 or later +%% +%% This is a numerical citation style. +%% +%%************************************************************************* +%% Legal Notice: +%% This code is offered as-is without any warranty either expressed or +%% implied; without even the implied warranty of MERCHANTABILITY or +%% FITNESS FOR A PARTICULAR PURPOSE! +%% User assumes all risk. +%% In no event shall the IEEE/IEEJ or any contributor to this code be liable for +%% any damages or losses, including, but not limited to, incidental, +%% consequential, or any other damages, resulting from the use or misuse +%% of any information contained here. +%% +%% All comments are the opinions of their respective authors and are not +%% necessarily endorsed by the IEEE/IEEJ. +%% +%% The original version of this code, i.e. IEEEtran.bst by, Michael Shell +%% was distributed under the LaTeX Project Public License (LPPL) +%% ( http://www.latex-project.org/ ) version 1.3, and may be freely used, +%% distributed and modified. A copy of the LPPL, version 1.3, is included +%% in the base LaTeX documentation of all distributions of LaTeX released +%% 2003/12/01 or later. +%% Retain all contribution notices and credits. +%% ** Modified files should be clearly indicated as such, including ** +%% ** renaming them and changing author support contact information. ** +%%************************************************************************* +%% +%% 日本人の電気系LaTeXユーザのためのBibTeXスタイルファイルです。本ファイル +%% はIEEE形式での引用スタイルで、オプションを変更することで電気学会形式へ +%% と変更することが可能です。 +%% 電気学会形式のIEEJtran.bst/IEEE形式のjIEEEtran.bstともに非公式です。 +%% ファイルの破損、データの損失、本コードを使用したことによるリジェクトなど +%% いかなる問題が生じた場合でも作者らは責任を負うことができません。 +%% コードはGitHub上で開発していますので、問題がありましたらIssueを立て、 +%% コミットをし、プルリクエストを投げてくださると嬉しいです。 +%% + + + +% +% Terminalに表示されるログメッセージのファイル名やURLの設定 +% + +FUNCTION{bst.file.name} { "jIEEEtran.bst" } +FUNCTION{bst.file.version} { "0.18" } +FUNCTION{bst.file.date} { "2022/03/26" } +FUNCTION{bst.file.website} { "https://github.com/ehki/jIEEEtran/" } +FUNCTION{bst.file.author} { "Haruki Ejiri and Yoshi Ri" } + + +%% オプション & 設定 + +% 電気学会形式の引用フォーマットを使用するかの設定 +% #0 : IEEEフォーマットで引用する。 +% 日本語が含まれるエントリでは、日本語の不自然な扱いを解消する。 +% 日本語が含まれないエントリでは、Languageフィールドの取り扱いを除き +% オリジナルのIEEEtran.bst通りの出力となる。 +% #1 : 電気学会フォーマットで引用する。 +% 日本語が含まれるエントリも、日本語が含まれないエントリも、 +% 全ての文献に電気学会形式に合わせて引用する。 +FUNCTION {use.ieej.setting} { #0 } + + +% 電気学会形式の場合に短縮表記をするかどうかの設定 +% #0 : 短縮しない +% #1 : 短縮する +FUNCTION {default.use.ieej.abbrev} { #0 } + + +% 電気学会形式の発行年の指定 +% default: {bbl.ieej.jp.year.pre} { "(" } +% {bbl.ieej.jp.year.aft} { ")" } +% {bbl.ieej.en.year.pre} { "(" } +% {bbl.ieej.en.year.aft} { ")" } +FUNCTION {bbl.ieej.jp.year.pre} { "(" } +FUNCTION {bbl.ieej.jp.year.aft} { ")" } +FUNCTION {bbl.ieej.en.year.pre} { "(" } +FUNCTION {bbl.ieej.en.year.aft} { ")" } + + +% 電気学会形式において、発行年の前にカンマを打つかの指定 +% #0 : 打たない +% #1 : 打つ +% default: { #0 } +FUNCTION {ieej.setting.comma.year.pre} { #0 } + + +% 電気学会形式において、発行年の後にピリオドを打つかの指定 +% #0 : 打たない +% #1 : 打つ +% default: { #0 } +FUNCTION {ieej.setting.punct.year.aft} { #0 } + + +% 電気学会形式において、英語の書籍名と雑誌名をemphasizeするかの指定 +% #0 : emphasize しない +% #1 : emphasize する +% default: {ieej.en.setting.emph.journal} { #1 } +% : {ieej.en.setting.emph.booktitle} { #0 } +FUNCTION {ieej.en.setting.emph.journal} { #1 } +FUNCTION {ieej.en.setting.emph.booktitle} { #0 } + + +% 電気学会形式において、日本語の書籍名と雑誌名をemphasizeするかの指定 +% #0 : emphasize しない +% #1 : emphasize する +% default: {ieej.jp.setting.emph.journal} { #0 } +% : {ieej.jp.setting.emph.booktitle} { #0 } +FUNCTION {ieej.jp.setting.emph.journal} { #0 } +FUNCTION {ieej.jp.setting.emph.booktitle} { #0 } + + +% IEEE形式において、日本語の書籍名と雑誌名をemphasizeするかの指定 +% #0 : emphasize しない +% #1 : emphasize する +% default: { #0 } +FUNCTION {ieee.jp.setting.emph.title} { #0 } + + +% 電気学会形式において、タイトル前後の文字を指定 +% default: {bbl.ieej.jp.title.pre} { "「" } +% {bbl.ieej.jp.title.aft} { "」" } +% {bbl.ieej.en.title.pre} { "``" } +% {bbl.ieej.en.title.aft} { "''" } +FUNCTION {bbl.ieej.jp.title.pre} { "「" } +FUNCTION {bbl.ieej.jp.title.aft} { "」" } +FUNCTION {bbl.ieej.en.title.pre} { "``" } +FUNCTION {bbl.ieej.en.title.aft} { "''" } + + +% 電気学会形式形式において、著者とタイトルの間の文字の指定 +% default: {bbl.ieej.jp.author.title.sep.F} { ":" } +% {bbl.ieej.en.author.title.sep.F} { ":" } +% {bbl.ieej.jp.author.title.sep.A} { "," } +% {bbl.ieej.en.author.title.sep.A} { "," } +FUNCTION {bbl.ieej.jp.author.title.sep.F} { ":" } +FUNCTION {bbl.ieej.en.author.title.sep.F} { ":" } +FUNCTION {bbl.ieej.jp.author.title.sep.A} { "," } +FUNCTION {bbl.ieej.en.author.title.sep.A} { "," } + + +% 日本語文献において、vol. の表記法の設定 +% .Fは非省略表記、.Aは省略表記 +% default: {bbl.ieej.vol.F} { "Vol." } +% {bbl.ieej.vol.A} { "\textbf{" } +FUNCTION {bbl.ieej.vol.F} { "Vol." } +FUNCTION {bbl.ieej.vol.A} { "\textbf{" } + + +% 日本語文献において、vol. を記載した後、 +% カンマの前に記載する文字列の指定 +% .Fは非省略表記、.Aは省略表記 +% default: {bbl.ieej.vol.aft.F} { "" } +% {bbl.ieej.vol.aft.A} { "}" } +FUNCTION {bbl.ieej.vol.aft.F} { "" } +FUNCTION {bbl.ieej.vol.aft.A} { "}" } + + +% 日本語文献において、no. の表記法の設定 +% .Fは非省略表記、.Aは省略表記 +% default: {bbl.ieej.no.F} { "No." } +% {bbl.ieej.no.A} { "(" } +FUNCTION {bbl.ieej.no.F} { "No." } +FUNCTION {bbl.ieej.no.A} { "(" } + + +% 日本語文献において、no. を記載した後、 +% カンマの前に記載する文字列の指定 +% .Fは非省略表記、.Aは省略表記 +% default: {bbl.ieej.no.aft.F} { "" } +% {bbl.ieej.no.aft.A} { ")" } +FUNCTION {bbl.ieej.no.aft.F} { "" } +FUNCTION {bbl.ieej.no.aft.A} { ")" } + + +% 日本語文献における、pp. の表記法の設定。 +% .Fは非省略表記、.Aは省略表記 +% default: {bbl.ieej.pages.F} { "pp." } +% {bbl.ieej.pages.A} { "" } +FUNCTION {bbl.ieej.pages.F} { "pp." } +FUNCTION {bbl.ieej.pages.A} { "" } + + +% 日本語文献における、p. の表記法の設定。 +% .Fは非省略表記、.Aは省略表記 +% default: {bbl.ieej.page.F} { "p." } +% {bbl.ieej.page.A} { "" } +FUNCTION {bbl.ieej.page.F} { "p." } +FUNCTION {bbl.ieej.page.A} { "" } + + +% 日本語と英語の etal の表記の設定 +% default: {bbl.etal.jp} { "他" } +% {bbl.etal.en} { "et~al." } +FUNCTION {bbl.etal.jp} { "他" } +FUNCTION {bbl.etal.en} { "et~al." } + + +% 電気学会形式において、日本語/英語文献の章番号前後文字、チルダ(~)を使用するかの設定 +% default: {bbl.ieej.jp.chapter.pre} { "第" } +% {bbl.ieej.jp.chapter.aft} { "章" } +% {bbl.ieej.jp.chapter.tie.pre} { #0 } +% {bbl.ieej.jp.chapter.tie.aft} { #0 } +% {bbl.ieej.en.chapter.pre} { "Chap." } +% {bbl.ieej.en.chapter.aft} { "" } +% {bbl.ieej.en.chapter.tie.pre} { #0 } +% {bbl.ieej.en.chapter.tie.aft} { #0 } +FUNCTION {bbl.ieej.jp.chapter.pre} { "第" } +FUNCTION {bbl.ieej.jp.chapter.aft} { "章" } +FUNCTION {bbl.ieej.jp.chapter.tie.pre} { #0 } % 章番号前文字と章番号の間にチルダを挿入しない +FUNCTION {bbl.ieej.jp.chapter.tie.aft} { #0 } % 章番号と章番号後文字との間にチルダを挿入しない +FUNCTION {bbl.ieej.en.chapter.pre} { "Chap." } +FUNCTION {bbl.ieej.en.chapter.aft} { "" } +FUNCTION {bbl.ieej.en.chapter.tie.pre} { #0 } % 章番号前文字と章番号の間にチルダを挿入する +FUNCTION {bbl.ieej.en.chapter.tie.aft} { #0 } % 章番号と章番号後文字との間にチルダを挿入しない + + +% 日本語文献において、著者間の仕切り文字の設定 +% default: {bbl.ieej.jp.author.sep} { "・" } +% {bbl.ieej.en.author.sep} { ", " } +FUNCTION {bbl.ieej.jp.author.sep} { "・" } +FUNCTION {bbl.ieej.en.author.sep} { ", " } + + +% 電気学会形式において、発行年と発行月の区切り文字の指定 +% default: { "-" } +FUNCTION {bbl.ieej.year.month.sep} { "-" } + + +% 電気学会形式において、発行月の表示形式の指定 +% #0 : "1", "2", ..., "12" のように数字で表示 +% #1 : "Jan", "Feb.", ..., "Dec." のようにアルファベットで表示 +% default: { #0 } +FUNCTION {format.month.ieej} { #0 } + + +% IEEE形式において、発行月の表示形式の指定 +% #0 : "1", "2", ..., "12" のように数字で表示 +% #1 : "Jan", "Feb.", ..., "Dec." のようにアルファベットで表示 +% default: { #1 } +FUNCTION {format.month.ieee} { #1 } + + +% 電気学会形式において、 +% 「手法Aと手法B、どちらが正しいのか?」 +% "Method A and B - Which is correct?" +% のように、?や.など文区切り文字がタイトル最後にきた場合でも +% 「手法Aと手法B、どちらが正しいのか?」,学会名 +% "Method A and B - Which is correct?", Journal title +% のように"の後にカンマを打つかの設定 +% #0: カンマを打たない, #1: カンマを打つ +% default: { #1 } +FUNCTION { bbl.ieej.force.punct.aft.quote } { #1 } + + +% languageにJapaneseやFrenchの指定がある場合に +% (in Language)を表記するかの設定 +% #0 言語表記しない +% #1 IEEE-Reference-Guideの通りに言語表記する +% https://ieeeauthorcenter.ieee.org/wp-content/uploads/IEEE-Reference-Guide.pdf +% #2 文献末尾に言語表記する +% default : {bbl.format.language.ieej} { #2 } +% {bbl.format.language.ieee} { #1 } +FUNCTION {bbl.format.language.ieej} { #2 } +FUNCTION {bbl.format.language.ieee} { #1 } +FUNCTION {bbl.format.language} +{ use.ieej.setting #1 = + { bbl.format.language.ieej } + { bbl.format.language.ieee } + if$ +} + + +% language表記の後にピリオドを打つかの設定 +% default : { #1 } % for jIEEEtran.bst (デフォルト通りで強制しない) +% { #0 } % for IEEJtran.bst (ピリオドを強制的に打たせない) +FUNCTION {bbl.format.language.punct.ieej} { #0 } +FUNCTION {bbl.format.language.punct.ieee} { #1 } +FUNCTION {bbl.format.language.punct} +{ use.ieej.setting #1 = + { bbl.format.language.punct.ieej } + { bbl.format.language.punct.ieee } + if$ +} + + +% select.language関数を用いてタイトルジャーナル名に +% \BIBforeignlanguage{Japanese} +% などのhyphenation設定の処理を行うかの設定。 +% { #1 } : hyphenation設定を行う(設定していないとWARNINGが出る。 +% { #0 } : hyphenation設定を行わない +% default : { #0 } +FUNCTION {bbl.use.select.language} { #0 } + + +% URLの表記をするかどうかの設定 +% default : {default.is.use.url.ieej} {#0} 電気学会形式ではURLを書かない +% {default.is.use.url.ieee} {#1} IEEE形式ではURLがあれば書く +FUNCTION {default.is.use.url.ieej} {#0} +FUNCTION {default.is.use.url.ieee} {#1} + + +% 同一著者の文献が連続した場合に著者名を長ダッシュで代用するかの設定 +% 電気学会形式では長ダッシュで代用はしない +% IEEE形式では長ダッシュで代用する +% default : { default.is.dash.repeated.names.ieej } { #0 } +% { default.is.dash.repeated.names.ieee } { #1 } +FUNCTION { default.is.dash.repeated.names.ieej } { #0 } +FUNCTION { default.is.dash.repeated.names.ieee } { #1 } + + +% IEEEtran.bstに元からあるオプション群 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% DEFAULTS FOR THE CONTROLS OF THE BST STYLE %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% These are the defaults for the user adjustable controls. The values used +% here can be overridden by the user via IEEEtranBSTCTL entry type. + +% NOTE: The recommended LaTeX command to invoke a control entry type is: +% +%\makeatletter +%\def\bstctlcite{\@ifnextchar[{\@bstctlcite}{\@bstctlcite[@auxout]}} +%\def\@bstctlcite[#1]#2{\@bsphack +% \@for\@citeb:=#2\do{% +% \edef\@citeb{\expandafter\@firstofone\@citeb}% +% \if@filesw\immediate\write\csname #1\endcsname{\string\citation{\@citeb}}\fi}% +% \@esphack} +%\makeatother +% +% It is called at the start of the document, before the first \cite, like: +% \bstctlcite{IEEEexample:BSTcontrol} +% +% IEEEtran.cls V1.6 and later does provide this command. + + +% #0 turns off the display of the number for articles. +% #1 enables +FUNCTION {default.is.use.number.for.article} { #1 } + + +% #0 turns off the display of the paper and type fields in @inproceedings. +% #1 enables +FUNCTION {default.is.use.paper} { #1 } + + +% #0 turns off the display of urls +% #1 enables +FUNCTION {default.is.use.url} +{ use.ieej.setting #1 = + { default.is.use.url.ieej } + { default.is.use.url.ieee } + if$ +} + + +% #0 turns off the forced use of "et al." +% #1 enables +FUNCTION {default.is.forced.et.al} +{ % Note: "and" function is not declared yet + use.ieej.setting #1 = + { default.use.ieej.abbrev #1 = + { #1 } + { #0 } + if$ + } + { #0 } + if$ +} + + +% The maximum number of names that can be present beyond which an "et al." +% usage is forced. Be sure that num.names.shown.with.forced.et.al (below) +% is not greater than this value! +% Note: There are many instances of references in IEEE journals which have +% a very large number of authors as well as instances in which "et al." is +% used profusely. +FUNCTION {default.max.num.names.before.forced.et.al} +{ % Note: "and" function is not declared yet + use.ieej.setting #1 = + { default.use.ieej.abbrev #1 = + { #2 } % two authors are shown without et al. + { #10 } + if$ + } + { #10 } + if$ +} + + +% The number of names that will be shown with a forced "et al.". +% Must be less than or equal to max.num.names.before.forced.et.al +FUNCTION {default.num.names.shown.with.forced.et.al} { #1 } + + +% #0 turns off the alternate interword spacing for entries with URLs. +% #1 enables +FUNCTION {default.is.use.alt.interword.spacing} { #1 } + + +% If alternate interword spacing for entries with URLs is enabled, this is +% the interword spacing stretch factor that will be used. For example, the +% default "4" here means that the interword spacing in entries with URLs can +% stretch to four times normal. Does not have to be an integer. Note that +% the value specified here can be overridden by the user in their LaTeX +% code via a command such as: +% "\providecommand\BIBentryALTinterwordstretchfactor{1.5}" in addition to +% that via the IEEEtranBSTCTL entry type. +FUNCTION {default.ALTinterwordstretchfactor} { "4" } + + +% #0 turns off the "dashification" of repeated (i.e., identical to those +% of the previous entry) names. The IEEE normally does this. +% #1 enables +FUNCTION {default.is.dash.repeated.names} { + use.ieej.setting #1 = + { default.is.dash.repeated.names.ieej } + { default.is.dash.repeated.names.ieee } + if$ +} + + +% The default name format control string. %change based on japanese +FUNCTION {default.name.format.en.string}{ "{f.~}{vv~}{ll}{, jj}" } +FUNCTION {default.name.format.jp.string}{ "{ff}~{vv~}{ll}{, jj}" } + + +% The default LaTeX font command for the names. +FUNCTION {default.name.latex.cmd}{ "" } + + +% The default URL prefix. +FUNCTION {default.name.url.prefix}{ "[Online]. Available:" } + + +% Other controls that cannot be accessed via IEEEtranBSTCTL entry type. + +% #0 turns off the terminal startup banner/completed message so as to +% operate more quietly. +% #1 enables +FUNCTION {is.print.banners.to.terminal} { #1 } + + + + +%%%%%%%%%%%% +%% BANNER %% +%%%%%%%%%%%% + +FUNCTION {banner.message} +{ is.print.banners.to.terminal + { "-- " bst.file.name * " " * bst.file.version * + " (" * bst.file.date * ") " * "by " * bst.file.author * "." * + top$ + "-- " bst.file.website * + top$ + "-- See the " quote$ * "IEEEtran_bst_HOWTO.pdf" * quote$ * + " manual for usage information for IEEEtran.bst." * + top$ + "-- See also " quote$ * "howtouse.pdf" * quote$ * + " manual for usase information for jIEEEtran.bst and IEEJtran.bst." * + top$ + } + { skip$ } + if$ +} + +FUNCTION {completed.message} +{ is.print.banners.to.terminal + { "" + top$ + "Done." + top$ + } + { skip$ } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%%%% +%% STRING CONSTANTS %% +%%%%%%%%%%%%%%%%%%%%%% +FUNCTION {bbl.a}{ "A" } +FUNCTION {bbl.an}{ "An" } +FUNCTION {bbl.and}{ "and" } +%FUNCTION {bbl.etal}{ "et~al." } +FUNCTION {bbl.editors}{ "eds." } +FUNCTION {bbl.editor}{ "ed." } +FUNCTION {bbl.edition}{ "ed." } +FUNCTION {bbl.volume}{ "vol." } +FUNCTION {bbl.of}{ "of" } +FUNCTION {bbl.number}{ "no." } +FUNCTION {bbl.in}{ "in" } +FUNCTION {bbl.pages}{ "pp." } +FUNCTION {bbl.page}{ "p." } +FUNCTION {bbl.chapter}{ "ch." } +FUNCTION {bbl.paper}{ "paper" } +FUNCTION {bbl.part}{ "pt." } +FUNCTION {bbl.patent}{ "Patent" } +FUNCTION {bbl.patentUS}{ "U.S." } +FUNCTION {bbl.revision}{ "Rev." } +FUNCTION {bbl.series}{ "ser." } +FUNCTION {bbl.standard}{ "Std." } +FUNCTION {bbl.techrep}{ "Tech. Rep." } +FUNCTION {bbl.the}{ "The" } +FUNCTION {bbl.mthesis}{ "Master's thesis" } +FUNCTION {bbl.phdthesis}{ "Ph.D. dissertation" } +FUNCTION {bbl.st}{ "st" } +FUNCTION {bbl.nd}{ "nd" } +FUNCTION {bbl.rd}{ "rd" } +FUNCTION {bbl.th}{ "th" } + + +% This is the LaTeX spacer that is used when a larger than normal space +% is called for (such as just before the address:publisher). +FUNCTION {large.space} { "\hskip 1em plus 0.5em minus 0.4em\relax " } + +% The LaTeX code for dashes that are used to represent repeated names. +% Note: Some older IEEE journals used something like +% "\rule{0.275in}{0.5pt}\," which is fairly thick and runs right along +% the baseline. However, the IEEE now uses a thinner, above baseline, +% six dash long sequence. +FUNCTION {repeated.name.dashes} { "------" } + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% PREDEFINED STRING MACROS %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +MACRO {jan} {"Jan."} +MACRO {feb} {"Feb."} +MACRO {mar} {"Mar."} +MACRO {apr} {"Apr."} +MACRO {may} {"May"} +MACRO {jun} {"Jun."} +MACRO {jul} {"Jul."} +MACRO {aug} {"Aug."} +MACRO {sep} {"Sep."} +MACRO {oct} {"Oct."} +MACRO {nov} {"Nov."} +MACRO {dec} {"Dec."} + + + +%%%%%%%%%%%%%%%%%% +%% ENTRY FIELDS %% +%%%%%%%%%%%%%%%%%% + +ENTRY + { address + assignee + author + booktitle + chapter + day + dayfiled + edition + editor + howpublished + institution + intype + journal + key + language + month + monthfiled + nationality + note + number + organization + pages + paper + publisher + school + series + revision + title + type + url + volume + year + yearfiled + CTLuse_article_number + CTLuse_paper + CTLuse_url + CTLuse_forced_etal + CTLmax_names_forced_etal + CTLnames_show_etal + CTLuse_alt_spacing + CTLalt_stretch_factor + CTLdash_repeated_names + CTLname_format_string + CTLname_latex_cmd + CTLname_url_prefix + CTLuse_ieej_abbrev + } + {} + { label } + + + + +%%%%%%%%%%%%%%%%%%%%%%% +%% INTEGER VARIABLES %% +%%%%%%%%%%%%%%%%%%%%%%% + +INTEGERS { prev.status.punct this.status.punct punct.std + punct.no punct.comma punct.period + prev.status.space this.status.space space.std + space.no space.normal space.large + prev.status.quote this.status.quote quote.std + quote.no quote.close + prev.status.nline this.status.nline nline.std + nline.no nline.newblock + status.cap cap.std + cap.no cap.yes + japanese.flag} + +INTEGERS { longest.label.width multiresult nameptr namesleft number.label numnames } + +INTEGERS { is.use.number.for.article + is.use.paper + is.use.url + is.forced.et.al + max.num.names.before.forced.et.al + num.names.shown.with.forced.et.al + is.use.alt.interword.spacing + is.dash.repeated.names + use.ieej.abbrev} + + +%%%%%%%%%%%%%%%%%%%%%% +%% STRING VARIABLES %% +%%%%%%%%%%%%%%%%%%%%%% + +STRINGS { bibinfo + longest.label + oldname + s + t + ALTinterwordstretchfactor + name.format.string + name.latex.cmd + name.url.prefix} + + + + +%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOW LEVEL FUNCTIONS %% +%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {initialize.controls} +{ default.is.use.number.for.article 'is.use.number.for.article := + default.is.use.paper 'is.use.paper := + default.is.use.url 'is.use.url := + default.is.forced.et.al 'is.forced.et.al := + default.max.num.names.before.forced.et.al 'max.num.names.before.forced.et.al := + default.num.names.shown.with.forced.et.al 'num.names.shown.with.forced.et.al := + default.is.use.alt.interword.spacing 'is.use.alt.interword.spacing := + default.is.dash.repeated.names 'is.dash.repeated.names := + default.ALTinterwordstretchfactor 'ALTinterwordstretchfactor := + default.name.format.en.string 'name.format.string := + default.name.latex.cmd 'name.latex.cmd := + default.name.url.prefix 'name.url.prefix := + default.use.ieej.abbrev 'use.ieej.abbrev := +} + + +% This IEEEtran.bst features a very powerful and flexible mechanism for +% controlling the capitalization, punctuation, spacing, quotation, and +% newlines of the formatted entry fields. (Note: IEEEtran.bst does not need +% or use the newline/newblock feature, but it has been implemented for +% possible future use.) The output states of IEEEtran.bst consist of +% multiple independent attributes and, as such, can be thought of as being +% vectors, rather than the simple scalar values ("before.all", +% "mid.sentence", etc.) used in most other .bst files. +% +% The more flexible and complex design used here was motivated in part by +% the IEEE's rather unusual bibliography style. For example, the IEEE ends the +% previous field item with a period and large space prior to the publisher +% address; the @electronic entry types use periods as inter-item punctuation +% rather than the commas used by the other entry types; and URLs are never +% followed by periods even though they are the last item in the entry. +% Although it is possible to accommodate these features with the conventional +% output state system, the seemingly endless exceptions make for convoluted, +% unreliable and difficult to maintain code. +% +% IEEEtran.bst's output state system can be easily understood via a simple +% illustration of two most recently formatted entry fields (on the stack): +% +% CURRENT_ITEM +% "PREVIOUS_ITEM +% +% which, in this example, is to eventually appear in the bibliography as: +% +% "PREVIOUS_ITEM," CURRENT_ITEM +% +% It is the job of the output routine to take the previous item off of the +% stack (while leaving the current item at the top of the stack), apply its +% trailing punctuation (including closing quote marks) and spacing, and then +% to write the result to BibTeX's output buffer: +% +% "PREVIOUS_ITEM," +% +% Punctuation (and spacing) between items is often determined by both of the +% items rather than just the first one. The presence of quotation marks +% further complicates the situation because, in standard English, trailing +% punctuation marks are supposed to be contained within the quotes. +% +% IEEEtran.bst maintains two output state (aka "status") vectors which +% correspond to the previous and current (aka "this") items. Each vector +% consists of several independent attributes which track punctuation, +% spacing, quotation, and newlines. Capitalization status is handled by a +% separate scalar because the format routines, not the output routine, +% handle capitalization and, therefore, there is no need to maintain the +% capitalization attribute for both the "previous" and "this" items. +% +% When a format routine adds a new item, it copies the current output status +% vector to the previous output status vector and (usually) resets the +% current (this) output status vector to a "standard status" vector. Using a +% "standard status" vector in this way allows us to redefine what we mean by +% "standard status" at the start of each entry handler and reuse the same +% format routines under the various inter-item separation schemes. For +% example, the standard status vector for the @book entry type may use +% commas for item separators, while the @electronic type may use periods, +% yet both entry handlers exploit many of the exact same format routines. +% +% Because format routines have write access to the output status vector of +% the previous item, they can override the punctuation choices of the +% previous format routine! Therefore, it becomes trivial to implement rules +% such as "Always use a period and a large space before the publisher." By +% pushing the generation of the closing quote mark to the output routine, we +% avoid all the problems caused by having to close a quote before having all +% the information required to determine what the punctuation should be. +% +% The IEEEtran.bst output state system can easily be expanded if needed. +% For instance, it is easy to add a "space.tie" attribute value if the +% bibliography rules mandate that two items have to be joined with an +% unbreakable space. + +FUNCTION {initialize.status.constants} +{ #0 'punct.no := + #1 'punct.comma := + #2 'punct.period := + #0 'space.no := + #1 'space.normal := + #2 'space.large := + #0 'quote.no := + #1 'quote.close := + #0 'cap.no := + #1 'cap.yes := + #0 'nline.no := + #1 'nline.newblock := + #0 'japanese.flag := +} + +FUNCTION {std.status.using.comma} +{ punct.comma 'punct.std := + space.normal 'space.std := + quote.no 'quote.std := + nline.no 'nline.std := + cap.no 'cap.std := +} + +FUNCTION {std.status.using.period} +{ punct.period 'punct.std := + space.normal 'space.std := + quote.no 'quote.std := + nline.no 'nline.std := + cap.yes 'cap.std := +} + +FUNCTION {initialize.prev.this.status} +{ punct.no 'prev.status.punct := + space.no 'prev.status.space := + quote.no 'prev.status.quote := + nline.no 'prev.status.nline := + punct.no 'this.status.punct := + space.no 'this.status.space := + quote.no 'this.status.quote := + nline.no 'this.status.nline := + cap.yes 'status.cap := +} + +FUNCTION {this.status.std} +{ punct.std 'this.status.punct := + space.std 'this.status.space := + quote.std 'this.status.quote := + nline.std 'this.status.nline := +} + +FUNCTION {cap.status.std}{ cap.std 'status.cap := } + +FUNCTION {this.to.prev.status} +{ this.status.punct 'prev.status.punct := + this.status.space 'prev.status.space := + this.status.quote 'prev.status.quote := + this.status.nline 'prev.status.nline := +} + + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ { skip$ } + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + { skip$ } + if$ +} + + +% convert the strings "yes" or "no" to #1 or #0 respectively +FUNCTION {yes.no.to.int} +{ "l" change.case$ duplicate$ + "yes" = + { pop$ #1 } + { duplicate$ "no" = + { pop$ #0 } + { "unknown boolean " quote$ * swap$ * quote$ * + " in " * cite$ * warning$ + #0 + } + if$ + } + if$ +} + + +% pushes true if the single char string on the stack is in the +% range of "0" to "9" +FUNCTION {is.num} +{ chr.to.int$ + duplicate$ "0" chr.to.int$ < not + swap$ "9" chr.to.int$ > not and +} + +% multiplies the integer on the stack by a factor of 10 +FUNCTION {bump.int.mag} +{ #0 'multiresult := + { duplicate$ #0 > } + { #1 - + multiresult #10 + + 'multiresult := + } + while$ +pop$ +multiresult +} + +% converts a single character string on the stack to an integer +FUNCTION {char.to.integer} +{ duplicate$ + is.num + { chr.to.int$ "0" chr.to.int$ - } + {"noninteger character " quote$ * swap$ * quote$ * + " in integer field of " * cite$ * warning$ + #0 + } + if$ +} + +% converts a string on the stack to an integer +FUNCTION {string.to.integer} +{ duplicate$ text.length$ 'namesleft := + #1 'nameptr := + #0 'numnames := + { nameptr namesleft > not } + { duplicate$ nameptr #1 substring$ + char.to.integer numnames bump.int.mag + + 'numnames := + nameptr #1 + + 'nameptr := + } + while$ +pop$ +numnames +} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% JAPANESE WORD TOGGLER %% +%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +FUNCTION {bbl.ieej.year.pre} +{ japanese.flag #1 = + { bbl.ieej.jp.year.pre } + { bbl.ieej.en.year.pre } + if$ +} +FUNCTION {bbl.ieej.year.aft} +{ japanese.flag #1 = + { bbl.ieej.jp.year.aft } + { bbl.ieej.en.year.aft } + if$ +} +FUNCTION {bbl.ieej.title.pre} +{ japanese.flag #1 = + { bbl.ieej.jp.title.pre } + { bbl.ieej.en.title.pre } + if$ +} +FUNCTION {bbl.ieej.title.aft} +{ japanese.flag #1 = + { bbl.ieej.jp.title.aft } + { bbl.ieej.en.title.aft } + if$ +} +FUNCTION {bbl.ieej.chapter.pre} +{ japanese.flag #1 = + { bbl.ieej.jp.chapter.pre } + { bbl.ieej.en.chapter.pre } + if$ +} +FUNCTION {bbl.ieej.chapter.aft} +{ japanese.flag #1 = + { bbl.ieej.jp.chapter.aft } + { bbl.ieej.en.chapter.aft } + if$ +} +FUNCTION {bbl.ieej.chapter.tie.pre} +{ japanese.flag #1 = + { bbl.ieej.jp.chapter.tie.pre } + { bbl.ieej.en.chapter.tie.pre } + if$ +} +FUNCTION {bbl.ieej.chapter.tie.aft} +{ japanese.flag #1 = + { bbl.ieej.jp.chapter.tie.aft } + { bbl.ieej.en.chapter.tie.aft } + if$ +} +FUNCTION {bbl.etal} +{ japanese.flag #1 = + { bbl.etal.jp } + { bbl.etal.en } + if$ +} +FUNCTION {bbl.ieej.jp.author.title.sep} +{ use.ieej.abbrev #0 = + { bbl.ieej.jp.author.title.sep.F } + { bbl.ieej.jp.author.title.sep.A } + if$ +} +FUNCTION {bbl.ieej.en.author.title.sep} +{ use.ieej.abbrev #0 = + { bbl.ieej.en.author.title.sep.F } + { bbl.ieej.en.author.title.sep.A } + if$ +} +FUNCTION {bbl.ieej.author.title.sep} +{ japanese.flag #1 = + { bbl.ieej.jp.author.title.sep } + { bbl.ieej.en.author.title.sep } + if$ +} +FUNCTION {bbl.ieej.vol} +{ use.ieej.abbrev #0 = + { bbl.ieej.vol.F } + { bbl.ieej.vol.A } + if$ +} +FUNCTION {bbl.ieej.vol.aft} +{ use.ieej.abbrev #0 = + { bbl.ieej.vol.aft.F } + { bbl.ieej.vol.aft.A } + if$ +} +FUNCTION {bbl.ieej.no} +{ use.ieej.abbrev #0 = + { bbl.ieej.no.F } + { bbl.ieej.no.A } + if$ +} +FUNCTION {bbl.ieej.no.aft} +{ use.ieej.abbrev #0 = + { bbl.ieej.no.aft.F } + { bbl.ieej.no.aft.A } + if$ +} +FUNCTION {bbl.ieej.pages} +{ use.ieej.abbrev #0 = + { bbl.ieej.pages.F } + { bbl.ieej.pages.A } + if$ +} +FUNCTION {bbl.ieej.page} +{ use.ieej.abbrev #0 = + { bbl.ieej.page.F } + { bbl.ieej.page.A } + if$ +} + + + +% The output routines write out the *next* to the top (previous) item on the +% stack, adding punctuation and such as needed. Since IEEEtran.bst maintains +% the output status for the top two items on the stack, these output +% routines have to consider the previous output status (which corresponds to +% the item that is being output). Full independent control of punctuation, +% closing quote marks, spacing, and newblock is provided. +% +% "output.nonnull" does not check for the presence of a previous empty +% item. +% +% "output" does check for the presence of a previous empty item and will +% remove an empty item rather than outputing it. +% +% "output.warn" is like "output", but will issue a warning if it detects +% an empty item. + +FUNCTION {output.nonnull} +{ swap$ + prev.status.quote quote.close = + { use.ieej.setting #1 = + { bbl.ieej.title.aft * } + { japanese.flag #1 = { "''" * } { skip$ } if$ } + if$ + } + { skip$ } + if$ + prev.status.punct punct.comma = + { japanese.flag #0 = { "," * } { "," * } if$ } + { skip$ } + if$ + prev.status.punct punct.period = + { japanese.flag #0 = { add.period$ } { "." * } if$ } + { skip$ } + if$ + use.ieej.setting #0 = japanese.flag #0 = and + { prev.status.quote quote.close = { "''" * } { skip$ } if$ } + { skip$ } + if$ + prev.status.space space.normal = + { japanese.flag #0 = { " " * } { skip$ } if$ } + { skip$ } + if$ + prev.status.space space.large = + { large.space * } + { skip$ } + if$ + write$ + prev.status.nline nline.newblock = + { newline$ "\newblock " write$ } + { skip$ } + if$ +} + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {output.warn} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} + + +% "fin.entry" is the output routine that handles the last item of the entry +% (which will be on the top of the stack when "fin.entry" is called). + +FUNCTION {fin.entry} +{ this.status.punct punct.no = + { skip$ } + { japanese.flag #0 = { add.period$ } { "." * } if$ } + if$ + this.status.quote quote.close = + { "''" * } + { skip$ } + if$ + write$ + newline$ + %% for JP setting + #0 'japanese.flag := + default.name.format.en.string 'name.format.string := +} + + +FUNCTION {is.last.char.not.punct} +{ duplicate$ + "}" * add.period$ + #-1 #1 substring$ "." = +} + +FUNCTION {is.multiple.pages} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} + +FUNCTION {capitalize}{ "u" change.case$ "t" change.case$ } + +FUNCTION {emphasize} +{ duplicate$ empty$ + { pop$ "" } + { "\emph{" swap$ * "}" * } + if$ +} + +FUNCTION {do.name.latex.cmd} +{ name.latex.cmd + empty$ + { skip$ } + { name.latex.cmd "{" * swap$ * "}" * } + if$ +} + +% IEEEtran.bst uses its own \BIBforeignlanguage command which directly +% invokes the TeX hyphenation patterns without the need of the Babel +% package. Babel does a lot more than switch hyphenation patterns and +% its loading can cause unintended effects in many class files (such as +% IEEEtran.cls). +FUNCTION {select.language} +{ duplicate$ empty$ 'pop$ + { language empty$ bbl.use.select.language #0 = or 'skip$ + { "\BIBforeignlanguage{" language * "}{" * swap$ * "}" * } + if$ + } + if$ +} + +FUNCTION {tie.or.space.prefix} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ +} + +FUNCTION {get.bbl.editor} +{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } + +FUNCTION {space.word} +{ " " swap$ * " " * } + + +% Field Conditioners, Converters, Checkers and External Interfaces + +FUNCTION {empty.field.to.null.string} +{ duplicate$ empty$ + { pop$ "" } + { skip$ } + if$ +} + +FUNCTION {either.or.check} +{ empty$ + { pop$ } + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} + +FUNCTION {empty.entry.warn} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ url empty$ + and and and and and and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} + + +% The bibinfo system provides a way for the electronic parsing/acquisition +% of a bibliography's contents as is done by ReVTeX. For example, a field +% could be entered into the bibliography as: +% \bibinfo{volume}{2} +% Only the "2" would show up in the document, but the LaTeX \bibinfo command +% could do additional things with the information. IEEEtran.bst does provide +% a \bibinfo command via "\providecommand{\bibinfo}[2]{#2}". However, it is +% currently not used as the bogus bibinfo functions defined here output the +% entry values directly without the \bibinfo wrapper. The bibinfo functions +% themselves (and the calls to them) are retained for possible future use. +% +% bibinfo.check avoids acting on missing fields while bibinfo.warn will +% issue a warning message if a missing field is detected. Prior to calling +% the bibinfo functions, the user should push the field value and then its +% name string, in that order. + +FUNCTION {bibinfo.check} +{ swap$ duplicate$ missing$ + { pop$ pop$ "" } + { duplicate$ empty$ + { swap$ pop$ } + { swap$ pop$ } + if$ + } + if$ +} + +FUNCTION {bibinfo.warn} +{ swap$ duplicate$ missing$ + { swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ "" } + { duplicate$ empty$ + { swap$ "empty " swap$ * " in " * cite$ * warning$ } + { swap$ pop$ } + if$ + } + if$ +} + + +% The IEEE separates large numbers with more than 4 digits into groups of +% three. The IEEE uses a small space to separate these number groups. +% Typical applications include patent and page numbers. + +% number of consecutive digits required to trigger the group separation. +FUNCTION {large.number.trigger}{ #5 } + +% For numbers longer than the trigger, this is the blocksize of the groups. +% The blocksize must be less than the trigger threshold, and 2 * blocksize +% must be greater than the trigger threshold (can't do more than one +% separation on the initial trigger). +FUNCTION {large.number.blocksize}{ #3 } + +% What is actually inserted between the number groups. +FUNCTION {large.number.separator}{ "\," } + +% So as to save on integer variables by reusing existing ones, numnames +% holds the current number of consecutive digits read and nameptr holds +% the number that will trigger an inserted space. +FUNCTION {large.number.separate} +{ 't := + "" + #0 'numnames := + large.number.trigger 'nameptr := + { t empty$ not } + { t #-1 #1 substring$ is.num + { numnames #1 + 'numnames := } + { #0 'numnames := + large.number.trigger 'nameptr := + } + if$ + t #-1 #1 substring$ swap$ * + t #-2 global.max$ substring$ 't := + numnames nameptr = + { duplicate$ #1 nameptr large.number.blocksize - substring$ swap$ + nameptr large.number.blocksize - #1 + global.max$ substring$ + large.number.separator swap$ * * + nameptr large.number.blocksize - 'numnames := + large.number.blocksize #1 + 'nameptr := + } + { skip$ } + if$ + } + while$ +} + +% Converts all single dashes "-" to double dashes "--". +FUNCTION {n.dashify} +{ large.number.separate + 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + + +% This function detects entries with names that are identical to that of +% the previous entry and replaces the repeated names with dashes (if the +% "is.dash.repeated.names" user control is nonzero). +FUNCTION {name.or.dash} +{ 's := + oldname empty$ + { s 'oldname := s } + { s oldname = + { is.dash.repeated.names + { repeated.name.dashes } + { s 'oldname := s } + if$ + } + { s 'oldname := s } + if$ + } + if$ +} + +% Converts the number string on the top of the stack to +% "numerical ordinal form" (e.g., "7" to "7th"). There is +% no artificial limit to the upper bound of the numbers as the +% two least significant digits determine the ordinal form. +FUNCTION {num.to.ordinal} +{ duplicate$ #-2 #1 substring$ "1" = + { bbl.th * } + { duplicate$ #-1 #1 substring$ "1" = + { bbl.st * } + { duplicate$ #-1 #1 substring$ "2" = + { bbl.nd * } + { duplicate$ #-1 #1 substring$ "3" = + { bbl.rd * } + { bbl.th * } + if$ + } + if$ + } + if$ + } + if$ +} + +% If the string on the top of the stack begins with a number, +% (e.g., 11th) then replace the string with the leading number +% it contains. Otherwise retain the string as-is. s holds the +% extracted number, t holds the part of the string that remains +% to be scanned. +FUNCTION {extract.num} +{ duplicate$ 't := + "" 's := + { t empty$ not } + { t #1 #1 substring$ + t #2 global.max$ substring$ 't := + duplicate$ is.num + { s swap$ * 's := } + { pop$ "" 't := } + if$ + } + while$ + s empty$ + 'skip$ + { pop$ s } + if$ +} + +% Converts the word number string on the top of the stack to +% Arabic string form. Will be successful up to "tenth". +FUNCTION {word.to.num} +{ duplicate$ "l" change.case$ 's := + s "first" = + { pop$ "1" } + { skip$ } + if$ + s "second" = + { pop$ "2" } + { skip$ } + if$ + s "third" = + { pop$ "3" } + { skip$ } + if$ + s "fourth" = + { pop$ "4" } + { skip$ } + if$ + s "fifth" = + { pop$ "5" } + { skip$ } + if$ + s "sixth" = + { pop$ "6" } + { skip$ } + if$ + s "seventh" = + { pop$ "7" } + { skip$ } + if$ + s "eighth" = + { pop$ "8" } + { skip$ } + if$ + s "ninth" = + { pop$ "9" } + { skip$ } + if$ + s "tenth" = + { pop$ "10" } + { skip$ } + if$ +} + + +FUNCTION {month.word.to.num} +{ duplicate$ "l" change.case$ 's := + s "jan." = s "jan" = s "january" = or or { pop$ "1" } { skip$ } if$ + s "feb." = s "feb" = s "febuary" = or or { pop$ "2" } { skip$ } if$ + s "mar." = s "mar" = s "march" = or or { pop$ "3" } { skip$ } if$ + s "apr." = s "apr" = s "april" = or or { pop$ "4" } { skip$ } if$ + s "may." = s "may" = s "may" = or or { pop$ "5" } { skip$ } if$ + s "jun." = s "jun" = s "june" = or or { pop$ "6" } { skip$ } if$ + s "jul." = s "jul" = s "july" = or or { pop$ "7" } { skip$ } if$ + s "aug." = s "aug" = s "august" = or or { pop$ "8" } { skip$ } if$ + s "sep." = s "sep" = s "september" = or or { pop$ "9" } { skip$ } if$ + s "oct." = s "oct" = s "october" = or or { pop$ "10" } { skip$ } if$ + s "nov." = s "nov" = s "november" = or or { pop$ "11" } { skip$ } if$ + s "dec." = s "dec" = s "december" = or or { pop$ "12" } { skip$ } if$ +} + + +FUNCTION {month.num.to.word} +{ duplicate$ "l" change.case$ 's := + s "1" = { pop$ "Jan." } { skip$ } if$ + s "2" = { pop$ "Feb." } { skip$ } if$ + s "3" = { pop$ "Mar." } { skip$ } if$ + s "4" = { pop$ "Apr." } { skip$ } if$ + s "5" = { pop$ "May" } { skip$ } if$ + s "6" = { pop$ "June" } { skip$ } if$ + s "7" = { pop$ "July" } { skip$ } if$ + s "8" = { pop$ "Aug." } { skip$ } if$ + s "9" = { pop$ "Sep." } { skip$ } if$ + s "10" = { pop$ "Oct." } { skip$ } if$ + s "11" = { pop$ "Nov." } { skip$ } if$ + s "12" = { pop$ "Dec." } { skip$ } if$ +} + +% Converts the string on the top of the stack to numerical +% ordinal (e.g., "11th") form. +FUNCTION {convert.edition} +{ duplicate$ empty$ 'skip$ + { duplicate$ #1 #1 substring$ is.num + { extract.num + num.to.ordinal + } + { word.to.num + duplicate$ #1 #1 substring$ is.num + { num.to.ordinal } + { "edition ordinal word " quote$ * edition * quote$ * + " may be too high (or improper) for conversion" * " in " * cite$ * warning$ + } + if$ + } + if$ + } + if$ +} + + +%%%%%%%%%%%%%%%%%%%%%% +%% JAPANESE HANDLER %% +%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {chk.jp.kanji.str} +% pbibtexで用意されている is.kanji.str$ 関数を使用して日本語エントリか確認 +{ duplicate$ empty$ + { pop$ #0 } % フィールドが空ならチェックせず #0 を返す + { is.kanji.str$ #1 = { #1 } { #0 } if$ } + if$ +} + + +FUNCTION {chk.jp.entry.pbibtex} +% author, title, journal, publisher のフィールドについて +% 日本語文字を探索し、どれか一つでも日本語が含まれていたら +% japanese.flag に #1 を代入、名前フォーマットも上書き +{ author chk.jp.kanji.str #1 = + title chk.jp.kanji.str #1 = or + journal chk.jp.kanji.str #1 = or + publisher chk.jp.kanji.str #1 = or + { #1 'japanese.flag := + default.name.format.jp.string 'name.format.string := } + { skip$ } + if$ +} + + +FUNCTION {emphasize.title} +% タイトルの強調表示設定、emphasize すると \emph{} 内に入れるため、英語では斜体になる。 +% 日本語ではゴシック体となるが、不自然なためデフォルトでは \emph{} に入れる処理をスキップ。 +{ 's := + use.ieej.setting #0 = + { japanese.flag #1 = + % IEEE/JP は 設定により emphasize (斜体ではなく太字になり不自然なため) + { ieee.jp.setting.emph.title #1 = { emphasize } { skip$ } if$ } + % IEEE/EN は emphasize + { emphasize } + if$ + } + { japanese.flag #1 = + % 電気学会では、日本語も英語も設定で変更。 + { ieej.jp.setting.emph.journal #1 = s "journal" = and { #1 } { #0 } if$ + ieej.jp.setting.emph.booktitle #1 = s "booktitle" = and { #1 } { #0 } if$ + or { emphasize } { skip$ } if$ + } + { ieej.en.setting.emph.journal #1 = s "journal" = and { #1 } { #0 } if$ + ieej.en.setting.emph.booktitle #1 = s "booktitle" = and { #1 } { #0 } if$ + or { emphasize } { skip$ } if$ + } + if$ + } + if$ +} + + +FUNCTION {format.jp.edition} +% 版情報の整形 +% 日本語では 第n版 と、第と版で挟む。第1版は初版へと変更する。 +% 英語では 1st ed. 2nd ed. 等へと整形する。 +{ use.ieej.setting #1 = japanese.flag #1 = and + { duplicate$ "1" = { pop$ "初版" * } { "第" swap$ * * "版" * } if$ } + { convert.edition "l" change.case$ * "~" * bbl.edition * } + if$ +} + + +FUNCTION {bbl.title.edition.sep} +% 本のタイトルと版情報の間の区切り文字を制御。 +{ japanese.flag #1 = { "," * } { ", " * } if$ } + + +FUNCTION {format.jp.year} +% 電気学会形式では、出版社は ( と ) で挟む +% ただしオプションで変更可 +{ use.ieej.setting #1 = + { bbl.ieej.year.aft * bbl.ieej.year.pre swap$ * * } + { * } + if$ +} + + +FUNCTION {format.jp.title} +% 電気学会形式かつ日本語文献のときは、タイトルを 「 と 」 で挟む +% ただしオプションで変更可 +{ use.ieej.setting #1 = japanese.flag #1 = and + { bbl.ieej.title.pre swap$ * bbl.ieej.title.aft * } + { skip$ } + if$ +} + + +FUNCTION {author.sep} +% IEEEでも電気学会でも、最後の著者以外は +% 所定文字を場合分けして挿入する +{ use.ieej.setting #0 = + { japanese.flag #1 = { "," } { ", " } if$ } + { japanese.flag #1 = { bbl.ieej.jp.author.sep } { bbl.ieej.en.author.sep } if$ } + if$ +} + + +FUNCTION {author.sep.last} +{ use.ieej.setting #0 = + { japanese.flag #0 = % IEEE 形式の場合、and の取り扱いに注意 + { ", " * bbl.and space.word } % 英語ではカンマの後 and を挿入 + { "," } % 日本語では他と同様に全角カンマのみ + if$ + } + { japanese.flag #0 = % 電気学会形式の場合、and を使用せず、予め設定したものを返す + { bbl.ieej.en.author.sep } + { bbl.ieej.jp.author.sep } + if$ + } + if$ +} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LATEX BIBLIOGRAPHY CODE %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {start.entry} +{ newline$ + "\bibitem{" write$ + cite$ write$ + "}" write$ + newline$ + "" + initialize.prev.this.status + chk.jp.entry.pbibtex +} + +% Here we write out all the LaTeX code that we will need. The most involved +% code sequences are those that control the alternate interword spacing and +% foreign language hyphenation patterns. The heavy use of \providecommand +% gives users a way to override the defaults. Special thanks to Javier Bezos, +% Johannes Braams, Robin Fairbairns, Heiko Oberdiek, Donald Arseneau and all +% the other gurus on comp.text.tex for their help and advice on the topic of +% \selectlanguage, Babel and BibTeX. +FUNCTION {begin.bib} +{ "% Generated by " bst.file.name * ", version: " * + bst.file.version * " (" * bst.file.date * ")" * + write$ newline$ + preamble$ empty$ 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" longest.label * "}" * + write$ newline$ + "\providecommand{\url}[1]{#1}" + write$ newline$ + "\csname url@samestyle\endcsname" + write$ newline$ + "\providecommand{\newblock}{\relax}" + write$ newline$ + "\providecommand{\bibinfo}[2]{#2}" + write$ newline$ + "\providecommand{\BIBentrySTDinterwordspacing}{\spaceskip=0pt\relax}" + write$ newline$ + "\providecommand{\BIBentryALTinterwordstretchfactor}{" + ALTinterwordstretchfactor * "}" * + write$ newline$ + "\providecommand{\BIBentryALTinterwordspacing}{\spaceskip=\fontdimen2\font plus " + write$ newline$ + "\BIBentryALTinterwordstretchfactor\fontdimen3\font minus \fontdimen4\font\relax}" + write$ newline$ + "\providecommand{\BIBforeignlanguage}[2]{{%" + write$ newline$ + "\expandafter\ifx\csname l@#1\endcsname\relax" + write$ newline$ + "\typeout{** WARNING: " bst.file.name * ": No hyphenation pattern has been}%" * + write$ newline$ + "\typeout{** loaded for the language `#1'. Using the pattern for}%" + write$ newline$ + "\typeout{** the default language instead.}%" + write$ newline$ + "\else" + write$ newline$ + "\language=\csname l@#1\endcsname" + write$ newline$ + "\fi" + write$ newline$ + "#2}}" + write$ newline$ + "\providecommand{\BIBdecl}{\relax}" + write$ newline$ + "\BIBdecl" + write$ newline$ +} + +FUNCTION {end.bib} +{ newline$ "\end{thebibliography}" write$ newline$ } + +FUNCTION {if.url.alt.interword.spacing} +{ is.use.alt.interword.spacing + { is.use.url + { url empty$ 'skip$ {"\BIBentryALTinterwordspacing" write$ newline$} if$ } + { skip$ } + if$ + } + { skip$ } + if$ +} + +FUNCTION {if.url.std.interword.spacing} +{ is.use.alt.interword.spacing + { is.use.url + { url empty$ 'skip$ {"\BIBentrySTDinterwordspacing" write$ newline$} if$ } + { skip$ } + if$ + } + { skip$ } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%%%%%% +%% LONGEST LABEL PASS %% +%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #1 'number.label := + #0 'longest.label.width := +} + +FUNCTION {longest.label.pass} +{ type$ "ieeetranbstctl" = + { skip$ } + { number.label int.to.str$ 'label := + number.label #1 + 'number.label := + label width$ longest.label.width > + { label 'longest.label := + label width$ 'longest.label.width := + } + { skip$ } + if$ + } + if$ +} + + + +%%%%%%%%%%%%%%%%%%%%% +%% FORMAT HANDLERS %% +%%%%%%%%%%%%%%%%%%%%% + +%% Lower Level Formats (used by higher level formats) + +FUNCTION {format.pub} +{ 't := + "" + t empty$ + { skip$ } + { this.to.prev.status + this.status.std + cap.status.std + t * + } + if$ +} + +FUNCTION {format.address.org.or.pub.date} +{ 't := + "" + year empty$ + { "empty year in " cite$ * warning$ } + { skip$ } + if$ + address empty$ t empty$ and + year empty$ and month empty$ and + { skip$ } + { this.to.prev.status + this.status.std + cap.status.std + address "address" bibinfo.check * + t empty$ + { skip$ } + { japanese.flag #1 = + { punct.no 'prev.status.punct := } + { punct.period 'prev.status.punct := } + if$ + space.large 'prev.status.space := + address empty$ + { skip$ } + { ": " * } + if$ + t * + } + if$ + language empty.field.to.null.string + duplicate$ empty$ bbl.format.language #1 = not or + { * } + { capitalize " (in " swap$ * ")" * * } + if$ + year empty$ month empty$ and + { skip$ } + { t empty$ address empty$ and + { skip$ } + { use.ieej.setting #1 = + { japanese.flag #1 = { skip$ } { " " * } if$ } + { japanese.flag #1 = { "," * } { ", " * } if$ } + if$ + } + if$ + month empty$ + { year empty$ + { skip$ } + { year "year" bibinfo.check format.jp.year } + if$ + } + { month "month" bibinfo.check month.word.to.num + use.ieej.setting #1 = + { format.month.ieej #1 = { month.num.to.word } { skip$ } if$ } + { format.month.ieee #1 = { month.num.to.word } { skip$ } if$ } + if$ + * + year empty$ + { skip$ } + { " " * year "year" bibinfo.check * } + if$ + } + if$ + } + if$ + } + if$ +} + +FUNCTION {format.names} +{ 'bibinfo := + duplicate$ empty$ 'skip$ { + this.to.prev.status + this.status.std + 's := + japanese.flag #1 = { s purify$ 's := } { skip$ } if$ + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr name.format.string format.name$ + s nameptr "~{ll}" format.name$ = % check for insititution(s) without space + { s nameptr "{ll}" format.name$ } % for institution(s) without space + { s nameptr name.format.string format.name$ } % for usual author(s) + if$ + bibinfo bibinfo.check + 't := + nameptr #1 > + { nameptr num.names.shown.with.forced.et.al #1 + = + numnames max.num.names.before.forced.et.al > + is.forced.et.al and and + { "others" 't := #1 'namesleft := } + { skip$ } + if$ + namesleft #1 > + { author.sep * t do.name.latex.cmd * } + { s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + t "others" = + { japanese.flag #1 = + { "・" * bbl.etal } + { " " * bbl.etal emphasize } + if$ * + } + { author.sep.last * t do.name.latex.cmd * } + if$ + } + if$ + } + { t do.name.latex.cmd } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + cap.status.std + } if$ +} + + + + +%% Higher Level Formats + +%% addresses/locations + +FUNCTION {format.address} +{ address duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + + + +%% author/editor names + +FUNCTION {format.authors} +{ author "author" format.names + use.ieej.setting #1 = + { bbl.ieej.author.title.sep * + punct.no 'this.status.punct := } + { skip$ } + if$ +} + +FUNCTION {format.editors} +{ editor "editor" format.names duplicate$ empty$ 'skip$ + { ", " * + get.bbl.editor + capitalize + * + } + if$ +} + + + +%% date + +FUNCTION {format.date} +{ month "month" bibinfo.check month.word.to.num + use.ieej.setting #1 = + { format.month.ieej #1 = { month.num.to.word } { skip$ } if$ } + { format.month.ieee #1 = { month.num.to.word } { skip$ } if$ } + if$ + duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { swap$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + "there's a month but no year in " cite$ * warning$ } + if$ + * + } + { this.to.prev.status + this.status.std + cap.status.std + use.ieej.setting #1 = + { swap$ + { * } + { use.ieej.abbrev #1 = + { swap$ pop$ } + { bbl.ieej.year.month.sep * swap$ * } + if$ + } + if$ + } + { swap$ 'skip$ { swap$ " " * swap$ } if$ * } + if$ + use.ieej.setting #1 = + { bbl.ieej.year.aft * bbl.ieej.year.pre swap$ * + ieej.setting.punct.year.aft #0 = + { punct.no 'this.status.punct := } + { skip$ } + if$ + ieej.setting.comma.year.pre #0 = + { punct.no 'prev.status.punct := } + { skip$ } + if$ + } + { skip$ } + if$ + } + if$ +} + +FUNCTION {format.date.electronic} +{ month "month" bibinfo.check duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { swap$ + { pop$ } + { "there's a month but no year in " cite$ * warning$ + pop$ ")" * "(" swap$ * + this.to.prev.status + punct.no 'this.status.punct := + space.normal 'this.status.space := + quote.no 'this.status.quote := + cap.yes 'status.cap := + } + if$ + } + { swap$ + { swap$ pop$ ")" * "(" swap$ * } + { "(" swap$ * ", " * swap$ * ")" * } + if$ + this.to.prev.status + punct.no 'this.status.punct := + space.normal 'this.status.space := + quote.no 'this.status.quote := + cap.yes 'status.cap := + } + if$ +} + + + +%% edition/title + +% Note: The IEEE considers the edition to be closely associated with +% the title of a book. So, in IEEEtran.bst the edition is normally handled +% within the formatting of the title. The format.edition function is +% retained here for possible future use. +FUNCTION {format.edition} +{ edition duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + convert.edition + status.cap + { "t" } + { "l" } + if$ change.case$ + "edition" bibinfo.check + "~" * bbl.edition * + cap.status.std + } + if$ +} + +% This is used to format the booktitle of a conference proceedings. +% Here we use the "intype" field to provide the user a way to +% override the word "in" (e.g., with things like "presented at") +% Use of intype stops the emphasis of the booktitle to indicate that +% we no longer mean the written conference proceedings, but the +% conference itself. +FUNCTION {format.in.booktitle} +{ booktitle "booktitle" bibinfo.check duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + select.language + intype missing$ + { japanese.flag #1 = + { "" } + { "booktitle" emphasize.title bbl.in " " * } + if$ + } + { intype " " * } + if$ + swap$ * + cap.status.std + } + if$ +} + + +% This is used to format the booktitle of collection. +% Here the "intype" field is not supported, but "edition" is. +FUNCTION {format.in.booktitle.edition} +{ booktitle "booktitle" bibinfo.check duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + select.language + japanese.flag #1 = + { punct.comma 'prev.status.punct := } + { skip$ } + if$ + "booktitle" emphasize.title + edition empty$ + { skip$ } + { bbl.title.edition.sep edition format.jp.edition } + if$ + japanese.flag #1 = + { space.normal 'prev.status.space := } + { bbl.in " " * swap$ *} + if$ + cap.status.std + } + if$ +} + +FUNCTION {format.article.title} +{ title duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + "t" change.case$ + } + if$ + "title" bibinfo.check + duplicate$ empty$ 'skip$ + { quote.close 'this.status.quote := + is.last.char.not.punct + { punct.std 'this.status.punct := } + { use.ieej.setting #1 = bbl.ieej.force.punct.aft.quote #1 = and + { punct.std 'this.status.punct := } + { punct.no 'this.status.punct := } + if$ + } + if$ + select.language + use.ieej.setting #1 = + { bbl.ieej.title.pre swap$ * } + { "``" swap$ * } + if$ + cap.status.std + } + if$ +} + +FUNCTION {format.article.title.electronic} +{ title duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + "t" change.case$ + } + if$ + "title" bibinfo.check + duplicate$ empty$ + { skip$ } + { select.language } + if$ +} + +FUNCTION {format.book.title.edition} +{ title "title" bibinfo.check + duplicate$ empty$ + { "empty title in " cite$ * warning$ } + { this.to.prev.status + this.status.std + select.language + format.jp.title + "booktitle" emphasize.title + edition empty$ + { skip$ } + { bbl.title.edition.sep edition format.jp.edition } + if$ + use.ieej.setting #1 = + { space.normal 'prev.status.space := } + { skip$ } + if$ + cap.status.std + punct.comma 'this.status.punct := + use.ieej.setting #1 = + { skip$ } + { punct.comma 'prev.status.punct := } + if$ + } + if$ +} + +FUNCTION {format.book.title} +{ title "title" bibinfo.check + duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + select.language + format.jp.title + "booktitle" emphasize.title + } + if$ +} + + + +%% journal + +FUNCTION {format.journal} +{ journal duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + select.language + "journal" emphasize.title + } + if$ +} + + + +%% how published + +FUNCTION {format.howpublished} +{ howpublished duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + + + +%% institutions/organization/publishers/school + +FUNCTION {format.institution} +{ institution duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + +FUNCTION {format.organization} +{ organization duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + +FUNCTION {format.publisher} +{ publisher "publisher" bibinfo.warn format.pub } + +FUNCTION {format.address.publisher.date} +{ publisher "publisher" bibinfo.warn format.address.org.or.pub.date } + +FUNCTION {format.address.publisher.date.nowarn} +{ publisher "publisher" bibinfo.check format.address.org.or.pub.date } + +FUNCTION {format.address.organization.date} +{ organization "organization" bibinfo.check format.address.org.or.pub.date } + +FUNCTION {format.school} +{ school duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + +FUNCTION {format.language} +{ language empty.field.to.null.string + duplicate$ empty$ bbl.format.language #0 = or 'skip$ + { this.to.prev.status + this.status.std + capitalize + punct.comma 'this.status.punct := + bbl.format.language.punct #0 = + { punct.no 'this.status.punct := } + { skip$ } + if$ + "(in " swap$ * ")" * + cap.status.std + } + if$ +} + + +%% volume/number/series/chapter/pages + +FUNCTION {format.volume} +{ volume empty.field.to.null.string + duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + use.ieej.setting #1 = + { bbl.ieej.vol swap$ "volume" bibinfo.check * bbl.ieej.vol.aft * + use.ieej.abbrev #1 = + { punct.no 'this.status.punct := + space.no 'this.status.space := + } + { skip$ } + if$ + } + { bbl.volume + status.cap + { capitalize } + { skip$ } + if$ + swap$ tie.or.space.prefix + "volume" bibinfo.check + * * + cap.status.std + } + if$ + } + if$ +} + +FUNCTION {format.number} +{ number empty.field.to.null.string + duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + use.ieej.setting #1 = + { bbl.ieej.no swap$ "number" bibinfo.check * bbl.ieej.no.aft * } + { status.cap + { bbl.number capitalize } + { bbl.number } + if$ + swap$ tie.or.space.prefix + "number" bibinfo.check + * * + cap.status.std + } + if$ + } + if$ +} + +FUNCTION {format.number.if.use.for.article} +{ is.use.number.for.article + { format.number } + { "" } + if$ +} + +% The IEEE does not seem to tie the series so closely with the volume +% and number as is done in other bibliography styles. Instead the +% series is treated somewhat like an extension of the title. +FUNCTION {format.series} +{ series empty$ + { "" } + { this.to.prev.status + this.status.std + bbl.series " " * + series "series" bibinfo.check * + cap.status.std + } + if$ +} + + +FUNCTION {format.chapter} +{ chapter empty$ + { "" } + { this.to.prev.status + this.status.std + use.ieej.setting #0 = + { type empty$ + { bbl.chapter } + { type "l" change.case$ + "type" bibinfo.check + } + if$ + chapter tie.or.space.prefix + "chapter" bibinfo.check + * * + cap.status.std + } + { type empty$ + { bbl.ieej.chapter.pre } + { type "l" change.case$ + "type" bibinfo.check + } + if$ + chapter + bbl.ieej.chapter.tie.pre #1 = + { tie.or.space.prefix } + { "" } + if$ + "chapter" bibinfo.check + * * + bbl.ieej.chapter.aft + bbl.ieej.chapter.tie.aft #1 = + { tie.or.space.prefix } + { "" } + if$ + "chapter" bibinfo.check + * * + cap.status.std + } + if$ + } + if$ +} + + +% The intended use of format.paper is for paper numbers of inproceedings. +% The paper type can be overridden via the type field. +% We allow the type to be displayed even if the paper number is absent +% for things like "postdeadline paper" +FUNCTION {format.paper} +{ is.use.paper + { paper empty$ + { type empty$ + { "" } + { this.to.prev.status + this.status.std + type "type" bibinfo.check + cap.status.std + } + if$ + } + { this.to.prev.status + this.status.std + type empty$ + { bbl.paper } + { type "type" bibinfo.check } + if$ + " " * paper + "paper" bibinfo.check + * + cap.status.std + } + if$ + } + { "" } + if$ +} + + +FUNCTION {format.pages} +{ pages duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + duplicate$ is.multiple.pages + { use.ieej.setting #1 = + { bbl.ieej.pages swap$ } + { bbl.pages swap$ } + if$ + n.dashify + } + { use.ieej.setting #1 = + { bbl.ieej.page swap$ } + { bbl.page swap$ } + if$ + } + if$ + use.ieej.setting #1 = { "" } { tie.or.space.prefix } if$ + "pages" bibinfo.check + * * + cap.status.std + } + if$ +} + + + +%% technical report number + +FUNCTION {format.tech.report.number} +{ number "number" bibinfo.check + this.to.prev.status + this.status.std + cap.status.std + type duplicate$ empty$ + { pop$ + bbl.techrep + } + { skip$ } + if$ + "type" bibinfo.check + swap$ duplicate$ empty$ + { pop$ } + { tie.or.space.prefix * * } + if$ +} + + + +%% note + +FUNCTION {format.note} +{ note empty$ + { "" } + { this.to.prev.status + this.status.std + punct.period 'this.status.punct := + note #1 #1 substring$ + duplicate$ "{" = + { skip$ } + { status.cap + { "u" } + { "l" } + if$ + change.case$ + } + if$ + note #2 global.max$ substring$ * "note" bibinfo.check + cap.yes 'status.cap := + } + if$ +} + + + +%% patent + +FUNCTION {format.patent.date} +{ this.to.prev.status + this.status.std + year empty$ + { monthfiled duplicate$ empty$ + { "monthfiled" bibinfo.check pop$ "" } + { "monthfiled" bibinfo.check } + if$ + dayfiled duplicate$ empty$ + { "dayfiled" bibinfo.check pop$ "" * } + { "dayfiled" bibinfo.check + monthfiled empty$ + { "dayfiled without a monthfiled in " cite$ * warning$ + * + } + { " " swap$ * * } + if$ + } + if$ + yearfiled empty$ + { "no year or yearfiled in " cite$ * warning$ } + { yearfiled "yearfiled" bibinfo.check + swap$ + duplicate$ empty$ + { pop$ } + { ", " * swap$ * } + if$ + } + if$ + } + { month duplicate$ empty$ + { "month" bibinfo.check pop$ "" } + { "month" bibinfo.check } + if$ + day duplicate$ empty$ + { "day" bibinfo.check pop$ "" * } + { "day" bibinfo.check + month empty$ + { "day without a month in " cite$ * warning$ + * + } + { " " swap$ * * } + if$ + } + if$ + year "year" bibinfo.check + swap$ + duplicate$ empty$ + { pop$ } + { ", " * swap$ * } + if$ + } + if$ + cap.status.std +} + +FUNCTION {format.patent.nationality.type.number} +{ this.to.prev.status + this.status.std + nationality duplicate$ empty$ + { "nationality" bibinfo.warn pop$ "" } + { "nationality" bibinfo.check + duplicate$ "l" change.case$ "united states" = + { pop$ bbl.patentUS } + { skip$ } + if$ + " " * + } + if$ + type empty$ + { bbl.patent "type" bibinfo.check } + { type "type" bibinfo.check } + if$ + * + number duplicate$ empty$ + { "number" bibinfo.warn pop$ } + { "number" bibinfo.check + large.number.separate + swap$ " " * swap$ * + } + if$ + cap.status.std +} + + + +%% standard + +FUNCTION {format.organization.institution.standard.type.number} +{ this.to.prev.status + this.status.std + organization duplicate$ empty$ + { pop$ + institution duplicate$ empty$ + { "institution" bibinfo.warn } + { "institution" bibinfo.warn " " * } + if$ + } + { "organization" bibinfo.warn " " * } + if$ + type empty$ + { bbl.standard "type" bibinfo.check } + { type "type" bibinfo.check } + if$ + * + number duplicate$ empty$ + { "number" bibinfo.check pop$ } + { "number" bibinfo.check + large.number.separate + swap$ " " * swap$ * + } + if$ + cap.status.std +} + +FUNCTION {format.revision} +{ revision empty$ + { "" } + { this.to.prev.status + this.status.std + bbl.revision + revision tie.or.space.prefix + "revision" bibinfo.check + * * + cap.status.std + } + if$ +} + + +%% thesis + +FUNCTION {format.master.thesis.type} +{ this.to.prev.status + this.status.std + type empty$ + { + bbl.mthesis + } + { + type "type" bibinfo.check + } + if$ +cap.status.std +} + +FUNCTION {format.phd.thesis.type} +{ this.to.prev.status + this.status.std + type empty$ + { + bbl.phdthesis + } + { + type "type" bibinfo.check + } + if$ +cap.status.std +} + + + +%% URL + +FUNCTION {format.url} +{ is.use.url + { url empty$ + { "" } + { this.to.prev.status + this.status.std + cap.yes 'status.cap := + name.url.prefix " " * + "\url{" * url * "}" * + punct.no 'this.status.punct := + punct.period 'prev.status.punct := + space.normal 'this.status.space := + space.normal 'prev.status.space := + quote.no 'this.status.quote := + } + if$ + } + { "" } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%% +%% ENTRY HANDLERS %% +%%%%%%%%%%%%%%%%%%%% + + +% Note: In many journals, the IEEE (or the authors) tend not to show the number +% for articles, so the display of the number is controlled here by the +% switch "is.use.number.for.article" +FUNCTION {article} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + use.ieej.abbrev #1 = + { skip$ } + { format.article.title "title" output.warn } + if$ + bbl.format.language #1 = { format.language output } 'skip$ if$ + format.journal "journal" bibinfo.check "journal" output.warn + format.volume output + format.number.if.use.for.article output + format.pages output + format.date "year" output.warn + format.note output + format.url output + bbl.format.language #2 = { format.language output } 'skip$ if$ + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {book} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + author empty$ + { format.editors "author and editor" output.warn } + { format.authors output.nonnull } + if$ + name.or.dash + format.book.title.edition output + format.series output + author empty$ + { skip$ } + { format.editors output } + if$ + use.ieej.setting #1 = + { format.publisher output } + { format.address.publisher.date output } + if$ + format.volume output + format.number output + format.note output + use.ieej.setting #0 = 'skip$ { format.date output } if$ + format.url output + bbl.format.language #2 = { format.language output } 'skip$ if$ + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {booklet} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.article.title "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.date output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {electronic} +{ std.status.using.period + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.date.electronic output + format.article.title.electronic output + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.note output + format.url output + fin.entry + empty.entry.warn + if.url.std.interword.spacing +} + +FUNCTION {inbook} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + author empty$ + { format.editors "author and editor" output.warn } + { format.authors output.nonnull } + if$ + name.or.dash + format.book.title.edition output + format.series output + use.ieej.setting #1 = + { format.publisher output } + { format.address.publisher.date output } + if$ + format.volume output + format.number output + format.chapter output + format.pages output + format.note output + use.ieej.setting #0 = 'skip$ { format.date output } if$ + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {incollection} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.in.booktitle.edition "booktitle" output.warn + format.series output + format.editors output + use.ieej.setting #1 = + { format.publisher output } + { format.address.publisher.date output } + if$ + format.volume output + format.number output + format.chapter output + format.pages output + format.note output + use.ieej.setting #0 = 'skip$ { format.date output } if$ + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {inproceedings} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + use.ieej.abbrev #1 = + { skip$ } + { format.article.title "title" output.warn } + if$ + format.in.booktitle "booktitle" output.warn + format.series output + format.editors output + format.volume output + format.number output + use.ieej.setting #1 = + { format.paper output + format.pages output + use.ieej.abbrev #1 = + { skip$ } + { format.address output } + if$ + } + { publisher empty$ + { format.address.organization.date output } + { format.organization "organization" bibinfo.check output + format.address.publisher.date output + } + if$ + format.paper output + format.pages output + } + if$ + format.note output + use.ieej.setting #0 = 'skip$ { format.date output } if$ + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {manual} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.book.title.edition "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.date output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {mastersthesis} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.master.thesis.type output.nonnull + format.school "school" bibinfo.warn output + format.address "address" bibinfo.check output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {misc} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.article.title output + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.pages output + format.date output + format.note output + format.url output + fin.entry + empty.entry.warn + if.url.std.interword.spacing +} + +FUNCTION {patent} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.article.title output + format.patent.nationality.type.number output + format.patent.date output + format.note output + format.url output + fin.entry + empty.entry.warn + if.url.std.interword.spacing +} + +FUNCTION {periodical} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.editors output + name.or.dash + format.book.title "title" output.warn + format.series output + format.volume output + format.number output + format.organization "organization" bibinfo.check output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {phdthesis} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.phd.thesis.type output.nonnull + format.school "school" bibinfo.warn output + format.address "address" bibinfo.check output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {proceedings} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.editors output + name.or.dash + format.book.title "title" output.warn + format.series output + format.volume output + format.number output + publisher empty$ + { format.address.organization.date output } + { format.organization "organization" bibinfo.check output + format.address.publisher.date output + } + if$ + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {standard} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.book.title "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.organization.institution.standard.type.number output + format.revision output + format.date output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {techreport} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.institution "institution" bibinfo.warn output + format.address "address" bibinfo.check output + format.tech.report.number output.nonnull + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {unpublished} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.date output + format.note "note" output.warn + format.url output + fin.entry + if.url.std.interword.spacing +} + + +% The special entry type which provides the user interface to the +% BST controls +FUNCTION {IEEEtranBSTCTL} +{ is.print.banners.to.terminal + { "** IEEEtran BST control entry " quote$ * cite$ * quote$ * " detected." * + top$ + } + { skip$ } + if$ + CTLuse_article_number + empty$ + { skip$ } + { CTLuse_article_number + yes.no.to.int + 'is.use.number.for.article := + } + if$ + CTLuse_paper + empty$ + { skip$ } + { CTLuse_paper + yes.no.to.int + 'is.use.paper := + } + if$ + CTLuse_url + empty$ + { skip$ } + { CTLuse_url + yes.no.to.int + 'is.use.url := + } + if$ + CTLuse_forced_etal + empty$ + { skip$ } + { CTLuse_forced_etal + yes.no.to.int + 'is.forced.et.al := + } + if$ + CTLmax_names_forced_etal + empty$ + { skip$ } + { CTLmax_names_forced_etal + string.to.integer + 'max.num.names.before.forced.et.al := + } + if$ + CTLnames_show_etal + empty$ + { skip$ } + { CTLnames_show_etal + string.to.integer + 'num.names.shown.with.forced.et.al := + } + if$ + CTLuse_alt_spacing + empty$ + { skip$ } + { CTLuse_alt_spacing + yes.no.to.int + 'is.use.alt.interword.spacing := + } + if$ + CTLalt_stretch_factor + empty$ + { skip$ } + { CTLalt_stretch_factor + 'ALTinterwordstretchfactor := + "\renewcommand{\BIBentryALTinterwordstretchfactor}{" + ALTinterwordstretchfactor * "}" * + write$ newline$ + } + if$ + CTLdash_repeated_names + empty$ + { skip$ } + { CTLdash_repeated_names + yes.no.to.int + 'is.dash.repeated.names := + } + if$ + CTLname_format_string + empty$ + { skip$ } + { CTLname_format_string + 'name.format.string := + } + if$ + CTLname_latex_cmd + empty$ + { skip$ } + { CTLname_latex_cmd + 'name.latex.cmd := + } + if$ + CTLname_url_prefix + missing$ + { skip$ } + { CTLname_url_prefix + 'name.url.prefix := + } + if$ + CTLuse_ieej_abbrev + empty$ + { skip$ } + { CTLuse_ieej_abbrev + yes.no.to.int + 'use.ieej.abbrev := + use.ieej.setting #1 = + { use.ieej.abbrev 'is.forced.et.al := } + { skip$ } + if$ + } + if$ + + num.names.shown.with.forced.et.al max.num.names.before.forced.et.al > + { "CTLnames_show_etal cannot be greater than CTLmax_names_forced_etal in " cite$ * warning$ + max.num.names.before.forced.et.al 'num.names.shown.with.forced.et.al := + } + { skip$ } + if$ +} + + +%%%%%%%%%%%%%%%%%%% +%% ENTRY ALIASES %% +%%%%%%%%%%%%%%%%%%% +FUNCTION {conference}{inproceedings} +FUNCTION {online}{electronic} +FUNCTION {internet}{electronic} +FUNCTION {webpage}{electronic} +FUNCTION {www}{electronic} +FUNCTION {default.type}{misc} + + + +%%%%%%%%%%%%%%%%%% +%% MAIN PROGRAM %% +%%%%%%%%%%%%%%%%%% + +READ + +EXECUTE {initialize.controls} +EXECUTE {initialize.status.constants} +EXECUTE {banner.message} + +EXECUTE {initialize.longest.label} +ITERATE {longest.label.pass} + +EXECUTE {begin.bib} +ITERATE {call.type$} +EXECUTE {end.bib} + +EXECUTE{completed.message} + + +%% That's all folks, mds. diff --git a/biblio/bibtex/contrib/jieeetran/jieeetran-en.pdf b/biblio/bibtex/contrib/jieeetran/jieeetran-en.pdf Binary files differnew file mode 100644 index 0000000000..bc619d10fb --- /dev/null +++ b/biblio/bibtex/contrib/jieeetran/jieeetran-en.pdf diff --git a/biblio/bibtex/contrib/jieeetran/jieeetran-en.tex b/biblio/bibtex/contrib/jieeetran/jieeetran-en.tex new file mode 100644 index 0000000000..606c18f330 --- /dev/null +++ b/biblio/bibtex/contrib/jieeetran/jieeetran-en.tex @@ -0,0 +1,86 @@ +\documentclass[11pt, a4paper, dvipdfmx]{article} + +\usepackage{bxtexlogo} + +\begin{filecontents}[overwrite]{library.bib} +@misc{IEEEtran, + author = {Michael Shell}, + url = {https://www.ctan.org/tex-archive/macros/latex/contrib/IEEEtran/bibtex}, + title = {{IEEEtran}}, + month = {August}, + year = {2015} +} +@misc{jIEEEtran, + author = {ehki}, + url = {https://github.com/ehki/jIEEEtran}, + title = {{jIEEEtran}}, + month = {March}, + year = {2020} +} +@misc{jeconbst, + author = {ShiroTakeda}, + url = {http://shirotakeda.org/ja/tex-ja/jecon-ja.html}, + title = {{jecon.bst}}, + month = {August}, + year = {2019} +} +\end{filecontents} + + +\title{\texttt{jIEEEtran.bst}:\\Unofficial IEEE \BibTeX\ style for Japanese\\(ver. 0.18)} +\author{Haruki EJIRI} + +\begin{document} + +\maketitle + +\begin{abstract} +The jIEEEtran \BibTeX\ style is an unofficial IEEE style citation format for Japanese users. +It is a customization of Michael Shell's IEEEtran.bst, and provides natural Japanese name handling. +A Python script named mixej.py enables one content with both English and Japanese format to be handled properly. +\end{abstract} + + +\section{Introduction} + +IEEJtran.bst is an unofficial \BibTeX-style (.bst) file in IEEJ format developed for Japanese users engaging in electrical engineering. +YoshiRi implemented natural Japanese notation based on Michael Shell's IEEEtran.bst[?]. +And now the author develops it in GitHub repository [?] after taking it over. +Please note jIEEEtran.bst is unofficial. +The author does not guarantee that it will work in all environments. +We cannot be held responsible for any problems that may occur. +We recommend platex/pbibtex or uplatex/upbibtex as \TeX\ engines. + + +\section{Configuration} + +If jIEEEtran.bst has been installed by \TeX\ Live package manager, etc., and placed under PATH, write \texttt{\string\bibliographystyle\string{jIEEEtran\string}} in the preamble to complete the setup. +In the case that jIEEEtran.bst is individually downloaded and placed in the same directory as the main \TeX\ file such a reason for customization, state \texttt{\string\bibliographystyle\string{jIEEEtran\string}} in the preamble in the same way to complete the setting. +In the .bib file containing bibliographic information, Japanese authors' names should be written as: +\begin{center} +\texttt{author = \string{\string{Yamada Taro\string} and \string{Sato Jiro\string}\string}}, +\end{center} +or +\begin{center} +\texttt{author = \string{Yamada, Taro and Sato, Jiro\string}}. +\end{center} + + +\section{Combine English and Japanese entries} + +Japanese users are sometimes required to write both English and Japanese citation formats as one bibliography entry. +A python script named \texttt{mixej.py} included in the \texttt{jieeetran} package enables combining English and Japanese entries. +To combine two entries of enkey and jpkey, users have to cite as \texttt{\string\cite\string{enkye/ej/jpkey\string}}, where enkey and jpkey are English and Japanese citation keys, respectively. +Then compile by the following seven steps: +\begin{center} + \texttt{uplatex → python mixej.py → upbibtex → python mixej.py\\→ uplatex → uplatex → dvipdfmx} +\end{center} +instead of the typical five steps: +\begin{center} + \texttt{uplatex → upbibtex → uplatex → uplatex → dvipdfmx}. +\end{center} +Note that the uplatex command is Unicode and Japanese compatible latex command. + +The Japanese version of this document, \texttt{jieeetran.pdf}, shows examples for English and Japanese combined citations. + +\end{document} diff --git a/biblio/bibtex/contrib/jieeetran/jieeetran.pdf b/biblio/bibtex/contrib/jieeetran/jieeetran.pdf Binary files differnew file mode 100644 index 0000000000..2e8f532b79 --- /dev/null +++ b/biblio/bibtex/contrib/jieeetran/jieeetran.pdf diff --git a/biblio/bibtex/contrib/jieeetran/jieeetran.tex b/biblio/bibtex/contrib/jieeetran/jieeetran.tex new file mode 100644 index 0000000000..454929a5b9 --- /dev/null +++ b/biblio/bibtex/contrib/jieeetran/jieeetran.tex @@ -0,0 +1,376 @@ +\documentclass[11pt, a4paper, dvipdfmx, uplatex]{jsarticle} +\bibliographystyle{jIEEEtran} + +\usepackage{listings, jlisting} +\lstdefinestyle{onecol}{ + basicstyle={\scriptsize\ttfamily}, + identifierstyle={\footnotesize}, + commentstyle={\footnotesizeitshape}, + keywordstyle={\footnotesize\bfseries}, + ndkeywordstyle={\footnotesize}, + stringstyle={\footnotesize\ttfamily}, + breaklines=true, + columns=[l]{fullflexible} +} + +\begin{filecontents}[overwrite]{library.bib} +@misc{IEEEtran, + author = {Michael Shell}, + url = {https://www.ctan.org/tex-archive/macros/latex/contrib/IEEEtran/bibtex}, + title = {{IEEEtran}}, + month = {August}, + year = {2015} +} +@misc{jIEEEtran, + author = {ehki}, + url = {https://github.com/ehki/jIEEEtran}, + title = {{jIEEEtran}}, + month = {March}, + year = {2020} +} +@misc{jeconbst, + author = {ShiroTakeda}, + url = {http://shirotakeda.org/ja/tex-ja/jecon-ja.html}, + title = {{jecon.bst}}, + month = {August}, + year = {2019} +} +@article{jpArticle1, + author = {山田 一郎 and 山田 次郎 and 山田 三郎 and 山田 四郎}, + year = {2019}, + journal = {日本語学会}, + title = {文献1}, + number = {10}, + pages = {20--30}, + volume = {15}, + month = {3} +} +@article{jpArticle2, + author = {{山田 五郎} and {山田 六郎}}, + year = {2019}, + journal = {日本語学会}, + title = {文献2}, + number = {10}, + pages = {21}, + volume = {15}, + month = {12} +} +@article{jpArticle3, + author = {{山田 八郎} and {山田 六郎}}, + year = {2010}, + journal = {日本語学会}, + title = {手法1と手法2の比較検討}, + number = {1}, + pages = {15}, + volume = {5} +} +@article{enArticle1, + author = {Ichiro Yamada and Jiro Yamada and Saburo Yamada and Shiro Yamada}, + year = {2019}, + journal = {Japanese Journal}, + title = {Title1}, + number = {10}, + pages = {20--30}, + volume = {15}, + month = {march}, + language = {Japanese} +} +@article{enArticle2, + author = {Goro Yamada and Rokuro Yamada}, + year = {2019}, + journal = {Japanese Journal}, + title = {Title2}, + volume = {15}, + number = {10}, + pages = {21}, + month = {dec.}, + language = {Japanese} +} +@article{enArticle3, + author = {Hachiro Yamada and Rokuro Yamada}, + year = {2010}, + journal = {Japanese Journal}, + title = {Comparison Between Method 1 and Method 2}, + number = {1}, + pages = {15}, + volume = {5} +} +@inproceedings{jpInproceedings1, + author = {山田, 一郎 and 山田, 次郎}, + title = {文献タイトル}, + booktitle = {令和2年日本語大会}, + address = {大阪}, + year = {2010}, + month = {3}, + number = {10}, + pages = {20--30} +} +@inproceedings{jpInproceedings2, + author = {山田, 三郎 and 佐藤, 四郎}, + title = {タイトル}, + booktitle = {第30回部門大会}, + address = {東京}, + year = {2005}, + month = {2}, + number = {2}, + pages = {15--19} +} +@inproceedings{enInproceedings1, + author = {Hayashi, Shinji and Ogura, Yasuhiro}, + title = {Sample Conference Article Title}, + booktitle = {Proc. 5th Internatinoal Sample Conference (ISC)}, + address = {Tokyo, Japan}, + month = {jan}, + year = {1997}, + pages = {290-294}, + number = {2} +} +@inproceedings{enInproceedings2, + author = {Yamada, Sabuso and Sato, Shiro}, + title = {Title}, + booktitle = {Proc. 30th Society Conference}, + address = {Tokyo}, + year = {2005}, + month = {2}, + number = {2}, + pages = {15--19}, + language = {Japanese} +} +@incollection{jpIncollection1, + author = {{佐藤 二郎} and {林 三郎}}, + year = {2012}, + publisher = {日本語出版}, + address = {東京}, + title = {日本語本2の中の抜粋}, + booktitle = {日本語本2}, + edition = {2}, + pages = {100--200} +} +@incollection{jpIncollection2, + author = {山田, 一郎}, + year = {1900}, + publisher = {出版会社}, + address = {東京}, + title = {タイトル}, + booktitle = {日本語本3}, + chapter = {3}, + edition = {1}, + pages = {100--150}, +} +@incollection{enIncollection1, + address = {Tokyo, Japan}, + publisher = {JP Press}, + author = {Sato, Jiro and Hayashi, Saburo}, + booktitle = {Jpbook2}, + title = {Part of Jpbook2}, + pages = {100--200}, + edition = {2}, + year = {2012}, +} +@book{jpBook1, + author = {佐藤, 一郎}, + year = {2010}, + publisher = {日本語出版}, + address = {東京}, + title = {日本語本}, + edition = {1}, + pages = {100--200} +} +@book{jpBook2, + author = {佐藤, 二郎 and 佐藤, 三郎}, + year = {2012}, + publisher = {日本語出版}, + address = {東京}, + title = {日本語本2}, + edition = {2}, + pages = {100--200} +} +@book{jpBook3, + author = {学会委員会}, + year = {2020}, + publisher = {学会出版}, + title = {学会本}, + edition = {1} +} +@book{enBook1, + address = {City, Country}, + publisher = {Publisher}, + author = {Sato, Jiro and Hayashi, Saburo}, + year = {2000}, + title = {Title, not booktitle}, + edition = {3}, + pages = {1-10}, +} +@book{enjBook1, + author = {Ichiro Sato}, + year = {2010}, + publisher = {Japanese Publisher}, + address = {Tokyo}, + title = {Japanese Book title}, + edition = {1}, + pages = {100--200}, + language = {japaneese} +} +@book{jpjBook1, + author = {佐藤 一郎}, + year = {2010}, + publisher = {日本語出版}, + address = {東京}, + title = {日本語本}, + edition = {1}, + pages = {100--200} +} +\end{filecontents} + + +\title{\texttt{jIEEEtran.bst}:\\日本語対応IEEE非公式\BibTeX スタイル\\(ver. 0.18)} +\author{江尻 開} + +\begin{document} + +\maketitle + +\begin{abstract} +jIEEEtranは日本人ユーザ向けに調整されたIEEE形式の非公式\BibTeX スタイルです。 +Michael Shell氏のIEEEtran.bstを基に、日本語著者の自然な姓名処理を実現します。 +一つのエントリに英語と日本語を併記可能とするPythonスクリプトmixej.pyも提供します。 +\end{abstract} + + +\section{はじめに} + +\texttt{jIEEEtran.bst}はIEEEの引用スタイルを保ったまま日本語の取り扱いを自然にした\BibTeX スタイル(\texttt{.bst})ファイルです。 +卒業論文や修士論文など,\LaTeX を使用した文献管理の一助になることを目的としています。 +Michael Shell氏による\texttt{IEEEtran.bst}\cite{IEEEtran}をもとにYoshiRi氏が日本語の自然な表記を実装し,現在は著者がリポジトリを譲渡していただきGitHub上\cite{jIEEEtran}で継続して開発しています。 +同レポジトリでは電気学会形式の非公式\BibTeX スタイルである\texttt{IEEJtran.bst}も取り扱っています。 +オプションの追記方法や日本語の判別方法については,武田氏らによる\texttt{jecon.bst}\cite{jeconbst}を参考にしています。 +\TeX Live 2019以降の使用を想定しています。 +\texttt{w32tex}や古い\TeX Liveでの動作は確認していません。 +\TeX エンジンとしてplatex/pbibtexもしくはuplatex/upbibtexを推奨し,本マニュアルはuplatexでコンパイルしています。 +\TeX エンジンが出力する中間ファイルの改変にPythonを使用します。 +Pythonは\texttt{3.7}以降での動作を確認しています。 + + +\section{使用方法} + +\texttt{jIEEEtran.bst}が\TeX Liveのパッケージマネージャ等でインストールされ,PATHの通った場所に配置されている場合,プリアンブルに\texttt{\string\bibliographystyle\string{jIEEEtran\string}}と記載すれば設定は完了です。 +後述のカスタマイズ等の目的で\texttt{jIEEEtran.bst}を個別にダウンロードして配置する場合,メインの\TeX ファイルと同じディレクトリに格納し,同様にプリアンブルに\texttt{\string\bibliographystyle\string{jIEEEtran\string}}と記載すれば設定は完了です。 + +文献情報が記載される\texttt{.bib}ファイル上では,日本人著者は +\begin{center} + \texttt{author = \string{\string{\textgt{姓姓 名名}\string} and \string{\textgt{姓姓 名名}\string}\string}} +\end{center} +と,\texttt{\string{\string}}で挟むか, +\begin{center} + \texttt{author = \string{姓姓, 名名 and 姓姓, 名名\string}} +\end{center} +と,\texttt{\string{\string}}で挟まず半角カンマを挿入して記入してください。 + + +\section{カスタマイズ} +\texttt{jIEEEtran}はテキストファイルである\texttt{jIEEEtran.bst}を直接変更することでカスタマイズが可能です。 +例えば、IEEE形式では同一著者の文献が連続した場合に著者名を長ダッシュで代用しますが、この処理を行いたくない場合、\texttt{jIEEEtran.bst}の +\begin{center} + \texttt{FUNCTION \string{default.is.dash.repeated.names.ieee\string} \string{ \#1 \string}} +\end{center} +を +\begin{center} + \texttt{FUNCTION \string{default.is.dash.repeated.names.ieee\string} \string{ \#0 \string}} +\end{center} +に変更します。 +他の設定項目は\texttt{jIEEEtran.bst}を直接ご確認ください。 + + +\section{英語と日本語の併記方法} + +電気学会の引用スタイルで求められているように,一つの文献エントリに英語と日本語の情報を併記する場合,\texttt{.tex}ファイルには次のように記載してください。 +\begin{center} + \texttt{\string\cite\string{enArticle1/ej/jpArticle1\string}} +\end{center} +加えて,外部pythonファイルの\texttt{mixej.py}を用いて\texttt{.aux}ファイルと\texttt{.bbl}ファイルを改変する必要があります。 +具体的には,\BibTeX コマンドの実行前に\texttt{enArticle1/ej/jpArticle1\string}を\texttt{enArticle1}と\texttt{jpArticle1}の2つのエントリに分け,\BibTeX コマンドが文献情報を書き出した後に再度結合させる操作を行います。 + + +\subsection{コンパイル手順} + +英語と日本語の併記を行わない場合,通常通りのコンパイル手順で\texttt{.pdf}を生成することができます。 +例えば\texttt{uplatex}で\texttt{.dvi}を生成し,\texttt{.dvi}から\texttt{.pdf}を生成,\BibTeX コマンドには\texttt{upbibtex}を使う場合, +\begin{center} +\texttt{uplatex → upbibtex → uplatex → uplatex → dvipdfmx} +\end{center} +という手順です。 + +英語と日本語の併記を行う場合,通常のコンパイル手順での\texttt{upbibtex}前後に\texttt{python}による\texttt{mixej.py}の処理を一回ずつ挟みます。 +前と同様に,\texttt{uplatex}で\texttt{.dvi}を生成し,\texttt{.dvi}から\texttt{.pdf}を生成,\BibTeX コマンドには\texttt{upbibtex}を使う場合, +\begin{center} +\texttt{uplatex → python mixej.py → upbibtex → python mixej.py\\→ uplatex → uplatex → dvipdfmx} +\end{center} +という手順に変更されます。 + + +\subsection{コンパイラの設定の例} + +Latexmkを使用している場合,MacやLinuxなどのUNIX系列では\texttt{.latexmkrc}に対して次のように設定することで実現可能です。 + +\noindent\makebox[\linewidth]{\rule{\linewidth}{0.4pt}}\vspace{-0.5zw} +\begin{lstlisting}[style=onecol] +#!/usr/bin/perl + +$latex = 'uplatex %O -synctex=1 -interaction=nonstopmode -kanji=utf8 -file-line-error %S'; +$bibtex = 'python mixej.py %B; upbibtex %O %B; python mixej.py %B'; +$dvipdf = 'dvipdfmx -V 7 %O -o %D %S'; +$pdf_previewer = "open -ga /Applications/Skim.app"; +\end{lstlisting}\vspace{-1.8zw} +\noindent\makebox[\linewidth]{\rule{\linewidth}{0.4pt}}\vspace{0.5zw}\par + +\noindent +Windowsでは,cmd, powershellともに\texttt{bibtex}の設定を次のようにすれば動きます。ただし,\texttt{\&}前後の半角スペースを忘れずに記入してください。 + +\noindent\makebox[\linewidth]{\rule{\linewidth}{0.4pt}}\vspace{-0.5zw} +\begin{lstlisting}[style=onecol] +$bibtex = '@cd & python mixej.py %B & upbibtex %B & python mixej.py %B'; +\end{lstlisting}\vspace{-1.8zw} +\noindent\makebox[\linewidth]{\rule{\linewidth}{0.4pt}}\vspace{0.5zw}\par + + +最近ではVisual Studio Codeを使用している方が多いと思いますが,MacやLinuxでのVSCodeのLaTeX Workshop Extension用の設定は次のように書けます。Windowsの場合は\texttt{.latexmkrc}の場合と同様に\texttt{bibtex}コマンドを書き換えてください。 + +\noindent\makebox[\linewidth]{\rule{\linewidth}{0.4pt}}\vspace{-0.5zw} +\begin{lstlisting}[style=onecol] +"latex-workshop.latex.tools": [ + { + "command": "latexmk", + "name": "latexmk uplatex/upbibtex/mixej", + "args": [ + "-e", "$latex='uplatex %O -synctex=1 -interaction=nonstopmode -kanji=utf8 -file-line-error %S'", + "-e", "$bibtex='python mixej.py %B; upbibtex %O %B; python mixej.py %B'", + "-e", "$dvipdf='dvipdfmx -V 7 %O -o %D %S'", + "-norc", "-pdfdvi", "%DOC%" + ], + } +], +"latex-workshop.latex.recipes": [ + { "name": "latexmk uplatex/upbibtex/mixej", "tools": [ "latexmk uplatex/upbibtex/mixej" ] } +], +\end{lstlisting}\vspace{-1.8zw} +\noindent\makebox[\linewidth]{\rule{\linewidth}{0.4pt}}\vspace{0.5zw}\par + + +\subsection{引用例} + +いくつかの引用例を示します。 +英語Articleの例\cite{enArticle1}。 +日本語Articleの例\cite{jpArticle1}。 +英語と日本語を併記したArticleの例\cite{enArticle2/ej/jpArticle2,enArticle3/ej/jpArticle3}。 +英語Inproceedingsの例\cite{enInproceedings1}。 +日本語Inproceedingsの例\cite{jpInproceedings1}。 +英語と日本語を併記したInproceedingsの例\cite{enInproceedings2/ej/jpInproceedings2}。 +英語Incollectionの例\cite{enIncollection1}。 +日本語Incollectionの例\cite{jpIncollection1,jpIncollection2}。 +英語Bookの例\cite{enBook1}。 +日本語Bookの例\cite{jpBook1,jpBook2,jpBook3}。 +英語と日本語を併記したBookの例\cite{enjBook1/ej/jpjBook1}。 + +\bibliography{library.bib} + +\end{document} diff --git a/biblio/bibtex/contrib/jieeetran/mixej.py b/biblio/bibtex/contrib/jieeetran/mixej.py new file mode 100644 index 0000000000..f96dbf6f48 --- /dev/null +++ b/biblio/bibtex/contrib/jieeetran/mixej.py @@ -0,0 +1,486 @@ +import sys +import platform +import json +import logging + + +SPLIT_KEY = '/ej/' +ITEM_SEP = '\\hspace{0mm}\\\\' + +FILE_VERSION = '0.18' +FILE_DATE = '2022/03/26' +FILE_AUTHOR = 'Haruki Ejiri' +FILE_URL = 'https://github.com/ehki/jIEEEtran/' + +logger = logging.getLogger(__name__) + + +def check_load_file(fn, asjson=False): + """load file if exist else return -1. + + This code load text and json file if exist. + If the file not exist, return -1 + + Parameters + ---------- + fn : str + Path to the file to load + asjson : bool + whether the fn should be loaded using json or normal text file + + Returns + ------- + int + 0 if success + """ + + logger.info('-- Checking file %s, ' % fn) + try: + with open(fn, 'r', encoding='utf-8') as f: + logger.info('exist, load.') + if asjson: + return json.load(f) + else: + return f.read() + except FileNotFoundError: + logger.info('not found.') + return -1 + + +def save_pairs(fn, pairs): + """save pairs to the JSON format file with the extensions of ".ejp". + + This code save the pairs to the file in JSON format. + + Parameters + ---------- + fn : str + Path to the file to write pairs + pairs : list of two strings + for example: [["en1", "jp1"], ["en2", "jp2"], ["en3", "jp3"]] + + Returns + ------- + int + 0 if success + """ + + logger.info('-- Saving found pairs to %s, ' % fn) + with open(fn, 'w', encoding='utf-8') as f: + json.dump(pairs, f) + logger.info('done.') + return 0 + + +def divide_aux(fn, pairs): + """divide comined citation(s) and bibcite(s) in aux file. + + This code divide the combined key(s) in aux file. + For example, the following citation(s) and bibcite(s) in aux file + -- + \\citation{englishTest7/ej/japaneseTest7} + + \\bibcite{englishTest7/ej/japaneseTest7}{16} + -- + will be converted to the following two divided citations and bibitems. + -- + \\citation{englishTest7,japaneseTest7} + + \\bibcite{englishTest7,japaneseTest7}{16} + -- + + Parameters + ---------- + fn : str + Path to the aux file to proceess + pairs : list of two strings + for example: [["en1", "jp1"], ["en2", "jp2"], ["en3", "jp3"]] + + Returns + ------- + int + -1 if the file to process not found, 0 if success + """ + + aux = check_load_file(fn) + if aux == -1: # file not found + return -1 # failed + for k1, k2 in pairs: + combi = SPLIT_KEY.join([k1, k2]) + # for example, combi is "engkey/ej/jpkey", wehere SPLIT_KEY is "/ej/" + logger.info('-- Dividing %s into %s and %s' % (combi, k1, k2)) + aux = aux.replace('%s' % combi, + '%s,%s' % (k1, k2)) + with open(fn, 'w', encoding='utf-8') as f: + f.write(aux) + return 0 + + +def divide_bbl(fn, pairs): + """divide comined bibitem(s) in bbl file. + + This code divide the combined key(s) in bbl file. + For example, the following combined bibitem(s) in bbl file + -- + \\bibitem{englishTest5/ej/japaneseTest5} + I.~Yamada, J.~Sato, S.~Tanaka, S.~Suzuki: ``Article title'', Japanese + Transaction, Vol.10, No.5, pp.45--60 (2016-3)\\hspace{0mm}\\\\ + 山田~一郎・佐藤~次郎・田中~三郎・鈴木~四郎:「文献タイトル」, + 日本語学会,Vol.10,No.5,pp.45--60(2016-3) + -- + will be converted to the following two divided bibitems. + -- + \\bibitem{englishTest5} + I.~Yamada, J.~Sato, S.~Tanaka, S.~Suzuki: ``Article title'', Japanese + Transaction, Vol.10, No.5, pp.45--60 (2016-3) + + \\bibitem{japaneseTest5} + 山田~一郎・佐藤~次郎・田中~三郎・鈴木~四郎:「文献タイトル」, + 日本語学会,Vol.10,No.5,pp.45--60(2016-3) + -- + + Parameters + ---------- + fn : str + Path to the bbl file to proceess + pairs : list of two strings + for example: [["en1", "jp1"], ["en2", "jp2"], ["en3", "jp3"]] + + Returns + ------- + int + -1 if the file to process not found, 0 if success + """ + + bbl = check_load_file(fn) + if bbl == -1: # file not found + return -1 # failed + for k1, k2 in pairs: + combi = SPLIT_KEY.join([k1, k2]) + # for example, combi is "engkey/ej/jpkey", wehere SPLIT_KEY is "/ej/" + logger.info('-- Dividing %s into %s and %s' % (combi, k1, k2)) + bbl = bbl.replace(ITEM_SEP, '\n\n\\bibitem{%s}' % k2) + bbl = bbl.replace('\\bibitem{%s}' % combi, '\\bibitem{%s}' % k1) + logger.info('-- Saving divided bbl to %s, ' % fn) + with open(fn, 'w', encoding='utf-8') as f: + f.write(bbl) + logger.info('done.') + return 0 # successfully finished + + +def find_pairs(fn, aux): + """find english/japanese pair from string in aux. + + This code find and store english/japanese pair. + Reading each line in aux strings, the engligh and japanese keys + are extracted if SPLIT_KEY is in the line. + If the combined english/japanese keys in the aux file, + the pairs are stored to the external JSON file + + Parameters + ---------- + fn : str + Path to the aux file to proceess + aux : strings in aux file + loaded string + + Returns + ------- + int + 0 if no combined keys found + num-of-pairs if successfully processed + """ + + pairs = [] + logger.info('-- ') + for line in aux.split('\n'): + if SPLIT_KEY not in line or '\\citation' not in line: + continue + # the line contains \citation and /ej/ + for ln in line.replace('\\citation{', '').replace('}', '').split(','): + # convert '\citation{hoge1/ej/hoge2}' to 'hoge1/ej/hoge2' + if len(ln.split(SPLIT_KEY)) == 2: + pairs.append(ln.split(SPLIT_KEY)) + # store as ['hoge1', 'hoge2'] pairs + logger.info('%s' % str(ln.split(SPLIT_KEY))) + if len(pairs) == 0: + logger.info('No combined keys found.') + ret = 0 + if len(pairs) > 0: + logger.info(' %d combined keys found.' % len(pairs)) + ret = pairs + save_pairs(fn, pairs) + return ret + + +def combine_aux(fn, pairs): + """combine divided citation(s) and bibcite(s) in aux file. + + This code combine the divided key(s) in aux file. + For example, the following two divided citation(s) and bibcite(s) + in aux file + -- + \\citation{englishTest7,japaneseTest7} + + \\bibcite{englishTest7,japaneseTest7}{16} + -- + will be converted to the following combined citations and bibitems. + -- + \\citation{englishTest7/ej/japaneseTest7} + + \\bibcite{englishTest7/ej/japaneseTest7}{16} + -- + + Parameters + ---------- + fn : str + Path to the aux file to proceess + pairs : list of two strings + for example: [["en1", "jp1"], ["en2", "jp2"], ["en3", "jp3"]] + + Returns + ------- + int + -1 if the file to process not found, 0 if success + """ + + aux = check_load_file(fn) + if aux == -1: # file not found + return -1 # failed + for k1, k2 in pairs: + combi = SPLIT_KEY.join([k1, k2]) + # for example, combi is "engkey/ej/jpkey", wehere SPLIT_KEY is "/ej/" + logger.info('-- Combining %s and %s to %s' % (k1, k2, combi)) + aux = aux.replace('%s,%s' % (k1, k2), '%s' % combi) + logger.info('-- Saving combined aux to %s, ' % fn) + with open(fn, 'w', encoding='utf-8') as f: + f.write(aux) + logger.info('done.') + + +def combine_bbl(fn, pairs): + """combine divided bibitem(s) in bbl file. + + This code divide the combined key(s) in bbl file. + For example, the following two divided bibitem(s) in bbl file + -- + \\bibitem{englishTest5} + I.~Yamada, J.~Sato, S.~Tanaka, S.~Suzuki: ``Article title'', Japanese + Transaction, Vol.10, No.5, pp.45--60 (2016-3) + + \\bibitem{japaneseTest5} + 山田~一郎・佐藤~次郎・田中~三郎・鈴木~四郎:「文献タイトル」, + 日本語学会,Vol.10,No.5,pp.45--60(2016-3) + -- + will be converted to the following combined citations and bibitems. + -- + \\bibitem{englishTest5/ej/japaneseTest5} + I.~Yamada, J.~Sato, S.~Tanaka, S.~Suzuki: ``Article title'', Japanese + Transaction, Vol.10, No.5, pp.45--60 (2016-3)\\hspace{0mm}\\\\ + 山田~一郎・佐藤~次郎・田中~三郎・鈴木~四郎:「文献タイトル」, + 日本語学会,Vol.10,No.5,pp.45--60(2016-3) + -- + + Parameters + ---------- + fn : str + Path to the aux file to proceess + pairs : list of two strings + for example: [["en1", "jp1"], ["en2", "jp2"], ["en3", "jp3"]] + + Returns + ------- + int + -1 if the file to process not found, 0 if success + """ + + bbl = check_load_file(fn) + if bbl == -1: # file not found + return -1 # failed + for k1, k2 in pairs: + combi = SPLIT_KEY.join([k1, k2]) + # for example, combi is "engkey/ej/jpkey", wehere SPLIT_KEY is "/ej/" + logger.info('-- Combining %s and %s to %s' % (k1, k2, combi)) + bbl = bbl.replace('\n\n\\bibitem{%s}' % k2, ITEM_SEP) + bbl = bbl.replace('\\bibitem{%s}' % k1, + '\\bibitem{%s}' % combi) + logger.info('-- Saving combined bbl to %s, ' % fn) + with open(fn, 'w', encoding='utf-8') as f: + f.write(bbl) + logger.info('done.') + + +def divide_ej_key(bn): + """divide combined english and japanese bibiteems in bbl and aux file. + + This code divide the combined key(s) in aux and bbl file. + For example, the following combined bibitem(s) in bbl file + -- + \\bibitem{englishTest5/ej/japaneseTest5} + I.~Yamada, J.~Sato, S.~Tanaka, S.~Suzuki: ``Article title'', Japanese + Transaction, Vol.10, No.5, pp.45--60 (2016-3)\\hspace{0mm}\\\\ + 山田~一郎・佐藤~次郎・田中~三郎・鈴木~四郎:「文献タイトル」, + 日本語学会,Vol.10,No.5,pp.45--60(2016-3) + -- + will be converted to the following two divided bibitems. + -- + \\bibitem{englishTest5} + I.~Yamada, J.~Sato, S.~Tanaka, S.~Suzuki: ``Article title'', Japanese + Transaction, Vol.10, No.5, pp.45--60 (2016-3) + + \\bibitem{japaneseTest5} + 山田~一郎・佐藤~次郎・田中~三郎・鈴木~四郎:「文献タイトル」, + 日本語学会,Vol.10,No.5,pp.45--60(2016-3) + -- + The following two combined citation(s) and bibcite(s) in aux file + -- + \\citation{englishTest7/ej/japaneseTest7} + + \\bibcite{englishTest7/ej/japaneseTest7}{16} + -- + will also be converted to the following combined citations and bibitems. + -- + \\citation{englishTest7} + \\citation{japaneseTest7} + + \\bibcite{englishTest7}{1} + \\bibcite{japaneseTest7}{16} + -- + The first process during LaTeX compile, there would no bbl file. + If the bbl file not exist, the dividing process would be skipped. + A list of english/japanese pairs will be extracted from aux file, + and if will be saved in the JSON file with + ".ejp" (english-japanese-pair) extension + + Parameters + ---------- + bn : str + Target file to process without extension. + if your target tex file is '/DIRNAME/main.tex' + the bn would be '/DIRNAME/main' + + Returns + ------- + int + -1 if the file to process not found + 0 if no combined keys found + num-of-pairs if successfully processed + """ + + logger.info('--') + logger.info('-- Dividing combinecd keys.') + aux = check_load_file(bn + '.aux') + if aux == -1: # aux file not found + return -1 # abort + logger.info('-- Search combined keys from %s.aux.' % bn) + pairs = find_pairs(bn + '.ejp', aux) + if pairs == 0: # no combined keys + return 0 # probably already divided + divide_aux(bn + '.aux', pairs) + divide_bbl(bn + '.bbl', pairs) + return len(pairs) + + +def combine_ej_key(bn): + """combine english and japanese bibiteems in bbl and aux file. + + This code combine the divided key(s) in aux and bbl file. + For example, the following divided bibitem(s) in bbl file + -- + \\bibitem{englishTest5} + I.~Yamada, J.~Sato, S.~Tanaka, S.~Suzuki: ``Article title'', Japanese + Transaction, Vol.10, No.5, pp.45--60 (2016-3) + + \\bibitem{japaneseTest5} + 山田~一郎・佐藤~次郎・田中~三郎・鈴木~四郎:「文献タイトル」, + 日本語学会,Vol.10,No.5,pp.45--60(2016-3) + -- + will be converted to the following two divided bibitems. + -- + \\bibitem{englishTest5/ej/japaneseTest5} + I.~Yamada, J.~Sato, S.~Tanaka, S.~Suzuki: ``Article title'', Japanese + Transaction, Vol.10, No.5, pp.45--60 (2016-3)\\hspace{0mm}\\\\ + 山田~一郎・佐藤~次郎・田中~三郎・鈴木~四郎:「文献タイトル」, + 日本語学会,Vol.10,No.5,pp.45--60(2016-3) + -- + The following two divided citation(s) and bibcite(s) in aux file + -- + \\citation{englishTest7} + \\citation{japaneseTest7} + + \\bibcite{englishTest7}{1} + \\bibcite{japaneseTest7}{16} + -- + will also be converted to the following combined citations and bibitems. + -- + \\citation{englishTest7/ej/japaneseTest7} + + \\bibcite{englishTest7/ej/japaneseTest7}{16} + -- + + Parameters + ---------- + bn : str + Target file to process without extension. + if your target tex file is '/DIRNAME/main.tex' + the bn would be '/DIRNAME/main' + + Returns + ------- + int + -1 if the file to process not found + 0 if no combined keys found + num-of-pairs if successfully processed + """ + + logger.info('--') + logger.info('-- Combining divided keys.') + pairs = check_load_file(bn + '.ejp', asjson=True) + if pairs == -1: # file not found + return -1 + if len(pairs) == 0: # no combined keys + return 0 + combine_aux(bn + '.aux', pairs) + combine_bbl(bn + '.bbl', pairs) + return len(pairs) + + +if __name__ == '__main__': + + logger = logging.getLogger() + logger.setLevel(logging.INFO) + + sh = logging.StreamHandler() + logger.addHandler(sh) + + logger.info( + 'This is python version %s ' % platform.python_version()) + logger.info( + 'mixje.py version %s (%s) by %s.' % + (FILE_VERSION, FILE_DATE, FILE_AUTHOR) + ) + logger.info('See web site: %s' % FILE_URL) + try: + fname = sys.argv[1] + logger.info('Target: %s' % fname) + except IndexError: + logger.info('Fatal error: You must assign target.') + sys.exit(0) + + sk = divide_ej_key(fname) + if sk > 0: # combined keys existed + logger.info('-- Fin, %d keys were divided.' % sk) + sys.exit(0) + elif sk < 0: # Abort + sys.exit(0) + + ck = combine_ej_key(fname) + if ck != 0: + # print('-- %d divided citation keys were successfully combined' % ck) + logger.info('-- Fin, %d keys were combined.' % ck) + sys.exit(0) + with open(sys.argv[1] + '.ejp', 'w', encoding='utf-8') as f: + json.dump([], f) + logger.info( + '-- No cmobined nor divided citation key in the aux file') + sys.exit(0) diff --git a/graphics/mcf2graph/CHANGELOG b/graphics/mcf2graph/CHANGELOG index ac54744493..aefa94b116 100644 --- a/graphics/mcf2graph/CHANGELOG +++ b/graphics/mcf2graph/CHANGELOG @@ -1,6 +1,15 @@ ******************************************************************************* - Changelog of mcf2graph software package by Akira Yamaji 2022-03-13 + Changelog of mcf2graph software package by Akira Yamaji 2022-03-27 ******************************************************************************* +[ver. 4.83 / 2022-03-27] + -fix bug in bond check + -change fuction name + check() => mc_check() + query() => mc_query() + -improve report output + -update mcf_library.mcf + -update MCF manual + [ver. 4.82 / 2022-03-13] -add new example file mcf_exa_code.tex (example include code) diff --git a/graphics/mcf2graph/README b/graphics/mcf2graph/README index bac51eca95..61465c30aa 100644 --- a/graphics/mcf2graph/README +++ b/graphics/mcf2graph/README @@ -1,7 +1,7 @@ ******************************************************************************** mcf2graph : Convert Molecular Coding Format to graphics with MetaPost Author : Akira Yamaji - version : 4.82 2022-03-13 + version : 4.83 2022-03-27 E-mail : mcf2graph@gmail.com Located at : http://www.ctan.org/pkg/mcf2graph ******************************************************************************** @@ -34,21 +34,21 @@ 3. How to use mcf2graph with MetaPost Minimum requirement to use mcf2graph : mpost.exe,mpost.dll,mpost.mp,plain.mp - ( 1) >mpost FILENAME => output eps(.mps) file - ( 2) >mpost -s ahangle=1 FILENAME => output png file (600dpi) - ( 3) >mpost -s ahangle=11 FILENAME => output png file (1200dpi) - ( 4) >mpost -s ahangle=2 FILENAME => output svg file - ( 5) >mpost -s ahangle=3 FILENAME => output eps(.eps) file - ( 6) >mpost -s ahlength=1 FILENAME => output information-aux file(for tex) - ( 7) >mpost -s ahlength=2 FILENAME => output information-aux file - (for spread sheet) - ( 8) >mpost -s ahlength=3 FILENAME => output library-aux file - ( 9) >mpost -s ahlength=5 FILENAME => output mol file(V2000) - (10) >mpost -s ahlength=6 FILENAME => output mol file(V3000) - (11) >mpost -s ahlength=7 FILENAME => output report file + ( 1) >mpost FILENAME => output eps(.mps) file + ( 2) >mpost -s ahangle=1 FILENAME => output png file (600dpi) + ( 3) >mpost -s ahangle=11 FILENAME => output png file (1200dpi) + ( 4) >mpost -s ahangle=2 FILENAME => output svg file + ( 5) >mpost -s ahangle=3 FILENAME => output eps(.eps) file + ( 6) >mpost -s ahlength=1 FILENAME => output information-aux file(for tex) + ( 7) >mpost -s ahlength=2 FILENAME => output information-aux file + (for spread sheet) + ( 8) >mpost -s ahlength=3 FILENAME => output library-aux file + ( 9) >mpost -s ahlength=5 FILENAME => output mol file(V2000) + (10) >mpost -s ahlength=6 FILENAME => output mol file(V3000) + (11) >mpost -s ahlength=7 FILENAME => output report file 4. License - mcf2graph ver 4.82 Copyright (c) 2013-2022 Akira Yamaji + mcf2graph ver 4.83 Copyright (c) 2013-2022 Akira Yamaji Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/graphics/mcf2graph/mcf2graph.mp b/graphics/mcf2graph/mcf2graph.mp index 6bf2292510..10c14d4cec 100644 --- a/graphics/mcf2graph/mcf2graph.mp +++ b/graphics/mcf2graph/mcf2graph.mp @@ -1,5 +1,5 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% mcf2graph ver 4.82 Copyright (c) 2013-2022 Akira Yamaji +% mcf2graph ver 4.83 Copyright (c) 2013-2022 Akira Yamaji % % Permission is hereby granted, free of charge, to any person obtaining a copy of this software % and associated documentation files (the "Software"), to deal in the Software without restriction, @@ -33,7 +33,7 @@ % Set output MOL file (V3000) : mpost -s ahlength=6 FILENAME % Set output report : mpost -s ahlength=7 FILENAME %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -message "* This is mcf2graph ver 4.82 2022.03.13"; +message "* This is mcf2graph ver 4.83 2022.03.27"; tracingstats:=1; prologues:=3; warningcheck:=0; %------------------------------------------------------------------------------------------------- numeric save_num[],parts_com[][],parts_par[][],parts_cnt[],tbl_atom[],tbl_group[][],tbl_atom_wt[], @@ -162,25 +162,25 @@ enddef; %-------------------------------------------------------------------------------------------------- def init_par(text t)= nA:=nB:=nC:=0; - for list=t: if numeric list: nA:=nA+1; save_num[nA]:=list; - ef pair list: nB:=nB+1; save_pair[nB]:=list; - ef string list: nC:=nC+1; save_str[nC]:=list; fi + for list=t: if numeric list: save_num[incr nA]:=list; + ef pair list: save_pair[incr nB]:=list; + ef string list: save_str[incr nC]:=list; fi endfor enddef; %-------------------------------------------------------------------------------------------------- def store_par(text t)= nA:=nB:=nC:=0; - for list=t: if numeric list: nA:=nA+1; if save_num[nA]<>list: save_num[nA]:=list; fi - ef pair list: nB:=nB+1; if save_pair[nB]<>list: save_pair[nB]:=list; fi - ef string list: nC:=nC+1; if save_str[nC]<>list: save_str[nC]:=list; fi fi + for list=t: if numeric list: if save_num[incr nA]<>list: save_num[nA]:=list; fi + ef pair list: if save_pair[incr nB]<>list: save_pair[nB]:=list; fi + ef string list: if save_str[incr nC]<>list: save_str[nC]:=list; fi fi endfor enddef; %-------------------------------------------------------------------------------------------------- def restore_par(text t)= nA:=nB:=nC:=0; - forsuffixes list=t: if numeric list: nA:=nA+1; if list<>save_num[nA]: list:=save_num[nA]; fi - ef pair list: nB:=nB+1; if list<>save_pair[nB]: list:=save_pair[nB]; fi - ef string list: nC:=nC+1; if list<>save_str[nC]: list:=save_str[nC]; fi fi + forsuffixes list=t: if numeric list: if list<>save_num[incr nA]: list:=save_num[nA]; fi + ef pair list: if list<>save_pair[incr nB]: list:=save_pair[nB]; fi + ef string list: if list<>save_str[incr nC]: list:=save_str[nC]; fi fi endfor enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -201,25 +201,24 @@ def beginfigm(text s)= picture mol_pic[]; color color_list[]; %------------------------------------------------------------------------------------------------ + store_par(parameter_list); + %------------------------------------------------------------------------------------------------ let ext=ext_to_fig; let add=add_to_molecule; def '=read_ud enddef; %------------------------------------------------------------------------------------------------ inf_NO:=inf_EN:=inf_JN:=inf_MW:=inf_FM:=inf_CAS:=inf_Cat:=inf_EXA:=inf_EXB:="-"; - mc:=temps:=cal_MW:=cal_MI:=cal_FM:=filter_s:=""; - file_input:=default_library; + mc:=temps:=cal_MW:=cal_MI:=cal_FM:=filter_s:=""; file_input:=default_library; %------------------------------------------------------------------------------------------------ parts_num:=parts_usr_start; parts_int:=parts_int_start; - %------------------------------------------------------------------------------------------------ - store_par(parameter_list); fig_num:=fig_num+1; f_ext:=cntM:=mc_row:=info_cnt:=f_EOF:=0; %------------------------------------------------------------------------------------------------ for list=s: at_colon:=scan_char(":",list,0,1); if at_colon=1: fw_n:=scan_char(" ",list,1,2); bw_n:=scan_char(" ",list,-1,2); - mc_row:=mc_row+1; mc_indent[mc_row]:=fw_n-2; + mc_indent[incr mc_row]:=fw_n-2; mc[mc_row]:=substring(fw_n-1,bw_n) of list; mc:=mc&mc[mc_row]; ef at_colon>=1: - info_cnt:=info_cnt+1; info_s[info_cnt]:=list; + info_s[incr info_cnt]:=list; sT:=substring(0,at_colon-1) of list; sV:=substring(at_colon,length(list)) of list; if sT="f": if scan_char(".",sV,0,1)=0: file_input:=sV&".mcf"; else: file_input:=sV; fi ef sT="t": temps:=sV; @@ -307,7 +306,7 @@ def pickup_data_unit(expr t,v,f)= sS:=readfrom file_input; if sS=EOF: f_EOF:=1; fi exitif f_EOF=1; exitif subc(1,sS)="+"; if subc(1,sS)<>"%": - fw_n:=scan_char(" ",sS,1,1); mc_row:=mc_row+1; mc_indent[mc_row]:=fw_n-1; + fw_n:=scan_char(" ",sS,1,1); mc_indent[incr mc_row]:=fw_n-1; mc[mc_row]:=substring(fw_n-1,length(sS)) of sS; mc:=mc&mc[mc_row]; fi endfor for i=1 upto inf_num: @@ -336,7 +335,6 @@ def pickup_data_unit(expr t,v,f)= enddef; %-------------------------------------------------------------------------------------------------- vardef scan_bit(expr n,b)= if b>=1: odd(floor(n/b)) else: odd(floor((frac n)/b)) fi enddef; -%-------------------------------------------------------------------------------------------------- vardef scan_char(expr c,s,d,n)= nN:=0; if d=0: for i=n upto length(s): if subc(i,s)=c: nN:=i; fi exitif nN>0; endfor @@ -345,16 +343,18 @@ vardef scan_char(expr c,s,d,n)= enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% vardef '(text t)= parts_num:=parts_num+1; read_mcf(parts_num)(t); parts_num enddef; -vardef read_id(text t)=read_mcf(incr parts_num)(|,#rate_cr,t,##,(_com,_rest)); parts_num enddef; -vardef read_ud(text t)=read_mcf(incr parts_num)(dum,dum,|,t,(_com,_rest)); parts_num enddef; +vardef read_id(text t)= parts_num:=parts_num+1; + read_mcf(parts_num)(|,#rate_cr,t,##,(_com,_rest)); parts_num enddef; +vardef read_ud(text t)= parts_num:=parts_num+1; + read_mcf(parts_num)(dum,dum,|,t,(_com,_rest)); parts_num enddef; vardef abs_adress primary n = if n LT 0:: (n+360)-4095 else:: n-4095 fi enddef; primarydef a from_until b = (_from,a),(_until,b) enddef; tertiarydef a op_equ b = if (known a)and(known b):: change_bond(a,b) else:: _nop fi enddef; tertiarydef a op_col b = if (known a)and(known b):: change_atom(a,b) else:: _nop fi enddef; tertiarydef a op_hat b = if known b:: (_tmp_rot,b),a else:: _nop,a fi enddef; tertiarydef a op_til b = if known b:: (_tmp_line,b),a else:: _nop,a fi enddef; -tertiarydef a op_lt b = if known b:: (_tmp_env,b),a else:: _nop,a fi enddef; -tertiarydef a op_bq b = if known b:: (_tmp_len,b),a else:: _nop,a fi enddef; +tertiarydef a op_lth b = if known b:: (_tmp_env,b),a else:: _nop,a fi enddef; +tertiarydef a op_bqu b = if known b:: (_tmp_len,b),a else:: _nop,a fi enddef; def rot_angle primary n = (_rot_ang,n) enddef; def cyc_atom primary n = (_cyc,n) enddef; def jump_atom_abs primary a = if numeric a:: (_jp_atom,$a) ef pair a:: (_jp_atom,$1),<$0,angle(a)~0`length(a),<$0 fi @@ -367,21 +367,19 @@ def group_si secondary n = if known n:: (_group_si,n) else:: _nop fi enddef; def group_dm secondary n = if known n:: (_group_dm,n) else:: _nop fi enddef; def group_wf secondary n = if known n:: (_group_wf,n) else:: _nop fi enddef; def group_zf secondary n = if known n:: (_group_zf,n) else:: _nop fi enddef; -def group_wv secondary n = /n~wv enddef; -def group_nb secondary n = /n~nb enddef; -%------------------------------------------------------------------------------------------------- -def CP = com_par enddef; def CPe = com_par_ex(0) enddef; def CPx = com_par_ex(1) enddef; +def group_wv secondary n = /n~wv enddef; def group_nb secondary n = /n~nb enddef; %================================================================================================= def read_mcf(expr n)(text t)= begingroup save nCP; if unknown inside_MC:: - save /,//,/*,*/,**,*/*,~,^,',`,<,>,:,=,\,\\,*\,\*,*\*,@,@$,$,&,&$,#,##,{,},|,||,_,inside_MC; + save /,//,/*,*/,**,*/*,~,^,',`,<,>,:,=,\,\\,*\,\*,*\*,@,@$,$,&,&$,#,##,{,},|,||,_,CP,CA, + inside_MC; | :=mark_adress; || :=reset_adress; ##:=reset_length; _:=Me; \:=0; \\:=zero_dm; *\:=zero_wf; \*:=zero_zf; *\*:=zero_wv; - let = ==op_equ; let : ==op_col; let ^==op_hat; let ~==op_til; let > ==op_lt; let `==op_bq; + let = ==op_equ; let : ==op_col; let ^==op_hat; let ~==op_til; let > ==op_lth; let `==op_bqu; def $==abs_adress enddef; def &$==&.$ enddef; def '==read_id enddef; - def {==read_number( enddef; + def {==read_number( enddef; def CP == com_par enddef; def CA == com_par_adr enddef; let }==); let @$==jump_atom_abs; let < ==rot_angle; let @==jump_atom; let &==cyc_atom; let #==chg_length; let /==group_si; let //==group_dm; let */==group_wf; let /*==group_zf; let */*==group_wv; let **==group_nb; @@ -391,15 +389,14 @@ def read_mcf(expr n)(text t)= nCP:=0; for list==t:: if known list:: - if pair list:: nCP:=nCP+1; parts_com[n][nCP]:=xpart(list); parts_par[n][nCP]:=ypart(list); + if pair list:: parts_com[n][incr nCP]:=xpart(list); parts_par[n][nCP]:=ypart(list); ef numeric list:: if list==_nop:: message "unknown command in "AND decimal(n); ef list>=parts_emb_start:: for i==1 upto parts_cnt[list]:: - nCP:=nCP+1; - parts_com[n][nCP]:=parts_com[list][i]; parts_par[n][nCP]:=parts_par[list][i]; + parts_com[n][incr nCP]:=parts_com[list][i]; parts_par[n][nCP]:=parts_par[list][i]; endfor - else:: nCP:=nCP+1; parts_com[n][nCP]:=_mk_bond; parts_par[n][nCP]:=list; fi + else:: parts_com[n][incr nCP]:=_mk_bond; parts_par[n][nCP]:=list; fi fi else:: message "unknown command in "AND decimal(n); fi @@ -416,16 +413,15 @@ vardef read_number(text t)= if known list:: if numeric list:: if list==_nop:: message "unknown command in "AND decimal(parts_int); - else:: nA:=nA+1; parts_com[parts_int][nA]:=_numeric; parts_par[parts_int][nA]:=list; + else:: parts_com[parts_int][incr nA]:=_numeric; parts_par[parts_int][nA]:=list; fi ef pair list:: if xpart(list)==_from:: nB:=ypart(list); ef xpart(list)==_until:: nC:=ypart(list); for i==nB upto nC:: - nA:=nA+1; parts_com[parts_int][nA]:=_numeric; parts_par[parts_int][nA]:=i; + parts_com[parts_int][incr nA]:=_numeric; parts_par[parts_int][nA]:=i; endfor - else:: nA:=nA+1; - parts_com[parts_int][nA]:=xpart(list); parts_par[parts_int][nA]:=ypart(list); + else:: parts_com[parts_int][incr nA]:=xpart(list); parts_par[parts_int][nA]:=ypart(list); fi fi else:: message "unknown command in "AND decimal(parts_int); @@ -462,27 +458,27 @@ enddef; vardef change_bond(expr a,b) = if known b:: parts_int:=parts_int+1; nC:=0; if numeric b:: - if (b>=si)and(b<=bd_):: + if (b>=si)and(b<=bd_):: if a>=parts_int_start:: for i==1 upto parts_cnt[a]:: if parts_com[a][i]==_numeric:: - if frac parts_par[a][i]==0:: com_par(_set_adr,parts_par[a][i]) com_par(_set_line,b) - ef b==dl:: com_par(_set_adr,floor parts_par[a][i]) com_par(_set_line,dr) - ef b==dr:: com_par(_set_adr,floor parts_par[a][i]) com_par(_set_line,dl) - else:: com_par(_set_adr,floor parts_par[a][i]) com_par(_set_line,b) fi fi + if frac parts_par[a][i]==0:: CA(_set_line,b,parts_par[a][i]) + ef b==dl:: CA(_set_line,dr,floor parts_par[a][i]) + ef b==dr:: CA(_set_line,dl,floor parts_par[a][i]) + else:: CA(_set_line,b,floor parts_par[a][i]) + fi + fi endfor - else:: com_par(_set_adr,a) com_par(_set_line,b) + else:: CP(_set_adr,a) CP(_set_line,b) fi elseif (b>=?3)and(b<=?8[15]):: if numeric a:: if a>=parts_int_start:: for i==1 upto parts_cnt[a]:: if parts_com[a][i]==_numeric:: - if b==Ph1:: fuse_ring(parts_par[a][i],6) - CP(_set_adr,-2) CP(_set_line,dl) CP(_set_adr,-4) CP(_set_line,dl) - ef b==Ph2:: fuse_ring(parts_par[a][i],6) - CP(_set_adr,-1) CP(_set_line,dl) CP(_set_adr,-3) CP(_set_line,dl) - CP(_set_adr,-5) CP(_set_line,dl) + if b==Ph1:: fuse_ring(parts_par[a][i],6) CA(_set_line,dl,-2) CA(_set_line,dl,-4) + ef b==Ph2:: fuse_ring(parts_par[a][i],6) CA(_set_line,dl,-1) CA(_set_line,dl,-3) + CA(_set_line,dl,-5) ef (b>=?5[11])and(b<=?5[15]):: fuse_ring_size(a,5,b-?5[11]+11) ef (b>=?6[11])and(b<=?6[15]):: fuse_ring_size(a,6,b-?6[11]+11) ef (b>=?7[11])and(b<=?7[15]):: fuse_ring_size(a,7,b-?7[11]+11) @@ -503,24 +499,21 @@ vardef change_bond(expr a,b) = ef frac parts_com[a][i]==0:: fuse_ring_bonds((parts_com[a][i],floor parts_par[a][i]),5,2) ef frac parts_par[a][i]==0:: - fuse_ring_bonds((floor parts_com[a][i],floor parts_par[a][i]),5,2) - fi + fuse_ring_bonds((floor parts_com[a][i],floor parts_par[a][i]),5,2) fi ef b==?4:: fuse_ring_bonds((parts_com[a][i],parts_par[a][i]),4,2) ef b==?6[3]:: fuse_ring_bonds((parts_com[a][i],parts_par[a][i]),6,3) ef b==?6[2]:: fuse_ring_bonds((parts_com[a][i],parts_par[a][i]),6,2) ef b==?5[2]:: fuse_ring_bonds((parts_com[a][i],parts_par[a][i]),5,2) ef b==Ph1:: fuse_ring_bonds((parts_com[a][i],parts_par[a][i]),6,4) - CP(_set_adr,-1) CP(_set_line,dl) CP(_set_adr,-3) CP(_set_line,dl) + CA(_set_line,dl,-1) CA(_set_line,dl,-3) ef b==Ph2:: fuse_ring_bonds((parts_com[a][i],parts_par[a][i]),6,4) - CP(_set_adr,-2) CP(_set_line,dl) CP(_set_adr,-4) CP(_set_line,dl) + CA(_set_line,dl,-2) CA(_set_line,dl,-4) fi fi endfor else:: - if b==Ph1:: fuse_ring(a,6) CP(_set_adr,-2) CP(_set_line,dl) - CP(_set_adr,-4) CP(_set_line,dl) - ef b==Ph2:: fuse_ring(a,6) CP(_set_adr,-1) CP(_set_line,dl) - CP(_set_adr,-3) CP(_set_line,dl) CP(_set_adr,-5) CP(_set_line,dl) + if b==Ph1:: fuse_ring(a,6) CA(_set_line,dl,-2) CA(_set_line,dl,-4) + ef b==Ph2:: fuse_ring(a,6) CA(_set_line,dl,-1) CA(_set_line,dl,-3) CA(_set_line,dl,-5) ef (b>=?5[11])and(b<=?5[15]):: fuse_ring_size(a,5,b-?5[11]+11) ef (b>=?6[11])and(b<=?6[15]):: fuse_ring_size(a,6,b-?6[11]+11) ef (b>=?7[11])and(b<=?7[15]):: fuse_ring_size(a,7,b-?7[11]+11) @@ -533,13 +526,12 @@ vardef change_bond(expr a,b) = ef b==?6[3]:: fuse_ring_bonds(a,6,3) ef b==?6[2]:: fuse_ring_bonds(a,6,2) ef b==?5[2]:: fuse_ring_bonds(a,5,2) - ef b==Ph1:: fuse_ring_bonds(a,6,4) - CP(_set_adr,-1) CP(_set_line,dl) CP(_set_adr,-3) CP(_set_line,dl) - ef b==Ph2:: fuse_ring_bonds(a,6,4) - CP(_set_adr,-2) CP(_set_line,dl) CP(_set_adr,-4) CP(_set_line,dl) fi + ef b==Ph1:: fuse_ring_bonds(a,6,4) CA(_set_line,dl,-1) CA(_set_line,dl,-3) + ef b==Ph2:: fuse_ring_bonds(a,6,4) CA(_set_line,dl,-2) CA(_set_line,dl,-4) + fi fi fi - elseif color b:: color_list[incr cntC]:=b; CPe(a)(_set_colorB,cntC) fi + elseif color b:: color_list[incr cntC]:=b; CA(_set_colorB,cntC,a) fi parts_cnt[parts_int]:=nC; parts_int fi enddef; @@ -547,16 +539,16 @@ enddef; vardef change_atom(expr a,b)= if known b:: parts_int:=parts_int+1; nC:=0; if numeric b:: - if (b GT parts_emb_start)and(b<=parts_atom_end):: CPe(a)(_chg_atom,b) - ef b==NH:: CPe(a)(_chg_atom,N) if NH<>xNH:: CP(_tmp_line,nl) fi - CP(_com,_group_s) CPx(a)(_group_si,H) CP(_com,_group_e) - ef b==N!:: CPe(a)(_chg_atom,N) CP(_com,_group_s) CPx(a)(_group_si,_) CP(_com,_group_e) - ef b==N!2:: CPe(a)(_chg_atom,N) CP(_com,_group_s) CPx(a)(_group_si,!) CP(_com,_group_e) - ef b==??:: CP(_com,_group_s) CP(_tmp_rot,35) CPx(a)(_group_si,_) - CP(_tmp_rot,-35) CPx(a)(_group_si,_) CP(_com,_group_e) - ef b==SOO:: CPe(a)(_chg_atom,S) CP(_com,_group_s) CP(_tmp_rot,35) CPx(a)(_group_dm,O) - CP(_tmp_rot,-35) CPx(a)(_group_dm,O) CP(_com,_group_e) - ef b==SO:: CPe(a)(_chg_atom,S) CP(_com,_group_s) CPx(a)(_group_dm,O) CP(_com,_group_e) + if (b GT parts_emb_start)and(b<=parts_atom_end):: CA(_chg_atom,b,a) + ef b==NH:: CA(_chg_atom,N,a) if NH<>xNH:: CP(_tmp_line,nl) fi + CP(_com,_group_s) CA(_group_si,H,a) CP(_com,_group_e) + ef b==N!:: CA(_chg_atom,N,a) CP(_com,_group_s) CA(_group_si,_,a) CP(_com,_group_e) + ef b==N!2:: CA(_chg_atom,N,a) CP(_com,_group_s) CA(_group_si,!,a) CP(_com,_group_e) + ef b==??:: CP(_com,_group_s) CP(_tmp_rot,35) CA(_group_si,_,a) + CP(_tmp_rot,-35) CA(_group_si,_,a) CP(_com,_group_e) + ef b==SOO:: CA(_chg_atom,S,a) CP(_com,_group_s) CP(_tmp_rot,35) CA(_group_dm,O,a) + CP(_tmp_rot,-35) CA(_group_dm,O,a) CP(_com,_group_e) + ef b==SO:: CA(_chg_atom,S,a) CP(_com,_group_s) CA(_group_dm,O,a) CP(_com,_group_e) ef b==n_:: CP(_com,_group_s) CP(_set_add,a_minus) CP(_chg_add,a) CP(_com,_group_e) ef b==p_:: CP(_com,_group_s) CP(_set_add,a_plus) CP(_chg_add,a) CP(_com,_group_e) fi @@ -565,33 +557,27 @@ vardef change_atom(expr a,b)= if a>=parts_emb_start:: for i==1 upto parts_cnt[a]:: if parts_com[a][i]==_numeric:: - if xpart(b)==_group_wf:: - if frac parts_par[a][i]==0:: CP(_set_adr,parts_par[a][i]) CP(_group_wf,ypart(b)) - else:: CP(_set_adr,floor parts_par[a][i]) CP(_group_zf,ypart(b)) fi - ef xpart(b)==_group_zf:: - if frac parts_par[a][i]==0:: CP(_set_adr,parts_par[a][i]) CP(_group_zf,ypart(b)) - else:: CP(_set_adr,floor parts_par[a][i]) CP(_group_wf,ypart(b)) fi - else:: CP(_set_adr,parts_par[a][i]) CP(xpart(b),ypart(b)) fi + if frac parts_par[a][i]==0:: CA(xpart(b),ypart(b),parts_par[a][i]) + ef xpart(b)==_group_wf:: CA(_group_zf,ypart(b),floor parts_par[a][i]) + ef xpart(b)==_group_zf:: CA(_group_wf,ypart(b),floor parts_par[a][i]) + else:: CA(xpart(b),ypart(b),parts_par[a][i]) fi else:: CP(parts_com[a][i],parts_par[a][i]) fi endfor - else:: CP(_set_adr,a) CP(xpart(b),ypart(b)) - fi + else:: CA(xpart(b),ypart(b),a) fi CP(_com,_group_e) - ef color b:: color_list[incr cntC]:=b; CPe(a)(_set_colorA,cntC) - fi + ef color b:: color_list[incr cntC]:=b; CA(_set_colorA,cntC,a) fi parts_cnt[parts_int]:=nC; parts_int fi enddef; %------------------------------------------------------------------------------------------------- -def com_par(expr a,b)= nC:=nC+1; parts_com[parts_int][nC]:=a; parts_par[parts_int][nC]:=b; enddef; -%------------------------------------------------------------------------------------------------- -def com_par_ex(expr f)(expr c)(expr a,b)= - if c>=parts_emb_start:: - for i==1 upto parts_cnt[c]:: - if parts_com[c][i]==_numeric:: com_par(_set_adr,parts_par[c][i]) com_par(a,b) - ef f==1:: com_par(parts_com[c][i],parts_par[c][i]) fi +def com_par(expr c,p)= parts_com[parts_int][incr nC]:=c; parts_par[parts_int][nC]:=p; enddef; +def com_par_adr(expr c,p,a)= + if a>=parts_emb_start:: + for i==1 upto parts_cnt[a]:: + if parts_com[a][i]==_numeric:: com_par(_set_adr,parts_par[a][i]) com_par(c,p) + else:: com_par(parts_com[a][i],parts_par[a][i]) fi endfor - else:: com_par(_set_adr,c) com_par(a,b) + else:: com_par(_set_adr,a) com_par(c,p) fi enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -670,8 +656,7 @@ def MC(text t)= path frameA[],zA,zL; %----------------------------------------------------------------------------------------------- if (sw_expand=1)or(scan_bit(sw_output,MOL2k))or(scan_bit(sw_output,MOL3k)): - expand_set; rate_cr:=1; else: rate_cr:=-ratio_chain_ring; - fi + expand_set; rate_cr:=1; else: rate_cr:=-ratio_chain_ring; fi cC:="C"; cH:="H"; cO:="O"; cN:="N"; cS:="S"; cF:="F"; cP:="P"; cntA:=cntB:=cntC:=group_num:=0; str_tbl[0]:=cC; str_cnt:=2000; %----------------------------------------------------------------------------------------------- @@ -693,12 +678,10 @@ def MC(text t)= proc_skeleton(0); proc_scaling; if (mol_ht/mol_wd)>(m_ht/m_wd): if ypart(msize)>1: factor:=ypart(msize)/mol_ht; - else: factor:=((fig_ht-2margin_tb)*ypart(msize))/mol_ht; - fi + else: factor:=((fig_ht-2margin_tb)*ypart(msize))/mol_ht; fi else: if xpart(msize)>1: factor:=xpart(msize)/mol_wd; - else: factor:=((fig_wd-2margin_lr)*xpart(msize))/mol_wd; - fi + else: factor:=((fig_wd-2margin_lr)*xpart(msize))/mol_wd; fi fi exitif (factor>=1-eps)and(factor<=1+eps); blen:=blen*factor; proc_size_setup; endfor @@ -722,8 +705,7 @@ def MC(text t)= if addA[i]<>0: nA:=angX[i]+add_rot[i]; nC:=nA mod 90; if strA[i]=0: nB:=.5atom_wd; else: nB:=atom_wd; fi - draw_char(char(addA[i]),sfrt(posA[i],nB,nA)); - fi + draw_char(char(addA[i]),sfrt(posA[i],nB,nA)); fi endfor fi %-draw bond----------------------------------------------------------------------------------- @@ -759,7 +741,7 @@ def MC(text t)= else: nX:=margin_lr-minX+(fig_wd-mol_wd-2margin_lr)*xpart(mposition); fi if ypart(mposition)>1: nY:=ypart(mposition)-minY; else: nY:=margin_tb-minY+(fig_ht-mol_ht-2margin_tb)*ypart(mposition); fi - cntM:=cntM+1; posM[0][cntM]:=(nX,nY); + posM[0][incr cntM]:=(nX,nY); posM[1][cntM]:=(minX+nX,minY+nY); posM[2][cntM]:=(maxX+nX,maxY+nY); wdM[cntM]:=mol_wd; htM[cntM]:=mol_ht; mol_pic[cntM]:=currentpicture; @@ -771,8 +753,7 @@ enddef; %------------------------------------------------------------------------------------------------- def add_group= if f_at=1: nE:=getA(adrT); check_adrA(nE); else: nE:=cntA+1; fi - group_num:=group_num+1; group_cnt[group_num]:=0; - store_group(_jp_absA,nE) store_group(_com,_len_s) + group_cnt[incr group_num]:=0; store_group(_jp_absA,nE) store_group(_com,_len_s) if lineT<>nb: store_group(_tmp_line,lineT) fi if rotT<>0: store_group(_rot_ang,rotT) fi if lenT<>rate_cr: store_group(_chg_len,lenT) @@ -791,16 +772,16 @@ def add_group= enddef; %------------------------------------------------------------------------------------------------- def store_group(expr a,b)= - group_cnt[group_num]:=group_cnt[group_num]+1; - group_com[group_num][group_cnt[group_num]]:=a; group_par[group_num][group_cnt[group_num]]:=b; + group_com[group_num][incr group_cnt[group_num]]:=a; + group_par[group_num][group_cnt[group_num]]:=b; enddef; %================================================================================================= def read_group(expr a)(expr n)= save_group_cnt:=group_num; save_cntD:=parts_cnt[a]; for i=n upto group_num: for j=1 upto group_cnt[i]: - parts_cnt[a]:=parts_cnt[a]+1; - parts_com[a][parts_cnt[a]]:=group_com[i][j]; parts_par[a][parts_cnt[a]]:=group_par[i][j]; + parts_com[a][incr parts_cnt[a]]:=group_com[i][j]; + parts_par[a][parts_cnt[a]]:=group_par[i][j]; endfor endfor proc_bond_atom(a)(save_cntD+1); @@ -834,8 +815,7 @@ def proc_scaling= tempc:=subc(j,str_tbl[strA[i]]); if tempc="^": nU:=.5atom_wd; ef tempc="_": nD:=.5atom_wd; - ef (tempc<>"{")and(tempc<>"}"): nP:=nP+atom_wd*tbl_char_wd[ASCII(tempc)]; - fi + ef (tempc<>"{")and(tempc<>"}"): nP:=nP+atom_wd*tbl_char_wd[ASCII(tempc)]; fi endfor if (angX[i]<=90)or(angX[i]>=270): nR:=nP; else: nL:=nP; fi if (nX-nL+.5atom_wd)<minX: minX:=nX-nL+.5atom_wd; fi @@ -900,11 +880,11 @@ def proc_bond_atom(expr a)(expr n)= enddef; %------------------------------------------------------------------------------------------------- def add_atom(expr n)= - cntB:=cntB+1; lineB[cntB]:=lineT; lineT:=si; + lineB[incr cntB]:=lineT; lineT:=si; if lenT=rate_cr: lenB[cntB]:=bondL; else: lenB[cntB]:=lenT; lenT:=rate_cr; fi - if f_bra=0: cntA:=cntA+1; sB[cntB]:=cntA; strA[cntA]:=temp_strA; - addA[cntA]:=addAT; addAT:=temp_strA:=add_rot[cntA]:=0; - if rotT<>0: add_rot[cntA]:=rotT; rotT:=0; fi + if f_bra=0: sB[cntB]:=incr cntA; strA[cntA]:=temp_strA; + addA[cntA]:=addAT; addAT:=temp_strA:=add_rot[cntA]:=0; + if rotT<>0: add_rot[cntA]:=rotT; rotT:=0; fi else: f_bra:=0; fi if n=0: eB[cntB]:=cntA+1; f_term:=0; else: eB[cntB]:=n; f_term:=1; fi enddef; @@ -978,14 +958,14 @@ vardef getB(expr n)= if n>=0: markB+n ef n>=-999: cntB+n+1 else: n+4095 fi endde def termA= if f_term=0: if f_bra=0: - cntA:=cntA+1; strA[cntA]:=temp_strA; addA[cntA]:=addAT; add_rot[cntA]:=rotT; + strA[incr cntA]:=temp_strA; addA[cntA]:=addAT; add_rot[cntA]:=rotT; addAT:=temp_strA:=rotT:=0; else: f_bra:=0; fi f_term:=1; fi enddef; %------------------------------------------------------------------------------------------------- def termB= - if f_term=0: if f_bra=0:cntA:=cntA+1; angX[cntA]:=angT mod 360; else:f_bra:=0; fi f_term:=1; fi + if f_term=0: if f_bra=0: angX[incr cntA]:=angT mod 360; else:f_bra:=0; fi f_term:=1; fi enddef; %------------------------------------------------------------------------------------------------- vardef glu_atom(expr n)= @@ -1337,10 +1317,14 @@ def proc_report_out(expr f)= printf "---------------------------------------------------------------------------"; for i=1 upto mc_row: printf (substring(0,mc_indent[i]) of blanks)&mc[i]; endfor printf "---------------------------------------------------------------------------"; - printf " row="&fdr(3)(mc_row)&" / length="&fdr(4)(length(mc))&" / commands="&fdr(3)(cnt_cmm); - printf " {}=X ="&fdr(3)(cnt_chgB)&" / {}:X ="&fdr(3)(cnt_chgA)& - " / '() ="&fdr(3)(cnt_inline_def)&" / @ ="&fdr(3)(cnt_at)& - " / & ="&fdr(3)(cnt_and)&" / < ="&fdr(3)(cnt_gtn); fi + printf " row="&fdr(3)(mc_row)&" , length="&fdr(4)(length(mc))& + " , commands="&fdr(3)(cnt_cmm); + printf " {}=X["&decimal(cnt_chgB)&"],{}:X["&decimal(cnt_chgA)& + "],'()["&decimal(cnt_inline_def)&"],@["&decimal(cnt_at)& + "],&["&decimal(cnt_and)&"],<["&decimal(cnt_gtn)&"],=["&decimal(cnt_equ)& + "],|["&decimal(cnt_bar-cnt_bars)&"],||["&decimal(cnt_bars)& + "],#["&decimal(cnt_hsh-cnt_hshs)&"],##["&decimal(cnt_hshs)&"]"; + fi printf "---------------------------------------------------------------------------"; printf " Warnings = "&fdr(3)(warning_cnt)&" / Code= "&decimal(parts_cnt[0]); printf " Width * Height = " & fdr(10)(mol_wd)&" * "&fdr(10)(mol_ht); @@ -1372,15 +1356,14 @@ def proc_report_out(expr f)= if sumA[i]>=1: printf " "&fsl(5)(erase_brace(tbl_atom_str[i]))& "("&fdr(9)(tbl_atom_wt[i])&")"&"["&fdr(9)(tbl_atom_mi[i])&"]"&" * "&fdr(4)(sumA[i]) - &fdr(15)(tbl_atom_wt[i]*sumA[i])&"["&fdr(12)(tbl_atom_mi[i]*sumA[i])&"]"; - fi + &fdr(15)(tbl_atom_wt[i]*sumA[i])&"["&fdr(12)(tbl_atom_mi[i]*sumA[i])&"]"; fi endfor printf " Molecular Weight [Mono Isotopic] = "&fsr(12)(cal_MW)&"["&fsr(12)(cal_MI)&"]"; printf "---------------------------------------------------------------------------"; printf " Weight Calc: " &cal_MW &" / Input: " - if inf_MW<>"-": &inf_MW &" / weight gap= " &decimal(num_MW-scantokens(inf_MW)) fi; - printf " Fomula Calc: "&cal_FM&" / Input: " - if inf_FM<>"-": &inf_FM&" / "& iif(inf_FM=cal_FM,"MACTCH","NOT MACTCH") fi; + if inf_MW<>"-": &inf_MW &" / weight gap= " &decimal(num_MW-scantokens(inf_MW)) fi; + printf " Fomula Calc: "&cal_FM &" / Input: " + if inf_FM<>"-": &inf_FM&" / "& iif(inf_FM=cal_FM,"MACTCH","NOT MACTCH") fi; printf "==========================================================================="; if f=1: printf EOF; fi enddef; @@ -1432,8 +1415,7 @@ def proc_mc_out(expr f)= forever: for i=nN downto 1: if at_comma[i]<=nA+mc_length: - printf substring(nA,at_comma[i]) of mc; nA:=at_comma[i]; exitif true; - fi + printf substring(nA,at_comma[i]) of mc; nA:=at_comma[i]; exitif true; fi endfor if nL-nA<=mc_length: printf substring(nA,nL) of mc; exitif true; fi endfor @@ -1444,7 +1426,9 @@ def proc_mc_out(expr f)= enddef; %================================================================================================= vardef fit_zero(expr n)= if n<=9: "00" ef n<=99: "0" else: "" fi &decimal(n) enddef; -vardef bond_type(expr n)= if (n>=dl)and(n<=dm_):2 ef n=tm:3 ef n=0: 0 else: 1 fi enddef; +vardef bond_type(expr n)= + if (n>=dl)and(n<=dm_):2 ef n=tm:3 ef (n=0)or(n=vf)or(n=vb): 0 else: 1 fi +enddef; vardef bond_charge(expr n)= if n=2: 1 ef n=1: 3 ef n=-1: 5 ef n=-2: 6 else: 0 fi enddef; vardef bond_stereo(expr n)= if (n=wf)or(n=zb)or(n=bd): 1 ef (n=zf)or(n=wb)or(n=dt): 6 ef n=wv: 4 else: 0 fi enddef; @@ -1454,8 +1438,8 @@ vardef bond_config(expr n)= vardef STa(expr s,WT,MI)= str_cnt:=str_cnt+1; tbl_cnt:=tbl_cnt+1; parts_num:=parts_num+1; parts_com[parts_num][1]:=_set_atom; parts_par[parts_num][1]:=str_cnt; parts_cnt[parts_num]:=1; - str_tbl[str_cnt]:=tbl_atom_str[tbl_cnt]:=s; - tbl_atom[tbl_cnt]:=0; tbl_atom_wt[tbl_cnt]:=WT; tbl_atom_mi[tbl_cnt]:=MI; + str_tbl[str_cnt]:=tbl_atom_str[tbl_cnt]:=s; tbl_atom[tbl_cnt]:=0; + tbl_atom_wt[tbl_cnt]:=WT; tbl_atom_mi[tbl_cnt]:=MI; parts_num enddef; %------------------------------------------------------------------------------------------------- @@ -1463,10 +1447,7 @@ vardef STb(expr s)(text t)= str_cnt:=str_cnt+1; tbl_cnt:=tbl_cnt+1; parts_num:=parts_num+1; parts_com[parts_num][1]:=_set_atom; parts_par[parts_num][1]:=str_cnt; parts_cnt[parts_num]:=1; str_tbl[str_cnt]:=tbl_atom_str[tbl_cnt]:=s; tbl_atom[tbl_cnt]:=0; - for list=t: - tbl_atom[tbl_cnt]:=tbl_atom[tbl_cnt]+1; - tbl_group[tbl_cnt][tbl_atom[tbl_cnt]]:=list-parts_emb_start; - endfor + for list=t: tbl_group[tbl_cnt][incr tbl_atom[tbl_cnt]]:=list-parts_emb_start; endfor parts_num enddef; %================================================================================================= @@ -1486,9 +1467,9 @@ K:= STa("K" ,39.0983, 38.9637064864); Li:=STa("{Li}",6.941, 7.016003 Mg:=STa("{Mg}",24.305, 23.985041697); Mn:=STa("{Mn}",54.938044, 54.93804391); N:= STa("N" ,14.0067, 14.00307400443); Na:=STa("{Na}",22.98977, 22.9897692820); Ni:=STa("{Ni}",58.693, 57.93534241); O:= STa("O" ,15.9994, 15.99491461957); -P:= STa("P" ,30.973762, 30.97376199842); Pb:= STa("Pb" ,207.2, 205.974455); -Pd:=STa("Pd" ,106.4, 107.905075); -S:= STa("S" ,32.065, 31.9720711744); Sb:= STa("Sb" ,121.75, 120.90381); +P:= STa("P" ,30.973762, 30.97376199842); Pb:= STa("{Pb}",207.2, 205.974455); +Pd:=STa("{Pd}",106.4, 107.905075); +S:= STa("S" ,32.065, 31.9720711744); Sb:= STa("{Sb}",121.75, 120.90381); Se:=STa("{Se}",78.971, 79.9165218); Si:=STa("{Si}",28.0855, 27.97692653465); Sn:=STa("{Sn}",118.71, 119.90220163); Ti:=STa("{Ti}",47.867, 47.94794198); U:= STa("U", 238.0289, 238.05079); V:= STa("V", 50.9415, 50.943957); @@ -1504,7 +1485,7 @@ ONa:=STb("O{Na}")(O,Na); SO3Na:=STb("S{O_3_}{Na}")(S,O,O,O,Na); tbl_group_end:=tbl_cnt; parts_atom_end:=parts_num; %================================================================================================= for i=3 upto 20: ?[i]:='((_com,_len_ss),(_get_len,_ring_len),<((-180 DIV i)-90) - for j==2 upto i:: ,(360 DIV i) endfor,(_cyc_sB,1-i),(_com,_len_ee)); endfor + for j==2 upto i:: ,(360 DIV i) endfor,(_cyc_sB,1-i),(_com,_len_ee)); endfor Ph:=Ph1:='(?6,-2=dl,-4=dl,-6=dl); Ph2:='(?6,-1=dl,-3=dl,-5=dl); for i=4,5,6: for j=2 upto i-2: ?[i][j]:='(); endfor endfor for i=5,6,7,8: for j=11 upto 15: ?[i][j]:='(); endfor endfor @@ -1563,7 +1544,7 @@ def expand_set= !CH3:=!xCH3; !OH:=!xOH; !NH2:=!xNH2; !CHO:=!xCHO; !COOH:=!xCOOH; !CN:=!xCN; !NO2:=!xNO2; enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -vardef check(expr s)= +vardef mc_check(expr s)= save mc_char,err_cnt,char_cnt,f_depth,cnt_prn_s,cnt_prn_e,cnt_brc_s,cnt_brc_e,cnt_brk_s, cnt_brk_e,cmm_adr; string err_str[],err_type[]; @@ -1575,15 +1556,16 @@ vardef check(expr s)= %--------------------------------------------------------------------------------------------- if mc_row>=1: for i=1 upto length(s): - tempc:=subc(i,s); if tempc<>" ": char_cnt:=char_cnt+1; mc_char[char_cnt]:=ASCII(tempc); fi + tempc:=subc(i,s); if tempc<>" ": mc_char[incr char_cnt]:=ASCII(tempc); fi endfor mc_char[0]:=mc_char[char_cnt+1]:=mc_char[char_cnt+2]:=a_cmm; %-- argument missing chkeck -------------------------------------------------------------- - cnt_prn_s:=cnt_prn_e:=cnt_brc_s:=cnt_brc_e:=cnt_brk_s:=cnt_brk_e:=cnt_inline_def:=cnt_at:=0; - cnt_cmm:=cnt_and:=cnt_gtn:=cnt_gtn:=nA:=f_depth:=0; + cnt_prn_s:=cnt_prn_e:=cnt_brc_s:=cnt_brc_e:=cnt_brk_s:=cnt_brk_e:=cnt_inline_def:=0; + cnt_at:=cnt_cmm:=cnt_and:=cnt_gtn:=cnt_equ:=cnt_cln:=cnt_bar:=cnt_bars:=0; + cnt_hsh:=cnt_hshs:=f_depth:=nA:=0; forever: nA:=nA+1; nB:=mc_char[nA-1]; nC:=mc_char[nA]; nD:=mc_char[nA+1]; - if nC=a_cmm: if f_depth=0: cnt_cmm:=cnt_cmm+1; cmm_adr[cnt_cmm]:=nA; fi + if nC=a_cmm: if f_depth=0: cmm_adr[incr cnt_cmm]:=nA; fi ef nC=a_ast: if nD=a_sls: if mc_char[nA+2]=a_ast: if mc_char[nA+3]=a_cmm: proc_err(7,nA) nA:=nA+2; fi % */* x @@ -1592,24 +1574,28 @@ vardef check(expr s)= ef nC=a_sls: if nD=a_sls: if mc_char[nA+2]=a_cmm: proc_err(7,nA) nA:=nA+1; fi % // x ef nD=a_ast: if mc_char[nA+2]=a_cmm: proc_err(7,nA) nA:=nA+1; fi % /* x ef nD=a_cmm: proc_err(7,nA) fi % / x - ef nC=a_hsh: if nD=a_hsh: nA:=nA+1; % ## + ef nC=a_hsh: cnt_hsh:=cnt_hsh+1; % #+## + if nD=a_hsh: cnt_hshs:=cnt_hshs+1; nA:=nA+1; % ## ef nD=a_cmm: proc_err(7,nA) fi if nB<>a_cmm: proc_err(8,nA) fi % a # x ef nC=a_dol: if nD=a_cmm: proc_err(7,nA) fi % $ x - ef nC=a_equ: if nD= a_cmm: proc_err(7,nA) fi if nB= a_cmm: proc_err(7,nA) fi % x = x - ef nC=a_cln: if nD= a_cmm: proc_err(7,nA) fi if nB= a_cmm: proc_err(7,nA) fi % x : x + ef nC=a_equ: cnt_equ:=cnt_equ+1; + if nD= a_cmm: proc_err(7,nA) fi if nB= a_cmm: proc_err(7,nA) fi % x = x + ef nC=a_cln: cnt_cln:=cnt_cln+1; + if nD= a_cmm: proc_err(7,nA) fi if nB= a_cmm: proc_err(7,nA) fi % x : x ef nC=a_amk: cnt_at:=cnt_at+1; if nD= a_cmm: proc_err(7,nA) fi if nB<>a_cmm: proc_err(8,nA) fi % a @ x ef nC=a_and: cnt_and:=cnt_and+1; if nD= a_cmm: proc_err(7,nA) fi if nB<>a_cmm: proc_err(8,nA) fi % a & x ef nC=a_gtn: cnt_gtn:=cnt_gtn+1; - ef nC=a_ltn: if nD= a_cmm: proc_err(7,nA) fi if nB= a_cmm: proc_err(7,nA) fi % x > x - ef nC=a_tld: if nD= a_cmm: proc_err(7,nA) fi if nB= a_cmm: proc_err(7,nA) fi % x ~ x - ef nC=a_hat: if nD= a_cmm: proc_err(7,nA) fi if nB= a_cmm: proc_err(7,nA) fi % x ^ x - ef nC=a_bqt: if nD= a_cmm: proc_err(7,nA) fi if nB= a_cmm: proc_err(7,nA) fi % x ` x - ef nC=a_bar: if nD= a_bar: if mc_char[nA+2]=a_bar: nA:=nA+1; % || - ef mc_char[nA+2]<>a_cmm: proc_err(8,nA) fi % | a - if nB<>a_cmm: proc_err(8,nA) fi fi % a | - ef nC=a_prn_s: if nD= a_cmm: proc_err(7,nA) fi % ( x + ef nC=a_ltn: if nD= a_cmm: proc_err(7,nA) fi if nB= a_cmm: proc_err(7,nA) fi % x > x + ef nC=a_tld: if nD= a_cmm: proc_err(7,nA) fi if nB= a_cmm: proc_err(7,nA) fi % x ~ x + ef nC=a_hat: if nD= a_cmm: proc_err(7,nA) fi if nB= a_cmm: proc_err(7,nA) fi % x ^ x + ef nC=a_bqt: if nD= a_cmm: proc_err(7,nA) fi if nB= a_cmm: proc_err(7,nA) fi % x ` x + ef nC=a_bar: cnt_bar:=cnt_bar+1; % |+|| + if nD= a_bar: cnt_bars:=cnt_bars+1; if mc_char[nA+2]=a_bar: nA:=nA+1; % || + ef mc_char[nA+2]<>a_cmm: proc_err(8,nA) fi % | a + if nB<>a_cmm: proc_err(8,nA) fi fi % a | + ef nC=a_prn_s: if nD= a_cmm: proc_err(7,nA) fi % ( x cnt_prn_s:=cnt_prn_s+1; f_depth:=1; if nB=a_qut: cnt_inline_def:=cnt_inline_def+1; fi ef nC=a_prn_e: cnt_prn_e:=cnt_prn_e+1; f_depth:=0; @@ -1635,11 +1621,11 @@ vardef check(expr s)= err_cnt enddef; %------------------------------------------------------------------------------------------------- -def proc_err(expr e,n)= err_cnt:=err_cnt+1; err_adr[err_cnt]:=n; err_code[err_cnt]:=e; +def proc_err(expr e,n)= err_adr[incr err_cnt]:=n; err_code[err_cnt]:=e; if e<=6: err_str[err_cnt]:=" "; else: err_str[err_cnt]:=substring(n-3,n+2) of mc; fi enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -def query(text s)= +def mc_query(text s)= begingroup save f_mcf,f_line,unit_row,unit_cnt,line_s,row_cnt,semic_cnt,info_cnt,order,min_n,key_cnt, info_s,sign_at,sign_n,filter_n,filter_tag,filter_var,filter_sign,filter_cnt,filter_p, @@ -1665,9 +1651,9 @@ def query(text s)= if sign_n=0: if sT="f": if scan_char(".",sV,0,1)=0: file_input:=sV&".mcf"; else: file_input:=sV; fi ef sT="o": if scan_char(".",sV,0,1)=0: file_output:=sV&".aux"; else: file_output:=sV; fi - ef sT="s": key_cnt:=key_cnt+1; key_s[key_cnt]:=sV; fi + ef sT="s": key_s[incr key_cnt]:=sV; fi else: - filter_cnt:=filter_cnt+1; filter_tag[filter_cnt]:=sT; filter_sign[filter_cnt]:=sign_n; + filter_tag[incr filter_cnt]:=sT; filter_sign[filter_cnt]:=sign_n; if (sign_n>=3)and(is_num(sV)=1): filter_var[filter_cnt]:=fix_num(sV); else: filter_var[filter_cnt]:=sV; fi fi @@ -1676,7 +1662,7 @@ def query(text s)= forever: temps:=readfrom file_input; exitif temps=EOF; if subc(1,temps)<>"%": - unit_row:=unit_row+1; line_s[unit_cnt][unit_row]:=temps; + line_s[unit_cnt][incr unit_row]:=temps; if (substring(0,2) of temps)="+-": row_cnt[unit_cnt]:=unit_row; f_mcf:=unit_row:=0; filter_n:=1; for i=1 upto filter_cnt: filter_p[i]:=0; endfor @@ -1757,12 +1743,10 @@ vardef is_num(expr s)= enddef; %------------------------------------------------------------------------------------------------- vardef split_semic(expr s)= - nN:=at_semic[0]:=0; - for i=1 upto length(s): if subc(i,s)=";": nN:=nN+1; at_semic[nN]:=i; fi endfor nN + nN:=at_semic[0]:=0; for i=1 upto length(s): if subc(i,s)=";": at_semic[incr nN]:=i; fi endfor nN enddef; %------------------------------------------------------------------------------------------------- vardef split_comma(expr s)= - nN:=at_comma[0]:=0; - for i=1 upto length(s): if subc(i,s)=",": nN:=nN+1; at_comma[nN]:=i; fi endfor nN + nN:=at_comma[0]:=0; for i=1 upto length(s): if subc(i,s)=",": at_comma[incr nN]:=i; fi endfor nN enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/graphics/mcf2graph/mcf_exa_code.pdf b/graphics/mcf2graph/mcf_exa_code.pdf Binary files differindex c4f74a9d58..59e94dd93e 100644 --- a/graphics/mcf2graph/mcf_exa_code.pdf +++ b/graphics/mcf2graph/mcf_exa_code.pdf diff --git a/graphics/mcf2graph/mcf_exa_code.tex b/graphics/mcf2graph/mcf_exa_code.tex index 90096a0f34..b7d3807fe6 100644 --- a/graphics/mcf2graph/mcf_exa_code.tex +++ b/graphics/mcf2graph/mcf_exa_code.tex @@ -1,7 +1,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Print out mcf data list (LuaLaTeX) by A.Yamaji 2022.03.13 +% Print out mcf data list by A.Yamaji 2022.03.27 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% ** mcf2graph.mf must be version 4.82 +% ** mcf2graph.mf must be version 4.83 % ** use mcf_library.mcf % ** typeset by LuaLaTeX(luamplib) \documentclass{article} @@ -19,14 +19,14 @@ fsize:=(35mm,34mm); max_blength:=4mm; row_h:=3.8mm; + header_h:=3.8mm; def make_frame= draw (0,0)--(185mm,0)--(185mm,h)--(0,h)--cycle wpcs thickness_frame; - draw (w,h-row_h)--(185mm,h-row_h) wpcs thickness_frame; + draw (w,h-header_h)--(185mm,h-header_h) wpcs thickness_frame; draw (w,h)--(w,0) wpcs thickness_frame; - draw ( 75mm,h)--( 75mm,h-row_h) wpcs thickness_frame; - draw (105mm,h)--(105mm,h-row_h) wpcs thickness_frame; - draw (130mm,h)--(130mm,h-row_h) wpcs thickness_frame; - draw (155mm,h)--(155mm,h-row_h) wpcs thickness_frame; + for col_w=75mm,105mm,130mm,155mm: + draw (col_w,h)--(col_w,h-header_h) wpcs thickness_frame; + endfor enddef; fi }% @@ -48,7 +48,7 @@ \noindent% \begin{mplibcode} beginfigm(":<0,0~nb") - if check(mc)=0: + if mc_check(mc)=0: MC(scantokens(mc)) ext( defaultfont:="cmtt9"; @@ -78,15 +78,15 @@ %%%%%% beginfigm("t:EXA","v+:*") %%%%%% beginfigm("t:EXA","v+:1") beginfigm("t:EXA","v+:2") - if check(mc)=0: + if mc_check(mc)=0: MC(scantokens(mc)) ext( defaultfont:="cmtt9"; label.lrt("["&decimal(fig_num)&"]",(0,h)); label.llft(inf_EXA,(w,h)); if length(inf_EN)>23: - nA:=defaultscale; defaultscale:=23/length(inf_EN); - label.lrt(inf_EN, (w,h)); + nA:=defaultscale; + defaultscale:=23/length(inf_EN); label.lrt(inf_EN, (w,h)); defaultscale:=nA; else: label.lrt(inf_EN, (w,h)); diff --git a/graphics/mcf2graph/mcf_exa_soc.mp b/graphics/mcf2graph/mcf_exa_soc.mp index 9be5d18af1..b4144fd0ce 100644 --- a/graphics/mcf2graph/mcf_exa_soc.mp +++ b/graphics/mcf2graph/mcf_exa_soc.mp @@ -1,15 +1,15 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Molecular Coding Format by Akira Yamaji 2022.03.13 +% Molecular Coding Format by Akira Yamaji 2022.03.27 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -input mcf2graph; %%% it must be version 4.82 -message "* mcf_exa_soc 2022.03.13"; +input mcf2graph; %%% it must be version 4.83 +message "* mcf_exa_soc 2022.03.27"; message ""; %------------------------------------------------------------------------------ %%%%sw_frame:=Outside; %%%%sw_numbering:=Bond; %%%%sw_numbering:=Atom; %%%%sw_frame:=Atom; -sw_expand:=1; +%%%%sw_expand:=1; tag1:="J"; tag2:="C"; tag3:="fm"; tag4:="mw"; tag5:="EN"; tag6:="MW"; %------------------------------------------------------------------------------ %% outputformat:="png"; hppp:=vppp:=0.1; outputtemplate:="%j-%3c.png"; @@ -20,9 +20,9 @@ tag1:="J"; tag2:="C"; tag3:="fm"; tag4:="mw"; tag5:="EN"; tag6:="MW"; %ext(defaultfont:=mpfont; defaultscale:=.3; %label.rt(inf_EN&" / "&cal_MW&" / "&decimal(num_MW-scantokens(inf_MW)),(0,0));) %------------------------------------------------------------------------------ -%%%%query("Cat=biological","MW<200","s:MW"); -%%%%query("Cat=biological","MW<150.0","s:EN"); -%%%%query("MW>=150","MW<=250","s:MW"); +%%%%mc_query("Cat=biological","MW<200","s:MW"); +%%%%mc_query("Cat=biological","MW<150.0","s:EN"); +%%%%mc_query("MW>=150","MW<=250","s:MW"); %****************************************************************************** fsize:=(35mm,24mm); max_blength:=4mm; @@ -33,7 +33,7 @@ forever: %%%% beginfigm("f:temp","v+:*") % use query output 'temp.mcf' %%%% beginfigm("v+:*") % select all beginfigm("t:EXA","v+:1") % 'v+:1': select EXA=1 - if f_EOF=0: if check(mc)=0: MC(scantokens(mc)) fi fi + if f_EOF=0: if mc_check(mc)=0: MC(scantokens(mc)) fi fi endfigm exitif f_EOF=1; % exit if file end endfor diff --git a/graphics/mcf2graph/mcf_example.pdf b/graphics/mcf2graph/mcf_example.pdf Binary files differindex 4a658c43b5..f14cc81259 100644 --- a/graphics/mcf2graph/mcf_example.pdf +++ b/graphics/mcf2graph/mcf_example.pdf diff --git a/graphics/mcf2graph/mcf_example.tex b/graphics/mcf2graph/mcf_example.tex index 8508fc134f..c356799a8f 100644 --- a/graphics/mcf2graph/mcf_example.tex +++ b/graphics/mcf2graph/mcf_example.tex @@ -1,7 +1,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Example of MCF Typeset with LuaLaTeX(luamplib) by A.Yamaji 2022.03.13 +% Example of MCF Typeset with LuaLaTeX(luamplib) by A.Yamaji 2022.03.27 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% ** mcf2graph.mf must be version 4.82 +% ** mcf2graph.mf must be version 4.83 % ** use mcf_library.mcf % ** typeset by LuaLaTeX(luamplib) \documentclass{article} @@ -64,7 +64,7 @@ \sbox{\fig@box}{% \begin{mplibcode} beginfigm("t:EXA","v+:1") - if check(mc)=0: + if mc_check(mc)=0: MC(scantokens(mc)) VerbatimTeX("\gdef\EN{"&inf_EN&"}"); VerbatimTeX("\gdef\MW{"&inf_MW&"}"); diff --git a/graphics/mcf2graph/mcf_library.mcf b/graphics/mcf2graph/mcf_library.mcf index ac330fef91..2ea49f3b41 100644 --- a/graphics/mcf2graph/mcf_library.mcf +++ b/graphics/mcf2graph/mcf_library.mcf @@ -1,5 +1,5 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% molecular library file mcf_library.mcf by Akira Yamaji 2022.03.13 +% molecular library file mcf_library.mcf by Akira Yamaji 2022.03.27 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % tag1:var1;tag2:var2;tag3:var3 ..... % first character of line "%" comment out @@ -394,7 +394,7 @@ Cat:biological;EN:Isoflavone;MW:222.24;EXA:1 +------------------------------------------------------------------------------ Cat:biological;EN:Flavanone;MW:224.25;EXA:1 + -<30,Ph,3=?6,10:O,7://O,8:/OH,9:/Ph, +<30,Ph,3=?6,10:O,7://O,9:/Ph, +------------------------------------------------------------------------------ Cat:biological;EN:Flavonol;MW:238.24;EXA:1 + @@ -2203,14 +2203,13 @@ Cat:biological;EN:Okadaic acid;MW:805.00;EXA:2 +------------------------------------------------------------------------------ Cat:antibiotics;EN:Vancomycin;MW:1449.25;EXA:2 + -<-30,#1,!12,{1,3,12}=zf,7=wf,/H^-60,60,*/OH,60, - Ph,-4:/Cl,@-3,\,O,!,Ph,@-4,\,O,!,Ph,-1^15:/Cl,@-3,\,/*OH,*/H^-60,&1, - @7,&26,@$1,60,//O,60,NH,60,/*H,*/COOH^180,-60, - Ph,{-2,-4}:/OH,@-1,\,Ph,-5:/OH,@-2,&4,##, - {3^40,6,9,12}://O,{2,5,8,11}:NH,{1,4^180,7'^-60,10'^60,14'^60}:*/H, +<-30,#1,!12,{1,3,12}=zf,7=wf,60,60,Ph,@-3,\,O,!,Ph,@-4,\,O,!,Ph,@-3,\,&1, + @7,&26,@$1,60,60,NH,60,-60,Ph,@-1,\,Ph,@-2,&4,##, + {36,3^40,6,9,12}://O,{2,5,8,11}:NH,{1,4^180,7'^-60,10'^60,14'^60,35^-60}:*/H, + {41,43,46}:/OH,{14,35'}:*/OH,{17,34^15}:/Cl,38^180:*/COOH, @10,*\^-60,60,//O,!,NH2,@13,*\,NH,!,//O,!,/??!,*/H^60,!~zf,NH,!, - @23,\,O,!,|,?6`.7,2:O,3^10:/!OH,{4,5}:/OH, - @-1,\,O,!,|,?6`.7,6:O,{3^35,5}:/_,3^-35:/NH2,4:/OH + @23,\,O,!~zf,|,?6`.7,2:O,3^10:*/!OH,{4',5}:*/OH, + @-1,\*,O,!~wb,|,?6`.7,6:O,{3'^35,5}:*/_,3^-35:/NH2,4:/*OH, +------------------------------------------------------------------------------ Cat:biological;EN:Maitotoxin;MW:3425.86;EXA:2 + diff --git a/graphics/mcf2graph/mcf_man_soc.mp b/graphics/mcf2graph/mcf_man_soc.mp index da1e9b8093..62d042bbf7 100644 --- a/graphics/mcf2graph/mcf_man_soc.mp +++ b/graphics/mcf2graph/mcf_man_soc.mp @@ -1,9 +1,9 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Molecular Coding Format file for mcf_manual.tex by Akira.Yamaji 2022.03.13 +% MCF file for mcf_manual.tex by Akira.Yamaji 2022.03.27 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -input mcf2graph; %% it must be version 4.82 +input mcf2graph; %% it must be version 4.83 % ** use library file 'mcf_library.mcf' -message "mcf_man_soc 2022.03.13"; message ""; +message "mcf_man_soc 2022.03.27"; message ""; %------------------------------------------------------------------------ sw_mframe:=0; sw_expand:=0; @@ -13,120 +13,120 @@ fsize:=(40mm,25mm); blength:=6mm; %*********************************************************************** beginfigm("EN:Glycine",":<30,NH2,!2,COOH") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:L-Alanine",":<30,NH2,!~wb,/_,!,COOH") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:L-Valine",":<30,NH2,!~wb,/?!,!,COOH") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:L-Leucine",":<30,NH2,!~wb,/'(!,?!),!,COOH") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:L-Isoleucine",":<30,NH2,!~wb,/'(/*_,!2),!,COOH") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:L-Serine",":<30,NH2,!~wb,/!OH,!,COOH") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:L-Threonine",":<30,NH2,!~wb,/'(/_,!~wf,OH),!,COOH") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:L-Cysteine",":<30,NH2,!~wb,/!SH,!,COOH") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:L-Methionine",":<30,NH2,!~wb,/'(!2,S,!),!,COOH") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:L-Phenylalanine",":<30,NH2,!~wb,/!Ph,!,COOH") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:L-Tyrosine",":<30,NH2,!~wb,/'(!Ph,-3:/OH),!,COOH") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:L-Triptophan", ":<30,NH2,!~wb,!,COOH,@2,\,!,<24,|,?5,-4=Ph,2=dr,5=dl,4:NH") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:L-Prorine",":<18,?5,3:NH,4:*/COOH") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:L-Glutamine", ":<30,NH2,!~wb,!,COOH,@2,\`1,!`1,!,//O,!,NH2") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:L-Asparagine",":<30,NH2,!~wb,/'(!,//O,!,NH2),!,COOH") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:L-Aspartic acid",":<30,NH2,!~wb,/!COOH,!,COOH") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:L-Glutamic acid",":<30,NH2,!~wb,/'(!2,COOH),!,COOH") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:L-Lysine",":<30,NH2,!~wb,/'(!4,NH2),!,COOH") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:L-Arginine", ":<30,NH2,!~wb,!,COOH,@2,\`1,!`1,!2,NH,!,//NH,!,NH2") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:L-Hystidine", ":<30,NH2,!~wb,!,COOH,@2,\,!,|,?5,{1,3}=dl,3:N,5:NH") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:L-DOPA",":<30,NH2,!~wb,!,COOH,@2,\,!,Ph,{-3,-4}:/OH") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:Ornithine",":<30,NH2,!~wb,/'(!3,NH2),!,COOH") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:Citrulline",":<30,NH2,!~wb,/'(!3,NH,!,//O,!,NH2),!,COOH") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:GABA",":<30,NH2,!4,COOH") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:amino Levulinic acid",":<30,NH2,!2,//O,!3,COOH") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:4-amino benzoic acid",":<30,Ph,1:/NH2,4:/COOH") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:L-Carboxyl glutamic acid", ":<30,NH2,!~wb,/'(!,/COOH,!,COOH),!,COOH") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:L-Hydroxy Prorine",":<18,?5,1:/OH,3:NH,4:*/COOH") - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1085,13 +1085,13 @@ endfigm beginfigm("EN:Pyridine",":<30,Ph,2:N") sw_trimming:=0; fsize:=(12mm,12mm); - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %----------------------------------------------------------------------- beginfigm("EN:Pyridine",":<30,Ph,2):N") sw_trimming:=0; fsize:=(12mm,12mm); - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:add() 1") @@ -1216,7 +1216,7 @@ defaultsize:=save_defaultsize; %*************************************************************************** beginfigm("t:EN","v:Luciferin") fsize:=(50mm,15mm); - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*************************************************************************** beginfigm("EN:Colchicine","MW:385.41", @@ -1226,7 +1226,7 @@ beginfigm("EN:Colchicine","MW:385.41", ": @9,\,NH,!,//O,! ") %--------------------------------------- fsize:=(50mm,20mm); - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*************************************************************************** beginfigm("EN:Paclitaxel","MW:853.91", @@ -1240,7 +1240,7 @@ beginfigm("EN:Paclitaxel","MW:853.91", ": @12,\*^-15,O,60,//O,-60 ") %------------------------------------------------------ fsize:=(50mm,25mm); - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*************************************************************************** beginfigm("EN:Maltose","MW:342.3", @@ -1252,7 +1252,7 @@ beginfigm("EN:Maltose","MW:342.3", ": #.5,{2^$90,3^$-90,4^$-90}:/OH,6^$90:/!OH ") %------------------------------------------------------ fsize:=(50mm,20mm); - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %*********************************************************************** beginfigm("EN:Cellobiose","MW:342.3", @@ -1264,7 +1264,7 @@ beginfigm("EN:Cellobiose","MW:342.3", ": #.5,{2^$90,3^$-90,4^$-90}:/OH,6^$90:/!OH ") %------------------------------------------------------ fsize:=(50mm,20mm); - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% bye diff --git a/graphics/mcf2graph/mcf_manual.pdf b/graphics/mcf2graph/mcf_manual.pdf Binary files differindex cec3c7ffbc..605c3a0c24 100644 --- a/graphics/mcf2graph/mcf_manual.pdf +++ b/graphics/mcf2graph/mcf_manual.pdf diff --git a/graphics/mcf2graph/mcf_manual.tex b/graphics/mcf2graph/mcf_manual.tex index 01d25e170c..71ac080b10 100644 --- a/graphics/mcf2graph/mcf_manual.tex +++ b/graphics/mcf2graph/mcf_manual.tex @@ -1,5 +1,5 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Molecular Coding Format manual by Akira Yamaji 2022.03.13 +% Molecular Coding Format manual by Akira Yamaji 2022.03.27 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \documentclass[a4paper]{article} \usepackage[pdftex]{graphicx} @@ -1093,8 +1093,8 @@ endfor \end{verbatim} \MCFgraph %----------------------------------------------------------------------------- -\subsection{Function check()} -\index{check()}% +\subsection{Function mc\_check()} +\index{mc\_check()}% \begin{verbatim} (immediately compile) @@ -1104,17 +1104,17 @@ endfigm (check mcf and compile) -** check(mc) : error count +** mc_check(mc) : error count beginfigm("EN:Pyridine", ":<30,Ph,}2:N") % ** extra '}' - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm \end{verbatim} \MCFgraph\hspace{22mm}\MCFgraph \begin{verbatim} -check(mc)=0 check(mc)>=1 +mc_check(mc)=0 mc_check(mc)>=1 \end{verbatim} %=============================================================================== \newpage @@ -1382,13 +1382,13 @@ endfigm \section{MCF example} %----------------------------------------------------------------------------- \subsection{Luciferin} -\index{check()}% +\index{mc\_check()}% \begin{verbatim} (use library file 'mcf_library') beginfigm("f:mcf_library", "t:EN","v:Luciferin") fsize:=(50mm,15mm); - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm \end{verbatim} \MCFgraph @@ -1402,7 +1402,7 @@ beginfigm("EN:Colchicine","MW:385.41", ": @9,\,NH,!,//O,! ") %------------------------------------- fsize:=(50mm,20mm); - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm \end{verbatim} \MCFgraph @@ -1424,7 +1424,7 @@ beginfigm("EN:Paclitaxel","MW:853.91", ": @12,\*^-15,O,60,//O,-60 ") %------------------------------------ fsize:=(50mm,25mm); - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm \end{verbatim} \MCFgraph @@ -1450,7 +1450,7 @@ beginfigm("EN:Maltose","MW:342.3", ": 6^$90:/!OH ") %----------------------------------------- fsize:=(50mm,20mm); - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm \end{verbatim} \MCFgraph @@ -1476,7 +1476,7 @@ beginfigm("EN:Cellobiose","MW:342.3", ": 6^$90:/!OH ") %----------------------------------------- fsize:=(50mm,20mm); - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm \end{verbatim} \MCFgraph @@ -1516,29 +1516,29 @@ beginfigm("EN:Cholesterol","MW:386.65", >information ": {4,12}:*/_^60, ", > mc3 ": @-1,18,/*_,-60,!3,?! ") > mc4 %---------------------------------------- > - if check(mc)=0: MC(scantokens(mc)) fi > mc=mc1 - mc4 + if mc_check(mc)=0: MC(scantokens(mc)) fi > mc=mc1 - mc4 endfigm > %------------------------------------------------------------------------------ beginfigm("f:mcf_library.mcf","t:EN","v:Adenine") > from mcf_library.mcf - if check(mc)=0: MC(scantokens(mc)) fi > select EN="Adenine" + if mc_check(mc)=0: MC(scantokens(mc)) fi > select EN="Adenine" endfigm > %------------------------------------------------------------------------------ beginfigm("t:EN","v:Guanine") > select EN="Guanine" - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm %------------------------------------------------------------------------------ beginfigm("t:EN","v:Cytosine") > select EN="Cytosine" - if check(mc)=0: MC(scantokens(mc)) fi > + if mc_check(mc)=0: MC(scantokens(mc)) fi > endfigm > %------------------------------------------------------------------------------ beginfigm("t:n","v+:4") > v+:4 = select No.4 - if check(mc)=0: MC(scantokens(mc)) fi > keep file open + if mc_check(mc)=0: MC(scantokens(mc)) fi > keep file open endfigm > %------------------------------------------------------------------------------ forever: %%%%%%%%%% beginfigm("f:mcf_library","v+:*") > select all beginfigm("f:mcf_library","t:EXA","v+:1") > 'v+:1'= select EXA=1 - if f_EOF=0: if check(mc)=0: MC(scantokens(mc)) fi fi > keep file open + if f_EOF=0: if mc_check(mc)=0: MC(scantokens(mc)) fi fi > keep file open endfigm > exitif f_EOF=1; > exit if file end endfor @@ -1609,12 +1609,12 @@ Cat:biological;EN:Stearic acid;MW:284.48 %------------------------------------------------------------------------------ \noindent% \newpage -\subsection{Function query()} -\index{query()}% +\subsection{Function mc\_query()} +\index{mc\_query()}% \paragraph{(Example)} \begin{verbatim} %-------------------------------------------------------------- -% query() +% mc_query() % % "f:filename" : input file name (default "mcf_library.mcf") % "o:filename" : output file name (default "temp.mcf") @@ -1626,13 +1626,11 @@ Cat:biological;EN:Stearic acid;MW:284.48 % filter 2 : MW>=285 % filter 3 : MW<=295 %-------------------------------------------------------------- -query("s:EN", -%%%%% "f:mcf_library.mcf","o:temp.mcf","s:EN", - "Cat=biological","MW>=285","MW<=295"); +mc_query("s:EN","Cat=biological","MW>=285","MW<=295"); %-------------------------------------------------------------- forever: beginfigm("f:temp","v+:*") % use file temp.mcf / select all - if f_EOF=0: if check(mc)=0: MC(scantokens(mc)) fi fi + if f_EOF=0: if mc_check(mc)=0: MC(scantokens(mc)) fi fi endfigm exitif f_EOF=1; endfor @@ -1952,7 +1950,7 @@ M END ": {1^60,5^180,16^60}:/*H, ", ": @14,\*,|,?5,{1,4}=dl,3:O ") %---------------------------------------- - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm \end{mplibcode}\\ %-------------------------------------------------------------------- @@ -1965,7 +1963,7 @@ M END ": {3,7,12,16}:/_, ", ": |,?6,6=dl,{6,2^35,2^-35}:/_ ") %------------------------------------------ - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm \end{mplibcode}\\ %-------------------------------------------------------------------- @@ -1979,7 +1977,7 @@ M END ": 2:/COOH,7://_,13:*/OH,8:/*OH, ", ": 14:*/_,{1^60,4^60}:*/H ") %------------------------------------ - if check(mc)=0: MC(scantokens(mc)) fi + if mc_check(mc)=0: MC(scantokens(mc)) fi endfigm; %-------------------------------------------------------------------- \end{mplibcode}\\ diff --git a/graphics/mcf2graph/mcf_mplib_exa.pdf b/graphics/mcf2graph/mcf_mplib_exa.pdf Binary files differindex 91de41e545..ed678e74bd 100644 --- a/graphics/mcf2graph/mcf_mplib_exa.pdf +++ b/graphics/mcf2graph/mcf_mplib_exa.pdf diff --git a/graphics/mcf2graph/mcf_mplib_exa.tex b/graphics/mcf2graph/mcf_mplib_exa.tex index 8a37c82760..666885b91d 100644 --- a/graphics/mcf2graph/mcf_mplib_exa.tex +++ b/graphics/mcf2graph/mcf_mplib_exa.tex @@ -1,7 +1,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Example of MCF typest with LuaLaTeX(luamplib) by A.Yamaji 2022.03.13 +% Example of MCF typest with LuaLaTeX(luamplib) by A.Yamaji 2022.03.27 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% ** mcf2graph.mp must be version 4.82 +% ** mcf2graph.mp must be version 4.83 % ** use mcf_library.mcf \documentclass{article} %------------------------------------------------------------------------------ @@ -85,7 +85,7 @@ beginfigm("EN:Paclitaxel","MW:853.918", ": @7,\*,O,-45,//O,60,Ph,11:*/OCO!>rl,12:/*OCO!^-15>lr ") %--------------------------------------------------------------------- fsize:=(140mm,30mm); - if check(mc)=0: MCat(0,0.5)(scantokens(mc)) + if mc_check(mc)=0: MCat(0,0.5)(scantokens(mc)) sw_numbering:=Atom; MCat(0.6,0.5)(scantokens(mc)) sw_numbering:=Bond; MCat(1,0.5)(scantokens(mc)) fi @@ -101,7 +101,7 @@ beginfigm("EN:Paclitaxel","MW:853.918", ": @7,\*,O,-45,//O,60,Ph,11:*/OCO!>rl,12:/*OCO!^-15>lr ") %--------------------------------------------------------------------- fsize:=(140mm,30mm); - if check(mc)=0: MCat(0,0.5)(scantokens(mc)) + if mc_check(mc)=0: MCat(0,0.5)(scantokens(mc)) sw_numbering:=Atom; MCat(0.6,0.5)(scantokens(mc)) sw_numbering:=Bond; MCat(1,0.5)(scantokens(mc)) fi @@ -116,7 +116,7 @@ endfigm beginfigm("f:mcf_library.mcf","t:EN","v:Chlorophyll a","NO:-") sw_output:=Fig+Calc+Mcode; %%%% output temp-mc.aux %%%% fsize:=(100mm,30mm); - if check(mc)=0: + if mc_check(mc)=0: MC(scantokens(mc)) VerbatimTeX("\gdef\EN{"&inf_EN&"}\gdef\MW{"&inf_MW&"}"); VerbatimTeX("\gdef\mw{"&cal_MW&"}\gdef\fm{"&cal_FM&"}"); @@ -130,7 +130,7 @@ endfigm \begin{mplibcode} beginfigm("f:mcf_library.mcf","t:EN","v:Chlorophyll a","NO:-") sw_output:=Fig+Calc+Mcode; fsize:=(100mm,30mm); - if check(mc)=0: + if mc_check(mc)=0: MC(scantokens(mc)) VerbatimTeX("\gdef\EN{"&inf_EN&"}\gdef\MW{"&inf_MW&"}"); VerbatimTeX("\gdef\mw{"&cal_MW&"}\gdef\fm{"&cal_FM&"}"); @@ -148,7 +148,7 @@ beginfigm("t:EN","v:Okadaic acid","EN:Dinophysistoxin-1", "MW:819",":,38:*/_,65=red") %%%% add methyl group (color red) %%%% sw_output:=Fig+Calc+Mcode; %%%% output temp-mc.aux %%%% fsize:=(120mm,20mm); - if check(mc)=0: MC(scantokens(mc)) + if mc_check(mc)=0: MC(scantokens(mc)) VerbatimTeX("\gdef\EN{"&inf_EN&"}\gdef\MW{"&inf_MW&"}"); VerbatimTeX("\gdef\mw{"&cal_MW&"}\gdef\fm{"&cal_FM&"}"); fi @@ -163,7 +163,7 @@ beginfigm("t:EN","v:Okadaic acid","EN:Dinophysistoxin-1", "MW:819",":,38:*/_,65=red") %%%% add methyl group (color red) %%%% sw_output:=Fig+Calc+Mcode; %%%% output temp-mc.aux %%%% fsize:=(120mm,20mm); - if check(mc)=0: MC(scantokens(mc)) + if mc_check(mc)=0: MC(scantokens(mc)) VerbatimTeX("\gdef\EN{"&inf_EN&"}\gdef\MW{"&inf_MW&"}"); VerbatimTeX("\gdef\mw{"&cal_MW&"}\gdef\fm{"&cal_FM&"}"); fi @@ -184,7 +184,7 @@ endfigm; beginfigm("t:EN","v:Maitotoxin") sw_output:=Fig+Calc+Mcode; %%%% output temp-mc.aux %%%% fsize:=(120mm,60mm); fmargin:=(0,3mm); sw_frame:=Outside; - if check(mc)=0: MC(scantokens(mc)) + if mc_check(mc)=0: MC(scantokens(mc)) VerbatimTeX("\gdef\EN{"&inf_EN&"}\gdef\MW{"&inf_MW&"}"); VerbatimTeX("\gdef\mw{"&cal_MW&"}\gdef\fm{"&cal_FM&"}"); fi @@ -199,7 +199,7 @@ endfigm; beginfigm("t:EN","v:Maitotoxin") sw_output:=Fig+Calc+Mcode; fsize:=(120mm,60mm); fmargin:=(0,3mm); sw_frame:=Outside; %% mc_length:=40; - if check(mc)=0: MC(scantokens(mc)) + if mc_check(mc)=0: MC(scantokens(mc)) VerbatimTeX("\gdef\EN{"&inf_EN&"}\gdef\MW{"&inf_MW&"}"); VerbatimTeX("\gdef\mw{"&cal_MW&"}\gdef\fm{"&cal_FM&"}"); fi diff --git a/macros/latex/contrib/cooking-units/cooking-units.dtx b/macros/latex/contrib/cooking-units/cooking-units.dtx index ee29c982c3..574f2b7fcd 100644 --- a/macros/latex/contrib/cooking-units/cooking-units.dtx +++ b/macros/latex/contrib/cooking-units/cooking-units.dtx @@ -82,7 +82,7 @@ for the details of that license. %\keepsilent \askforoverwritefalse \preamble -Copyright (C) 2016--2021 by Ben Vitecek (current Maintainer) +Copyright (C) 2016--2022 by Ben Vitecek (current Maintainer) This file may be distributed and/or modified under the conditions of the LaTeX Project Public License, either @@ -143,9 +143,9 @@ and the derived file cooking-units.sty. \usepackage{nicefrac} \usepackage{cleveref} \usepackage{mathtools} -\usepackage{siunitx} +\usepackage{siunitx}[=v2] \usepackage{totalcount} -\usepackage{microtype} +%\usepackage{microtype} \usepackage{enumitem} @@ -244,7 +244,7 @@ and the derived file cooking-units.sty. \NewDocumentCommand \PrintUnit { o m } { \__cookingunits_culang_let:nnN { name } {#2} \l_tmpa_tl - \tl_if_eq:NNF \l_tmpa_tl \q__cookingunits_no_translation + \tl_if_eq:NNF \l_tmpa_tl \c__cookingunits_no_translation_str { \l_tmpa_tl } \IfNoValueF {#1} {#1} & @@ -307,7 +307,7 @@ and the derived file cooking-units.sty. { \cs_if_eq:NNTF ##1 \\ { \textbackslash\textbackslash \\ } - { \textbackslash \textcolor{blue}{\cs_to_str:N ##1} } + { \textbackslash \textcolor {blue} { \cs_to_str:N ##1 } } }{ \token_if_letter:NTF ##1 {##1} @@ -449,13 +449,13 @@ and the derived file cooking-units.sty. { \l_translation_does_not_exist_tl } { \__cu_use:n { culang_let_for:nnnN } {#1} { unit-symbol } {#2} \l_tmpa_tl - \tl_if_in:NnTF \l_tmpa_tl \q__cookingunits_no_translation + \tl_if_in:NnTF \l_tmpa_tl \c__cookingunits_no_translation_str { \l_translation_does_not_exist_tl } { \l_tmpa_tl } } & \__cu_use:n { culang_let_for:nnnN } {#1} { name } {#2} \l_tmpa_tl - \tl_if_in:NnTF \l_tmpa_tl \q__cookingunits_no_translation + \tl_if_eq:NNTF \l_tmpa_tl \c__cookingunits_no_translation_str { \l_translation_does_not_exist_tl } { \l_tmpa_tl } & @@ -463,13 +463,13 @@ and the derived file cooking-units.sty. \__cu_use:n { culang_let_for:nnnN } {#1} { name-pl } {#2} \l_tmpb_tl \str_if_eq:NNF \l_tmpa_tl \l_tmpb_tl { - \tl_if_in:NnTF \l_tmpb_tl \q__cookingunits_no_translation + \tl_if_eq:NNTF \l_tmpb_tl \c__cookingunits_no_translation_str { \l_translation_does_not_exist_tl } { (\l_tmpb_tl) } } & \__cu_use:n { culang_let_for:nnnN } {#1} { gender } {#2} \l_tmpa_tl - \tl_if_in:NnTF \l_tmpa_tl \q__cookingunits_no_translation + \tl_if_eq:NNTF \l_tmpa_tl \c__cookingunits_no_translation_str { \l_translation_does_not_exist_tl } { \l_tmpa_tl } } @@ -477,14 +477,12 @@ and the derived file cooking-units.sty. \NewDocumentCommand \CreateTableForPhrases { >{\TrimSpaces} m } { \seq_clear:N \l_tmpa_seq - \__cu_use:n { culang_let_for:nnnN } {#1} { phrase } { phrase-prop } \l_tmpa_prop + \__cu_use:n { culang_get_phrase_prop_for:nN } {#1} \l_tmpa_prop \prop_if_exist:NTF \l_tmpa_prop { - \tl_if_eq:NNTF \q__cooking_units_no_translation \l_tmpa_prop + \tl_if_eq:NNTF \c__cookingunits_no_translation_str \l_tmpa_prop { \ERRORCreateTablePhraseII } - { - \prop_get:NnN \l_tmpa_prop { seq } \l_tmpa_seq - } + { \prop_get:NnN \l_tmpa_prop { seq } \l_tmpa_seq } } { \ERRORCreateTablePhraseI } \seq_gput_right:Nn \l_tmpa_seq { THEEND } @@ -553,10 +551,10 @@ and the derived file cooking-units.sty. \endlist } \makeatletter -\newenvironment{mydescription} - {\list{}{\labelwidth\z@ \itemindent-\leftmargin - \let\makelabel\descriptionlabel}} - {\endlist} +%\newenvironment{mydescription} +% {\list{}{\labelwidth\z@ \itemindent-\leftmargin +% \let\makelabel\descriptionlabel}} +% {\endlist} \renewcommand*\descriptionlabel[1]{\hspace\labelsep \normalfont\bfseries #1} \makeatother @@ -804,6 +802,9 @@ and the derived file cooking-units.sty. % \changes {2021/03/21} {2.00} {New commands to define keys: \mycs{cudefinekeychain} and \mycs{cuaddtokeychain}.} % \changes {2021/03/21} {2.00} {Using commands as unit-keys now works.} % +% \changes {2022/03/26} {2.00a} {Bugfix: Fixing property list retrival error (storing property lists via translations did not work too well).} +% \changes {2022/03/26} {2.00a} {Bugfix: |\cuam| prints a unit in case of an error. This also happens with \opt{parse-number=false}.} +% \changes {2022/03/26} {2.00a} {Bugfix: Remove \cs{peek_meaning_ignore_spaces:NTF}.} % % % @@ -849,7 +850,7 @@ and the derived file cooking-units.sty. % not very \LaTeX-like, so I started writing some code to convert % units. I expanded the code, rewrote it in \LaTeX3 (which is much % more pleasant than \LaTeXe) and here it is. -% +% % % % @@ -3207,7 +3208,7 @@ and the derived file cooking-units.sty. % % % -% +% % % % @@ -3367,7 +3368,7 @@ and the derived file cooking-units.sty. % % % -% +% % % % @@ -3385,6 +3386,7 @@ and the derived file cooking-units.sty. % shown. % % \small +% % %\clearpage % \subsection{English} @@ -3449,7 +3451,7 @@ and the derived file cooking-units.sty. % % % -% +% \normalsize % % % \section{US, Imperial and Other units} @@ -3559,108 +3561,6 @@ and the derived file cooking-units.sty. % % % -% -% \begin{comment} -%^^A \section{Notes and other stuff} -%^^A This section contains stuff which might or might not be interesting. -%^^A -%^^A \subsection{More or less FAQ} -%^^A -%^^A \num{624150912.6 +- 3.9 e+10} -%^^A \num{6.241509126 +- 0.000000039 e+18} -%^^A -%^^A \num{8.6173303 +- 00000.0000050 e-5} -%^^A -%^^A \subsection{Calculation} -%^^A This subsection deals with some regarding the conversion to certain units. -%^^A Mostly to (I like to call them) \enquote{electron volt units} (or natural units). -%^^A Let's begin. -%^^A -%^^A We start with the easiest one: conversion of joule into electron volt. -%^^A Easy because Wikipedia and nearly every physics book knows the answer. -%^^A And according to Wikipedia -%^^A \begin{align} -%^^A \SI{1}{\eV} &= \SI{1.6021766208(98)e-19}{\joule} \\ -%^^A \SI{1}{\joule} &= \SI{6.241509126 +- 0.000000039 e+18}{\eV} -%^^A \end{align} -%^^A Adding this is no problem: -%^^A \begin{lstlisting} -%^^A \cuaddtokeys {J} {eV} { 1.6021766208e-19 } -%^^A \end{lstlisting} -%^^A -%^^A -%^^A Great, next Temperature (kelvin) to electron volt. Also no problem at all -%^^A because joule and kelvin are related by the boltzmann constant $k_B$ with -%^^A \begin{equation} -%^^A energy (\si{\joule}) = k_B \cdot temperature (\si{\kelvin}) -%^^A \end{equation} -%^^A as $[k_B]= \sfrac{\si{\joule}}{\si{\kelvin}}$ and -%^^A $k_B= \SI{1.38064852(79)e-23}{\joule\per\kelvin}$. Now using the power -%^^A of (more or less basic, but somehow annoying) mathematics we get: -%^^A \begin{align} -%^^A [k_B] &= \SI{1.38064852(79)e-23}{\joule\per\kelvin} = \\ -%^^A &= \num{1.38064852(79)e-23} \cdot \SI{6.241509126 +- 0.000000039 e+18 }{\eV\per\K} = \\ -%^^A &= \SI{8.6173303 +- 0.0000050 e-5 }{\eV\per\K} -%^^A \end{align} -% -% -%^^A \section{Notes and other stuff} -%^^A \subsection{Some details to electron volts} -%^^A This section explains how I calculated the values for conversion into electron volt -%^^A or the respective derivative. Let's begin with some constants (from Wikipedia), note that -%^^A \begin{equation*} -%^^A \num{1.23456(78)e-9} = \num[separate-uncertainty = true]{1.23456(78)e-9} -%^^A \end{equation*} -%^^A just for info. -%^^A -%^^A \begin{align} -%^^A \SI{1}{\eV} &= \SI{1.6021766208(98)e-19}{\J} \\ -%^^A \hbar &= \SI{1.054571800(13)e-34}{\J\s} \\ -%^^A k_B &= \SI{1.38064852(79)e-23}{\J\per\K} = \SI{8.6173303(50)e-5}{\eV\per\K}\\ -%^^A c &= \SI{299792458}{\m\per\s} -%^^A \end{align} -%^^A -%^^A Note that all those and following values are rounded to the second relevant figure of the -%^^A uncertainty of the value. -%^^A -%^^A Well then, next are temperatures. -%^^A -%^^A Temperatures are fairly easy. Just convert the temperature of your choice to kelvin -%^^A and multiplicate it with $k_B$: -%^^A \begin{align} -%^^A \SI{1}{\K} * k_B &= \SI{8.6173303(50)e-5}{\eV} -%^^A \end{align} -%^^A -%^^A Next is more complicated. To compute the resulting unceartanity I using -%^^A \enquote{Gauß'sches Fehlerfortpflanzungsgesetz} (I don't know if this has -%^^A a translation). Anyway. We know that -%^^A \begin{align*} -%^^A \frac{\SI{1}{\eV}}{c^2} &= \frac{\SI{1.6021766208e-19}{\J}}{(\SI{299792458}{\m\per\s})^2} -%^^A = \frac{\SI{1.6021766208e-19}{\kg\m\squared\per\s\squared}}{\SI{8,98755178736818E16}{\m\squared\per\s\squared}} = \\ -%^^A &\frac{\SI{1.6021766208e-3}{\kg}}{\num{8,98755178736818}} = -%^^A \SI{1782661906,94091624922088}{\kg} -%^^A \end{align*} -%^^A -%^^A Great, now we have to calucalte the unceartinity: -%^^A \begin{align} -%^^A f(\si{\eV},c) &= \frac{\si{\eV}}{c^2} \\ -%^^A df(\si\eV,c) &= \sqrt{ (\frac{\partial f}{\partial \si\eV})^2 * (\Delta \si\eV)^2 + (\frac{\partial f}{\partial c})^2 * (\Delta c)^2 } = \\ -%^^A &= \sqrt{ (\frac{1}{c^2})^2 * (\Delta \si\eV)^2 + (-2\frac{eV}{c^{-3}})^2 * (\Delta c)^2 } -%^^A \end{align} -%^^A -%^^A Now we know that $\Delta c = 0$: -%^^A \begin{align} -%^^A df(\si\eV,c) &= \sqrt{ (\frac{1}{c^2})^2 * (\Delta \si\eV)^2 } = -%^^A \sqrt{ \frac{1}{(\SI{299792458}{\m\per\s} )^2} * (\SI{0.0000000098e-19}{\J})^2 } \\ -%^^A &= -%^^A \end{align} -% \end{comment} -% -% -% -% -% -% %\end{documentation} % % @@ -3703,14 +3603,14 @@ and the derived file cooking-units.sty. % \begin{macrocode} \ProvidesExplPackage {cooking-units} - {2021/05/16} - {2.00} + {2022/03/26} + {2.00a} {Ein Paket fuer Kocheinheiten} % \end{macrocode} % % Checking if \pkg{expl3} is up-to-date, otherwise abort the loading of the package. % \begin{macrocode} -\@ifpackagelater { expl3 } { 2021/05/07 } +\@ifpackagelater { expl3 } { 2022/02/24 } { } { \PackageError { cooking-units } { Support~package~expl3~too~old } @@ -3731,7 +3631,7 @@ and the derived file cooking-units.sty. % % Checking if \pkg{translations} is up-to-date, otherwise abort the loading of the package. % \begin{macrocode} -\@ifpackagelater { translations } { 2021/01/17 } +\@ifpackagelater { translations } { 2022/02/05 } { } { \PackageError { cooking-units } { Support~package~translations~too~old } @@ -3761,6 +3661,7 @@ and the derived file cooking-units.sty. % \end{macrocode} % \begin{macrocode} \bool_new:N \g_@@_opt_numeral_bool +%\bool_new:N \g_@@_opt_debug_bool \keys_define:nn { cooking-units } { use-numerals .code:n = @@ -3771,6 +3672,8 @@ and the derived file cooking-units.sty. use-numerals .default:n = { false }, use-fmtcount-numerals .bool_gset:N = \g_@@_opt_numeral_bool , use-fmtcount-numerals .default:n = { false }, +% debug .bool_set:N = \g_@@_opt_debug_bool , +% debug .default:n = { true } , unknown .code:n = { \msg_error:nnxx { cooking-units } { key-unknown } { \l_keys_path_str } { cooking-units } } @@ -3992,6 +3895,8 @@ and the derived file cooking-units.sty. \tl_new:N \l_@@_stored_units_tl \tl_new:N \l_@@_stored_formula_tl \tl_new:N \l_@@_base_tl +\tl_new:N \l_cookingunits_raw_amount_a_tl +\tl_new:N \l_cookingunits_raw_amount_b_tl % \end{macrocode} % \begin{macrocode} \tl_new:N \l_@@_cmd_hook_tl @@ -4062,7 +3967,7 @@ and the derived file cooking-units.sty. % The dimension between the fraction and the mixed fraction part is % stored within this macro. There is no real reason why I have % chosen this distance to be 0.1em, I just thought that it looks -% best. But if someone has some ideas of how large this distance +% best. But if someone has some ideas of how large this distancee % should be I am happy to listen. % \begin{macrocode} \dim_new:N \l_@@_mixed_frac_dim @@ -4303,11 +4208,12 @@ and the derived file cooking-units.sty. % \end{macrocode} %\end{macro} % -% \begin{macro}{ \q_@@_no_translation } +% \begin{macro}{ \q_@@_no_translation_str } % Checking value if a translation is avaiable. % \begin{macrocode} -\quark_new:N \q_@@_no_translation -%\cs_new:Npn \q_@@_no_translation { asdasd\ewhkerhjkwejhk } +\quark_new:N \q_@@_no_translation_str +\str_const:Nn \c_@@_no_translation_str { no-translation-sady-found-@@ } +%\cs_new:Npn \q_@@_no_translation_str { asdasd\ewhkerhjkwejhk } % \end{macrocode} %\end{macro} % @@ -6615,7 +6521,7 @@ and the derived file cooking-units.sty. \prg_new_conditional:Npnn \@@_culang_unitname_let:Nn #1#2 { TF, F , T } { \@@_culang_let:nnN { name } {#2} #1 - \tl_if_eq:NNTF #1 \q_@@_no_translation + \tl_if_eq:NNTF #1 \c_@@_no_translation_str { \prg_return_false: } { \prg_return_true: } } @@ -6671,17 +6577,17 @@ and the derived file cooking-units.sty. % % \begin{macrocode} \@@_culang_def_base:nnn { name } { decimal-mark } { . } -\@@_culang_def_base:nnn { name-pl } { decimal-mark } { \q_@@_no_translation } +\@@_culang_def_base:nnn { name-pl } { decimal-mark } { \c_@@_no_translation_str } \@@_culang_def_for:nnnn { German } { name-pl } { decimal-mark } { , } % \end{macrocode} % Note that the plural versions just exist for completing the set. % \begin{macrocode} -\@@_culang_def_base:nnn { name } { one (m) } { \q_@@_no_translation } -\@@_culang_def_base:nnn { name } { one (f) } { \q_@@_no_translation } -\@@_culang_def_base:nnn { name } { one (n) } { \q_@@_no_translation } -\@@_culang_def_base:nnn { name-pl } { one (m) } { \q_@@_no_translation } -\@@_culang_def_base:nnn { name-pl } { one (f) } { \q_@@_no_translation } -\@@_culang_def_base:nnn { name-pl } { one (n) } { \q_@@_no_translation } +\@@_culang_def_base:nnn { name } { one (m) } { \c_@@_no_translation_str } +\@@_culang_def_base:nnn { name } { one (f) } { \c_@@_no_translation_str } +\@@_culang_def_base:nnn { name } { one (n) } { \c_@@_no_translation_str } +\@@_culang_def_base:nnn { name-pl } { one (m) } { \c_@@_no_translation_str } +\@@_culang_def_base:nnn { name-pl } { one (f) } { \c_@@_no_translation_str } +\@@_culang_def_base:nnn { name-pl } { one (n) } { \c_@@_no_translation_str } % \end{macrocode} % \begin{macrocode} \@@_culang_def_for:nnnn { English } { name } { one (m) } { one } @@ -6696,7 +6602,7 @@ and the derived file cooking-units.sty. % % \begin{macrocode} \@@_culang_def_base:nnn { name } { cutext-range-sign } { -- } -\@@_culang_def_base:nnn { name-pl } { cutext-range-sign } { \q_@@_no_translation } +\@@_culang_def_base:nnn { name-pl } { cutext-range-sign } { \c_@@_no_translation_str } \@@_culang_def_for:nnnn { German } { name } { cutext-range-sign } { ~bis~ } \@@_culang_def_for:nnnn { English } { name } { cutext-range-sign } { ~to~ } % \end{macrocode} @@ -6734,16 +6640,18 @@ and the derived file cooking-units.sty. % \begin{macrocode} \cs_new:Npn \@@_def_new_type_aux:Nnn #1#2#3 { - \cs_new:cpn { @@_set_ #2 _to:n } ##1 + \cs_new_nopar:cpn { @@_set_ #2 _to:n } ##1 { - \tl_if_exist:cF { c_@@_#2_ ##1 _tl } { \tl_show:n { ERROR-set-#2-##1 } } - \tl_set_eq:Nc #1 { c_@@_#2_ ##1 _tl } + \tl_if_exist:cF { c_@@_#2_ ##1 _tl } + { \msg_error:nnn {cooking-units } { internal-error } { Type } { ERROR-set-#2-##1 } } + \tl_set_eq:Nc #1 { c_@@_#2_ ##1 _tl } } \tl_if_empty:nF {#3} { \prg_new_conditional:cpnn { @@_if_ #2 _equal:n } ##1 {#3} { - \tl_if_exist:cF { c_@@_#2_ ##1 _tl } { \tl_show:n { ERROR-check-#2-##1 } } + \tl_if_exist:cF { c_@@_#2_ ##1 _tl } + { \msg_error:nnnn {cooking-units } { internal-error } { Type-2 } { ERROR-set-#2-##1 } } \tl_if_eq:NcTF #1 { c_@@_#2_ ##1 _tl } { \prg_return_true: } { \prg_return_false: } @@ -6798,7 +6706,6 @@ and the derived file cooking-units.sty. % parses options and decides (depending on which command was used) % what to do with the stuff and how to print it. % \begin{macrocode} -\bool_new:N \l_@@_skip_first_part_bool \cs_new:Npn \@@_do_the_stuff:nnnnnn #1#2#3#4#5#6 { % #1 -- label @@ -7217,7 +7124,11 @@ and the derived file cooking-units.sty. \cs_new:Npn \@@_new_print_unit_correctly: { \@@_if_state_equal:nTF { error } - { \@@_print_unit_in_case_of_error: } + { + \tl_case:NnF \l_@@_cmd_type_tl + { \c_@@_cmd_type_cuam_tl { } } + { \@@_print_unit_in_case_of_error: } + } { \tl_case:NnF \l_@@_cmd_type_tl { @@ -7373,12 +7284,12 @@ and the derived file cooking-units.sty. % \begin{macrocode} \cs_new:Npn \@@_create_internal_error:nN #1#2 { - \@@_set_case_to:n { error } + \@@_set_state_to:n { error } \msg_error:nnnV { cooking-units } { internal-error } {#1} #2 } \cs_new:Npn \@@_create_error:n #1 { - \@@_set_case_to:n { error } + \@@_set_state_to:n { error } \msg_error:nnV { cooking-units } {#1} \l_@@_original_amount_tl } \cs_new:Npn \@@_create_error_and_stop:n #1 @@ -7388,7 +7299,7 @@ and the derived file cooking-units.sty. } \cs_new:Npn \@@_create_error:nn #1#2 { - \@@_set_case_to:n { error } + \@@_set_state_to:n { error } \msg_error:nnnV { cooking-units } {#1} {#2} \l_@@_original_amount_tl } % \end{macrocode} @@ -7473,7 +7384,7 @@ and the derived file cooking-units.sty. % \end{macro} % % -% \begin{macro}{ \@@_split_and_parse:} +% \begin{macro}{ \@@_split_and_parse:N} % Splits the input into fractions or ranges (or numbers). % \begin{macrocode} \cs_new:Npn \@@_split_and_parse:N #1 @@ -8247,8 +8158,8 @@ and the derived file cooking-units.sty. % \begin{macrocode} \cs_new:Npn \@@_cuam_post_process_input_phrases:NN #1#2 { - \@@_culang_let:nnN { phrase } { phrase-prop } \l_@@_phrase_prop - \tl_if_eq:NNT \q_@@_no_translation \l_@@_phrase_prop + \@@_culang_get_phrase_prop:N \l_@@_phrase_prop + \tl_if_eq:NNT \c_@@_no_translation_str \l_@@_phrase_prop { \use_none_delimit_by_q_stop:w } \prop_get:NnN \l_@@_phrase_prop { seq } \l_@@_phrase_numbers_seq % @@ -9119,8 +9030,8 @@ and the derived file cooking-units.sty. % \begin{macrocode} \cs_new:Npn \@@_set_cooking_unit_base_translation:n #1 { - \@@_culang_def_base:nnn { name } {#1} \q_@@_no_translation - \@@_culang_def_base:nnn { name-pl } {#1} \q_@@_no_translation + \@@_culang_def_base:nnn { name } {#1} \c_@@_no_translation_str + \@@_culang_def_base:nnn { name-pl } {#1} \c_@@_no_translation_str \@@_culang_def_base:nnn { gender } {#1} { m } } % \end{macrocode} @@ -9222,11 +9133,11 @@ and the derived file cooking-units.sty. { \seq_pop:NN \g_@@_stored_derived_formula_seq \l_@@_tmpb_tl \prop_put:NnV \l_@@_derived_units_prop {##1} \l_@@_tmpb_tl - \seq_pop:NN \g_@@_stored_derived_unit_print_seq \l_@@_tmpa_tl % \end{macrocode} % First create the unit, \emph{then} set the reference to the base unit. % (Else it is not yet defined) % \begin{macrocode} + \seq_pop:NN \g_@@_stored_derived_unit_print_seq \l_@@_tmpa_tl \exp_args:NNx \declarecookingunit [ {symbol={\l_@@_tmpa_tl}} ] {##1} \tl_set_eq:cN { l_@@_base_key_unit_ ##1 _tl } \l_@@_curr_unit_tl } @@ -9494,9 +9405,12 @@ and the derived file cooking-units.sty. \@@_error_if_unit_not_defined:nNT {#1} \l_@@_curr_unit_tl { \@@_set_state_to:n { error } } } - \peek_meaning_ignore_spaces:NTF [ - { \@@_parse_definename_optional_unitsymbol:w } - { \@@_parse_definename_singular:n } + \peek_remove_spaces:n + { + \peek_meaning:NTF [ + { \@@_parse_definename_optional_unitsymbol:w } + { \@@_parse_definename_singular:n } + } } % \end{macrocode} % \end{macro} @@ -9531,9 +9445,12 @@ and the derived file cooking-units.sty. \quark_if_recursion_tail_stop_do:nn {#1} { \msg_error:nn { cooking-units } { missing-argument } } \prop_put:Nnn \l_@@_tmpa_prop { name } {#1} - \peek_meaning_ignore_spaces:NTF [ - { \@@_parse_definename_optional_plural:w } - { \@@_parse_definename_optional_plural:w [#1] } + \peek_remove_spaces:n + { + \peek_meaning:NTF [ + { \@@_parse_definename_optional_plural:w } + { \@@_parse_definename_optional_plural:w [#1] } + } } % \end{macrocode} % \end{macro} @@ -9545,9 +9462,12 @@ and the derived file cooking-units.sty. \cs_new:Npn \@@_parse_definename_optional_plural:w [#1] { \prop_put:Nnn \l_@@_tmpa_prop { name-pl } {#1} - \peek_meaning_ignore_spaces:NTF < - { \@@_parse_definename_optional_gender:w } - { \@@_parse_definename_optional_gender:w <m> } + \peek_remove_spaces:n + { + \peek_meaning:NTF < + { \@@_parse_definename_optional_gender:w } + { \@@_parse_definename_optional_gender:w <m> } + } } % \end{macrocode} % \end{macro} @@ -9635,14 +9555,35 @@ and the derived file cooking-units.sty. % % % -% \begin{macro}{ \@@_cuprint_define_printed_unit:nn } +% \begin{macro}{ } % Defining phrases. Phrases (sadly) depend on the language. % The idea is going to be: Each language has its own property list % which is going to be stored for each language. Later, the property % list is recoverd for the language currently used. If no phrase is defined -% the fallback |\q_@@_no_translation| is returned. +% the fallback |\c_@@_no_translation_str| is returned. % \begin{macrocode} -\@@_culang_def_base:nnn { phrase } { phrase-prop } { \q_@@_no_translation } +\@@_culang_def_base:nnn { phrase } { phrase-prop } { \c_@@_no_translation_str } +\@@_culang_def_base:nnn { phrase } { phrase-lang } { Humphry-Drumphy } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{ } +% \begin{macrocode} +\cs_new:Npn \@@_culang_get_phrase_prop:N #1 + { + \@@_culang_let:nnN { phrase } { phrase-lang } \l_@@_language_tl + \prop_if_exist:cTF { l_@@_ \l_@@_language_tl _phrase_prop } + { + \prop_set_eq:Nc #1 { l_@@_ \l_@@_language_tl _phrase_prop } + } + { \tl_set_eq:NN #1 \c_@@_no_translation_str } + } +\cs_new:Npn \@@_culang_get_phrase_prop_for:nN #1#2 + { + \prop_set_eq:Nc #2 { l_@@_ #1 _phrase_prop } +% \prop_if_exist:cT { l_@@_ #1 _phrase_prop } +% { \prop_set_eq:Nc \l_@@_phrase_prop { l_@@_ #1 _phrase_prop } } + } % \end{macrocode} % \end{macro} % @@ -9684,21 +9625,26 @@ and the derived file cooking-units.sty. { \tl_set:Nn \l_@@_language_tl {#1} \@@_culang_if_translation_exists_for:VnnTF \l_@@_language_tl - { phrase } { phrase-prop } + { phrase } { phrase-lang } { - \@@_culang_let_for:VnnN \l_@@_language_tl { phrase } { phrase-prop } - \l_@@_phrase_prop +% \@@_culang_let_for:VnnN \l_@@_language_tl { phrase } { phrase-prop } +% \l_@@_phrase_prop + \prop_set_eq:Nc \l_@@_phrase_prop { l_@@_ \l_@@_language_tl _phrase_prop } \prop_get:NnN \l_@@_phrase_prop { seq } \l_@@_phrase_numbers_seq }{ + \prop_new:c { l_@@_ \l_@@_language_tl _phrase_prop } \prop_clear:N \l_@@_phrase_prop \seq_clear:N \l_@@_phrase_numbers_seq } - \@@_sanitize_arrows:n {#2} - \@@_parse_phrase:V \l_@@_sanitise_tl - \@@_new_cuphrase_sort_sequence:N \l_@@_phrase_numbers_seq - \prop_put:NnV \l_@@_phrase_prop { seq } \l_@@_phrase_numbers_seq - \@@_culang_def_for:VnnV - \l_@@_language_tl { phrase } { phrase-prop } \l_@@_phrase_prop + \@@_sanitize_arrows:n {#2} + \@@_parse_phrase:V \l_@@_sanitise_tl + \@@_new_cuphrase_sort_sequence:N \l_@@_phrase_numbers_seq + \prop_put:NnV \l_@@_phrase_prop { seq } \l_@@_phrase_numbers_seq + \prop_set_eq:cN { l_@@_ \l_@@_language_tl _phrase_prop } \l_@@_phrase_prop +% \@@_culang_def_for:VnnV +% \l_@@_language_tl { phrase } { phrase-prop } \l_@@_phrase_prop + \@@_culang_def_for:VnnV + \l_@@_language_tl { phrase } { phrase-lang } \l_@@_language_tl } % \end{macrocode} % \end{macro} @@ -9780,9 +9726,12 @@ and the derived file cooking-units.sty. % \begin{macrocode} \cs_new:Npn \@@_parse_phrase_optionals:n #1 { - \peek_meaning_ignore_spaces:NTF [ - { \@@_parse_stuff_plural:w } - { \@@_parse_stuff_plural:w [#1] } + \peek_remove_spaces:n + { + \peek_meaning:NTF [ + { \@@_parse_stuff_plural:w } + { \@@_parse_stuff_plural:w [#1] } + } } % \end{macrocode} % \end{macro} @@ -9795,9 +9744,12 @@ and the derived file cooking-units.sty. \cs_new:Npn \@@_parse_stuff_plural:w [#1] { \prop_put:Nnn \l_@@_tmpa_prop { -pl } {#1} - \peek_meaning_ignore_spaces:NTF < - { \@@_parse_stuff_gender:w } - { \@@_parse_stuff_gender:w <m> } + \peek_remove_spaces:n + { + \peek_meaning:NTF < + { \@@_parse_stuff_gender:w } + { \@@_parse_stuff_gender:w <m> } + } } % \end{macrocode} % \end{macro} diff --git a/macros/latex/contrib/cooking-units/cooking-units.ins b/macros/latex/contrib/cooking-units/cooking-units.ins index 7298eb0e53..1d58ebb3ae 100644 --- a/macros/latex/contrib/cooking-units/cooking-units.ins +++ b/macros/latex/contrib/cooking-units/cooking-units.ins @@ -5,7 +5,7 @@ %% The original source files were: %% %% cooking-units.dtx (with options: `install') -%% Copyright (C) 2016--2021 by Ben Vitecek (current Maintainer) +%% Copyright (C) 2016--2022 by Ben Vitecek (current Maintainer) %% %% This file may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either @@ -25,7 +25,7 @@ \input l3docstrip.tex \askforoverwritefalse \preamble -Copyright (C) 2016--2021 by Ben Vitecek (current Maintainer) +Copyright (C) 2016--2022 by Ben Vitecek (current Maintainer) This file may be distributed and/or modified under the conditions of the LaTeX Project Public License, either diff --git a/macros/latex/contrib/cooking-units/cooking-units.pdf b/macros/latex/contrib/cooking-units/cooking-units.pdf Binary files differindex e65da308d7..d4b06cbb01 100644 --- a/macros/latex/contrib/cooking-units/cooking-units.pdf +++ b/macros/latex/contrib/cooking-units/cooking-units.pdf diff --git a/macros/unicodetex/latex/njuthesis/njuthesis.dtx b/macros/unicodetex/latex/njuthesis/njuthesis.dtx index ff8521dd9d..228b53a204 100644 --- a/macros/unicodetex/latex/njuthesis/njuthesis.dtx +++ b/macros/unicodetex/latex/njuthesis/njuthesis.dtx @@ -111,7 +111,7 @@ To produce the documentation run the original source files ending with % %<class>\NeedsTeXFormat{LaTeX2e} %<*!(driver|install)> -%<+!driver>\GetIdInfo $Id: njuthesis.dtx 0.16.0 2022-03-19 12:00:00 +0800 NJU LUG <git+nju-lug-email-3104-issue-@yaoge123.cn>$ +%<+!driver>\GetIdInfo $Id: njuthesis.dtx 0.16.1 2022-03-27 13:00:00 +0800 NJU LUG <git+nju-lug-email-3104-issue-@yaoge123.cn>$ %<class> {Thesis template for Nanjing University} %<class>\ProvidesExplClass{njuthesis} %<definition-ug> {Undergraduate definition file for njuthesis} @@ -142,6 +142,7 @@ To produce the documentation run the original source files ending with \UseTblrLibrary{booktabs,diagbox,siunitx} \DefTblrTemplate{caption-tag}{default}{表\hspace{0.25em}\thetable} \SetTblrStyle{caption-tag}{font=\bfseries} +\SetTblrInner{row{1}={font=\bfseries}} \DefTblrTemplate{caption-sep}{default}{\quad} \lstdefinestyle{style@base} { @@ -191,13 +192,15 @@ To produce the documentation run the original source files ending with %</driver> % \fi % -% \title{\color{njuviolet}{The \cls{njuthesis} class\\ \textbf{南京大学学位论文模板}}} +% \title{\color{njuviolet}{The \cls{njuthesis} class\\ +% \textbf{南京大学学位论文模板}}} % % \author{^^A % 南京大学 Linux 用户组 -% \thanks{E-mail: \href{mailto:git+nju-lug-email-3104-issue-@yaoge123.cn}{git+nju-lug-email-3104-issue-@yaoge123.cn}}} +% \thanks{E-mail: \href{mailto:git+nju-lug-email-3104-issue-@yaoge123.cn} +% {git+nju-lug-email-3104-issue-@yaoge123.cn}}} % -% \date{v0.16.0 \quad 2022-03-19} +% \date{v0.16.1 \quad 2022-03-27} % % \changes{v0.1}{2021/09/04}{开始开发。} % \changes{v0.2}{2021/09/07}{初步搭建了可用的模板。} @@ -245,12 +248,13 @@ To produce the documentation run the original source files ending with % 在使用本模板时,我们默认您同意以下内容: % \begin{enumerate} % \item 本模板通过 LPPL 1.3c 协议开放源代码,您可以随意使用编译出的 PDF 文件。 -% \item 本模板与学校官方部门并不存在合作关系,作者不对使用本模板产生的格式审查问题负责。 +% \item 本模板与学校官方部门并不存在合作关系, +% 作者不对使用本模板产生的格式审查问题负责。 % \item 遇到本文档没有覆盖的问题属于正常情况,欢迎提交反馈意见。 % \end{enumerate} % -% 我们的 \href{https://git.nju.edu.cn/nju-lug/lug-introduction}{Linux 用户组}始终欢迎 -% 您的加入! +% 我们的 \href{https://git.nju.edu.cn/nju-lug/lug-introduction} +% {Linux 用户组}始终欢迎您的加入! % \end{abstract} % % \clearpage @@ -266,9 +270,12 @@ To produce the documentation run the original source files ending with % % \section{模板介绍} % -% \cls{njuthesis},即南京大学学位论文模板,是一个由南京大学 Linux 用户组维护的,用于处理本校学生毕业论文排版需求的 \hologo{LaTeX} 模板。 +% \cls{njuthesis},即南京大学学位论文模板,是一个由南京大学 Linux +% 用户组维护的,用于处理本校学生毕业论文排版需求的 \hologo{LaTeX} 模板。 % -% 本模板使用的本科生毕业论文模板格式依据《关于启动南京大学2022届本科毕业论文(设计)工作的通知》\cite{nju2021},研究生学位论文格式依据研究生院提供的材料包。 +% 本模板使用的本科生毕业论文模板格式依据 +% 《关于启动南京大学2022届本科毕业论文(设计)工作的通知》\cite{nju2021}, +% 研究生学位论文格式依据研究生院提供的材料包。 % % % \subsection{开始之前} @@ -280,51 +287,68 @@ To produce the documentation run the original source files ending with % \fcolorbox{olgreen}{gray!5}{\parbox{\textwidth-5em}{% % \hspace{2em}\begin{minipage}[c]{10cm} % \begin{enumerate} -% \item 访问 \url{https://tex.nju.edu.cn} -% \item 点击右上角~\olbutton{注册}~按钮,用\href{https://itsc.nju.edu.cn/1b/ce/c21586a334798/page.htm}{南大邮箱}注册账号 -% \item 登录您的账号 -% \item 点击左上角~\olbutton{创建新项目}~按钮,选择~\olbutton{论文模板} -% \item 随意取名,点击~\olbutton{创建}~按钮 +% \item 访问 \url{https://tex.nju.edu.cn} +% \item 点击右上角~\olbutton{注册}~按钮, +% 用\href{https://itsc.nju.edu.cn/1b/ce/c21586a334798/page.htm} +% {南大邮箱}注册账号 +% \item 登录您的账号 +% \item 点击左上角~\olbutton{创建新项目}~按钮,选择~\olbutton{论文模板} +% \item 随意取名,点击~\olbutton{创建}~按钮 % \end{enumerate} % \end{minipage}}} % % \bigskip -% 稍等片刻,您会在浏览器右侧发现一份新生成的空白论文。如果它的效果令您满意,不妨以此为基础开始写作。 +% 稍等片刻,您会在浏览器右侧发现一份新生成的空白论文。 +% 如果它的效果令您满意,不妨以此为基础开始写作。 % % \subparagraph{我一定要体验上述流程吗?} -% 是,但也不一定。有人坚持认为应该做一些\emph{直观、清晰、有手就行、一条路走到底}的教程,而不是 -% \emph{长篇累牍的精细介绍},其核心论据在于:现代人类总体上需要快速取得成就感,而且大部分可能用 -% 到本模板的同学不会具备必要的基础知识。反驳的观点在于过分简单的实验总是浪费时间的,尤其是在您 -% 可能早已掌握基本用法的情况下。但,不论如何,这番操作总会使您预览到 \cls{njuthesis} 论文模板的 -% 实际样式。 +% 是,但也不一定。有人坚持认为应该做一些\emph{直观、清晰、有手就行、一 +% 条路走到底}的教程,而不是\emph{长篇累牍的精细介绍},其核心论据在于: +% 现代人类总体上需要快速取得成就感,而且大部分可能用到本模板的同学不 +% 会具备必要的基础知识。反驳的观点在于过分简单的实验总是浪费时间的, +% 尤其是在您可能早已掌握基本用法的情况下。但,不论如何,这番操作总会 +% 使您预览到 \cls{njuthesis} 论文模板的实际样式。 % % \subparagraph{我并没有见到理想的结果。} -% 具体是哪里不满意?如果是\emph{样式存在偏差},请联系模板的作者;如果\emph{不能访问前文提到的在 -% 线编译网站},请考虑检查网络连接,依次咨询本校 -% \href{https://itsc.nju.edu.cn}{信息化管理建设服务中心} 和该网站的维护者 -% \href{mailto:my@yaoge123.cn}{姚舸老师};如果\emph{报错},请点击左上角的菜单按钮,查看编译器是 -% 否显示为 |XeLaTeX|;再如果\emph{还有其他原因},通过这几分钟的实验我们也可以得到一个相当有益的 -% 结论:\emph{也许 Word 模板更加适合您}。这可以节省下熟悉 \hologo{TeX} 排版软件使用方法所需的可 -% 观时间。 +% 具体是哪里不满意?如果是\emph{样式存在偏差},请联系模板的作者;如果 +% \emph{不能访问前文提到的在线编译网站},请考虑检查网络连接,依次咨询 +% 本校\href{https://itsc.nju.edu.cn}{信息化管理建设服务中心}和该网站 +% 的维护者\href{mailto:my@yaoge123.cn}{姚舸老师};如果\emph{报错},请 +% 点击左上角的菜单按钮,查看编译器是否显示为 |XeLaTeX|; +% 再如果\emph{还有其他原因},通过这几分钟的实验我们也可以得到一个相当 +% 有益的结论:\emph{也许 Word 模板更加适合您}。这可以节省下熟悉 +% \hologo{TeX} 排版软件使用方法所需的可观时间。 % % \subparagraph{但我依然对 \hologo{LaTeX} 一无所知!} -% 这意味着您也许得花些时间在\emph{长篇累牍的精细介绍}上。请接着向后阅读,有需要时善用搜索。 +% 这意味着您也许得花些时间在\emph{长篇累牍的精细介绍}上。 +% 请接着向后阅读,有需要时善用搜索。 % % % \subsection{历史沿革} % % 十几年来,多位热心校友发布过自己编写的模板,在 GitHub 网站上可考的包括: % \begin{enumerate} -% \item 杨文博(\href{http://yangwenbo.com/}{@solrex})的 njuthesis(2010 - 2018) \cite{wenboyang2013} -% \item \href{https://github.com/fireblue}{@fireblue} 基于杨文博模板的 NJUThesis(2013)\cite{fireblue2013} -% \item \href{https://github.com/wenhai-zheng}{@wenhai-zheng} 的 NJUThesis(2013)\cite{wenhai-zheng2013} -% \item 曹增乐(\href{https://github.com/ZLCao}{@ZLCao})的 NJUBachelor(2013 - 2016)\cite{zenglecao2013} -% \item 胡海星(\href{http://haixing-hu.github.io/}{@Haixing-Hu})的 NJU-Thesis(2013 - 2018)\cite{haixinghu2013} -% \item 张楚珩(\href{https://github.com/zhangchuheng123}{@zhangchuheng123})基于胡海星模板的 NJUThesis(2016)\cite{chuhengzhang2016} -% \item 蒋炎岩(\href{http://ics.nju.edu.cn/~jyy/}{@jiangyy})的 njuthesis(2017 - 2019)\cite{yanyanjiang2017} -% \item \href{https://github.com/njuHan}{@njuHan} 基于胡海星模板的 NJU-Thesis(2018 - 2021) -% \item 饶安逸(\href{https://anyirao.com/}{@AnyiRao})基于张楚珩模板的 NJU Thesis 2018(2018)\cite{anyirao2018} -% \item 赵懿晨(\href{https://fengchendian.github.io/about.html}{@FengChendian})基于饶安逸模板的 NJU Thesis 2021(2021)\cite{yichenzhao2021} +% \item 杨文博(\href{http://yangwenbo.com/}{@solrex})的 +% njuthesis(2010 - 2018) \cite{wenboyang2013} +% \item \href{https://github.com/fireblue}{@fireblue} 基于杨文博模板的 +% NJUThesis(2013)\cite{fireblue2013} +% \item \href{https://github.com/wenhai-zheng}{@wenhai-zheng} 的 +% NJUThesis(2013)\cite{wenhai-zheng2013} +% \item 曹增乐(\href{https://github.com/ZLCao}{@ZLCao})的 +% NJUBachelor(2013 - 2016)\cite{zenglecao2013} +% \item 胡海星(\href{http://haixing-hu.github.io/}{@Haixing-Hu})的 +% NJU-Thesis(2013 - 2018)\cite{haixinghu2013} +% \item 张楚珩(\href{https://github.com/zhangchuheng123}{@zhangchuheng123}) +% 基于胡海星模板的 NJUThesis(2016)\cite{chuhengzhang2016} +% \item 蒋炎岩(\href{http://ics.nju.edu.cn/~jyy/}{@jiangyy})的 +% njuthesis(2017 - 2019)\cite{yanyanjiang2017} +% \item \href{https://github.com/njuHan}{@njuHan} 基于胡海星模板的 +% NJU-Thesis(2018 - 2021) +% \item 饶安逸(\href{https://anyirao.com/}{@AnyiRao})基于张楚珩模板的 +% NJU Thesis 2018(2018)\cite{anyirao2018} +% \item 赵懿晨(\href{https://fengchendian.github.io/about.html} +% {@FengChendian})基于饶安逸模板的 +% NJU Thesis 2021(2021)\cite{yichenzhao2021} % \end{enumerate} % 至于不幸而未进行代码版本管理的,甚至于说以压缩包形式流传于各人硬盘中的,就更不可计数了。 % @@ -415,28 +439,37 @@ To produce the documentation run the original source files ending with % \href{https://github.com/nju-lug/NJUThesis}{Github仓库}。仓库内仅包含源代码、 % 空白模板及测试文件,不可直接用于写作。这些文件对应的使用方法请参考 % \ref{subsubsec:on-the-fly-installation}。如果由于网络原因不便访问主仓库,也可 -% 以从\href{https://git.nju.edu.cn/nju-lug/nju-latex-templates/njuthesis}{NJU Git 同步镜像} 获取项目工程文件。 +% 以从 \href{https://git.nju.edu.cn/nju-lug/nju-latex-templates/njuthesis} +% {NJU Git 同步镜像}获取项目工程文件。 % % \subparagraph{GitHub Releases} -% 本模板不定期将已有的新功能和问题修复打包为新的正式发行版,赋以更改后的版本号,发布在 \href{https://github.com/nju-lug/NJUThesis/releases/latest}{Github Releases 页面}。如果由于网络原因不便访问主仓库,也可以从\href{https://mirror.nju.edu.cn/github-release/nju-lug/NJUThesis/LatestRelease/}{南京大学镜像站下载页面}获取。可供下载的文件包括下列三种: +% 本模板不定期将已有的新功能和问题修复打包为新的正式发行版,赋以更改后的版本号, +% 发布在 \href{https://github.com/nju-lug/NJUThesis/releases/latest}{Github +% Releases 页面}。如果由于网络原因不便访问主仓库,也可以从\ignorespaces +% \href{https://mirror.nju.edu.cn/github-release/nju-lug/NJUThesis/LatestRelease/} +% {南京大学镜像站下载页面}获取。可供下载的文件包括下列三种: % \begin{description} % \item[\file{njuthesis-v*.pdf}] 模板说明文档(本文档)。 -% \item[\file{njuthesis-user-v*.zip}] 交付给用户的完整模板包,包括格式文件和范本文档,可在解压后用于本地编译,也可直接上传至在线编译网站。 -% \item[\file{njuthesis-ctan-v*.zip}] 交付给 CTAN 的源代码包,普通用户请忽略。 +% \item[\file{njuthesis-user-v*.zip}] 交付给用户的完整模板包, +% 包括格式文件和范本文档,可在解压后用于本地编译, +% 也可直接上传至在线编译网站。 +% \item[\file{njuthesis-ctan-v*.zip}] 交付给 CTAN 的源代码包, +% 普通用户请忽略。 % \end{description} % % % \subsubsection{文件构成} % -% 本模板由数量众多的文件组成,\emph{所有可能遇到的}文件如表 \ref{tab:njuthesis-files} 所示。 +% 本模板由数量众多的文件组成,\emph{所有可能遇到的}文件如表 +% \ref{tab:njuthesis-files} 所示。 % % \begin{table}[ht] % \centering % \begin{talltblr}[ -% caption = {\cls{njuthesis}文件构成}, -% label = {tab:njuthesis-files}, -% note{a} = {仅供开发使用,并不会在发布版本中出现。} -% ] {ll} +% caption = {\cls{njuthesis}文件构成}, +% label = {tab:njuthesis-files}, +% note{a} = {仅供开发使用,并不会在发布版本中出现。} +% ] { row{1} = {font=\bfseries}, colspec = {ll} } % \toprule % 名称 & 说明 \\ % \midrule @@ -513,8 +546,10 @@ To produce the documentation run the original source files ending with % % \subsubsection{安装\hologo{TeX}发行版} % -% 首先需要下载并安装 \hologo{TeX} 软件发行版,其中包括引擎、宏包、字体、文档等。各操作系统适用情况请参考表~\ref {tab:texdistribution}。第一次编译前请务必通过 MiKTeX Console、TeX Live -% Manager 等图形化程序或 \pkg{tlmgr} \emph{手动更新全部宏包}以避免潜在的兼容性问题。 +% 首先需要下载并安装 \hologo{TeX} 软件发行版,其中包括引擎、宏包、字体、 +% 文档等。各操作系统适用情况请参考表~\ref {tab:texdistribution}。第一次 +% 编译前请务必通过 MiKTeX Console、TeX LiveManager 等图形化程序或 +% \pkg{tlmgr} \emph{手动更新全部宏包}以避免潜在的兼容性问题。 % \begin{table}[ht] % \centering % \caption{\hologo{TeX} 软件发行版一览} @@ -533,11 +568,16 @@ To produce the documentation run the original source files ending with % 以下是一些值得注意的要点: % \begin{itemize} % \item 可以参照这份\emph{手把手的教程}\cite{install-latex-guide-zh-cn}。 -% \item 校园网环境中访问\href{https://mirror.nju.edu.cn/download/TeX%20%E6%8E%92%E7%89%88%E7%B3%BB%E7%BB%9F}{南京大学开源软件镜像站}可以获得最佳的下载体验。 +% \item 校园网环境中访问\ignorespaces +% \href{https://mirror.nju.edu.cn/download/TeX%20排版系统} +% {南京大学开源软件镜像站}可以获得最佳的下载体验。 % \item 使用最新的发行版,即版本号为2021或者21。 % \item 对于 Windows 和 macOS 用户,更推荐轻量化的 \hologo{MiKTeX} 套件。 -% \item Linux 用户请尽可能下载 full 版本,如 |texlive-full|。换言之,下载最大的软件包。 -% \item 对于一部分用到新版本特性的宏包,\cls{njuthesis} 内置了版本检查\footnote{譬如遇到 l3 过时问题请运行 |tlmgr update l3packages|。},请确认各宏包已升级至最新版。 +% ^^A \item Linux 用户请尽可能下载 full 版本,如 |texlive-full|。 +% ^^A 换言之,下载最大的软件包。 +% \item 对于一部分用到新版本特性的宏包,\cls{njuthesis} 内置了版本检查 +% \footnote{譬如遇到 l3 过时问题请运行 |tlmgr update l3packages|。} +% ,请确认各宏包已升级至最新版。 % \end{itemize} % % @@ -546,22 +586,30 @@ To produce the documentation run the original source files ending with % % 配置完编译器后,还需要一个\emph{文本编辑器}来完成 \file{.tex} 文件内容的写作。 % -% 关于具体使用哪一种,至今仍有相当一部分人认为Windows自带的\emph{记事本}是最好的 -% 文本编辑器。但对于本项目而言,在此诚心诚意地推荐您使用\emph{更现代更美观更多功 -% 能}的编辑器,譬如\emph{安装了 LaTeX Workshop 插件的 \href{https://code.visualstudio.com/}{Visual Studio Code}}。您也可以根据个人的喜好随意使用 TeXworks、TeXstudio 等编辑器,顺手就行。 +% 关于具体使用哪一种,至今仍有相当一部分人认为Windows自带的\emph{记事本}是 +% 最好的文本编辑器。但对于本项目而言,在此诚心诚意地推荐您使用\emph{更现代 +% 更美观更多功能}的编辑器,譬如\emph{安装了 \hologo{LaTeX} Workshop 插件的 +% \href{https://code.visualstudio.com/}{Visual Studio Code}}。您也可以根据 +% 个人的喜好随意使用 TeXworks、TeXstudio 等编辑器,顺手就行。 % % \cls{njuthesis} 为一些常见编辑器提供了配置文件,如 % \begin{description} -% \item[Visual Studio Code] 本模板在 \file{.vscode/} 中提供一份 \hologo{LaTeX} Workshop 插件的简易配置,在打开文件夹后将自动导入,可以省略初始配置步骤直接使用。 -% \item[TeXstudio] 本模板提供 \file{conf.txsprofile},可以使用快捷键 |alt+O+P| 导入配置文件。为了简化流程\footnote{当然,也可以设置为使用 \hologo{XeLaTeX} 编译,然后按照 \ref{subsubsec:compileseq} 内容使用快捷键 |F8| 手动编译参考文献。},该配置文件使用 \pkg{latexmk},第一次编译前请参考下一节内容安装 Perl。 +% \item[Visual Studio Code] 本模板在 \file{.vscode/} 中提供一份 +% \hologo{LaTeX} Workshop 插件的简易配置,在打开文件夹后将自动导入, +% 可以省略初始配置步骤直接使用。 +% \item[TeXstudio] 本模板提供 \file{conf.txsprofile},可以使用快捷键 +% |alt+O+P| 导入配置文件。为了简化流程\footnote{当然,也可以设置 +% 为使用 \hologo{XeLaTeX} 编译,然后按照 \ref{subsubsec:compileseq} +% 内容使用快捷键 |F8| 手动编译参考文献。},该配置文件使用 +% \pkg{latexmk},第一次编译前请参考下一节内容安装 Perl。 % \end{description} % % % \subsubsection{编译顺序} % \label{subsubsec:compileseq} -% \hologo{TeX} 本身是命令行程序,通过不同的命令调用所需的编译引擎,编辑器提供的 -% 快捷按钮实际只是做了包装。为了便于排查运行错误,以下通过具体终端命令简要描述编 -% 译过程。 +% \hologo{TeX} 本身是命令行程序,通过不同的命令调用所需的编译引擎, +% 编辑器提供的快捷按钮实际只是做了包装。为了便于排查运行错误, +% 以下通过具体终端命令简要描述编译过程。 % % 编译本模板的过程可以概括为下述步骤: % \begin{enumerate} @@ -570,8 +618,9 @@ To produce the documentation run the original source files ending with % \item 生成页码、编号、目录 % \item 将参考文献列表页插入目录 % \end{enumerate} -% 总计需要编译四次。\emph{假设即将使用的主文件名为 \file{njuthesis-sample.tex}},应采用以 -% 下命令顺序进行编译,以生成内容正确的 \file{njuthesis-sample.pdf}。输出的 PDF +% 总计需要编译四次。\emph{假设即将使用的主文件名为 +% \file{njuthesis-sample.tex}},应采用以下命令顺序进行编译, +% 以生成内容正确的 \file{njuthesis-sample.pdf}。输出的 PDF % 文档位于同一目录下。该目录下同时会生成若干中间文件。 % % 编译命令具体为引擎名称加主文件名,在编译 \file{.tex} 文件时, @@ -604,10 +653,13 @@ To produce the documentation run the original source files ending with % % % \subparagraph{使用 \pkg{latexmk}} -% \pkg{latexmk}\cite{latexmk} 是一个基于 Perl 脚本的自动编译工具,宗旨是通过单一命令简化上述的多次编译流程。在使用该命令前,请确保安装了以下软件: +% \pkg{latexmk}\cite{latexmk} 是一个基于 Perl 脚本的自动编译工具, +% 宗旨是通过单一命令简化上述的多次编译流程。 +% 在使用该命令前,请确保安装了以下软件: % \begin{description} -% \item[Perl] 一般预装于 macOS 和 Linux,而 Windows 用户需要单独安装 \href{https://strawberryperl.com/}{Strawberry Perl}。 -% \item[\pkg{latexmk}] \hologo{MiKTeX} 已预装;如果终端找不到 |latexmk| 命令,\hologo{TeX}\,Live 用户需使用 \pkg{tlmgr} 单独安装。 +% \item[Perl] 一般预装于 macOS 和 Linux,而 Windows 用户需要单独安装 +% \href{https://strawberryperl.com/}{Strawberry Perl}。 +% \item[\pkg{latexmk}] 如果终端找不到 |latexmk| 命令,需使用包管理器单独安装。 % \end{description} % % 该命令的使用方法为 @@ -817,23 +869,26 @@ To produce the documentation run the original source files ending with % \begin{table}[htbp] % \centering % \begin{talltblr}[ -% caption = {中文字体配置列表}, -% label = {tab:cjk-fontset}, -% note{a} = {请下载简繁扩展(即 GBK 编码)版本}, -% note{b} = {使用 -% \href{http://www.foundertype.com/index.php/FontInfo/index/id/164}{方正小标宋} -% 作为方正书宋的粗体}, -% note{c} = {使用 -% \href{http://www.foundertype.com/index.php/FontInfo/index/id/131}{方正黑体} -% 作为方正细黑一的粗体}, -% note{d} = {在部分操作系统中可能已经预装 Google Noto 字体。考虑到获取字体的难易程度,单独安装时请采用 +% caption = {中文字体配置列表}, +% label = {tab:cjk-fontset}, +% note{a} = {请下载简繁扩展(即 GBK 编码)版本}, +% note{b} = {使用\ignorespaces +% \href{http://www.foundertype.com/index.php/FontInfo/index/id/164} +% {方正小标宋}作为方正书宋的粗体}, +% note{c} = {使用\ignorespaces +% \href{http://www.foundertype.com/index.php/FontInfo/index/id/131} +% {方正黑体}作为方正细黑一的粗体}, +% note{d} = {在部分操作系统中可能已经预装 Google Noto 字体。 +% 考虑到获取字体的难易程度,单独安装时请采用 % \href{https://mirrors.nju.edu.cn/download/Adobe%20Source%20Han}{Adobe Source Han} % 字体表示思源字体,请下载 Simplified Chinese(即后缀名为 SC)的版本}, % note{e} = {思源字体并不包含楷书和仿宋,而 Adobe 楷体和仿宋难以直接下载, -% 因此使用方正字体代替}, -% ] { cell{2}{2,4} = {white!70!njuyellow}, cell{4}{4} = {white!70!njuyellow}, colspec = {ccccc} } +% 因此使用方正字体代替} ] +% { cell{2}{2,4} = {white!70!njuyellow}, +% cell{4}{4} = {white!70!njuyellow}, +% row{1} = {font=\bfseries}, colspec = {ccccc} } % \toprule -% \bf 配置名称 & \bf 宋体 & \bf 黑体 & \bf 楷书 & \bf 仿宋 \\ +% 配置名称 & 宋体 & 黑体 & 楷书 & 仿宋 \\ % \midrule % Windows & 中易宋体 & 中易黑体 & 中易楷体 & 中易仿宋 \\ % macOS & 华文宋体 & 华文黑体 & 华文楷体 & 华文仿宋 \\ @@ -847,7 +902,7 @@ To produce the documentation run the original source files ending with % \href{https://github.com/adobe-fonts}{思源}\TblrNote{d} % & \href{https://mirrors.nju.edu.cn/adobe-fonts/source-han-serif/OTF/SimplifiedChinese/}{思源宋体} % & \href{https://mirrors.nju.edu.cn/adobe-fonts/source-han-sans/OTF/SimplifiedChinese/}{思源黑体} -% & 方正楷体\TblrNote{e} & 方正仿宋 \\ +% & 方正楷体\TblrNote{e} & 方正仿宋 \\ % \bottomrule % \end{talltblr} % \end{table} @@ -903,9 +958,17 @@ To produce the documentation run the original source files ending with % title = \Arg{标题} % title* = \Arg{英文标题} % \end{syntax} -% 题目。由于封面上提供给中文题目的横线长度有限\footnote{单行最长为15个汉字,建议总长度不超过45字},本模板默认会自动对标题进行换行。如果需要手动制定换行位点,请使用换行控制符( |\\| ),最多两处。 +% 题目。由于封面上提供给中文题目的横线长度有限\footnote{单行最长为15个汉字,建议总长度不超过45字},本模板默认会自动对标题进行换行。如果需要手动指定换行位点,请使用换行控制符( |\\| ),最多两处。 % \end{function} % +% 绘制封面及摘要中的标题涉及断行处理,无法对空字符串产生正确结果。 +% 因而在手动将标题设置为空时,本模板将抛出如下错误: +% \begin{shellexample}[deletekeywords={in}] +% ! Package njuthesis Error: The title should not be left blank. +% (njuthesis) Please check whether you have fill in both +% (njuthesis) Chinese and English titles. +% \end{shellexample} +% % \begin{function}[updated=2021-10-01]{info/keywords,info/keywords*} % \begin{syntax} % keywords = \Arg{关键词} @@ -1434,7 +1497,8 @@ To produce the documentation run the original source files ending with % \item[著者-出版年制] 正文引用的文献采用著者-出版年制时,各篇文献的标注内容由著者姓氏与出版年构成,并置于"()"内。参考文献表采用著者-出版年制组织时,各篇文献首先按文种集中,然后按著者字顺和出版年排列。 % \end{description} % -% 对于本科生而言,学校规定文件表明参考文献表应当“用数字加方括号表示”\cite{nju2021},符合顺序编码制的格式,保持默认设置即可。 +% 对于本科生而言,学校规定文件表明参考文献表应当“用数字加方括号 +% 表示”\cite{nju2021},符合顺序编码制的格式,保持默认设置即可。 % % \begin{function}[added=2022-02-15]{bib/option} % \begin{syntax} @@ -1450,18 +1514,22 @@ To produce the documentation run the original source files ending with % \begin{syntax} % resource = \Arg{文件} % \end{syntax} -% 参考文献数据源。类似于 \tn{addbibresource} 命令,但可以使用逗号分隔的列表形式。必须使用带扩展名(\file{.bib})的完整文件名。 +% 参考文献数据源。类似于 \tn{addbibresource} 命令,但可以使用逗号分隔的 +% 列表形式。必须使用带扩展名(\file{.bib})的完整文件名。 % \end{function} % % \begin{function}{\addbibresource} % \begin{syntax} % \tn{addbibresource}\Arg{文件} % \end{syntax} -% 添加参考文献源文件。为了与 \pkg{biblatex} 进行兼容,也可使用本命令添加数据源。本命令不支持逗号分隔多个文件的形式,如果希望额外添加参考文献列表,需要在导言区中多次调用。 +% 添加参考文献源文件。为了与 \pkg{biblatex} 进行兼容,也可使用本命令 +% 添加数据源。本命令不支持逗号分隔多个文件的形式,如果希望额外添加参 +% 考文献列表,需要在导言区中多次调用。 % \end{function} % % 可以参考如下范例进行参考文献设置。 -% 其中 \opt{bib/option} 的内容旨在关闭部分不需显示的文献信息,可根据需要使用。 +% 其中 \opt{bib/option} 的内容旨在关闭部分不需显示的文献信息, +% 并采取仅首字母大写的作者姓名格式,可根据需要使用。 % \begin{latexexample}[moretexcs={\njusetup},emph={[2]bib}] % \njusetup { % bib = { @@ -1471,7 +1539,8 @@ To produce the documentation run the original source files ending with % doi = false, % isbn = false, % url = false, -% eprint = false +% eprint = false, +% gbnamefmt = lowercase % } % } % } @@ -1516,40 +1585,43 @@ To produce the documentation run the original source files ending with % 引用命令 \tn{cite} 含有多个变体,以便使用文献条目中不同的信息域。在两种参考文献样式下,这些命令的行为具体存在一些差异,详见表 \ref{tab:numeric-style} 和表 \ref{tab:author-year-style}。 % % \begin{table}[ht] -% \caption{顺序编码制下的引用样式} -% \label{tab:numeric-style} % \centering -% \begin{tblr}{cll} +% \begin{talltblr} [ +% caption = {顺序编码制下的引用样式}, +% label = {tab:numeric-style} ] +% { row{1} = {font=\bfseries}, colspec = {cll} } % \toprule -% \bf 引用方式 & \bf 命令 & \bf 排版效果 \\ +% 引用方式 & 命令 & 排版效果 \\ % \midrule -% 单篇文献 & \tn{cite} & 上标可设置页码 \\ -% 单篇文献 & \tn{parencite} & 非上标可设置页码 \\ -% 多篇文献 & \tn{cite} & 上标,逗号隔开或短横线连接 \\ -% 标注页码 & \tn{pagescite} & 上标加自动页码 \\ -% 标注作者 & \tn{textcite} & 作者为主语加非上标编号 \\ -% 标注作者 & \tn{authornumcite} & 作者为主语加上标编号 \\ -% 完整脚注 & \tn{footfullcite} & 脚注方式 \\ +% 单篇文献 & \tn{cite} & 上标可设置页码 \\ +% 单篇文献 & \tn{parencite} & 非上标可设置页码 \\ +% 多篇文献 & \tn{cite} & 上标,逗号隔开或短横线连接 \\ +% 标注页码 & \tn{pagescite} & 上标加自动页码 \\ +% 标注作者 & \tn{textcite} & 作者为主语加非上标编号 \\ +% 标注作者 & \tn{authornumcite} & 作者为主语加上标编号 \\ +% 完整脚注 & \tn{footfullcite} & 脚注方式 \\ % \bottomrule -% \end{tblr} +% \end{talltblr} % \end{table} % % \begin{table}[ht] % \centering -% \begin{talltblr}[ -% caption = {著者-出版年制下的引用样式}, -% label = {tab:author-year-style}, -% note{a} = {在此样式下 \tn{parencite} 效果等同于 \tn{cite}} ] {cll} +% \begin{talltblr} [ +% caption = {著者-出版年制下的引用样式}, +% label = {tab:author-year-style}, +% note{a} = {在此样式下 \tn{parencite} 效果等同于 \tn{cite}。} ] +% { row{1} = {font=\bfseries}, colspec = {cll} } % \toprule -% \bf 引用方式 & \bf 命令 & \bf 排版效果 \\ +% 引用方式 & 命令 & 排版效果 \\ % \midrule -% 单篇文献 & \tn{cite}\TblrNote{a} & 作者加年份用括号包围可设置页码 \\ -% 多篇文献 & \tn{cite} & 分号隔开 \\ -% 标注页码 & \tn{pagescite} & 作者加年份用括号包围自动页码 \\ -% 标注年份 & \tn{yearcite} & 用括号包围的年份 \\ -% 标注年份、页码 & \tn{yearpagescite} & 提供年份用括号包围自动页码 \\ -% 标注作者 & \tn{textcite} & 作者为主语加加括号包围年份 \\ -% 完整脚注 & \tn{footfullcite} & 脚注方式 \\ +% 单篇文献 & \tn{cite}\TblrNote{a} & +% 作者加年份用括号包围可设置页码 \\ +% 多篇文献 & \tn{cite} & 分号隔开 \\ +% 标注页码 & \tn{pagescite} & 作者加年份用括号包围自动页码 \\ +% 标注年份 & \tn{yearcite} & 用括号包围的年份 \\ +% 标注年份、页码 & \tn{yearpagescite} & 提供年份用括号包围自动页码 \\ +% 标注作者 & \tn{textcite} & 作者为主语加加括号包围年份 \\ +% 完整脚注 & \tn{footfullcite} & 脚注方式 \\ % \bottomrule % \end{talltblr} % \end{table} @@ -1632,6 +1704,24 @@ To produce the documentation run the original source files ending with % 关闭此选项后摘要页将不会出现在目录中,仅保留其 PDF 书签。 % \end{function} % +% \begin{function}[added=2022-03-26]{style/abstract-title} +% \begin{syntax} +% abstract-title = <(strict)|centered|natural> +% \end{syntax} +% 选择研究生摘要标题样式。 +% 默认为严格模式(\opt{strict}),即完全模仿材料包要求。 +% \end{function} +% +% 材料包中的 Word 空白模板仅有两行空白下划线。 +% 根据填写习惯的不同,模板预置了三种样式: +% \begin{itemize} +% \item \opt{strict},在两行空白下划线上左对齐填写标题。 +% 如果该标题不足一行,则第二行下划线留空; +% 如果长度超出两行,则向后延伸并抛出一个警告信息。 +% \item \opt{centered},将严格模式的左对齐改为居中。 +% \item \opt{natural},仅居中标题,不做行数检查。 +% 本模式更适合较短的题目。 +% \end{itemize} % % \subsubsection{前言页} % @@ -1801,6 +1891,8 @@ To produce the documentation run the original source files ending with % \begin{itemize} % \item \pkg{natbib} 和 \pkg{gbt7714} 等 \hologo{BibTeX} 相关的参考文献宏包。 % \item \pkg{bm} 等使用传统数学字体配置方案的宏包。 +% \item \pkg{babel} 在直接使用时会覆盖默认的中文名称设置。 +% \item \pkg{microtype} 在 \hologo{XeTeX} 和 \hologo{LuaTeX} 下支持有限。 % \end{itemize} % % @@ -2014,7 +2106,7 @@ To produce the documentation run the original source files ending with % % % \end{documentation} -% +% \clearpage % % \begin{implementation} % @@ -2106,12 +2198,13 @@ To produce the documentation run the original source files ending with % \end{variable} % % \begin{variable}{\l_@@_info_degree_tl,\l_@@_info_diploma_tl, -% \l_@@_info_type_tl} +% \l_@@_info_type_tl,\l_@@_info_type_en_tl} % 用于存储学位名称的变量。 % \begin{macrocode} \tl_new:N \l_@@_info_degree_tl \tl_new:N \l_@@_info_diploma_tl \tl_new:N \l_@@_info_type_tl +\tl_new:N \l_@@_info_type_en_tl % \end{macrocode} % \end{variable} % @@ -2283,7 +2376,7 @@ To produce the documentation run the original source files ending with \cs_new_protected:Npn \@@_ulined_center_box:nn #1#2 { \mode_leave_vertical: - \rule [ -0.5 ex ] { #1 } { 0.4 pt } + \rule [ -0.55 ex ] { #1 } { 0.4 pt } \skip_horizontal:n { -#1 } \hbox_to_wd:nn { #1 } { \hfil #2 \hfil } } @@ -2358,7 +2451,7 @@ To produce the documentation run the original source files ending with \cs_new_protected:Npn \@@_uline:n #1 { \mode_leave_vertical: - \rule [ -0.5 ex ] { #1 } { 0.4 pt } + \rule [ -0.55 ex ] { #1 } { 0.4 pt } \skip_horizontal:n { -#1 } } % \end{macrocode} @@ -2469,6 +2562,16 @@ To produce the documentation run the original source files ending with % \subsubsection{封面相关} % \changes{v0.16}{2022/03/10}{将封面和摘要内部函数定义移动到前部。} % +% 定义关于标题的报错信息。 +% \begin{macrocode} +\msg_new:nnn { njuthesis } { missing-title } + { + The~ title~ should~ not~ be~ left~ blank.\\ + Please~ check~ whether~ you~ have~ fill~ in~ + both~ Chinese~ and~ English~ titles. + } +% \end{macrocode} +% % \begin{macro}{\@@_split_title:n,\@@_split_title:V} % 分割标题。 % \begin{macrocode} @@ -2505,6 +2608,8 @@ To produce the documentation run the original source files ending with % \begin{macrocode} \cs_new_protected:Npn \@@_multiline_title:nnn #1#2#3 { + \tl_if_empty:NT \l_@@_info_title_tl + { \msg_error:nn { njuthesis } { missing-title } } \@@_split_title:V \l_@@_info_title_tl \@@_spread_box:nnV { #2 } { \kaishu } \c_@@_name_title_tl \@@_hskip: @@ -2612,6 +2717,77 @@ To produce the documentation run the original source files ending with % \end{macrocode} % \end{macro} % +% \begin{macro}{\@@_uline_box:} +% 用于摘要标题的下划线盒子。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_uline_box: + { \vtop{\box1\kern-\prevdepth\kern0.5ex\hrule} } +% \end{macrocode} +% \end{macro} +% +% 定义关于标题的报错信息。 +% \begin{macrocode} +\msg_new:nnn { njuthesis } { abs-title-too-long } + { + Your~ title~ is~ too~ long~ to~ fit~ in~ two~ lines.\\ + I~ have~ drawn~ additional~ lines~ to~ contain~ it,~ + which~ will~ probably~ make~ your~ abstract~ page~ + look~ slightly~ different~ from~ the~ standard.\\ + You~ can~ use~ the~ "style/abstract-title"~ key~ + to~ disable~ this~ message. + } +% \end{macrocode} +% +% \begin{macro}{\@@_uline_list:nnn,\@@_uline_list:xnn} +% \changes{v0.16}{2022/03/25}{使用原生断行算法处理摘要页标题。} +% 用于研究生摘要页面的多行标题。 +% \begin{arguments} +% \item 标签名 +% \item 内容 +% \item 左边距 +% \end{arguments} +% 这里使用了 Primitive \TeX{} 语法以利用原生的断行算法\footnote{\url{https://tex.stackexchange.com/questions/637861/underline-list-item-to-page-width}}。 +% 对其语法的简要介绍可以参考 \href{http://petr.olsak.net/ftp/olsak/optex/tex-nutshell.pdf}{\file{tex-nutshell.pdf}}。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_uline_list:nnn #1#2#3 + { + \hbox_set:Nn \l_@@_tmp_box {#1} + \setbox0=\vbox{\hangindent=\wd\l_@@_tmp_box \hangafter=-1 + \leftskip=#3 \rightskip=\leftskip \parindent=\z@ #2\par + \global\setbox2=\hbox{} + \int_gzero:N \l_@@_tmp_int + \loop + \setbox1=\lastbox \unskip\unpenalty + \unless\ifvoid1 + \global\setbox2=\hbox{\@@_uline_box:\penalty0\unhbox2} + \int_gincr:N \l_@@_tmp_int + \repeat + } + { + \noindent\copy\l_@@_tmp_box\unhbox2 +% \end{macrocode} +% 在使用自然断行算法后,研究生的摘要标题可选择 \opt{strict} +% 或者 \opt{natural} 模式。前者会为少于两行的标题补齐下划线, +% 并对多于三行的标题生成警告信息。这里通过行数处理边界条件, +% 包括标题未填写、标题只有一行,以及标题过长的情况。 +% \begin{macrocode} + \bool_if:NT \g_@@_strict_abs_title_bool + { + \int_case:nnF { \l_@@_tmp_int } + { + { 0 } { \msg_error:nn { njuthesis } { missing-title } } + { 1 } { \@@_uline:n { \textwidth } } + { 2 } { \prg_do_nothing: } + } + { \msg_warning:nn { njuthesis } { abs-title-too-long } } + \par + } + } + } +\cs_generate_variant:Nn \@@_uline_list:nnn { xnn } +% \end{macrocode} +% \end{macro} +% % % \subsection{页面对象} % \changes{v0.15}{2022/01/24}{使用 \pkg{xtemplate} 重构封面。} @@ -3035,10 +3211,10 @@ To produce the documentation run the original source files ending with % \begin{macrocode} \msg_new:nnn { njuthesis } { load-config } { I~ am~ loading~ config~ file~ "#1". } -\clist_if_empty:NF \g_@@_config_clist +\clist_map_inline:Nn \g_@@_config_clist { - \msg_info:nnx { njuthesis } { load-config } { \g_@@_config_tl } - \clist_map_inline:Nn \g_@@_config_clist { \file_input:n { #1 } } + \msg_info:nnn { njuthesis } { load-config } { #1 } + \file_input:n { #1 } } % \end{macrocode} % @@ -3060,6 +3236,7 @@ To produce the documentation run the original source files ending with title .tl_set:N = \l_@@_info_title_tl, title .initial:n = { 空 }, title* .tl_set:N = \l_@@_info_title_en_tl, + title* .initial:n = { Empty }, % \end{macrocode} % \end{macro} % @@ -3166,7 +3343,9 @@ To produce the documentation run the original source files ending with % 设置类型信息。 % \begin{macrocode} \tl_set:Nx \l_@@_info_type_tl - { \clist_item:Nn \c_@@_name_type_clist { \g_@@_info_type_int } } + { \clist_item:Nn \c_@@_name_type_clist { \g_@@_info_type_int } } +\tl_set:Nx \l_@@_info_type_en_tl + { \clist_item:Nn \c_@@_name_type_en_clist { \g_@@_info_type_int } } \tl_put_left:Nx \l_@@_info_type_tl { \tl_use:c { c_@@_name_ \l_@@_info_diploma_tl _tl } } % \end{macrocode} @@ -4539,7 +4718,7 @@ To produce the documentation run the original source files ending with \@@_ulined_center_box:nn { 9 em } { \l_@@_info_clc_tl } \hfill \@@_spread_box:nnV { 3.2 em } { } \c_@@_name_seclv_tl \@@_hskip: \@@_ulined_center_box:nn { 9 em } { \l_@@_info_seclv_tl } \\ - V { 3.2 em } { } { \c_@@_name_udc_tl } \@@_hskip: + \@@_spread_box:nnV { 3.2 em } { } \c_@@_name_udc_tl \@@_hskip: \@@_ulined_center_box:nn { 9 em } { \l_@@_info_udc_tl } \hfill \null } % \end{macrocode} @@ -4853,8 +5032,9 @@ To produce the documentation run the original source files ending with %<definition-g> content = \@@_abs_info_g:n { : }, %<definition-ug> format = \zihao { -4 } \kaishu, %<definition-g> format = \zihao { 4 } \kaishu, - align = l, - bottom-skip = 1 cm +%<definition-ug> bottom-skip = 1 cm, +%<definition-g> bottom-skip = 2 cm, + align = l } % \end{macrocode} % \end{macro} @@ -4880,8 +5060,9 @@ To produce the documentation run the original source files ending with %<definition-g> content = \@@_abs_info_en_g:n { :~ }, %<definition-ug> format = \zihao { -4 }, %<definition-g> format = \zihao { 4 }, - align = l, - bottom-skip = 1 cm +%<definition-ug> bottom-skip = 1 cm, +%<definition-g> bottom-skip = 2 cm, + align = l } %</(definition-ug|definition-g)> % \end{macrocode} @@ -4926,6 +5107,30 @@ To produce the documentation run the original source files ending with % \paragraph{研究生} % \changes{v0.13}{2021/12/12}{使用 \hologo{LaTeX3} 语法重构研究生摘要。} % +% \begin{macro}{abstract/mark} +% 英文摘要标题实例。 +% \begin{macrocode} +\@@_declare_element:nn { abstract / mark } + { + content = \c_@@_name_abstract_b_tl, + format = \sffamily \zihao { -3 }, + bottom-skip = 1 cm + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{abstract/en/mark} +% 英文摘要标题实例。 +% \begin{macrocode} +\@@_declare_element:nn { abstract / en / mark } + { + content = \c_@@_name_abstract_b_en_tl, + format = \sffamily \zihao { -3 }, + bottom-skip = 1 cm + } +% \end{macrocode} +% \end{macro} +% % \begin{macro}{\@@_abs_info_g:n} % 绘制研究生中文摘要信息栏。 % \begin{arguments} @@ -4936,15 +5141,12 @@ To produce the documentation run the original source files ending with %<*definition-g> \cs_new_protected:Npn \@@_abs_info_g:n #1 { - \@@_full_uline:NV \l_@@_tmp_dim + \@@_uline_list:xnn { \clist_item:Nn \c_@@_name_type_clist { \g_@@_info_type_int } \c_@@_name_title_a_tl #1 } - \@@_ulined_center_box:nn { \l_@@_tmp_dim } - { \tl_range:Nnn \l_@@_info_title_tl { 1 } { 20 } } \\ - \@@_uline:n { \textwidth } \@@_qquad: - \tl_range:Nnn \l_@@_info_title_tl { 21 } { -1 } \\ + { \l_@@_info_title_tl } { \g_@@_abs_title_left_skip } % \end{macrocode} % 专业、年级、姓名。 % \begin{macrocode} @@ -4977,21 +5179,16 @@ To produce the documentation run the original source files ending with % \begin{macrocode} \cs_new_protected:Npn \@@_abs_info_en_g:n #1 { - \@@_full_uline:NV \l_@@_tmp_dim - { \clist_item:Nn \c_@@_name_type_en_clist - { \g_@@_info_type_int } #1 } - \@@_ulined_center_box:nn { \l_@@_tmp_dim } - { \tl_range:Nnn \l_@@_info_title_en_tl { 1 } { 40 } } \\ - \@@_uline:n { \textwidth } \@@_qquad: - \tl_range:Nnn \l_@@_info_title_en_tl { 41 } { -1 } + \@@_uline_list:xnn { \l_@@_info_type_en_tl #1 } + { \l_@@_info_title_en_tl } { \g_@@_abs_title_left_skip } % \end{macrocode} % 使用循环输出专业、姓名、导师。注意这里将 |\\| 放置在前部, % 以避免末尾生成多余的换行符产生 |Underfull \vbox| 信息。 % \begin{macrocode} \clist_map_inline:nn { major, author, supv_full } - { \\ + { \@@_uline_entry:Nnnn \l_@@_tmp_dim - { ##1 _en } { ##1 _en } { #1 } + { ##1 _en } { ##1 _en } { #1 } \par } } %</definition-g> @@ -5016,7 +5213,7 @@ To produce the documentation run the original source files ending with % \end{macrocode} % 关键词列表的悬挂缩进样式由 \tn{list} 环境产生。 % \begin{macrocode} - \list { } + \list { \l_@@_tmp_tl } { \labelwidth \l_@@_tmp_dim \labelsep \c_zero_dim @@ -5028,8 +5225,7 @@ To produce the documentation run the original source files ending with % \begin{macrocode} \cs_set_eq:NN \makelabel \textbf } - \item [ \l_@@_tmp_tl ] - \clist_use:cn { l_@@_info_keywords #1 _clist } { #2 } + \item \clist_use:cn { l_@@_info_keywords #1 _clist } { #2 } \endlist } %</class> @@ -5038,6 +5234,7 @@ To produce the documentation run the original source files ending with % % % \subsubsection{绘制摘要} +% \changes{v0.16}{2022/03/26}{补上研究生摘要页面的小标题。} % % \begin{macro}{\@@_make_abstract:,\@@_make_abstract_en:} % 绘制摘要页面。 @@ -5047,11 +5244,13 @@ To produce the documentation run the original source files ending with { \UseInstance { nju } { abstract / title } \UseInstance { nju } { abstract / info } +%<definition-g> \UseInstance { nju } { abstract / mark } } \cs_new_protected:Npn \@@_make_abstract_en: { \UseInstance { nju } { abstract / en / title } \UseInstance { nju } { abstract / en / info } +%<definition-g> \UseInstance { nju } { abstract / en / mark } } %</(definition-ug|definition-g)> % \end{macrocode} @@ -5060,8 +5259,15 @@ To produce the documentation run the original source files ending with % % \subsubsection{用户接口} % +% \begin{macro}{\g_@@_abs_title_left_skip} +% 研究生摘要标题左边距。 % \begin{macrocode} %<*class> +\skip_new:N \g_@@_abs_title_left_skip +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} \keys_define:nn { nju / style } { % \end{macrocode} @@ -5069,8 +5275,32 @@ To produce the documentation run the original source files ending with % \changes{v0.15}{2022/02/04}{可选择摘要是否出现在目录中。} % 是否将摘要添加到目录。 % \begin{macrocode} - abstract-in-toc .bool_gset:N = \g_@@_abs_in_toc_bool, - abstract-in-toc .initial:n = true + abstract-in-toc .bool_gset:N = \g_@@_abs_in_toc_bool, + abstract-in-toc .initial:n = true, +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{style/abstract-title} +% \changes{v0.16}{2022/03/26}{可选择研究生摘要标题样式。} +% 选择摘要样式,默认为 \opt{strict}。 +% \begin{macrocode} + abstract-title .choice:, + abstract-title / strict .code:n = + { + \bool_gset_true:N \g_@@_strict_abs_title_bool + \skip_gset:Nn \g_@@_abs_title_left_skip { 1 em } + }, + abstract-title / centered .code:n = + { + \bool_gset_true:N \g_@@_strict_abs_title_bool + \skip_gset:Nn \g_@@_abs_title_left_skip { 0 pt plus 1 fill } + }, + abstract-title / natural .code:n = + { + \bool_gset_false:N \g_@@_strict_abs_title_bool + \skip_gset:Nn \g_@@_abs_title_left_skip { 0 pt plus 1 fill } + }, + abstract-title .initial:n = strict } % \end{macrocode} % \end{macro} @@ -5262,6 +5492,8 @@ To produce the documentation run the original source files ending with { abstract } { 摘要 } { ABSTRACT }, % 用于书签的摘要名称字样 { abstract_a } { 中文摘要 } { ABSTRACT }, + % 用于小标题的摘要名称字样 + { abstract_b } { 摘\qquad{}要 } { ABSTRACT }, { appendix } { 附录 } { appendix }, { dept } { 院系 } { DEPARTMENT }, { figure } { 图 } { figure }, diff --git a/macros/unicodetex/latex/njuthesis/njuthesis.ins b/macros/unicodetex/latex/njuthesis/njuthesis.ins index 1d947d360e..5efc57a52f 100644 --- a/macros/unicodetex/latex/njuthesis/njuthesis.ins +++ b/macros/unicodetex/latex/njuthesis/njuthesis.ins @@ -76,6 +76,18 @@ To produce the documentation run the original source files ending with \Msg{*************************************************************} \endbatchfile +\__nju_declare_element:nn { abstract / mark } + { + content = \c__nju_name_abstract_b_tl, + format = \sffamily \zihao { -3 }, + bottom-skip = 1 cm + } +\__nju_declare_element:nn { abstract / en / mark } + { + content = \c__nju_name_abstract_b_en_tl, + format = \sffamily \zihao { -3 }, + bottom-skip = 1 cm + } \endinput %% %% End of file `njuthesis.ins'. diff --git a/macros/unicodetex/latex/njuthesis/njuthesis.pdf b/macros/unicodetex/latex/njuthesis/njuthesis.pdf Binary files differindex 1430d0d6ab..578bddd52d 100644 --- a/macros/unicodetex/latex/njuthesis/njuthesis.pdf +++ b/macros/unicodetex/latex/njuthesis/njuthesis.pdf diff --git a/macros/unicodetex/latex/polyglossia/README.md b/macros/unicodetex/latex/polyglossia/README.md index 33bbb1d2d7..df223991ec 100644 --- a/macros/unicodetex/latex/polyglossia/README.md +++ b/macros/unicodetex/latex/polyglossia/README.md @@ -1,4 +1,4 @@ -# THE POLYGLOSSIA PACKAGE v1.51 +# THE POLYGLOSSIA PACKAGE v1.54 ## Multilingual typesetting with XeLaTeX and LuaLaTeX This package provides an alternative to Babel for users of XeLaTeX and LuaLaTeX. @@ -26,8 +26,8 @@ Polyglossia makes it possible to automate the following tasks: # LICENCE -Copyright (c) 2008-2010 François Charette, 2013 Élie Roux, 2011-2021 Arthur Reutenauer, -Copyright (c) 2019-2021 Bastien Roucariès, 2019-2021 Jürgen Spitzmüller +Copyright (c) 2008-2010 François Charette, 2013 Élie Roux, 2011-2022 Arthur Reutenauer, +Copyright (c) 2019-2022 Bastien Roucariès, 2019-2022 Jürgen Spitzmüller Except where otherwise noted, Polyglossia is placed under the terms of the MIT licence (https://opensource.org/licenses/MIT). diff --git a/macros/unicodetex/latex/polyglossia/polyglossia.dtx b/macros/unicodetex/latex/polyglossia/polyglossia.dtx index fdcd7f32eb..d3f0abc589 100644 --- a/macros/unicodetex/latex/polyglossia/polyglossia.dtx +++ b/macros/unicodetex/latex/polyglossia/polyglossia.dtx @@ -8,7 +8,7 @@ \iffalse %</internal> %<*README> -# THE POLYGLOSSIA PACKAGE v1.51 +# THE POLYGLOSSIA PACKAGE v1.54 ## Multilingual typesetting with XeLaTeX and LuaLaTeX This package provides an alternative to Babel for users of XeLaTeX and LuaLaTeX. @@ -36,8 +36,8 @@ Polyglossia makes it possible to automate the following tasks: # LICENCE -Copyright (c) 2008-2010 François Charette, 2013 Élie Roux, 2011-2021 Arthur Reutenauer, -Copyright (c) 2019-2021 Bastien Roucariès, 2019-2021 Jürgen Spitzmüller +Copyright (c) 2008-2010 François Charette, 2013 Élie Roux, 2011-2022 Arthur Reutenauer, +Copyright (c) 2019-2022 Bastien Roucariès, 2019-2022 Jürgen Spitzmüller Except where otherwise noted, Polyglossia is placed under the terms of the MIT licence (https://opensource.org/licenses/MIT). @@ -66,17 +66,17 @@ to track the issues and follow progress. The polyglossia package (C) 2008–2010 François Charette - (C) 2011–2021 Arthur Reutenauer + (C) 2011–2022 Arthur Reutenauer (C) 2013 Elie Roux (C) 2019 Bastien Roucariès - (C) 2019–2021 Jürgen Spitzmüller + (C) 2019–2022 Jürgen Spitzmüller License information appended \endpreamble \postamble - Copyright (C) 2021 by Arthur Reutenauer <arthur 'dot' reutenauer 'at' normalesup 'dot' org> + Copyright (C) 2022 by Arthur Reutenauer <arthur 'dot' reutenauer 'at' normalesup 'dot' org> This work may be distributed and/or modified under the conditions of the LaTeX Project Public License, either version 1.3 @@ -273,7 +273,6 @@ to track the issues and follow progress. \generate{\file{gloss-la-x-medieval.ldf}{\from{polyglossia.dtx}{gloss-la-x-medieval.ldf}}} \generate{\file{gloss-la.ldf}{\from{polyglossia.dtx}{gloss-la.ldf}}} \generate{\file{gloss-lao.ldf}{\from{polyglossia.dtx}{gloss-lao.ldf}}} -\generate{\file{gloss-latex.ldf}{\from{polyglossia.dtx}{gloss-latex.ldf}}} \generate{\file{gloss-latin.ldf}{\from{polyglossia.dtx}{gloss-latin.ldf}}} \generate{\file{gloss-latinclassic.ldf}{\from{polyglossia.dtx}{gloss-latinclassic.ldf}}} \generate{\file{gloss-latinecclesiastic.ldf}{\from{polyglossia.dtx}{gloss-latinecclesiastic.ldf}}} @@ -373,7 +372,7 @@ to track the issues and follow progress. % !TeX spellcheck = en_US % !TeX TS-program = xelatex \documentclass[11pt]{ltxdoc} -\usepackage{color} +\usepackage{xcolor} \usepackage{xspace,fancyvrb,longtable,booktabs} \usepackage[neverdecrease]{paralist} \usepackage[format=hang,labelfont=bf,labelsep=period]{caption} @@ -512,7 +511,7 @@ to track the issues and follow progress. % \color{xpgblue}Polyglossia: Modern multilingual typesetting with \XeLaTeX\ and \LuaLaTeX} % \author{\TA{François Charette} \and \TA{Arthur Reutenauer}\thanks{Current maintainer} % \and \TA{Bastien Roucariès} \and \TA{Jürgen Spitzmüller}} -% \date{\filedate \qquad \fileversion\\ +% \date{\filedate \qquad \fileversion\thanks{Please report bugs to \url{http://github.com/reutenauer/polyglossia/issues}}\\ % \footnotesize (\textsc{pdf} file generated on \today)} % % \maketitle @@ -685,11 +684,9 @@ to track the issues and follow progress. % british & english & variant=british \\ % canadian & english & variant=canadian \\ % canadien & french & variant=canadian \\ -% classiclatin\footnote{In \pkg{babel} currently only selectable via dot modifier (\emph{latin.classic}).} -% & latin & variant=classic \\ +% classiclatin & latin & variant=classic \\ % farsi & persian & \\ -% ecclesiasticlatin\footnote{In \pkg{babel} currently only selectable via dot modifier (\emph{latin.ecclesiastic}).} -% & latin & variant=ecclesiastic \\ +% ecclesiasticlatin & latin & variant=ecclesiastic \\ % friulan & friulian & \\ % german\footnote{Due to the name conflict only available in \pkg{polyglossia} as \emph{germanb} (which is a \pkg{babel} synonym).} % & german & spelling=old \\ @@ -697,8 +694,7 @@ to track the issues and follow progress. % kurmanji & kurdish & variant=kurmanji \\ % lowersorbian & sorbian & variant=lower \\ % magyar & hungarian & \\ -% medievallatin\footnote{In \pkg{babel} currently only selectable via dot modifier (\emph{latin.medieval}).} -% & latin & variant=medieval \\ +% medievallatin & latin & variant=medieval \\ % naustrian & german & variant=austrian \\ % newzealand & english & variant=newzealand \\ % ngerman & german & variant=german [\emph{default}] \\ @@ -717,7 +713,7 @@ to track the issues and follow progress. % \bottomrule % \end{tabular} % \end{minipage} -% +% % \end{table} % % For convenience reasons, \pkg{polyglossia} also supports the use of babel names\new{1.46} (for the few justified @@ -1214,7 +1210,7 @@ to track the issues and follow progress. % \paragraph*{Commands:} % \begin{itemize} % \item \Cmd\abjad outputs Arabic \textit{abjad} numbers according to the Mashriq varieties. -% Example: ¦\abjad{1863}¦ yields \textarabic{\abjad{1863}}. +% Example: ¦\abjad{1863}¦ yields \textarabic{\abjad{1863}}. % \item \Cmd\abjadmaghribi outputs Arabic \textit{abjad} numbers according to the Maghrib varieties. % Example: ¦\abjadmaghribi{1863}¦ yields \textarabic{\abjadmaghribi{1863}}. % \item \Cmd\abjadalph\new{1.50} steps through the Arabic alphabet, thus it can only be used up to 28. @@ -1330,17 +1326,17 @@ to track the issues and follow progress. % \item[¦"/¦] a slash that allows for a subsequent line break. As opposed to \cmd\slash, hyphenation % at the breakpoints preset in the hyphenation patterns is still allowed. % \end{shorthands} -% Furthermore, the following shorthands generate easy access to Croatian digraphs (ligatures): +% Furthermore, the following shorthands generate easy access to Croatian digraphs: % \begin{shorthands} -% \item[¦"dz¦] Generates the ligature \charifavailable{01C6}{dž}\ if the font provides it. If not, the -% two characters are output separately. Also available for ¦"Dz¦ (\charifavailable{01C5}{Dž}) -% and ¦"DZ¦ (\charifavailable{01C4}{DŽ}). -% \item[¦"lj¦] Generates the ligature \charifavailable{01C9}{lj}\ if the font provides it. If not, the -% two characters are output separately. Also available for ¦"Lj¦ (\charifavailable{01C8}{Lj}) -% and ¦"LJ¦ (\charifavailable{01C7}{LJ}). -% \item[¦"nj¦] Generates the ligature \charifavailable{01CC}{nj}\ if the font provides it. If not, the -% two characters are output separately. Also available for ¦"Nj¦ (\charifavailable{01CB}{Nj}) -% and ¦"NJ¦ (\charifavailable{01CA}{NJ}). +% \item[¦"dz¦] Generates the digraph \charifavailable{01C6}{dž}\ if the font provides it. If not, +% the two consecutive glyphs are output mimicking the digraph. Also available for +% ¦"Dz¦ (\charifavailable{01C5}{Dž}) and ¦"DZ¦ (\charifavailable{01C4}{DŽ}). +% \item[¦"lj¦] Generates the digraph \charifavailable{01C9}{lj}\ if the font provides it. If not, +% the two consecutive glyphs are output mimicking the digraph. Also available for +% ¦"Lj¦ (\charifavailable{01C8}{Lj}) and ¦"LJ¦ (\charifavailable{01C7}{LJ}). +% \item[¦"nj¦] Generates the digraph \charifavailable{01CC}{nj}\ if the font provides it. If not, +% the two consecutive glyphs are output mimicking the digraph. Also available for +% ¦"Nj¦ (\charifavailable{01CB}{Nj}) and ¦"NJ¦ (\charifavailable{01CA}{NJ}). % \end{shorthands} % % Finally, there are also four shorthands for quotation marks: @@ -1350,19 +1346,21 @@ to track the issues and follow progress. % \item[¦">¦] for Croatian left guillemets (»). % \item[¦"<¦] for Croatian right guillemets («). % \end{shorthands} -% \item \xpgboolkeyfalse[1.47]{disableligatures} -% If this is \xpgvalue{true}, all Croatian ligatures (for digraphs such as -% \charifavailable{01C6}{dž}) will be replaced by single characters. This can -% be useful if the ligatures on your font are broken (if the font does not -% have them, they are automatically replaced). +% \item \xpgboolkeyfalse[1.47]{disabledigraphs}[Up to version 1.53, the option was +% called \xpgvalue{disableligatures}. The old option is kept for backwards compatibility, +% but the use is discouraged.] If this is \xpgvalue{true}, all Croatian digraphs +% (such as \charifavailable{01C6}{dž}) will be replaced by the two consecutive letters, +% which is the most common way of typesetting them in Croatian. This can be useful if +% the Unicode digraphs in your font are broken (if the font does not have them, +% they are automatically mimicked by the two consecutive glyphs). % \item \xpgboolkeytrue[1.53]{localalph} % If \xpgvalue{true}, alphanumeric counters will use a locally established version which excludes % the characters \meta{q}, \meta{w}, \meta{x} and \meta{y} from alphabetic counting. % Obviously this limits the counting range to 22. % \item \xpgboolkeytrue[1.51]{splithyphens} -% According to Croatian typesetting conventions, if a word with a hard hyphen (such as \emph{je-li}) -% is hyphenated at this hyphen, a second hyphenation character is to be inserted at the beginning -% of the line that follows the hyphenation (\emph{je-/-li}). +% According to Croatian typesetting conventions, if a word with a hard hyphen (such as +% \emph{hrvatsko-engleski}) is hyphenated at this hyphen, a second hyphenation character is to be +% inserted at the beginning of the line that follows the hyphenation (\emph{hrvatsko-/-engleski}). % By default, this is done automatically (if you are using \LuaTeX, the \pkg{luavlna} package is % loaded to achieve this). % Set this option to ¦false¦ to disable the feature. @@ -1450,6 +1448,13 @@ to track the issues and follow progress. % \item[¦"/¦] a slash that allows for a subsequent line break. As opposed to \cmd\slash, % hyphenation at the breakpoints preset in the hyphenation patterns is still allowed. % \end{shorthands} +% \item \xpgboolkeyfalse[1.54]{schoolhyphens} +% If this is set to true, alternative (experimental) hyphenation patterns are used rather than the +% default Finnish patterns. These patterns (called `School Hyphenation') are more basic in that +% they do not contain hyphenation exceptions for compound words since these result in simple words +% not being hyphenated at points where this would be valid. The backdrop of the `School' patterns +% is that compound words might be hyphenated incorrectly. +% See \url{https://github.com/hyphenation/basic-finnish} for details. % \end{itemize} % % \subsection{french}\label{french} @@ -1881,16 +1886,22 @@ to track the issues and follow progress. % \item[¦=A¦] for Ā (A with macron), also available for Ē, Ī, Ō, Ū, V̄, and Ȳ. % Note that a macron above the letter V is only displayed if your font % supports the Unicode character ¦0304¦ (\emph{combining macron}). -% \item[¦=ae¦] for a͞e (ae diphthong with macron), also available for a͞u, e͞u, -% and o͞e. Note that macrons above diphthongs are only displayed if your font -% supports the Unicode character ¦035E¦ (\emph{combining double +% \item[¦=ae¦] for a͞e (ae diphthong with macron, for the ¦classic¦ and +% the ¦modern¦ variant) or ǣ (ae ligature with macron, for the ¦medieval¦ +% and the ¦ecclesiastic¦ variant), respectively; also available for a͞u, +% e͞u, and o͞e/œ̄. Note that macrons above diphthongs are only displayed if +% your font supports the Unicode character ¦035E¦ (\emph{combining double % macron}). -% \item[¦=Ae¦] for A͞e (Ae diphthong with macron), also available for A͞u, E͞u, -% and O͞e. -% \item[¦=AE¦] for A͞E (AE diphthong with macron), also available for A͞U, E͞U, -% and O͞E. +% \item[¦=Ae¦] for A͞e (Ae diphthong with macron, for the ¦classic¦ and +% the ¦modern¦ variant) or Ǣ (AE ligature with macron, for the ¦medieval¦ +% and the ¦ecclesiastic¦ variant), respectively; also available for A͞u, +% E͞u, and O͞e/Œ̄. +% \item[¦=AE¦] for A͞E (AE diphthong with macron, for the ¦classic¦ and +% the ¦modern¦ variant) or Ǣ (AE ligature with macron, for the ¦medieval¦ +% and the ¦ecclesiastic¦ variant), respectively; also available for A͞U, +% E͞U, and O͞E/Œ̄. % \item[¦\textasciicircum a¦] for ă (a with breve), also available for ĕ, ĭ, -% ŏ, ŭ, and y̆. Note that a breve above the letter y is only displayed if +% ŏ, ŭ, and y̆. Note that a breve above the letter y is only displayed if % your font supports the Unicode character ¦0306¦ (\emph{combining % breve}). % \item[¦\textasciicircum A¦] Ă (A with breve), also available for Ĕ, Ĭ, Ŏ, @@ -1996,6 +2007,32 @@ to track the issues and follow progress. % \paragraph*{Options:} % \begin{itemize} % \item \xpgchoicekey[1.45]{variant}{\xpgvalue{brazilian} or \xpgpresetvalue{portuguese}} +% \item \xpgboolkeyfalse[1.54]{babelshorthands} +% If this is turned on, the following shorthands for fine-tuning hyphenation and micro-typography +% of Portuguese words are activated. +% \begin{shorthands} +% \item[¦"|¦] disables a ligature at this position. +% \item[¦"=¦] for an explicit hyphen sign which is repeated at the beginning +% of the next line when hyphenated, as common in Portuguese typesetting +% (also if ¦splithyphens=false¦). Unlike plain ¦-¦, this also allows +% for hyphenation at the other points preset in the hyphenation patterns. +% \item[\texttt{"\textasciitilde}] for a hyphen sign without a breakpoint. Useful for +% cases where the hyphen should stick at the following syllable. +% \item[¦"-¦] adds a hyphenation point that does still allow for hyphenation at the points preset +% in the hyphenation patterns (as opposed to \cmd\-). +% \item[¦""¦] allows for a line break at this position (without hyphenation sign). +% \item[¦"/¦] a slash that allows for a subsequent line break. As opposed to \cmd\slash, hyphenation +% at the breakpoints preset in the hyphenation patterns is still allowed. +% \item[¦"<¦] for French left guillemets («). +% \item[¦">¦] for French right guillemets (»). +% \end{shorthands} +% \item \xpgboolkeytrue[1.54]{splithyphens} +% According to Portuguese typesetting conventions, if a word with a hard hyphen (such as +% \emph{pára-brisas}) is hyphenated at this hyphen, a second hyphenation character is to be +% inserted at the beginning of the line that follows the hyphenation (\emph{pára-/-brisas}). +% By default, this is done automatically (if you are using \LuaTeX, the \pkg{luavlna} package is +% loaded to achieve this). +% Set this option to ¦false¦ to disable the feature. % \end{itemize} % % \subsection{russian}\label{russian} @@ -2093,6 +2130,13 @@ to track the issues and follow progress. % \paragraph*{Options:} % \begin{itemize} % \item \xpgchoicekey{script}{\xpgpresetvalue{Cyrillic} or \xpgvalue{Latin}} +% \item \xpgboolkeytrue[1.54]{splithyphens} +% According to Serbian typesetting conventions, if a word with a hard hyphen (such as +% \emph{калцијум-карбонат}) is hyphenated at this hyphen, a second hyphenation character is to be +% inserted at the beginning of the line that follows the hyphenation (\emph{калцијум-/-карбонат}). +% By default, this is done automatically (if you are using \LuaTeX, the \pkg{luavlna} package is +% loaded to achieve this). +% Set this option to ¦false¦ to disable the feature. % \item \xpgchoicekey{numerals}{\xpgpresetvalue{arabic}, \xpgvalue{cyrillic-alph} or \xpgvalue{cyrillic-trad}} % Uses either Arabic numerals or Cyrillic alphanumerical numbering. The two Cyrillic variants differ as follows: % \begin{itemize} @@ -2125,7 +2169,8 @@ to track the issues and follow progress. % \begin{shorthands} % \item[¦"=¦] for an explicit hyphen sign which is repeated at the beginning % of the next line when hyphenated, as common in Slovak typesetting -% (only needed with ¦splithyphens=false¦). +% (also if ¦splithyphens=false¦). Unlike plain ¦-¦, this also allows +% for hyphenation at the other points preset in the hyphenation patterns. % \item[¦"|¦] disables a ligature at this position. % \item[\texttt{"\textasciitilde}] for a hyphen sign without a breakpoint. Useful for % cases where the hyphen should stick at the following syllable. @@ -2365,11 +2410,11 @@ to track the issues and follow progress. % (such as, in the case of English, ¦\def\chaptername{Chapter}¦) % \item \Cmd{\date\meta{lang}} stores definitions of date formats (usually redefinitions % of \cmd\today, in some cases also definitions of additional date commands) -% \item \Cmd{\blockextras\meta{lang}} stores macros that are to be executed when the language +% \item \Cmd{\blockextras@\meta{lang}} stores macros that are to be executed when the language % \meta{lang} is activated via \cmd\selectlanguage\ command or the \meta{lang} environment -% \item \Cmd{\inlineextras\meta{lang}} stores macros that are to be executed when the language +% \item \Cmd{\inlineextras@\meta{lang}} stores macros that are to be executed when the language % \meta{lang} is activated locally via \cmd\text\meta{lang} command -% \item \Cmd{\noextras\meta{lang}} stores macros that are to be executed when the language +% \item \Cmd{\noextras@\meta{lang}} stores macros that are to be executed when the language % \meta{lang} is closed % \end{itemize} % ^^A @@ -2720,6 +2765,48 @@ to track the issues and follow progress. % \section{Revision history} % % \bgroup\footnotesize +% \subsection*{1.54 (27-03-2022)} +% +% \subsubsection*{New features} +% \begin{itemize} +% \item New option \xpgoption{splithyphens} for Serbian (\TXI{496}) and Portuguese (\TXI{534}). +% \item Add \xpgoption{babelshorthands} to Portuguese. +% \item Add \xpgoption{schoolhyphens} option to Finnish (\TXI{525}). +% \end{itemize} +% +% \subsubsection*{Interface and defaults changes} +% \begin{itemize} +% \item Rename \xpgoption{disableligatures} to \xpgoption{disabledigraphs} for Croatian (\TXI{497}, \TXP{500}). +% \item Fix output with \xpgoption{numerals=cyrillic-alph} (part of \TXI{503}). +% \item Standardize February and November in Indonesian according to the Great Dictionary of the Indonesian Language +% of the Language Center (\emph{Kamus Besar Bahasa Indonesia}) (\TXP{526}). +% \end{itemize} +% +% \subsubsection*{Bug fixes} +% \begin{itemize} +% \item Fix robustification of font family switches (\TXI{428}). +% \item Preserve font family switches across languages (\TXI{519}). +% \item Fix \TeX\ dash ligatures with \xpgoption{splithyphens} (\TXI{502}). +% \item Prevent \emph{missing hyphenmins value} \LaTeX\ error with unknown languages (\TXI{513}). +% \item Fix global \xpgoption{babelshorthands}, \xpgoption{localmarks} and \xpgoption{verbose} +% options (\TXI{515}). +% \item Fix Latin shorthands (\TXI{516}). +% \item Remove spurious space in Bosnian date (\TXP{528}). +% \item Fix \cmd\languagevariant\ and \cmd\mainlanguagevariant\ macros (\TXI{530}, \TXI{531}). +% \item Make \cmd\iflanguageloaded\ and friends work in preamble (\TXI{532}). +% \item Fix deactivation of shorthands (\TXI{320}). +% \item Fix deactivation of numerals. +% \item Update deprecated \LaTeX\ hooks (\TXI{523}). +% \item Fix \xpgoption{luatexrenderer} option which was not considered appropriately (\TXI{533}). +% \item Turn warning about \texttt{totalhyphenmin} to info, which is more appropriate (\TXI{111}). +% \end{itemize} +% +% \subsubsection*{Documentation improvements} +% \begin{itemize} +% \item Document in this manual where to report bugs (\TXI{512}). +% \end{itemize} +% +% % \subsection*{1.53 (12-04-2021)} % % \subsubsection*{New features} @@ -2952,12 +3039,13 @@ to track the issues and follow progress. % change of behavior should you have used one of these options without value (\TXI{363}). % Concerned are the following options: % \begin{itemize} -% \item ¦babelshorthands¦ in language Belarusian, Mongolian, Ukrainian, and Russian -% (now ¦babelshorthands¦ equals ¦babelshorthand=true¦, no longer ¦babelshorthands=false¦). -% \item ¦localalph¦ in language Slovenian (¦localalph¦ now equals ¦localalph=true¦). -% \item ¦latesthyphen¦ in language German (¦latesthyphen¦ now equals ¦latesthyphen=true¦). -% \item ¦fullyear¦ in package \pkg{hebrewcal} (¦fullyear¦ now equals ¦fullyear=true¦). +% \item \xpgoption{babelshorthands} in language Belarusian, Mongolian, Ukrainian, and Russian +% (now \xpgoption{babelshorthands} equals \xpgoption{babelshorthand=true}, no longer \xpgoption{babelshorthands=false}). +% \item \xpgoption{localalph} in language Slovenian (\xpgoption{localalph} now equals \xpgoption{localalph=true}). +% \item \xpgoption{fullyear} in package \pkg{hebrewcal} (\xpgoption{fullyear} now equals \xpgoption{fullyear=true}). % \end{itemize} +% \item The option \xpgoption{latesthyphen} in language German is deprecated. \XeTeX\ and \LuaTeX\ nowadays +% always use the latest German hyphens. % \item The command ¦\setlanguagealias*¦ (introduced in v1.46) does no longer define % dedicated alias environments. % \item The babelnames for Latin variants have been corrected to ¦classiclatin¦, ¦ecclesiasticlatin¦ @@ -3512,7 +3600,7 @@ to track the issues and follow progress. % Many thanks to all the people who have contributed bugfixes and new features to \pkg{polyglossia} % since we took over. % In alphabetical order: \TA{Ignas Anikevicius}, \TA{Sina Ahmadi}, \TA{Wouter Bolsterlee}, \TA{Christian Buhtz}, -% \TA{Zgarbul Andrey}, \TA{Oleg Domanov}, \TA{Philipp Gesang}, \TA{Kevin Godby}, \TA{Enrico Gregorio}, +% \TA{Zgarbul Andrey}, \TA{Oleg Domanov}, user \TA{fakhriaunur}, \TA{Philipp Gesang}, \TA{Kevin Godby}, \TA{Enrico Gregorio}, % \TA{Khaled Hosny}, \TA{Najib Idrissi}, user \TA{julroy67}, \TA{Dohyun Kim}, \TA{Phil Kime}, \TA{Mike Kroutikov}, % \TA{Ivan Kokan}, \TA{Caleb Maclennan}, \TA{José Mancera}, \TA{Miquel Ortega}, \TA{Yevgen Pogribnyi}, \TA{Will Robertson}, % \TA{Maïeul Rouquette}, \TA{Elie Roux}, \TA{Hugo Roy}, \TA{Guy Rutenberg}, \TA{Philipp Stephani}, \TA{Niranjan Tambe}, @@ -3543,7 +3631,7 @@ to track the issues and follow progress. % \subsection{polyglossia.sty} % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{polyglossia}[2021/04/12 v1.53 +\ProvidesPackage{polyglossia}[2022/03/27 v1.54 Modern multilingual typesetting with XeLaTeX and LuaLaTeX] \RequirePackage{etoolbox} \RequirePackage{makecmds} @@ -3560,27 +3648,45 @@ to track the issues and follow progress. % Execute code #3 if package #1 has been loaded already, else % add to package hook #2 -\newcommand\xpg@at@package[3]{% - \@ifpackageloaded{#1}{#3}{\AddToHook{#2}{#3}}% -} - +\cs_new_nopar:Nn \__xpg_at_package_hook:nnn{ + \@ifpackageloaded{#1}{#3}{\AddToHook{#2}{#3}}% +} + +% safe according to expl3 bug #960 +\cs_generate_variant:Nn \prop_item:Nn { Ne, Nf, No, Nx } +\cs_generate_variant:Nn \clist_set:Nn { Ne, Nf, No, Nx } +\cs_generate_variant:Nn \clist_gput_right:Nn {Ne} +\cs_generate_variant:Nn \prop_get:NnN {NeN} +\cs_generate_variant:Nn \prop_gput:Nnn {Nne, Nee, Nen} +\cs_generate_variant:Nn \cs_gset:Npn {Npe} +\cs_generate_variant:Nn \cs_new:Nn {Ne} +\cs_generate_variant:Nn \cs_new_nopar:Nn {Ne} +\cs_generate_variant:Nn \cs_gset_nopar:Npn {Npe} +\cs_generate_variant:Nn \cs_gset_nopar:Npn {cpe} +\cs_generate_variant:Nn \tl_set:Nn {Ne} +\cs_generate_variant:Nn \str_foldcase:n {e} +\prg_generate_conditional_variant:Nnn \file_if_exist:n {e} {TF, T, F, p} +\prg_generate_conditional_variant:Nnn \tl_if_blank:n {e} {TF, T, F, p} +\prg_generate_conditional_variant:Nnn \clist_if_in:Nn {Ne} {TF, T, F, p} +\prg_generate_conditional_variant:Nnn \prop_if_in:Nn {Ne} {TF, T, F, p} % correct a bug in tracklang -\xpg@at@package{tracklang}{file/after/tracklang.sty}{% +\__xpg_at_package_hook:nnn{tracklang}{file/tracklang.sty/after}{% \@ifpackagelater{tracklang}{2019/08/30}{}{\global\def\AddTrackedLangage{\AddTrackedLanguage}} } - %% This is for compatibility with Babel-aware package: \def\languageshorthands#1{\relax} %this is for scrlttr2 class \def\bbl@cs#1{\csname bbl@#1\endcsname}% \AtEndPreamble{\let\bbl@set@language\xpg@set@language@aux} %for biblatex \AtEndPreamble{\let\bbl@main@language\xpg@main@language} %for biblatex -\providecommand\texorpdfstring[2]{#1}% dummy command if hyperref is not loaded +\AtEndPreamble{ + \providecommand\texorpdfstring[2]{#1}% dummy command if hyperref is not loaded +} -\ifluatex +\sys_if_engine_luatex:T{ \RequirePackage{luatexbase} % already included by fontspec, but needed here \RequireLuaModule{polyglossia} -\fi +} % Which version of XeTeX do we use? What is the boudary class? 4095 or 255 \@ifundefined{e@alloc@intercharclass@top} @@ -3588,10 +3694,16 @@ to track the issues and follow progress. {\let\xpg@boundaryclass=\e@alloc@intercharclass@top} % Useful for getting list of loaded languages and variants. Like babel's bbl@loaded -\let\xpg@loaded\@empty% list of loaded languages (polyglossia name) -\let\xpg@vloaded\@empty% list of loaded variants -\let\xpg@bloaded\@empty% list of loaded languages (babel name) -\let\xpg@bcp@loaded\@empty% list of loaded languages (bcp-47 id) +% all language loaded +\seq_new:N \__xpg_langs_loaded +% list of loaded languages (polyglossia name) +\clist_new:N \xpg@loaded +% list of loaded variants +\clist_new:N \xpg@vloaded +% list of loaded languages (babel name) +\clist_new:N \xpg@bloaded +% list of loaded languages (bcp-47 id) +\clist_new:N \xpg@bcp@loaded % counter in latin \def\latinalph#1{\expandafter\latin@alph\csname c@#1\endcsname} @@ -3661,25 +3773,37 @@ to track the issues and follow progress. % error out if lang is not loaded \cs_new_nopar:Nn \polyglossia@error@iflangnotloaded:n { - \cs_if_exist:cF{#1@loaded} + \seq_if_in:NxF \__xpg_langs_loaded {#1} { \xpg@error{language~ #1~ is~ not~ loaded.~ Please~ load~ it~ before~ using~ it.} } } +\msg_new:nnn { polyglossia } { languagenotloaded } +{ + The~ language~ #1~ is~ not~ loaded.~ You~ should~ load~ it. +} +\msg_redirect_name:nnn { polyglossia } { languagenotloaded } { critical } -% error do not use directly the gloss file -\msg_new:nnn { polyglossia } { directloadgloss } +\cs_new_nopar:Nn \__xpg_msg_if_lang_not_loaded:n { - You~ should~ not~ load~ directly~ the~ gloss~ file~ using~ `\string\usepackage'. - You~ must~ use~ `\string\setotherlanguage\{#1\}' or `\string\setmainlanguage\{#1\}'. + \tl_if_blank:eT {\xpg_alias_base_lang:n{#1}} + { + \msg_show:nnn { polyglossia } { languagenotloaded } {#1} + } } -\msg_redirect_name:nnn { polyglossia } { directloadgloss } { critical } +% %% use macro if defined, else warn that it is not -\def\csuse@warn#1{% - \ifcsundef{#1}{\xpg@warning{ \expandafter\string\csname #1\endcsname\space is~ not~ defined}}% - {\csname #1\endcsname}} +\cs_new_nopar:Nn \__xpg_use_or_warn:N +{ + \cs_if_exist_use:NF {#1} + { + \xpg@warning { \tl_to_str:N {#1} ~ is~ not~ defined } + } +} +\cs_generate_variant:Nn \__xpg_use_or_warn:N {c} + %% ensure directionality if bidi is loaded, else ignore \def\@@ensure@dir#1{\ifcsundef{@ensure@dir}{#1}{\@ensure@dir{#1}}} @@ -3697,66 +3821,94 @@ to track the issues and follow progress. } } +% if #1 is LR run #2 else #3 +\prg_set_conditional:Nnn \__xpg_if_LR_str:n {p, T, F, TF} +{ + \str_case_e:nnF{#1}{ + {LR}{\prg_return_true:} + {RL}{\prg_return_false:} + } + { + \xpg@error{Unknown~ direction~#1} + \prg_return_false: + } +} +\prg_generate_conditional_variant:Nnn \__xpg_if_LR_str:n {e} {p, T, F, TF} + % (lua)bidi commands to change directionality for paragraphs % and inline text. % overwritten with correct package \cs_new_nopar:Nn{\polyglossia@setpardirection:n}{% - \str_case_e:nnTF{#1}{% - {LR}{\relax}% - {RL}{\xpg@error{right-to-left,~ but~ (lua)bidi~ package~ was~ not~ loaded!}}% - }% - {}% - {\xpg@error{Unknown~ language~ direction~ #1 ~(base~ wrapper)}}% + \__xpg_if_LR_str:nF {#1} + { + \xpg@error{right-to-left,~ but~ (lua)bidi~ package~ was~ not~ loaded!} + } } \cs_new_nopar:Nn{\polyglossia@settextdirection:n}{% - \str_case_e:nnTF{#1}{% - {LR}{\relax}% - {RL}{\xpg@error{right-to-left,~ but~ (lua)bidi~ package~ was~ not~ loaded!}}% - }% - {}% - {\xpg@error{Unknown~ language~ direction~ #1 ~(base~ wrapper)}}% + \__xpg_if_LR_str:nF {#1} + { + \xpg@error{right-to-left,~ but~ (lua)bidi~ package~ was~ not~ loaded!} + } } -\xpg@at@package{bidi}{package/after/bidi}{% +\__xpg_at_package_hook:nnn{bidi}{package/bidi/after}{% \ExplSyntaxOn% \cs_gset_nopar:Nn{\polyglossia@setpardirection:n}{% - \str_case_e:nnTF{#1}{% - {LR}{\setLR}% - {RL}{\setRL}% - }% - {}% - {\xpg@error{Unknown~ language~ direction~ #1 ~(bidi~ wrapper)}}% + \__xpg_if_LR_str:nTF{#1}% + {% + \setLR% + }% + {% + \setRL% + }% }% \cs_gset_nopar:Nn{\polyglossia@settextdirection:n}{% - \str_case_e:nnTF{#1}{% - {LR}{\LRE}% - {RL}{\RLE}% - }% - {}% - {\xpg@error{Unknown~ language~ direction~ #1 ~(bidi~ wrapper)}}% + \__xpg_if_LR_str:nTF{#1}% + {% + \LRE% + }% + {% + \RLE% + }% }% \ExplSyntaxOff% } -\xpg@at@package{luabidi}{package/after/luabidi}{% +\__xpg_at_package_hook:nnn{luabidi}{package/luabidi/after}{% \ExplSyntaxOn% \cs_gset_nopar:Nn{\polyglossia@setpardirection:n}{% - \str_case_e:nnTF{#1}{% - {LR}{\setLR}% - {RL}{\setRL}% - } - {}% - {\xpg@error{Unknown~ language~ direction~ #1 ~(luabidi~ wrapper)}}% + \__xpg_if_LR_str:nTF{#1}% + {% + \setLR% + }% + {% + \setRL% + }% }% \cs_gset_nopar:Nn{\polyglossia@settextdirection:n}{% - \str_case_e:nnTF{#1}{% - {LR}{\LRE}% - {RL}{\RLE}% - } - {}% - {\xpg@error{Unknown~ language~ direction~ #1 ~(luabidi~ wrapper)}}% + \__xpg_if_LR_str:nTF{#1}% + {% + \LRE% + }% + {% + \RLE% + }% }% \ExplSyntaxOff% } +% emulate \RTLmain +\cs_new_nopar:Nn \__xpg_setRTLmain: {} +\str_case_e:nnF{\c_sys_engine_str}{% + {luatex}{\cs_gset:Nn \__xpg_setRTLmain: {\setRTLmain}} + {xetex}{\cs_gset:Nn \__xpg_setRTLmain: {\@RTLmaintrue\setnonlatin}} +} +{ + \cs_gset:Nn \__xpg_setRTLmain: + { + \xpg@warning{You’re~ running a~ TeX~ engine~ that~ is~ not~ LuaTeX~ or~ XeTeX.\MessageBreak + That~ is~ almost~ guaranteed~ to~ cause~ problems.} + } +} + %% compatibility with babel \let\addto\gappto% gappto is defined in etoolbox @@ -3792,6 +3944,8 @@ to track the issues and follow progress. %% TODO? \toggletrue{#1@setup@done}% % reinit \do \def\do##1{\setotherlanguage{##1}}% + % register base alias + \xpg_language_alias { #1 } { #1 } } % Adjust language key setting after initial setup @@ -3804,14 +3958,14 @@ to track the issues and follow progress. % setup hyphennames from a str list of hyphen \cs_new:Nn \polyglossia_setup_hyphen:n { - \exp_args:Nne \clist_set:Nn{\l_tmpa_clist}{\prop_item:Nn \polyglossia@langsetup {#1 / hyphennames}} + \clist_set:Ne{\l_tmpa_clist}{\prop_item:Nn \polyglossia@langsetup {#1 / hyphennames}} \providebool{havehyphen} \boolfalse{havehyphen} % for each hyphen in the set until we find one that works \clist_map_inline:Nn \l_tmpa_clist { \ifbool{havehyphen}{}{% % check if language hyphenname is defined - \polyglossia@check@ifdefined:NF{#1}{% + \__xpg_check_if_exist_l@:NF{#1}{% % if not, first consider nohyphenation \str_if_eq:nnTF{##1}{nohyphenation} {% @@ -3828,7 +3982,7 @@ to track the issues and follow progress. \xpg@set@hyphenation@patterns{##1} \global\booltrue{havehyphen} }% - }{}% + }{}% }% }% }% @@ -3847,7 +4001,7 @@ to track the issues and follow progress. \polyglossia@setup@language@patterns{#1}% }% % setup hyphenmins - \exp_args:NNe \clist_set:Nn \l_tmpa_clist + \clist_set:Ne \l_tmpa_clist { \prop_item:Nn \polyglossia@langsetup {#1 / hyphenmins} } \cs_if_eq:cNF {l@#1} \l@nohyphenation { @@ -4053,7 +4207,14 @@ to track the issues and follow progress. \prop_gput:Nnn{\polyglossia@langsetup}{#1/Localnumeral}{##1} }, #1 / Localnumeral.value_required:n = true, - #1 / Localnumeral.initial:n = {polyglossia@C@localnumeral} + #1 / Localnumeral.initial:n = {polyglossia@C@localnumeral}, + % environment define command (by default create the environment) + #1 / DefineCommandsCmd + .code:n = {\prop_gput:Nnn{\polyglossia@langsetup}{#1/DefineCommandsCmd}{##1}}, + #1 / DefineCommandsCmd + .value_required:n = true, + #1 / DefineCommandsCmd + .initial:n = {xpg_define_language_commands:e} } } @@ -4297,7 +4458,10 @@ to track the issues and follow progress. } } -\AtEndDocument{\prop_log:N{\polyglossia@langsetup}} +\AtEndDocument{ + \prop_log:N{\polyglossia@langsetup} + \prop_log:N{\__xpg_alias} +} \def\xpg@lastlanguage{0}% \providebool{xpg@hyphenation@disabled}% @@ -4454,7 +4618,9 @@ to track the issues and follow progress. }% \polyglossia@addfontfeature@language:xx{\prop_item:Nn{\polyglossia@langsetup}{#1/langtag}} {\prop_item:Nn{\polyglossia@langsetup}{#1/language}} - }}% + }% + \def\familytype{rm}% + }% \csgdef{#1@font@sf}{% \cs_if_exist_use:cF{#1fontsf}% { @@ -4475,7 +4641,9 @@ to track the issues and follow progress. }% \polyglossia@addfontfeature@language:xx{\prop_item:Nn{\polyglossia@langsetup}{#1/langtag}} {\prop_item:Nn{\polyglossia@langsetup}{#1/language}} - }}% + }% + \def\familytype{sf}% + }% \csgdef{#1@font@tt}{% \cs_if_exist_use:cF{#1fonttt}% { @@ -4496,7 +4664,9 @@ to track the issues and follow progress. }% \polyglossia@addfontfeature@language:xx{\prop_item:Nn{\polyglossia@langsetup}{#1/langtag}} {\prop_item:Nn{\polyglossia@langsetup}{#1/language}} - }}% + }% + \def\familytype{tt}% + }% \endgroup } @@ -4552,21 +4722,29 @@ to track the issues and follow progress. \newXeTeXintercharclass\xpg@normalclass %TODO }{} -\ifxetex %% when no patterns are available, we use \l@nohyphenation, assigned to 255 %% (suggestion by Enrico Gregorio) - \@ifundefined{l@nohyphenation}{\chardef\l@nohyphenation=255 }{} -\else\ifluatex - \@ifundefined{l@nohyphenation}{\chardef\l@nohyphenation=\directlua{ - tex.sprint(polyglossia.newloader_loaded_languages.nohyphenation)}\relax - }{} -\fi\fi +\str_case_e:nn{\c_sys_engine_str}{ + {luatex} + { + \@ifundefined{l@nohyphenation} + {\chardef\l@nohyphenation=\directlua{ + tex.sprint(polyglossia.newloader_loaded_languages.nohyphenation)}\relax + } + {} + } + {xetex} + { + \@ifundefined{l@nohyphenation}{\chardef\l@nohyphenation=255 }{} + } +} + %we call this macro when a gloss file is not found for a given language \def\xpg@nogloss#1{% \xpg@warning{File~ gloss-#1.ldf~ does~ not~ exist!\MessageBreak I~ will~ nevertheless~ try~ to~ use~ hyphenation~ patterns~ for~ #1.}% - \PolyglossiaSetup{#1}{hyphenmins,hyphennames={#1},fontsetup=true}% + \PolyglossiaSetup{#1}{hyphenmins={2,3},hyphennames={#1},fontsetup=true}% % the above amounts to: %\ifcsundef{l@#1}% % {\expandafter\adddialect\csname l@#1\endcsname\l@nohyphenation\relax}% @@ -4583,40 +4761,105 @@ to track the issues and follow progress. \catcode`\@=\xpg@saved@at@catcode% } +%% Load a lde file +\cs_new_nopar:Nn \__xpg_gloss_ext: {lde} +\cs_new_nopar:Ne \__xpg_saved_@pkgextension: {\@pkgextension} + +\msg_new:nnn { polyglossia } { directloadgloss } +{ + You~ should~ not~ load~ directly~ the~ gloss~ file. ~ + You~ must~ use~ `\string\setotherlanguage\{#1\}' or `\string\setmainlanguage\{#1\}'. +} +\msg_redirect_name:nnn { polyglossia } { directloadgloss } { critical } +\NewDocumentCommand{\__xpg_ProvidesLanguageDefinitionExtension_error}{m m m m} +{ + \msg_critical:nn { polyglossia } { directloadgloss } +} +% ProvideExplPackage but for language file +\cs_new_eq:NN \ProvidesLanguageDefinitionExtension \__xpg_ProvidesLanguageDefinitionExtension_error +\cs_new_eq:NN \__xpg_saved_ProvidesExplPackage \ProvidesExplPackage +\NewDocumentCommand{\__xpg_ProvidesLanguageDefinitionExtension}{m m m m} +{ + \__xpg_saved_ProvidesExplPackage{#1}{#2}{#3}{#4} + \cs_gset_eq:NN \@pkgextension \__xpg_saved_@pkgextension: + \cs_gset_eq:NN \ProvidesLanguageDefinitionExtension \__xpg_ProvidesLanguageDefinitionExtension_error +} + + +% wrapper for loading a gle file +\NewDocumentCommand{\RequireLanguageDefinitionExtension}{O{} m} +{ + \cs_gset_eq:NN \__xpg_saved_@pkgextension: \@pkgextension + \cs_gset_eq:NN \__xpg_saved_ProvidesExplPackage \ProvidesExplPackage + \cs_gset_eq:NN \@pkgextension \__xpg_gloss_ext: + \cs_gset_eq:NN \ProvidesLanguageDefinitionExtension \__xpg_ProvidesLanguageDefinitionExtension + \RequirePackage[#1]{gloss-#2} + % be paranoiac restore + \cs_gset_eq:NN \@pkgextension \__xpg_saved_@pkgextension: + \cs_gset_eq:NN \__xpg_ProvidesLanguageDefinitionExtension_error \ProvideLanguageDefinitionExtension +} + % try to load a language file \cs_new:Nn \polyglossia_load_lang_definition:nn { - \file_if_exist:nTF{gloss-#2.ldf} + \file_if_exist:eTF{gloss-#2.lde} { - % Temporarily force catcode of ~ to 13 since babelsh.def - % requires it. This is needed particularly with LaTeX3 - % packages which force \ExplSyntaxOn (#425) - \protected\edef\xpg@restore@tilde@catcode{\catcode 126 = \the\catcode 126\relax} - \catcode 126 = 13 - \xpg@input{gloss-#2.ldf} + \RequireLanguageDefinitionExtension[#1]{#2} \setkeys{#2}{#1} - % restore former ~ catcode - \xpg@restore@tilde@catcode } { - \xpg@nogloss{#2} + \file_if_exist:nTF{gloss-#2.ldf} + { + % Temporarily force catcode of ~ to 13 since babelsh.def + % requires it. This is needed particularly with LaTeX3 + % packages which force \ExplSyntaxOn (#425) + \protected\edef\xpg@restore@tilde@catcode{\catcode 126 = \the\catcode 126\relax} + \catcode 126 = 13 + \xpg@input{gloss-#2.ldf} + \setkeys{#2}{#1} + % restore former ~ catcode + \xpg@restore@tilde@catcode + } + { + \xpg@nogloss{#2} + } } } +\cs_generate_variant:Nn \polyglossia_load_lang_definition:nn { + ee, ef, en, eo, ex, + fe, ff, fn, fo, fx, + ne, nf, no, nx, + oe, of, on, oo, ox, + xe, xf, xn, xo, xx +} % load a master language from an alias file \newcommand*\xpg@load@master@language[1] { - \xpg@input{gloss-#1.ldf} - \ifcsundef{#1@loaded}% - { - \exp_args:Nx\polyglossia@define@language@cmd:n{#1}% - }{} - \polyglossia@register@language:nn{}{#1}% - \csgdef{#1@loaded}{}% + \file_if_exist:eTF{gloss-#1.lde} + { + \RequireLanguageDefinitionExtension{#1} + } + { + \xpg@input{gloss-#1.ldf} + } + \seq_if_in:NxF \__xpg_langs_loaded {#1} + { + % define environment and command if not alias + \str_if_eq:eeT {\prop_item:Ne \__xpg_alias {#1/target}} {#1} { + \use:c{\prop_item:Nn{\polyglossia@langsetup} + {#1/DefineCommandsCmd}} + {#1} + } + } + \polyglossia@register@language:nn{}{#1}% + \seq_gput_right:Nn \__xpg_langs_loaded {#1} } +\prop_new:N \__xpg_alias -% define environment and command -\cs_new:Nn \polyglossia@define@language@cmd:n { - \ifcsundef{#1@alias@lang}{% +% define environment and command if not alias +\cs_new:Nn \xpg_define_language_commands:n { + \str_if_eq:eeT {\prop_item:Ne \__xpg_alias {#1/target}} {#1} + { \exp_args:Ne \newenvironment {\prop_item:Nn{\polyglossia@langsetup}{#1/envname}} [1] [] { @@ -4627,156 +4870,242 @@ to track the issues and follow progress. }% \exp_args:Nc \newcommand {text#1} [2][] {% - \xpg@textlanguage[##1]{#1}{##2}% + \__xpg_textlanguage:een{##1}{#1}{##2}% }% - }{} + } +} +\cs_generate_variant:Nn \xpg_define_language_commands:n {e} + +\AtBeginDocument{ + \prop_log:N{\__xpg_alias} } +% resolve alias property #1 lang #2 item +\cs_new:Nn \xpg_alias_prop_item:nn { + \prop_if_in:NeTF \__xpg_alias {#1/#2} + { + \prop_item:Ne \__xpg_alias {#1/#2} + } + { + \prop_if_in:NeTF \__xpg_alias {#1/target} + { + % target to self fall back to language table + \str_if_eq:eeTF { \prop_item:Ne \__xpg_alias {#1/target} } { #1 } + { + \prop_item:Nn{\polyglossia@langsetup} {#1/#2} + } + % load alias by recursion + { + \xpg_alias_prop_item:ee { \prop_item:Ne \__xpg_alias {#1/target} } {#2} + } + } + { + % empty + } + } +} +\cs_generate_variant:Nn \xpg_alias_prop_item:nn {en, ne, ee} + +% add option #2 to list of option of language #1 +\cs_new:Nn \xpg_alias_add_to_option_i:nn +{ + \tl_if_blank:eTF {#2} + { + \xpg_alias_prop_item:nn {#1}{options} + } + { + \tl_if_blank:eTF { \xpg_alias_prop_item:nn {#1}{options} } + { + #2 + } + { + \xpg_alias_prop_item:nn {#1}{options},#2 + } + } +} + + +% get base language +\cs_new:Nn \xpg_alias_base_lang:n { + \str_if_eq:eeTF { \prop_item:Ne \__xpg_alias {#1/target} } { #1 } + { + #1 + } + { + \xpg_alias_base_lang:n { \prop_item:Ne \__xpg_alias {#1/target} } + } +} +\cs_generate_variant:Nn \xpg_alias_base_lang:n {e} + +\keys_define:nn { polyglossia/alias } +{ + % babelname\l_tmpa_prop + babelname .prop_put:N = \__xpg_language_alias_prop, + % bcp47 + bcp47 .prop_put:N = \__xpg_language_alias_prop, + % variant + variant .prop_put:N = \__xpg_language_alias_prop, +} + + + +% provide way to define alias environment and command +% #1 () variant +% #2 [] option (not yet without variant and bcp47 name) +% #3 language +% #4 () babel name +% #5 [] bcp47 name +% #6 alias +\DeclareDocumentCommand \xpg_language_alias { D(){} O{} m D(){} O{} m} +{ + \prop_gremove:Nn \__xpg_alias {#6/target} + \prop_gremove:Nn \__xpg_alias {#6/options} + \prop_gremove:Nn \__xpg_alias {#6/bcp47} + \prop_gremove:Nn \__xpg_alias {#6/babelname} + \prop_gremove:Nn \__xpg_alias {#6/variant} + \prop_gput:Nee \__xpg_alias {#6/target} {#3} + \tl_if_blank:eF {#1} + { + \prop_gput:Nee \__xpg_alias {#6/variant} {#1} + } + \tl_if_blank:eF {#5} + { + \prop_gput:Nee \__xpg_alias {#6/bcp47} {#5} + } + \tl_if_blank:eF {#4} + { + \prop_gput:Nee \__xpg_alias {#6/babelname} {#1} + } + \tl_if_blank:eF {#2} + { + \prop_gput:Nee \__xpg_alias {#6/options} {#2} + } +} + + % provide way to define alias environment and command % \setlanguagealias[<options>]{<language>}{<alias>} \DeclareDocumentCommand \setlanguagealias {s O{} m m} { % The starred version does not define commands and environments \IfBooleanF {#1} + { + \exp_args:Nc \providecommand {text#4} [2][] {} + \exp_args:Nc \renewcommand {text#4} [2][] { - \ifcsundef{#4@alias@lang}{% - \exp_args:Ne - \newenvironment {#4} - { - \begin{otherlanguage}[#2]{#3} - }% - { - \end{otherlanguage} - }% - \exp_args:Nc \newcommand {text#4} [2][] - {% - \xpg@textlanguage[#2,##1]{#3}{##2}% - }% - }{% - \exp_args:Ne - \renewenvironment {#4} - { - \begin{otherlanguage}[#2]{#3} - }% - { - \end{otherlanguage} - }% - \exp_args:Nc \renewcommand {text#4} [2][] - {% - \xpg@textlanguage[#2,##1]{#3}{##2}% - }% - }% + \__xpg_textlanguage:een{##1}{#4}{##2} + } + \exp_args:Nc \providecommand {#4} {} + \exp_args:Ne \renewenvironment {#4} + { + \begin{otherlanguage}{#4} + } + { + \end{otherlanguage} + } }% - \csgdef{#4@alias@lang}{#3}% - \tl_if_blank:nF {#2} {\csgdef{#4@alias@opts}{#2}}% + \tl_clear_new:N \__xpg_alias_option_tl + \prop_clear_new:N \__xpg_language_alias_prop + \keys_set_known:nnN{polyglossia/alias} {#2} \__xpg_alias_option_tl + \xpg_language_alias + (\prop_item:Nn \__xpg_language_alias_prop {variant}) + % TODO not yet [\__xpg_alias_option_tl] + [#2] + {#3} + (\prop_item:Nn \__xpg_language_alias_prop {babelname}) + [\prop_item:Nn \__xpg_language_alias_prop {bcp47}] + {#4} } \cs_new:Nn \polyglossia@register@language:nn { - % register polyglossia language name - \ifcsundef{#2@registered}{% - \global\edef\xpg@loaded{% - \ifx\xpg@loaded\@empty\else\xpg@loaded,\fi #2% - }% - }{} - \csgdef{#2@registered}{}% - \tl_if_blank:nF {#1}{% - % Register the language options - \polyglossia@set@lang@options:nn {#2} {#1}% - }% - % register babelname - \def\xpg@tmp@babelname{\prop_item:Nn{\polyglossia@langsetup}{#2/babelname}}% - \ifcsundef{\csname xpg@tmp@babelname\endcsname @bbl@registered}{% - \global\edef\xpg@bloaded{% - \ifx\xpg@bloaded\@empty\else\xpg@bloaded,\fi\xpg@tmp@babelname}% - }{}% - \csgdef{\csname xpg@tmp@babelname\endcsname @bbl@registered}{}% - % register BCP-47 ID - \def\xpg@tmp@bcpname{\prop_item:Nn{\polyglossia@langsetup}{#2/bcp47}}% - \ifcsundef{\csname xpg@tmp@bcpname\endcsname @bcp@registered}{% - \global\edef\xpg@bcp@loaded{% - \ifx\xpg@bcp@loaded\@empty\else\xpg@bcp@loaded,\fi\xpg@tmp@bcpname}% - }{}% - \csgdef{\csname xpg@tmp@bcpname\endcsname @bcp@registered}{}% + \clist_if_in:NeF \xpg@loaded {#2}{ + \clist_gput_right:Ne \xpg@loaded {#2} + } + % Register the language options + \polyglossia@set@lang@options:nnn {#2} {#1} {@xpg@set@langvariant} + % register babelname + \prop_get:NeN \polyglossia@langsetup {#2/babelname} \l_tmpa_tl + \clist_if_in:NeF \xpg@bloaded {\l_tmpa_tl}{ + \clist_gput_right:Ne \xpg@bloaded {\l_tmpa_tl} + } + % register BCP-47 ID + \prop_get:NeN \polyglossia@langsetup {#2/bcp47} \l_tmpa_tl + \clist_if_in:NeF \xpg@bcp@loaded {\l_tmpa_tl}{ + \clist_gput_right:Ne \xpg@bcp@loaded {\l_tmpa_tl} + } } - \newcommand{\setdefaultlanguage}[2][]{% % latex is an internal language, so do not record - \ifstrequal{#2}{latex}{}{% - % register polyglossia language name - \ifcsundef{#2@registered}{% - \global\edef\xpg@loaded{% - \ifx\xpg@loaded\@empty\else\xpg@loaded,\fi #2% - }% - }{}% - \csgdef{#2@registered}{}% - }% - \ifcsundef{#2@loaded}% + \str_if_eq:eeF{#2}{latex} { - \polyglossia_load_lang_definition:nn{#1}{#2} - % define environment and command (except for internal latex language) - \ifstrequal{#2}{latex}{}{% - \exp_args:Nx\polyglossia@define@language@cmd:n{#2} - }% - \csgdef{#2@loaded}{}% + \clist_if_in:NeF \xpg@loaded {\xpg_alias_base_lang:n{##2}}{ + \clist_gput_right:Ne \xpg@loaded {\xpg_alias_base_lang:n{##2}} + } } + \seq_if_in:NxF \__xpg_langs_loaded {#2} { - \relax + \polyglossia_load_lang_definition:nn{#1}{#2} + % define environment and command if not alias + \str_if_eq:eeT {\prop_item:Ne \__xpg_alias {#2/target}} {#2} { + \use:c{\prop_item:Nn{\polyglossia@langsetup} + {#2/DefineCommandsCmd}} + {#2} + } + \seq_gput_right:Nn \__xpg_langs_loaded {#2} } - \ifcsdef{#2@alias@lang}{% - \ifcsdef{#2@alias@opts}{% - \exp_args:Nxx \polyglossia_load_lang_definition:nn {\csuse{#2@alias@opts},#1} {\csuse{#2@alias@lang}}% - \exp_args:Nxx \polyglossia@set@default@language:nn {\csuse{#2@alias@opts},#1} {\csuse{#2@alias@lang}}% - }{% - \polyglossia@set@default@language:nn {#1} {\csuse{#2@alias@lang}}% - }% - }{% - \polyglossia@set@default@language:nn {#1} {#2}% - }% + \polyglossia@set@default@language:ee {\xpg_alias_add_to_option_i:nn{#2}{#1}} + {\xpg_alias_base_lang:n{#2}}% } + \cs_new:Nn \polyglossia@set@default@language:nn { \gdef\xpg@main@language{#2}% - \tl_if_blank:nTF {#1}{\gdef\mainlanguagevariant{}}{% + \tl_if_blank:nTF {#1} + { + \cs_gset_nopar:Npn \mainlanguagevariant {} + } + {% % Register the language options - \polyglossia@set@lang@options:nn {#2} {#1}% + \polyglossia@set@lang@options:nnn {#2} {#1} {@xpg@main@langvariant}% }% \csgdef{#2@gvar}{\mainlanguagevariant}% %% The following settings are for the default language and script % this tells bidi.sty or luabidi.sty that the document is RTL - \str_if_eq:eeTF{\prop_item:Nn{\polyglossia@langsetup}{#2/direction}}{RL}{% - \str_case_e:nnF{\c_sys_engine_str}{% - {luatex}{\setRTLmain} - {xetex}{\@RTLmaintrue\setnonlatin} - }{}% - }{}% + \__xpg_if_LR_str:eF{\prop_item:Nn{\polyglossia@langsetup}{#2/direction}} + { + \__xpg_setRTLmain: + } \cs_gset_nopar:Nn \polyglossia@AtBeginDocument@selectlanguage: { \selectbackgroundlanguage{#2} \selectlanguage[#1]{#2}% } \xpg@info{Default~ language~ is~ #2}% \polyglossia@set@language@name[#1]{#2}% - \def\mainlanguagename{#2} + + \cs_gset_nopar:Npn \mainlanguagename {#2} % Store babelname of main language (for external packages such as biblatex) - \prop_get:NxNT \polyglossia@langsetup {#2/babelname} \l_tmpa_tl - { \edef\mainbabelname{\l_tmpa_tl} } + \cs_gset_nopar:Npe \mainbabelname { \prop_item:Nn \polyglossia@langsetup {#2/babelname} } % Store babelname of current language (for external packages such as biblatex) - \prop_get:NxNT \polyglossia@langsetup {#2/babelname} \l_tmpa_tl - { \edef\babelname{\l_tmpa_tl}% - \cs_gset_eq:cc{#2@gbabelname}{babelname}% - } + \cs_gset_eq:NN \babelname \mainbabelname + \cs_gset_eq:cc{#2@gbabelname}{babelname}% % Store BCP-47 id of main language - \prop_get:NxNT \polyglossia@langsetup {#2/bcp47} \l_tmpa_tl - { \csedef{mainbcp47id}{\l_tmpa_tl} } - % Store BCP-47 id of current language - \prop_get:NxNT \polyglossia@langsetup {#2/bcp47} \l_tmpa_tl - { \csedef{bcp47id}{\l_tmpa_tl}% - \cs_gset_eq:cc{#2@gbcp47id}{bcp47id}% - } - \ifluatex % - \directlua{polyglossia.set_default_language('\luatexluaescapestring{\string#2}')}% - \fi % + \cs_gset_nopar:cpe {mainbcp47id} { \prop_item:Nn \polyglossia@langsetup {#2/bcp47} } + \cs_gset_eq:cc {bcp47id} {mainbcp47id} + \cs_gset_eq:cc{#2@gbcp47id}{bcp47id} + + \sys_if_engine_luatex:T + { + \directlua{polyglossia.set_default_language('\luatexluaescapestring{\string#2}')}% + } +} +\cs_generate_variant:Nn\polyglossia@set@default@language:nn { + ee, ef, en, eo, ex, + fe, ff, fn, fo, fx, + ne, nf, no, nx, + oe, of, on, oo, ox, + xe, xf, xn, xo, xx } \let\setmainlanguage=\setdefaultlanguage @@ -4785,12 +5114,11 @@ to track the issues and follow progress. % Currently supported: bcp-47 \DeclareDocumentCommand \languageid {m} { - \str_case:nnTF {#1} + \str_case:nnF {#1} { {bcp-47} { \csuse{bcp47id} } {bcp47} { \csuse{bcp47id} } } - {} { \xpg@error{Invalid~ \string\languageid\space argument:~ #1} } @@ -4800,25 +5128,26 @@ to track the issues and follow progress. % Currently supported: bcp-47 \DeclareDocumentCommand \mainlanguageid {m} { - \str_case:nnTF {#1} + \str_case:nnF {#1} { {bcp-47} { \csuse{mainbcp47id} } {bcp47} { \csuse{mainbcp47id} } } - {} { \xpg@error{Invalid~ \string\mainlanguageid\space argument:~ #1} } } - -\def\mainbabelname{}% -\def\mainlanguagevariant{}% +% main babel name +\cs_new_nopar:Npn \mainlanguagename {} +\cs_new_nopar:Npn \mainbabelname {} +\cs_new_nopar:cpn {mainbcp47id} {} +\cs_new_nopar:Npn \mainlanguagevariant {}% % Store main language variant for external packages \define@key{xpg@main@langvariant}{variant}{% - \gdef\mainlanguagevariant{#1}% + \cs_gset_nopar:Npn \mainlanguagevariant {#1}% } -\def\babelname{}% +\cs_new_nopar:Npn \babelname {} \def\languagevariant{}% % Store current language variant for external packages \define@key{xpg@set@langvariant}{variant}{% @@ -4831,21 +5160,16 @@ to track the issues and follow progress. \ifcsundef{#2@gvar}{\def\languagevariant{}}{\def\languagevariant{\csuse{#2@gvar}}} }{% % Register the language options - \polyglossia@set@lang@options:nn {#2} {#1}% + \polyglossia@set@lang@options:nnn {#2} {#1} {@xpg@set@langvariant}% + \cs_set_eq:cc{#2@gvar}{languagevariant}% }% } \newcommand*{\resetdefaultlanguage}[2][]{% - \ifcsdef{#2@alias@lang}{% - \ifcsdef{#2@alias@opts}{% - \exp_args:Nxx \polyglossia@reset@default@language:nn {\csuse{#2@alias@opts},#1} {\csuse{#2@alias@lang}}% - }{% - polyglossia@reset@default@language:nn {#1} {\csuse{#2@alias@lang}}% - }% - }{% - polyglossia@reset@default@language:nn {#1} {#2}% - }% + \polyglossia@reset@default@language:nn + {\xpg_alias_add_to_option_i:nn{#2}{#1}} + {\xpg_alias_base_lang:n{#2}}% } \cs_new:Nn \polyglossia@reset@default@language:nn @@ -4859,7 +5183,10 @@ to track the issues and follow progress. \cs_if_exist_use:c{noextras@bbl@\mainbabelname}% \csuse{init@noextras@\xpg@main@language}% \polyglossia@set@language@name[#1]{#2}% - \str_if_eq:eeTF{\prop_item:Nn{\polyglossia@langsetup}{#2/direction}}{RL}{\@rlmaintrue\@rl@footnotetrue}{}% + \__xpg_if_LR_str:eF{\prop_item:Ne{\polyglossia@langsetup}{#2/direction}} + { + \@rlmaintrue\@rl@footnotetrue + } \selectlanguage[#1]{#2}% \selectbackgroundlanguage{#2}% % Store babelname of current language (for external packages such as biblatex) @@ -4883,6 +5210,13 @@ to track the issues and follow progress. \csedef{bcp47id}{\prop_item:Nn{\polyglossia@langsetup}{#2/bcp47}}% }% } +\cs_generate_variant:Nn \polyglossia@reset@default@language:nn { + ee, ef, en, eo, ex, + fe, ff, fn, fo, fx, + ne, nf, no, nx, + oe, of, on, oo, ox, + xe, xf, xn, xo, xx +} % This saves the normalfont for the latin script since we may change normalfont in other scripts \let\normalfontlatin=\normalfont% @@ -4964,15 +5298,18 @@ to track the issues and follow progress. \def\xpg@select@fontfamily#1{% \def\tmp@tt{tt}\def\tmp@sf{sf}% \ifx\familytype\tmp@tt - \csuse@warn{#1@font@tt}% + \__xpg_use_or_warn:c{#1@font@tt}% \else\ifx\familytype\tmp@sf - \csuse@warn{#1@font@sf}% - \else\csuse@warn{#1@font@rm}\fi\fi} + \__xpg_use_or_warn:c{#1@font@sf}% + \else\__xpg_use_or_warn:c{#1@font@rm}\fi\fi} \def\xpg@set@normalfont#1{% - \DeclareRobustCommand\rmfamily{\csuse{#1@font@rm}}% - \DeclareRobustCommand\sffamily{\csuse{#1@font@sf}}% - \DeclareRobustCommand\ttfamily{\csuse{#1@font@tt}}% + \letcs{\rmfamily}{#1@font@rm}% + \letcs{\sffamily}{#1@font@sf}% + \letcs{\ttfamily}{#1@font@tt}% + \robustify\rmfamily% + \robustify\sffamily% + \robustify\ttfamily% \gdef\normalfont{\protect\xpg@select@fontfamily{#1}% \fontseries{\seriesdefault}\selectfont% \fontshape{\shapedefault} @@ -4991,14 +5328,10 @@ to track the issues and follow progress. \@afterindentfalse% } -\newcommand*{\selectbackgroundlanguage}[1]{% - \ifcsdef{#1@alias@lang}{% - \polyglossia@select@background@language:n {\csuse{#1@alias@lang}}% - }{% - \polyglossia@select@background@language:n {#1}% - }% +\cs_new_nopar:Npn \selectbackgroundlanguage #1 +{% + \polyglossia@select@background@language:n {\xpg_alias_base_lang:n{#1}} } - \cs_new:Nn \polyglossia@select@background@language:n { \str_if_eq:eeTF{\prop_item:Nn{\polyglossia@langsetup}{#1/lcscript}}{latin} @@ -5006,26 +5339,23 @@ to track the issues and follow progress. {\xpg@set@normalfont{#1}}% \csuse{#1@globalnumbers}% } - -\newcommand{\setotherlanguage}[2][]{% - \ifcsundef{#2@loaded} +\cs_generate_variant:Nn \polyglossia@select@background@language:n {e} +% Declare secondary language #2 with language options #1 +\DeclareDocumentCommand \setotherlanguage { O{} m } +{ + \seq_if_in:NxF \__xpg_langs_loaded {#2} { - \polyglossia_load_lang_definition:nn{#1}{#2} - % define environment and command - \exp_args:Nx\polyglossia@define@language@cmd:n{#2} - \ifcsdef{#2@alias@lang}{% - \ifcsdef{#2@alias@opts}{% - \exp_args:Nxx \polyglossia_load_lang_definition:nn {\csuse{#2@alias@opts},#1} {\csuse{#2@alias@lang}}% - \exp_args:Nxx \polyglossia@set@other@language:nn {\csuse{#2@alias@opts},#1} {\csuse{#2@alias@lang}}% - }{% - \polyglossia@set@other@language:nn {#1} {\csuse{#2@alias@lang}}% - }% - }{% - \polyglossia@set@other@language:nn {#1} {#2}% - }% - \csgdef{#2@loaded}{}% + \polyglossia_load_lang_definition:ee {#1} {#2}% + % define environment and command if not alias + \str_if_eq:eeT {\prop_item:Ne \__xpg_alias {#2/target}} {#2} { + \use:c{\prop_item:Nn{\polyglossia@langsetup} + {#2/DefineCommandsCmd}} + {#2} + } + \polyglossia@set@other@language:ee {\xpg_alias_add_to_option_i:nn{#2}{#1}} + {\xpg_alias_base_lang:n{#2}}% + \seq_gput_right:Nn \__xpg_langs_loaded {#2} } - {} } \cs_new:Nn \polyglossia@set@other@language:nn @@ -5033,15 +5363,22 @@ to track the issues and follow progress. \polyglossia@register@language:nn{#1}{#2}% % If a variant is set, store it. \gdef\otherlanguagevariant{} - \tl_if_blank:nTF {#1}{}{% - % Register the language options - \polyglossia@set@lang@options:nn {#2} {#1}% - }% + % Register the language options + \polyglossia@set@lang@options:nnn {#2} {#1} {@xpg@other@langvariant}% + \csgdef{#2@gvar}{\otherlanguagevariant}% \prop_get:NxNT \polyglossia@langsetup {#2/babelname} \l_tmpa_tl { \xdef\otherlanguagebabelname{\l_tmpa_tl} } \cs_gset_eq:cc{#2@gbabelname}{otherlanguagebabelname}% } +\cs_generate_variant:Nn \polyglossia@set@other@language:nn { + ee, ef, en, eo, ex, + fe, ff, fn, fo, fx, + ne, nf, no, nx, + oe, of, on, oo, ox, + xe, xf, xn, xo, xx +} + % Store main language variant for external packages \define@key{xpg@other@langvariant}{variant}{% @@ -5071,15 +5408,7 @@ to track the issues and follow progress. % where \text<alias> would cause clashes % (e.g., \textit) \newcommand\textlang[3][]{% - \ifcsdef{#2@alias@lang}{% - \ifcsdef{#2@alias@opts}{% - \exp_args:Nxx \xpg@textlanguage[\csuse{#2@alias@opts},#1]{\csuse{#2@alias@lang}}{#3}% - }{% - \xpg@textlanguage[#1]{\csuse{#2@alias@lang}}{#3}% - }% - }{% - \xpg@textlanguage[#1]{#2}{#3}% - }% + \__xpg_textlanguage:een {#1} {#2} {#3} }% % Alias to {<lang>}, but more suitable @@ -5122,6 +5451,8 @@ to track the issues and follow progress. % joint code of \foreignlanguage, otherlanguage* % and \text<lang> +% #1 option +% #2 language \newcommand{\xpg@otherlanguage}[2][] {% \polyglossia@error@iflangnotloaded:n{#2} @@ -5137,66 +5468,90 @@ to track the issues and follow progress. } \renewcommand{\foreignlanguage}[3][] -{% - \ifcsdef{#2@alias@lang}{% - \ifcsdef{#2@alias@opts}{% - \exp_args:Nxx \polyglossia@foreignlanguage:nnn {\csuse{#2@alias@opts},#1} {\csuse{#2@alias@lang}} {#3}% - }{% - \polyglossia@foreignlanguage:nnn {#1} {\csuse{#2@alias@lang}} {#3}% - }% - }{% - \polyglossia@foreignlanguage:nnn {#1} {#2} {#3}% - }% +{ + \__xpg_foreignlanguage:eeen {#1} {#2} {\xpg_alias_base_lang:n{#2}} {#3} } -\cs_new:Nn \polyglossia@foreignlanguage:nnn +% internal wrapper for foreing language +% #1 option +% #2 alias +% #3 base lang +% #3 text +\cs_new:Nn \__xpg_foreignlanguage:nnnn { - \polyglossia@error@iflangnotloaded:n{#2} - \bgroup - \xpg@otherlanguage[#1]{#2}% - \polyglossia@lang@settextdirection:nn{#2}{#3}% - \egroup + \tl_if_blank:nT {#3} + { + \msg_show:nnn { polyglossia } { languagenotloaded } {#2} + } + \group_begin: + \xpg@otherlanguage[\xpg_alias_add_to_option_i:nn{#2}{#1}]{#4}% + \polyglossia@lang@settextdirection:nn{#3}{#4}% + \group_end: } +\cs_generate_variant:Nn \__xpg_foreignlanguage:nnn {een} + % otherlanguage* is the environment equivalent of \foreignlanguage \expandafter\providecommand\csname otherlanguage*\endcsname{} \renewenvironment{otherlanguage*}[2][] {% - \ifcsdef{#2@alias@lang}{% - \ifcsdef{#2@alias@opts}{% - \exp_args:Nxx \polyglossia@otherlanguage:nn {\csuse{#2@alias@opts},#1} {\csuse{#2@alias@lang}}% - }{% - \polyglossia@otherlanguage:nn {#1} {\csuse{#2@alias@lang}}% - }% - }{% - \polyglossia@otherlanguage:nn {#1} {#2}% - }% + \__xpg_otherlanguage:eee {#1} {#2} {\xpg_alias_base_lang:n{#2}} } -{\egroup} +{\group_end:} -\cs_new:Nn \polyglossia@otherlanguage:nn +% internal wrapper +% #1 option +% #2 alias +% #3 base lang +\cs_new:Nn \__xpg_otherlanguage:nnn { - \xpg@otherlanguage[#1]{#2}% - \polyglossia@lang@settextdirection:nn{#2}\bgroup% + \tl_if_blank:nT {#3} + { + \msg_show:nnn { polyglossia } { languagenotloaded } {#2} + } + \xpg@otherlanguage[\xpg_alias_add_to_option_i:nn{#2}{#1}]{#3}% + \polyglossia@lang@settextdirection:nn{#3}\group_begin:% +} +\cs_generate_variant:Nn \__xpg_otherlanguage:nnn { + eee } % use by \text<lang> and \textlang. Equivalent to \foreignlanguage, % except that dates are localized. -\newcommand\xpg@textlanguage[3][]{% - \polyglossia@error@iflangnotloaded:n{#2} - \bgroup - \xpg@otherlanguage[#1]{#2}% - \csuse{date#2}% - % This is a hook for external packages which want to access variants - % via babelname (such as biblatex) - \cs_if_exist_use:c{date@bbl@\babelname}% - \polyglossia@lang@settextdirection:nn{#2}{#3}% - \egroup - % Reset the language's/script's font families - \str_if_eq:eeTF{\prop_item:Nn{\polyglossia@langsetup}{#2/lcscript}}{latin}{}{\resetfontlatin}% +% #1: option +% #2: alias +% #3: text +\cs_new:Nn \__xpg_textlanguage:nnn +{ + \__xpg_textlanguage:nnen {#1} {#2} {\xpg_alias_base_lang:n{#2}} {#3} } +\cs_generate_variant:Nn \__xpg_textlanguage:nnn {een} +% use by \text<lang> and \textlang. Equivalent to \foreignlanguage, +% except that dates are localized. +% #1: option +% #2: alias +% #3: base language +% #4: text +\cs_new:Nn \__xpg_textlanguage:nnnn +{ + \tl_if_blank:nT {#3} + { + \msg_show:nnn { polyglossia } { languagenotloaded } {#2} + } + \group_begin: + \xpg@otherlanguage[#1]{#3}% + \csuse{date#3}% + % This is a hook for external packages which want to access variants + % via babelname (such as biblatex) + \cs_if_exist_use:c{date@bbl@\babelname}% + \polyglossia@lang@settextdirection:nn{#3}{#4}% + \group_end: + % Reset the language's/script's font families + \str_if_eq:eeTF{\prop_item:Nn{\polyglossia@langsetup}{#3/lcscript}}{latin}{}{\resetfontlatin}% +} +\cs_generate_variant:Nn \__xpg_textlanguage:nnnn {nnen} % Define language-specific hyphenation exceptions \newcommand\pghyphenation[3][]{ @@ -5219,58 +5574,59 @@ to track the issues and follow progress. \let\emp@langname\@undefined} \DeclareDocumentCommand \selectlanguage {s O{} m} -{% - \ifcsdef{#3@alias@lang}{% - \ifcsdef{#3@alias@opts}{% - \exp_args:Nxx \polyglossia@select@language:nnn {#1} {\csuse{#3@alias@opts},#2} {\csuse{#3@alias@lang}}% - }{% - \polyglossia@select@language:nnn {#1} {#2} {\csuse{#3@alias@lang}}% - }% - }{% - \polyglossia@error@iflangnotloaded:n{#3}% - \polyglossia@select@language:nnn {#1} {#2} {#3}% - } +{ + \__xpg_msg_if_lang_not_loaded:n {#3} + \polyglossia@select@language:nee {#1} + {\xpg_alias_add_to_option_i:nn{#3}{#2}} + {\xpg_alias_base_lang:n{#3}} } \cs_new:Nn \polyglossia@select@language:nnn { \IfBooleanF {#1} - { - \cs_set_nopar:Npx \xpg@pop@language { \exp_not:N \xpg@pop@language@i {#2} {#3} } - \group_insert_after:N \xpg@pop@language - } - \tl_if_blank:nTF {#2}{}{% - % Register the language options - \polyglossia@set@lang@options:nn {#3} {#2}% - }% - % The starred variant does not write to the aux - \IfBooleanTF#1{% - \xpg@set@language@nonaux[#2]{#3}% - }{% - \xpg@set@language@aux[#2]{#3}% - }% - \ifluatex% - \directlua{polyglossia.select_language('\luatexluaescapestring{\string#3}', - \the\csname l@#3\endcsname)}% - \fi% + { + \cs_set_nopar:Npx \xpg@pop@language { \exp_not:N \xpg@pop@language@i {#2} {#3} } + \group_insert_after:N \xpg@pop@language + } + % Register the language options + \polyglossia@set@lang@options:nnn {#3} {#2} {@xpg@set@langvariant}% + % The starred variant does not write to the aux + \IfBooleanTF#1{% + \xpg@set@language@nonaux[#2]{#3}% + } + {% + \xpg@set@language@aux[#2]{#3}% + }% + \sys_if_engine_luatex:T + { + \directlua{polyglossia.select_language('\luatexluaescapestring{\string#3}', + \the\csname l@#3\endcsname)}% + } \polyglossia@register@language:nn{#2}{#3}% } +\cs_generate_variant:Nn \polyglossia@select@language:nnn { + nee, nne +} -\cs_new:Nn \polyglossia@set@lang@options:nn -{ +% set lang option #2 for lang #1 +\cs_new:Nn \polyglossia@set@lang@options:nnn +{ + \tl_if_blank:nF {#2} + { % If the optional argument sets a value for the key “variant”, copy it to xpg@langvariant \clist_map_inline:nn { #2 } {% - \xpg@parsevariantkeyvalue##1=@xpg@langvariant:#1\relax + \xpg@parsevariantkeyvalue##1=#3:#1\relax }% \exp_args:Nne \setkeys{#1}{#2}% + } } % Initialize default language options, so that % \iflanguageoption has the info it needs also % for default settings \newcommand*\xpg@initialize@gloss@options[2]{% - \polyglossia@set@lang@options:nn {#1} {#2}% + \polyglossia@set@lang@options:nnn {#1} {#2} {@xpg@set@langvariant}% } % Record synonymous keyvals such as variant=us and variant=american @@ -5320,16 +5676,16 @@ to track the issues and follow progress. { \prop_get:cnNTF {xpg@current@options@#1} {#2} \l_tmpa_tl { - \exp_args:Nee \str_if_eq:NNTF{\l_tmpa_tl}{#3} + \str_if_eq:eeTF{\l_tmpa_tl}{#3} {\prg_return_true:} { \prop_get:cnNTF {xpg@alias@keyvals@#1@#3} {#2} \l_tmpb_tl { - \exp_args:Nne \clist_set:Nn{\l_tmpa_clist}{\l_tmpb_tl} + \clist_set:Ne{\l_tmpa_clist}{\l_tmpb_tl} \providetoggle{xpgvalfound} \togglefalse{xpgvalfound} \clist_map_inline:Nn \l_tmpa_clist { - \exp_args:Nee \str_if_eq:NNT{##1}{\l_tmpa_tl} + \str_if_eq:eeT{##1}{\l_tmpa_tl} { \toggletrue{xpgvalfound} } } \iftoggle{xpgvalfound}{\prg_return_true:}{\prg_return_false:} @@ -5352,39 +5708,39 @@ to track the issues and follow progress. % Append any variant to csv list of variants \define@key{xpg@langvariant}{variant}{% - \edef\xpg@vloaded{#1\ifx\xpg@vloaded\@empty\else,\xpg@vloaded\fi}% -} - -\prg_set_conditional:Npnn \polyglossia@check@if@lang@loaded:N #1 { p , T , F , TF }{ - \cs_if_exist:cTF{#1}{ - \prg_return_true: - }{ - \prg_return_false: + \clist_if_in:NeF \xpg@vloaded {#1}{ + \clist_gput_right:Ne \xpg@vloaded {#1} } } % Test if language is loaded \newcommand*\iflanguageloaded[3]{% - \polyglossia@check@if@lang@loaded:NTF{#1@loaded}{#2}{#3}% + \AddToHook{begindocument/end}{% + \clist_if_in:NeTF \xpg@loaded{#1}{#2}{#3}% + }% } % Same for babellanguage is loaded \newcommand*\ifbabellanguageloaded[3]{% - \polyglossia@check@if@lang@loaded:NTF{#1@bbl@loaded}{#2}{#3}% + \AddToHook{begindocument/end}{% + \clist_if_in:NeTF \xpg@bloaded{#1}{#2}{#3}% + }% } % Same for languageid \DeclareDocumentCommand \iflanguageidloaded {mmmm} { + \AddToHook{begindocument/end}{% \str_case:nnTF {#1} { - {bcp-47} { \polyglossia@check@if@lang@loaded:NTF{#2@bcp@loaded}{#3}{#4} } - {bcp47} { \polyglossia@check@if@lang@loaded:NTF{#2@bcp@loaded}{#3}{#4} } + {bcp-47} { \clist_if_in:NeTF \xpg@bcp@loaded{#2}{#3}{#4} } + {bcp47} { \clist_if_in:NeTF \xpg@bcp@loaded{#2}{#3}{#4} } } {} { \xpg@error{Invalid~ \string\iflanguageidloaded\space argument:~ #1} } + }% } % Check if the current font has a given glyph @@ -5403,8 +5759,10 @@ to track the issues and follow progress. } } { - \xpg@warning{You’re running a TeX engine that is not LuaTeX or XeTeX.\MessageBreak - That is almost guaranteed to cause problems.} + \xpg@warning{You’re ~ running ~ a ~ TeX engine ~ that ~ is ~ + not ~ LuaTeX ~ or ~ XeTeX.\MessageBreak + That~ is~ almost~ guaranteed~ to~ cause~ problems.} + \prg_return_false: } } @@ -5446,6 +5804,11 @@ to track the issues and follow progress. }% \@select@language[#1]{#2}% % Write to the aux + \xpg@set@language@only@aux[#1]{#2}% +} + +\newcommand*{\xpg@set@language@only@aux}[2][]{% + % Write to the aux \if@filesw% \ifx#1\\\\% \protected@write\@auxout{}{\protect\selectlanguage*{#2}}% @@ -5477,45 +5840,8 @@ to track the issues and follow progress. }{}% } -% Open a group in the aux file. This is to keep -% nested language options local (see #320). -% In bidi tables, the opening/closing needs to be swapped (see #354) -\newcommand*{\xpg@set@group@aux}{% - \if@filesw% - \ifbool{xpg@inbiditable}{% - \protected@write\@auxout{}{\egroup}% - \addtocontents{toc}{\egroup}% - \addtocontents{lof}{\egroup}% - \addtocontents{lot}{\egroup}% - }{% - \protected@write\@auxout{}{\bgroup}% - \addtocontents{toc}{\bgroup}% - \addtocontents{lof}{\bgroup}% - \addtocontents{lot}{\bgroup}% - }% - \fi -} - -% Close the group in the aux file. -% In bidi RTL tables, the opening/closing needs -% to be swapped (see #354). -\newcommand*{\xpg@unset@group@aux}{% - \if@filesw% - \ifbool{xpg@inbiditable}{% - \protected@write\@auxout{}{\bgroup}% - \addtocontents{toc}{\bgroup}% - \addtocontents{lof}{\bgroup}% - \addtocontents{lot}{\bgroup}% - }{% - \protected@write\@auxout{}{\egroup}% - \addtocontents{toc}{\egroup}% - \addtocontents{lof}{\egroup}% - \addtocontents{lot}{\egroup}% - }% - \fi -} - -\prg_set_conditional:Npnn \polyglossia@check@ifdefined:N #1 { p , T , F , TF }{ +% check if language is defined +\prg_set_conditional:Npnn \__xpg_check_if_exist_l@:N #1 { p , T , F , TF }{ \cs_if_exist:cTF {l@#1} { \cs_if_eq:cNTF {l@#1} \l@nohyphenation @@ -5537,48 +5863,54 @@ to track the issues and follow progress. \def\polyglossia@luatex@load@lang#1{% % if \l@#1 is not properly defined, call lua function newloader(#1), % and assign the returned number to \l@#1 - \polyglossia@check@ifdefined:NF {#1} - { - \expandafter\chardef\csname l@#1\endcsname= - \directlua{ tex.sprint(polyglossia.newloader'#1') }\relax - } + \__xpg_check_if_exist_l@:NF {#1} + { + \expandafter\chardef\csname l@#1\endcsname= + \directlua{ tex.sprint(polyglossia.newloader'#1') }\relax + } } % This check is also used by biblatex, so don't % rename silently. \newcommand\xpg@ifdefined[3]{% - % With luatex, we first need to define \l@#1. - \ifluatex - \polyglossia@luatex@load@lang{#1}% - \fi - \polyglossia@check@ifdefined:NTF{#1}{#2}{#3}% + % With luatex, we first need to define \l@#1. + \sys_if_engine_luatex:T + { + \polyglossia@luatex@load@lang{#1}% + } + \__xpg_check_if_exist_l@:NTF{#1}{#2}{#3}% }% % Set \bbl@hyphendata@\the\language, which is (lua)babel's % hyphenation pattern hook % FIXME Clarifiy why/when this is needed. \newcommand*\xpg@set@bbl@hyphendata[1]{% - \ifluatex% - \ifcsdef{bbl@hyphendata@#1}{}{% - \global\@namedef{bbl@hyphendata@\the\language}{}% - }% - \fi% + \sys_if_engine_luatex:T + { + \ifcsdef{bbl@hyphendata@#1}{}{% + \global\@namedef{bbl@hyphendata@\the\language}{}% + }% + } } % Set hyphenation patterns for a given language. This does the right % thing both for XeTeX and LuaTeX \newcommand*\xpg@set@hyphenation@patterns[1]{% - \ifluatex - \polyglossia@luatex@load@lang{#1}% - \language=\csname l@#1\endcsname - \else - \ifxetex - \language=\csname l@#1\endcsname - \else + \str_case_e:nnF{\c_sys_engine_str}{ + {luatex} + { + \polyglossia@luatex@load@lang{#1}% + \language=\csname l@#1\endcsname + } + {xetex} + { + \language=\csname l@#1\endcsname + } + } + { \xpg@warning{You’re~running~a~TeX~engine~that~is~not~LuaTeX~or~XeTeX.\MessageBreak That~is~almost~guaranteed~to~cause~problems.}% - \fi - \fi + } } @@ -5615,38 +5947,46 @@ to track the issues and follow progress. % Hook for external packages such as biblatex \def\polyglossia@language@switched{} -\def\noextrascurrent#1{% - \csuse{noextras@#1}% - % This is a hook for external packages which want to access variants - % via babelname (such as biblatex) - \cs_if_exist_use:c{noextras@bbl@\babelname} +% remove all custumization for language #1 +\cs_new:Npn \noextrascurrent #1 +{% + \cs_if_exist_use:c{noextras@#1}% + % This is a hook for external packages which want to access variants + % via babelname (such as biblatex) + \cs_if_exist_use:c{noextras@bbl@\babelname} } % Common code for `\select@language' and `\foreignlanguage'. \newcommand{\select@@language}[2][]{% % disable the extras and number settings of the previous language - \ifcsundef{languagename}{}{% - \noextrascurrent{\languagename}% - \csuse{no\languagename @numbers}% - \ifxetex - \str_if_eq:eeTF{\exp_args:Nne\prop_item:Nn{\polyglossia@langsetup}{\languagename/direction}}{RL}% - {% - \str_if_eq:eeTF{\prop_item:Nn{\polyglossia@langsetup}{#2/direction}}{RL}% - {}% RTL -> RTL - {\setlatin}% RTL -> LTR - }{% - \str_if_eq:eeTF{\prop_item:Nn{\polyglossia@langsetup}{#2/direction}}{RL}% - {\setnonlatin}% LTR -> RTL - {}% LTR -> LTR - }% - \fi + \cs_if_exist:cT{languagename} + {% + \noextrascurrent{\languagename}% + \cs_if_exist_use:c{no\languagename @numbers}% + \sys_if_engine_xetex:T{ + \__xpg_if_LR_str:eTF{\prop_item:Ne{\polyglossia@langsetup}{\languagename/direction}} + { + \__xpg_if_LR_str:eF{\prop_item:Nn{\polyglossia@langsetup}{#2/direction}} + {\setnonlatin}% LTR -> RTL + }% + {% + \__xpg_if_LR_str:eT{\prop_item:Nn{\polyglossia@langsetup}{#2/direction}} + {\setlatin}% RTL -> LTR + } + } }% \polyglossia@set@language@name[#1]{#2}% % Set the language's/script's font families - \str_if_eq:eeTF{\prop_item:Nn{\polyglossia@langsetup}{#2/lcscript}}{latin}{\resetfontlatin}{\xpg@set@normalfont{#2}}% + \str_if_eq:eeTF{\prop_item:Nn{\polyglossia@langsetup}{#2/lcscript}} {latin} + { + \resetfontlatin + } + { + \xpg@set@normalfont{#2} + }% \xpg@select@fontfamily{#2}% - \csuse@warn{#2@language}% - \csuse{#2@numbers}% + \__xpg_use_or_warn:c{#2@language}% + \cs_if_exist_use:c{#2@numbers}% \use@localhyphenmins[#1]{#2}% \polyglossia@lang@frenchspacing:n{#2} } @@ -5656,24 +5996,48 @@ to track the issues and follow progress. \provideenvironment{otherlanguage}{}{} -\newbool{xpg@noset@groups} +% +% Keep track of the active (nested) languages and options +% +\clist_new:N \l_xpg_lang_stack + +\cs_new:Nn \polyglossia@stack@language:nn +{ + \clist_push:Nn \l_xpg_lang_stack {#1:#2} +} + +\cs_generate_variant:Nn \seq_set_split:Nnn {Nnx} + +\cs_new:Nn \polyglossia@unstack@language:n +{ + \clist_gpop:NNTF \l_xpg_lang_stack \l_tmpa_tl { + % Stored format = options:language => split: + \seq_set_split:Nnx \l_tmpa_seq {:} \l_tmpa_tl + \seq_get_left:NN \l_tmpa_seq \l_tmpb_tl + \seq_get_right:NN \l_tmpa_seq \l_tmpc_tl + % Execute passed command with language and maybe options + \tl_if_empty:NTF \l_tmpb_tl {\cs_if_exist_use:c{#1}{\l_tmpc_tl}} + {\cs_if_exist_use:c{#1}[\l_tmpb_tl]{\l_tmpc_tl}} + } + {} +} + \renewenvironment{otherlanguage}[2][] {% - % We usually embrace the switch in groups to keep the changes local. - % We cannot do this if an LTR environmet starts in an RTL paragraph, - % as bidi interferes here badly with its directionality smartness. - \ifxetex - \str_if_eq:eeT{\exp_args:Nne\prop_item:Nn{\polyglossia@langsetup}{\languagename/direction}}{RL}% - {% - \str_if_eq:eeTF{\prop_item:Nn{\polyglossia@langsetup}{#1/direction}}{RL}% - {}% RTL -> RTL - {\ifvmode\else\booltrue{xpg@noset@groups}\fi}% RTL -> LTR - }% - \fi% - \ifbool{xpg@noset@groups}{}{\xpg@set@group@aux}% + % Get real current options (incl. defaults) + \clist_clear_new:N \l_xpg_current_options + \prop_map_inline:cn {xpg@current@options@#2} + { + \clist_put_right:Nn \l_xpg_current_options {##1=##2} + } + % Store current options and language on stack + \polyglossia@stack@language:nn{\clist_use:Nn \l_xpg_current_options {,}}{#2}% \selectlanguage[#1]{#2}% } -{\ifbool{xpg@noset@groups}{}{\xpg@unset@group@aux}} +{% + % restore previous language in aux file and remove closed one from stack + \polyglossia@unstack@language:n{xpg@set@language@only@aux}% +} \newcommand{\setlocalhyphenmins}[3]{% \xpg@ifdefined{#1}{% @@ -5690,26 +6054,20 @@ to track the issues and follow progress. % \setlanghyphenmins[options]{lang}{l}{r} \newcommand*\setlanghyphenmins[4][]{% % Check for real language name and options - \edef\xpg@tmp@lang{#2}% - \edef\xpg@tmp@opts{#1}% - \ifcsdef{#2@alias@lang}{% - \edef\xpg@tmp@lang{\csuse{#2@alias@lang}}% - \ifcsdef{#2@alias@opts}{% - \edef\xpg@tmp@opts{\csuse{#2@alias@opts},#1}% - }{}% - }{}% + \edef\xpg@tmp@opts{\xpg_alias_add_to_option_i:nn{#2}{#1}} + \edef\xpg@tmp@lang{\xpg_alias_base_lang:n{#2}} \bgroup \polyglossia@error@iflangnotloaded:n{\xpg@tmp@lang} \exp_args:Nne \setkeys{\xpg@tmp@lang}{\xpg@tmp@opts}% % Store BCP-47 id of language \tl_if_blank:nTF {\xpg@tmp@opts}{% \ifcsundef{\csname xpg@tmp@lang\endcsname @gbcp47id}{% - \csedef{tmp@bcp47id}{\exp_args:Nne\prop_item:Nn{\polyglossia@langsetup}{\xpg@tmp@lang /bcp47}}% + \csedef{tmp@bcp47id}{\prop_item:Ne{\polyglossia@langsetup}{\xpg@tmp@lang /bcp47}}% }{% \csedef{tmp@bcp47id}{\csuse{#2@gbcp47id}}% }% }{% - \csedef{tmp@bcp47id}{\exp_args:Nne \prop_item:Nn{\polyglossia@langsetup}{\xpg@tmp@lang /bcp47}}% + \csedef{tmp@bcp47id}{\prop_item:Ne{\polyglossia@langsetup}{\xpg@tmp@lang /bcp47}}% }% \xpg@warning{id: \csuse{tmp@bcp47id}}% \csgdef{\csname tmp@bcp47id\endcsname @hyphenmins}{{#3}{#4}}% @@ -5741,15 +6099,15 @@ to track the issues and follow progress. \edef\tmpa{\csuse{\csname tmp@bcp47id\endcsname @hyphenmins}}% \expandafter\expandafter\expandafter\set@hyphenmins\tmpa\relax% } - \ifluatex + \sys_if_engine_luatex:T{ % Set \totalhyphenmin if specified \prop_get:NxNTF \polyglossia@langsetup {#2/totalhyphenmin} \l_tmpa_tl { - \xpg@warning{totalhyphenmin: '\l_tmpa_tl'} + \xpg@info{totalhyphenmin: '\l_tmpa_tl'} \expandafter\hyphenationmin \l_tmpa_tl% }% {}% - \fi + } } % Babel previously compiled in hyphenrules into the kernel (via hyphen.cfg) @@ -5761,37 +6119,17 @@ to track the issues and follow progress. % supports language options and aliases. \renewenvironment{hyphenrules}[2][] {% - % We usually embrace the switch in groups to keep the changes local. - % We cannot do this if an LTR environmet starts in an RTL paragraph, - % as bidi interferes here badly with its directionality smartness. - \ifxetex - \str_if_eq:eeT{\exp_args:Nne\prop_item:Nn{\polyglossia@langsetup}{\languagename/direction}}{RL}% - {% - \str_if_eq:eeTF{\prop_item:Nn{\polyglossia@langsetup}{#1/direction}}{RL}% - {}% RTL -> RTL - {\ifvmode\else\booltrue{xpg@noset@groups}\fi}% RTL -> LTR - }% - \fi% - \ifbool{xpg@noset@groups}{}{\xpg@set@group@aux}% % Check for real language name and options - \edef\xpg@tmp@lang{#2}% - \edef\xpg@tmp@opts{#1}% - \ifcsdef{#2@alias@lang}{% - \edef\xpg@tmp@lang{\csuse{#2@alias@lang}}% - \ifcsdef{#2@alias@opts}{% - \edef\xpg@tmp@opts{\csuse{#2@alias@opts},#1}% - }{}% - }{}% - \tl_if_blank:nF {\xpg@tmp@opts}{% - % Register the language options - \polyglossia@set@lang@options:nn {\xpg@tmp@lang} {\xpg@tmp@opts}% - }% + \edef\xpg@tmp@opts{\xpg_alias_add_to_option_i:nn{#2}{#1}} + \edef\xpg@tmp@lang{\xpg_alias_base_lang:n{#2}} + % Register the language options + \polyglossia@set@lang@options:nnn {\xpg@tmp@lang} {\xpg@tmp@opts} {@xpg@set@langvariant}% % Now switch patterns - \csuse@warn{\csuse{xpg@tmp@lang}@language}% + \__xpg_use_or_warn:c{\use:c{xpg@tmp@lang}@language}% % And activate hyphenmins \use@localhyphenmins[\xpg@tmp@opts]{\xpg@tmp@lang}% } -{\ifbool{xpg@noset@groups}{}{\xpg@unset@group@aux}} +{} \AtEndPreamble{% \@ifpackageloaded{bidi}{% @@ -5846,15 +6184,15 @@ to track the issues and follow progress. % Set the LuaTeX renderer. As opposed to fontspec, we use Harfbuzz by default. % This can be changed via the luatexrenderer package option. -\ifluatex - \exp_args:Nee \str_if_eq:nnF{\l_polyglossia_luatex_renderer}{none} - { - \xpg@info{Setting~ LuaTeX~ font~ renderer~ to~ \l_polyglossia_luatex_renderer} - \exp_args:Nee \defaultfontfeatures{Renderer=\l_polyglossia_luatex_renderer} - } -\fi +\sys_if_engine_luatex:T{ + \str_if_eq:eeF{\l_polyglossia_luatex_renderer}{none} + { + \xpg@info{Setting~ LuaTeX~ font~ renderer~ to~ \l_polyglossia_luatex_renderer} + \exp_args:Ne \defaultfontfeatures{Renderer=\l_polyglossia_luatex_renderer} + } +} -\bool_if:nTF \l_polyglossia_verbose_bool {} { +\bool_if:nF \l_polyglossia_verbose_bool { \gdef\@latex@info#1{\relax}% no latex info \gdef\@font@info#1{\relax}% no latex font info \gdef\@font@warning#1{\relax}% no latex font warnings @@ -5862,9 +6200,9 @@ to track the issues and follow progress. \gdef\xpg@info#1{\relax}% no polyglossia info } -\bool_if:nTF \l_polyglossia_localmarks_bool { +\bool_if:nT \l_polyglossia_localmarks_bool { \polyglossia@enable@local@marks: -}{} +} % compatibility \newif\ifsystem@babelshorthands @@ -9247,11 +9585,11 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages } \def\blockextras@afrikaans{% - \ifafrikaans@babelshorthands\afrikaans@shorthands\fi% + \ifafrikaans@babelshorthands\afrikaans@shorthands\else\noafrikaans@shorthands\fi% } \def\inlineextras@afrikaans{% - \ifafrikaans@babelshorthands\afrikaans@shorthands\fi% + \ifafrikaans@babelshorthands\afrikaans@shorthands\else\noafrikaans@shorthands\fi% } % \end{macrocode} @@ -9855,8 +10193,9 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \fi% \fi}} - -\newcommand{\arabicnumerals}[2]{\arabicnumber{#2}} +% Use \providecommand here as the ldf file might +% be reloaded via aeb (BCP). +\providecommand{\arabicnumerals}[2]{\arabicnumber{#2}} \def\arabicnumber#1{% \ifeastern@numerals @@ -10666,8 +11005,10 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \csuse{datebelarusian@\belarusian@spelling}% } -\newcommand{\belarusiannumerals}[2]{\belarusiannumber{#2}} -\newcommand{\Belarusiannumerals}[2]{\Belarusiannumber{#2}} +% Use \providecommand here as the ldf file might +% be reloaded via be-tarask (BCP). +\providecommand{\belarusiannumerals}[2]{\belarusiannumber{#2}} +\providecommand{\Belarusiannumerals}[2]{\Belarusiannumber{#2}} \def\belarusiannumber#1{% \ifcyrillic@numerals @@ -10743,12 +11084,12 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages } \def\blockextras@belarusian{% - \ifcyrillic@numerals\belarusian@numbers\fi% - \ifbelarusian@babelshorthands\belarusian@shorthands\fi% + \ifcyrillic@numerals\belarusian@numbers\else\nobelarusian@numbers\fi% + \ifbelarusian@babelshorthands\belarusian@shorthands\else\nobelarusian@shorthands\fi% } \def\inlineextras@belarusian{% - \ifbelarusian@babelshorthands\belarusian@shorthands\fi% + \ifbelarusian@babelshorthands\belarusian@shorthands\else\nobelarusian@shorthands\fi% } % \end{macrocode} @@ -10988,7 +11329,7 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \def\today{\number\day.~\ifcase\month\or januar\or februar\or mart\or april\or maj\or juni\or juli\or august\or septembar\or oktobar\or novembar\or - decembar\fi \space \number\year.~}% + decembar\fi \space \number\year.}% } % \end{macrocode} @@ -11457,11 +11798,11 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages } \def\blockextras@catalan{% - \ifcatalan@babelshorthands\catalan@shorthands\fi% + \ifcatalan@babelshorthands\catalan@shorthands\else\nocatalan@shorthands\fi% } \def\inlineextras@catalan{% - \ifcatalan@babelshorthands\catalan@shorthands\fi% + \ifcatalan@babelshorthands\catalan@shorthands\else\nocatalan@shorthands\fi% } % \end{macrocode} % \iffalse @@ -11603,14 +11944,25 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \define@boolkey{croatian}[croatian@]{babelshorthands}[true]{} -\define@boolkey{croatian}[croatian@]{disableligatures}[true]{} +\define@boolkey{croatian}[croatian@]{disabledigraphs}[true]{} + +% Alias kept for backwards compatibility. Please do not remove +\define@boolkey{croatian}[croatian@]{disableligatures}[true]{% + \xpg@warning{The option disableligatures is deprected.\MessageBreak + Please use disabledigraphs instead}% + \ifcroatian@disableligatures + \croatian@disabledigraphstrue + \else + \croatian@disabledigraphsfalse + \fi +} \define@boolkey{croatian}[croatian@]{splithyphens}[true]{} \define@boolkey{croatian}[croatian@]{localalph}[true]{} % Register default options -\xpg@initialize@gloss@options{croatian}{babelshorthands=false,disableligatures=false, +\xpg@initialize@gloss@options{croatian}{babelshorthands=false,disabledigraphs=false, splithyphens=true,localalph=true} \ifsystem@babelshorthands @@ -11626,6 +11978,14 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages }{} \def\croatian@@splhyphen#1{% + \def\croatian@sh@tmp{% + \if\croatian@sh@next-#1% + \else\expandafter\croatian@@@splhyphen{#1}\fi% + }% + \futurelet\croatian@sh@next\croatian@sh@tmp% +} + +\def\croatian@@@splhyphen#1{% \ifnum\hyphenchar \font>0% \kern\z@\discretionary{-}{\char\hyphenchar\the\font}{#1}% \nobreak\hskip\z@% @@ -11655,12 +12015,12 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \declare@shorthand{croatian}{"'}{”}% \declare@shorthand{croatian}{"<}{«}% \declare@shorthand{croatian}{">}{»}% - \declare@shorthand{croatian}{"D}{\xpg@hr@lig{D}}% - \declare@shorthand{croatian}{"d}{\xpg@hr@lig{d}}% - \declare@shorthand{croatian}{"L}{\xpg@hr@lig{L}}% - \declare@shorthand{croatian}{"l}{\xpg@hr@lig{l}}% - \declare@shorthand{croatian}{"N}{\xpg@hr@lig{N}}% - \declare@shorthand{croatian}{"n}{\xpg@hr@lig{n}}% + \declare@shorthand{croatian}{"D}{\xpg@hr@digraph{D}}% + \declare@shorthand{croatian}{"d}{\xpg@hr@digraph{d}}% + \declare@shorthand{croatian}{"L}{\xpg@hr@digraph{L}}% + \declare@shorthand{croatian}{"l}{\xpg@hr@digraph{l}}% + \declare@shorthand{croatian}{"N}{\xpg@hr@digraph{N}}% + \declare@shorthand{croatian}{"n}{\xpg@hr@digraph{n}}% } \def\nocroatian@shorthands{% @@ -11693,24 +12053,24 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \fi% } -\newcommand*\hr@charifavailable[2]{% - \ifcroatian@disableligatures - \bgroup#2\egroup% - \else - \charifavailable{#1}{#2}% +\newcommand*\hr@charifavailable[3]{% + \ifcroatian@disabledigraphs% no notion of digraphs at all + \bgroup#3\egroup% + \else% digraph... + \charifavailable{#1}{#2}% ... either a Unicode original or a mimic of one \fi% } -% Provide croatian ligatures if available in current font -\def\xpg@hr@lig#1#2{% +% Provide croatian digraphs if available in current font +\def\xpg@hr@digraph#1#2{% \bgroup% % 1. DŽ, Dž and dž \ifx#1D% \ifx#2Z\relax% - \hr@charifavailable{01C4}{DŽ}% + \hr@charifavailable{01C4}{D\nobreak Ž}{DŽ}% \else% \ifx#2z\relax - \hr@charifavailable{01C5}{Dž}% + \hr@charifavailable{01C5}{D\nobreak ž}{Dž}% \else D#2% \fi% @@ -11718,7 +12078,7 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \fi% \ifx#1d% \ifx#2z\relax - \hr@charifavailable{01C6}{dž}% + \hr@charifavailable{01C6}{d\nobreak ž}{dž}% \else d#2% \fi% @@ -11726,10 +12086,10 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages % 2. LJ, Lj and lj \ifx#1L% \ifx#2J\relax% - \hr@charifavailable{01C7}{LJ}% + \hr@charifavailable{01C7}{L\nobreak J}{LJ}% \else% \ifx#2j\relax - \hr@charifavailable{01C8}{Lj}% + \hr@charifavailable{01C8}{L\nobreak j}{Lj}% \else L#2% \fi% @@ -11737,7 +12097,7 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \fi% \ifx#1l% \ifx#2j\relax - \hr@charifavailable{01C9}{lj}% + \hr@charifavailable{01C9}{l\nobreak j}{lj}% \else l#2% \fi% @@ -11745,10 +12105,10 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages % 2. NJ, Nj and nj \ifx#1N% \ifx#2J\relax% - \hr@charifavailable{01CA}{NJ}% + \hr@charifavailable{01CA}{N\nobreak J}{NJ}% \else% \ifx#2j\relax - \hr@charifavailable{01CB}{Nj}% + \hr@charifavailable{01CB}{N\nobreak j}{Nj}% \else N#2% \fi% @@ -11756,7 +12116,7 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \fi% \ifx#1n% \ifx#2j\relax - \hr@charifavailable{01CC}{nj}% + \hr@charifavailable{01CC}{n\nobreak j}{nj}% \else n#2% \fi% @@ -11769,7 +12129,7 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \def\refname{Literatura}% \def\abstractname{Sažetak}% \def\bibname{Bibliografija}% - \def\chaptername{Poglav\hr@charifavailable{01C9}{lj}e}% + \def\chaptername{Poglav\xpg@hr@digraph{l}{j}e}% \def\appendixname{Dodatak}% \def\contentsname{Sadržaj}% \def\listfigurename{Popis slika}% @@ -11790,9 +12150,9 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \def\datecroatian{% \def\today{\number\day.~\ifcase\month\or - siječ\hr@charifavailable{01CC}{nj}a\or ve\hr@charifavailable{01C9}{lj}ače\or - ožujka\or trav\hr@charifavailable{01CC}{nj}a\or svib\hr@charifavailable{01CC}{nj}a\or - lip\hr@charifavailable{01CC}{nj}a\or srp\hr@charifavailable{01CC}{nj}a\or + siječ\xpg@hr@digraph{n}{j}a\or ve\xpg@hr@digraph{l}{j}ače\or + ožujka\or trav\xpg@hr@digraph{n}{j}a\or svib\xpg@hr@digraph{n}{j}a\or + lip\xpg@hr@digraph{n}{j}a\or srp\xpg@hr@digraph{n}{j}a\or kolovoza\or rujna\or listopada\or studenoga\or prosinca\fi \space \number\year.}% } @@ -11815,13 +12175,13 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages } \def\blockextras@croatian{% - \ifcroatian@babelshorthands\croatian@shorthands\fi% + \ifcroatian@babelshorthands\croatian@shorthands\else\nocroatian@shorthands\fi% \ifcroatian@splithyphens\croatian@hyphens\else\nocroatian@hyphens\fi% \ifcroatian@localalph\let\alph\croatian@alph\let\Alph\croatian@Alph\fi% } \def\inlineextras@croatian{% - \ifcroatian@babelshorthands\croatian@shorthands\fi% + \ifcroatian@babelshorthands\croatian@shorthands\else\nocroatian@shorthands\fi% \ifcroatian@splithyphens\croatian@hyphens\else\nocroatian@hyphens\fi% \ifcroatian@localalph\let\alph\croatian@alph\let\Alph\croatian@Alph\fi% } @@ -11904,7 +12264,15 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \shorthandoff{"}% }{} -\def\cs@@splithyphen#1{% +\def\czech@@splithyphen#1{% + \def\czech@sh@tmp{% + \if\czech@sh@next-#1% + \else\expandafter\czech@@@splithyphen{#1}\fi% + }% + \futurelet\czech@sh@next\czech@sh@tmp% +} + +\def\czech@@@splithyphen#1{% \ifnum\hyphenchar \font>0% \kern\z@\discretionary{-}{\char\hyphenchar\the\font}{#1}% \nobreak\hskip\z@% @@ -11913,14 +12281,14 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \fi% } -\def\cs@splithyphen{% - \cs@@splithyphen{-}% +\def\czech@splithyphen{% + \czech@@splithyphen{-}% } \def\czech@shorthands{% \bbl@activate{"}% \def\language@group{czech}% - \declare@shorthand{czech}{"=}{\cs@splithyphen}% + \declare@shorthand{czech}{"=}{\czech@splithyphen}% \declare@shorthand{czech}{"`}{„}% \declare@shorthand{czech}{"'}{“}% \declare@shorthand{czech}{"<}{«}% @@ -11957,9 +12325,9 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \else \XeTeXinterchartokenstate=1 \XeTeXcharclass `\- \czech@hyphen - \XeTeXinterchartoks \z@ \czech@hyphen = {\cs@@splithyphen}% "-" -> "\cs@@splithyphen-" + \XeTeXinterchartoks \z@ \czech@hyphen = {\czech@@splithyphen}% "-" -> "\czech@@splithyphen-" % necessary if used together with vlna: - \XeTeXinterchartoks \czech@nonsyllabicpreposition \czech@hyphen = {\cs@@splithyphen}% "-" -> "\cs@@splithyphen-" + \XeTeXinterchartoks \czech@nonsyllabicpreposition \czech@hyphen = {\czech@@splithyphen}% "-" -> "\czech@@splithyphen-" \fi% } @@ -12091,13 +12459,13 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages } \def\blockextras@czech{% - \ifczech@babelshorthands\czech@shorthands\fi% + \ifczech@babelshorthands\czech@shorthands\else\noczech@shorthands\fi% \ifczech@vlna\czech@vlna\else\noczech@vlna\fi% \ifczech@splithyphens\czech@hyphens\else\noczech@hyphens\fi% } \def\inlineextras@czech{% - \ifczech@babelshorthands\czech@shorthands\fi% + \ifczech@babelshorthands\czech@shorthands\else\noczech@shorthands\fi% \ifczech@vlna\czech@vlna\else\noczech@vlna\fi% \ifczech@splithyphens\czech@hyphens\else\noczech@hyphens\fi% } @@ -12642,11 +13010,11 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages } \def\blockextras@dutch{% - \ifdutch@babelshorthands\dutch@shorthands\fi% + \ifdutch@babelshorthands\dutch@shorthands\else\nodutch@shorthands\fi% } \def\inlineextras@dutch{% - \ifdutch@babelshorthands\dutch@shorthands\fi% + \ifdutch@babelshorthands\dutch@shorthands\else\nodutch@shorthands\fi% } % \end{macrocode} @@ -12819,19 +13187,20 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages } % BCP-47 compliant aliases -\setlanguagealias*{english}{en} -\setlanguagealias*[variant=australian]{english}{en-AU} -\setlanguagealias*[variant=newzealand]{english}{en-NZ} -\setlanguagealias*[variant=us]{english}{en-US} -\setlanguagealias*[variant=british]{english}{en-GB} -\setlanguagealias*[variant=canadian]{english}{en-CA} +\setlanguagealias*[bcp47=en]{english}{en} +\setlanguagealias*[variant=australian,babelname=autralian,bcp47=en-AU]{en}{en-AU} +\setlanguagealias*[variant=canadian,babelname=canadian,bcp47=en-CA]{en}{en-CA} +\setlanguagealias*[variant=british,babelname=british,bcp47=en-NZ]{en}{en-GB} +\setlanguagealias*[variant=newzealand,babelname=newzealand,bcp47=en-NZ]{en}{en-NZ} +\setlanguagealias*[variant=us,babelname=american,bcp47=en-US]{en}{en-US} + % Babel aliases -\setlanguagealias[variant=us]{english}{american} -\setlanguagealias[variant=australian]{english}{australian} -\setlanguagealias[variant=british]{english}{british} -\setlanguagealias[variant=canadian]{english}{canadian} -\setlanguagealias[variant=newzealand]{english}{newzealand} +\setlanguagealias[variant=us]{en-US}{american} +\setlanguagealias[variant=australian]{en-AU}{australian} +\setlanguagealias[variant=british]{en-GB}{british} +\setlanguagealias[variant=canadian]{en-CA}{canadian} +\setlanguagealias[variant=newzealand]{en-NZ}{newzealand} \providebool{british@hyphen} \providebool{english@ordinalmonthday} @@ -12979,6 +13348,7 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \def\alsoname{see also}% \def\proofname{Proof}% } + \def\dateenglish{% \def\english@day{% \ifenglish@ordinalmonthday @@ -13290,8 +13660,10 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \define@boolkey{finnish}[finnish@]{babelshorthands}[true]{} +\define@boolkey{finnish}[finnish@]{schoolhyphens}[true]{} + % Register default options -\xpg@initialize@gloss@options{finnish}{babelshorthands=false} +\xpg@initialize@gloss@options{finnish}{babelshorthands=false,schoolhyphens=false} \ifsystem@babelshorthands \setkeys{finnish}{babelshorthands=true} @@ -13345,6 +13717,21 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \def\proofname{Todistus}% \def\glossaryname{Sanasto}% } + +\def\finnish@language{% + \iffinnish@schoolhyphens + \xpg@ifdefined{schoolfinnish}{% + \polyglossia@setup@language@patterns{schoolfinnish}% + }{% + \xpg@warning{Finnish 'School' hyphenation patterns (schoolfinnish) not available.\MessageBreak + I will use the standard patterns for Finnish instead}% + \polyglossia@setup@language@patterns{finnish}% + }% + \else + \polyglossia@setup@language@patterns{finnish}% + \fi +} + \def\datefinnish{% \def\today{\number\day.~\ifcase\month\or tammikuuta\or helmikuuta\or maaliskuuta\or huhtikuuta\or @@ -13357,11 +13744,11 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages } \def\blockextras@finnish{% - \iffinnish@babelshorthands\finnish@shorthands\fi% + \iffinnish@babelshorthands\finnish@shorthands\else\nofinnish@shorthands\fi% } \def\inlineextras@finnish{% - \iffinnish@babelshorthands\finnish@shorthands\fi% + \iffinnish@babelshorthands\finnish@shorthands\else\nofinnish@shorthands\fi% } % \end{macrocode} @@ -14496,12 +14883,12 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages } \def\blockextras@georgian{% - \ifgeorgian@numerals\georgian@numbers\fi% - \ifgeorgian@babelshorthands\georgian@shorthands\fi% + \ifgeorgian@numerals\georgian@numbers\else\nogeorgian@numbers\fi% + \ifgeorgian@babelshorthands\georgian@shorthands\else\nogeorgian@shorthands\fi% } \def\inlineextras@georgian{% - \ifgeorgian@babelshorthands\georgian@shorthands\fi% + \ifgeorgian@babelshorthands\georgian@shorthands\else\nogeorgian@shorthands\fi% } % \end{macrocode} @@ -14664,7 +15051,7 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \xpg@info{Option: German, script=\xpg@val}% }{\xpg@warning{Unknown German script `#1'}} -% Option defunc'ed, as bot XeTeX and LuaTeX meanwhile +% Option defunc'ed, as both XeTeX and LuaTeX meanwhile % use the experimental German hyphenation patterns by default. \define@boolkey{german}[german@]{latesthyphen}[true]{} @@ -14673,7 +15060,7 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \setkeys{german}{spelling,script,variant} % Register default options -\xpg@initialize@gloss@options{german}{variant=german,spelling=new,script=latin,latesthyphen=false,babelshorthands=false} +\xpg@initialize@gloss@options{german}{variant=german,spelling=new,script=latin,babelshorthands=false} % Register alias options \xpg@set@alias@values{german}{spelling}{new}{1996} \xpg@set@alias@values{german}{spelling}{old}{1901} @@ -14829,11 +15216,11 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages } \def\blockextras@german{% - \ifgerman@babelshorthands\german@shorthands\fi% + \ifgerman@babelshorthands\german@shorthands\else\nogerman@shorthands\fi% } \def\inlineextras@german{% - \ifgerman@babelshorthands\german@shorthands\fi% + \ifgerman@babelshorthands\german@shorthands\else\nogerman@shorthands\fi% } % \end{macrocode} @@ -15144,8 +15531,10 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \renewrobustcmd\anw@print{ʹ}} \anw@true -\newcommand{\greeknumerals}[2]{\greeknumber{#2}} -\newcommand{\Greeknumerals}[2]{\Greeknumber{#2}} +% Use \providecommand here as the ldf file might +% be reloaded via politunikogreek. +\providecommand{\greeknumerals}[2]{\greeknumber{#2}} +\providecommand{\Greeknumerals}[2]{\Greeknumber{#2}} \protected\def\greeknumber#1{\expandafter\@greeknumber\expandafter{\number#1}} \def\@greeknumber#1{% @@ -16353,12 +16742,12 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \lccode\string"2019=\string"2019% \clubpenalty=3000 \@clubpenalty=3000 \widowpenalty=3000% \finalhyphendemerits=50000000% - \ifitalian@babelshorthands\italian@shorthands\fi% + \ifitalian@babelshorthands\italian@shorthands\else\noitalian@shorthands\fi% } \def\inlineextras@italian{% \lccode\string"2019=\string"2019% - \ifitalian@babelshorthands\italian@shorthands\fi% + \ifitalian@babelshorthands\italian@shorthands\else\noitalian@shorthands\fi% } %%% CHANGES END %%% % \end{macrocode} @@ -17120,16 +17509,25 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages % change chapter and part headings \if@korean@swapheadings % With titlesec - \ifdefined\titleformat - \ifdefined\@part - \let\xpg@save@part@format\@part - \patchcmd{\@part}% + \ifcsdef{titleformat}{% + \ifcsdef{H@old@part}{% Hyperref + \let\xpg@save@part@format\H@old@part + \patchcmd{\H@old@part}% {\partname\nobreakspace\thepart}% {\koreanTHEname\nobreakspace \thepart\nobreakspace \partname}% {}% {\xpg@warning{Failed to patch part for Korean}}% - \fi - \ifdefined\chapter + }{% not hyperref + \ifcsdef{@part}{% + \let\xpg@save@part@format\@part + \patchcmd{\@part}% + {\partname\nobreakspace\thepart}% + {\koreanTHEname\nobreakspace \thepart\nobreakspace \partname}% + {}% + {\xpg@warning{Failed to patch part for Korean}}% + }{}% + } + \ifcsdef{chapter}{% \titleformat\chapter[display]% {\@ifundefined{ttl@fil}{\raggedright}{\ttl@fil}\ttl@fonts\ttl@sizes6}% {% @@ -17139,15 +17537,15 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \koreanTHEname\space \thechapter\space \@chapapp \fi }{.8\baselineskip}{\ttl@sizes\z@\ttl@passexplicit}% - \fi - \else % (not \ifdefined\titleformat) + }{}% + }{% (not \ifdefined\titleformat) % With KOMA - \ifdefined\sectionformat - \ifdefined\partformat + \ifcsdef{sectionformat}{% + \ifcsdef{partformat}{% \let\xpg@save@part@format\partformat \renewcommand*{\partformat}{\koreanTHEname~\thepart~\partname}% - \fi - \ifdefined\chapterformat + }{}% + \ifcsdef{chapterformat}{% \let\xpg@save@chap@format\chapterformat \renewcommand*{\chapterformat}{\mbox{% \IfChapterUsesPrefixLine @@ -17160,11 +17558,11 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages }% {\thechapter\autodot\enskip}% }}% - \fi - \else % (not \ifdefined\sectionformat) + }{}% + }{% (not \ifdefined\sectionformat) % With memoir - \ifdefined\@memptsize - \ifdefined\@makechapterhead + \ifcsdef{@memptsize}{% + \ifcsdef{@makechapterhead}{% \let\xpg@save@chap@format\@makechapterhead \patchcmd{\@makechapterhead}% {\printchaptername \chapternamenum \printchapternum}% @@ -17182,10 +17580,10 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \ifpatchable\printchaptername\@chapapp {\chapnamefont\koreanTHEname\chapternamenum}{}}% \fi - \fi - \ifdefined\@part - \let\xpg@save@part@format\@part - \patchcmd{\@part}% + }{}% + \ifcsdef{H@old@part}{% Hyperref + \let\xpg@save@part@format\H@old@part + \patchcmd{\H@old@part}% {\printpartname \partnamenum \printpartnum}% {\printkoreanpartthe \printpartnum\partnamenum \printpartname}% {}% @@ -17193,10 +17591,22 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \ifdefined\printkoreanpartthe\else \def\printkoreanpartthe{\partnamefont\koreanTHEname\partnamenum}% \fi - \fi - \else % (not \ifdefined\@memptsize) + }{% not hyperref + \ifcsdef{@part}{% + \let\xpg@save@part@format\@part + \patchcmd{\@part}% + {\printpartname \partnamenum \printpartnum}% + {\printkoreanpartthe \printpartnum\partnamenum \printpartname}% + {}% + {\xpg@warning{Failed to patch part for Korean}}% + \ifdefined\printkoreanpartthe\else + \def\printkoreanpartthe{\partnamefont\koreanTHEname\partnamenum}% + \fi + }{}% + }% + }{% (not \ifdefined\@memptsize) % With standard classes - \ifdefined\@makechapterhead + \ifcsdef{@makechapterhead}{% \let\xpg@save@chap@format\@makechapterhead \patchcmd{\@makechapterhead}% {\@chapapp\space \thechapter}% @@ -17209,23 +17619,35 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages }% {}% {\xpg@warning{Failed to patch chapter for Korean}}% - \fi - \ifdefined\@part - \let\xpg@save@part@format\@part - \patchcmd{\@part}% + }{}% + \ifcsdef{H@old@part}{% Hyperref + \let\xpg@save@part@format\H@old@part + \patchcmd{\H@old@part}% {\partname\nobreakspace\thepart}% {\koreanTHEname\nobreakspace \thepart\nobreakspace \partname}% {}% {\xpg@warning{Failed to patch part for Korean}}% - \fi % (end \ifdefined\@part) - \fi % (end \ifdefined\@memptsize) - \fi % (end \ifdefined\sectionformat) - \fi % (end \ifdefined\titleformat) + }{% not hyperref + \ifcsdef{@part}{% + \ifpatchable{\@part}% + {\partname\nobreakspace\thepart}% + {\let\xpg@save@part@format\@part + \patchcmd{\@part}% + {\partname\nobreakspace\thepart}% + {\koreanTHEname\nobreakspace \thepart\nobreakspace \partname}% + {}% + {\ifcsdef{part}{\xpg@warning{Failed to patch part for Korean}}{}}}% + {}% + }{}% (end \ifdefined\@part) + }% (end not hyperref) + }% (end \ifdefined\@memptsize) + }% (end \ifdefined\sectionformat) + }% (end \ifdefined\titleformat) \fi % (end \if@korean@swapheadings) % % Change running headers \if@korean@swapheaders - \ifdefined\chapterformat + \ifcsdef{chapterformat}{% % With KOMA \let\xpg@save@chaptermark@format\chaptermarkformat \renewcommand*\chaptermarkformat{% @@ -17240,8 +17662,8 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages {\thechapter\autodot}% \enskip }% - \else % (not \ifdefined\chapterformat) - \ifdefined\@memptsize + }{% (not \ifdefined\chapterformat) + \ifcsdef{@memptsize}{% % With memoir \let\xpg@save@chaptermark@format\chaptermark \patchcmd{\chaptermark}% @@ -17254,74 +17676,85 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \fi }% {}% - {}% - \else % (not \ifdefined\@memptsize) + {\xpg@warning{Failed to patch chaptermark for Korean}}% + }{% (not \ifdefined\@memptsize) % With standard classes - \ifdefined\chaptermark - \let\xpg@save@chaptermark@format\chaptermark - \patchcmd{\chaptermark}% - {\@chapapp\ \thechapter}% - {% - \ifx\@chapapp\korean@appendix@chapapp - \appendixname\ \thechapter - \else - \koreanTHEname\ \thechapter\ \@chapapp - \fi - }% - {}% - {}% - \fi % (end \ifdefined\chaptermark) - \fi % (end \ifdefined\@memptsize) - \fi % (end \ifdefined\chapterformat) + \ifcsdef{chaptermark}{% + \ifpatchable{\chaptermark}% + {\@chapapp\ \thechapter}% + {\let\xpg@save@chaptermark@format\chaptermark + \patchcmd{\chaptermark}% + {\@chapapp\ \thechapter}% + {% + \ifx\@chapapp\korean@appendix@chapapp + \appendixname\ \thechapter + \else + \koreanTHEname\ \thechapter\ \@chapapp + \fi + }% + {}% + {\xpg@warning{Failed to patch chaptermark for Korean}}}% + {}% + }{}% (end \ifdefined\chaptermark) + }% (end \ifdefined\@memptsize) + }% (end \ifdefined\chapterformat) \fi % (end \if@korean@swapheaders) } \def\nokorean@headingsformat{% % Reset chapter and part heading - \ifdefined\titleformat + \ifcsdef{titleformat}{% % With titlesec - \ifdefined\xpg@save@part@format - \let\@part\xpg@save@part@format - \fi - \ifdefined\chapter + \ifcsdef{xpg@save@part@format}{% + \ifcsdef{H@old@part}{% + \let\H@old@part\xpg@save@part@format + }{% + \let\@part\xpg@save@part@format + }% + }{}% + \ifcsdef{chapter}{% \titleformat\chapter[display]% {\@ifundefined{ttl@fil}{\raggedright}{\ttl@fil}\ttl@fonts\ttl@sizes6}% {\@chapapp\space\thechapter}{.8\baselineskip}{\ttl@sizes\z@\ttl@passexplicit}% - \fi - \else % (not \ifdefined\titleformat) - \ifdefined\sectionformat + }{}% + }{% (not \ifdefined\titleformat) + \ifcsdef{sectionformat}{% % With KOMA - \ifdefined\xpg@save@part@format + \ifcsdef{xpg@save@part@format}{% \let\partformat\xpg@save@part@format - \fi - \ifdefined\xpg@save@chap@format + }{}% + \ifcsdef{xpg@save@chap@format}{% \let\chapterformat\xpg@save@chap@format - \fi - \else + }{}% + }{% % With memoir and standard classes - \ifdefined\xpg@save@part@format - \let\@part\xpg@save@part@format - \fi - \ifdefined\xpg@save@chap@format + \ifcsdef{xpg@save@part@format}{% + \ifcsdef{H@old@part}{% + \let\H@old@part\xpg@save@part@format + }{% + \let\@part\xpg@save@part@format + }% + }{}% + \ifcsdef{xpg@save@chap@format}{% \let\@makechapterhead\xpg@save@chap@format - \fi - \fi % (end \ifdefined\sectionformat) - \fi % (end \ifdefined\titleformat) + }{}% + }% (end \ifdefined\sectionformat) + }% (end \ifdefined\titleformat) % % Reset headers - \ifdefined\chaptermarkformat + \ifcsdef{chaptermarkformat}{% % With KOMA - \ifdefined\xpg@save@chaptermark@format + \ifcsdef{xpg@save@chaptermark@format}{% \let\chaptermarkformat\xpg@save@chaptermark@format - \fi - \else - \ifdefined\chaptermark + }{}% + }{% + \ifcsdef{chaptermark}{% % With memoir and standard classes - \ifdefined\xpg@save@chaptermark@format + \ifcsdef{xpg@save@chaptermark@format}{% \let\chaptermark\xpg@save@chaptermark@format - \fi - \fi % (end \ifdefined\chaptermark) - \fi % (end \ifdefined\chapterformat) + }{}% + }{}% (end \ifdefined\chaptermark) + }% (end \ifdefined\chapterformat) } \def\datekorean{% @@ -17824,7 +18257,9 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \csname datekurdish@\kurdish@variant @\kurdish@script\endcsname% } -\newcommand{\kurdishnumerals}[2]{\kurdishnumber{#2}} +% Use \providecommand here as the ldf file might +% be reloaded via BCP. +\providecommand{\kurdishnumerals}[2]{\kurdishnumber{#2}} \def\kurdishnumber#1{% \if@western@numerals @@ -18064,54 +18499,13 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages % \end{macrocode} % \iffalse %</gloss-lao.ldf> -%<*gloss-latex.ldf> -% \fi -% \clearpage -% -% \subsection{gloss-latex.ldf} -% \begin{macrocode} -\ProvidesFile{gloss-latex.ldf}[polyglossia: module for default language] - -\PolyglossiaSetup{latex}{ - hyphennames={english}, - hyphenmins={2,3}, - langtag=ENG, - fontsetup=true, -} - -\def\captionslatex{% - \def\prefacename{Preface}% - \def\refname{References}% - \def\abstractname{Abstract}% - \def\bibname{Bibliography}% - \def\chaptername{Chapter}% - \def\appendixname{Appendix}% - \def\contentsname{Contents}% - \def\listfigurename{List of Figures}% - \def\listtablename{List of Tables}% - \def\indexname{Index}% - \def\figurename{Figure}% - \def\tablename{Table}% - \def\partname{Part}% - \def\enclname{encl}% - \def\ccname{cc}% - \def\headtoname{To}% - \def\pagename{Page}% - \def\seename{see}% - \def\alsoname{see also}% - \def\proofname{Proof}% -} - -% \end{macrocode} -% \iffalse -%</gloss-latex.ldf> %<*gloss-latin.ldf> % \fi % \clearpage % % \subsection{gloss-latin.ldf} % \begin{macrocode} -\ProvidesFile{gloss-latin.ldf}[polyglossia: module for Latin v.2.3 2020-03-08] +\ProvidesFile{gloss-latin.ldf}[polyglossia: module for Latin v.2.4 2021-10-25] \ExplSyntaxOn @@ -18140,7 +18534,7 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \bool_new:N \l_polyglossia_latin_use_j_bool \bool_new:N \l_polyglossia_latin_use_v_bool -\bool_new:N \l_polyglossia_latin_use_digraphs_bool +\bool_new:N \l_polyglossia_latin_use_ligatures_bool \bool_new:N \l_polyglossia_latin_capitalize_month_bool \cs_new:Npn \polyglossia_latin_classical_character_codes: @@ -18501,7 +18895,7 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages { \bool_set_false:N \l_polyglossia_latin_use_j_bool \bool_set_false:N \l_polyglossia_latin_use_v_bool - \bool_set_false:N \l_polyglossia_latin_use_digraphs_bool + \bool_set_false:N \l_polyglossia_latin_use_ligatures_bool \bool_set_true:N \l_polyglossia_latin_capitalize_month_bool \bool_set_false:N \l_polyglossia_latin_punctuation_spacing_bool \str_set:Nn \l_polyglossia_latin_variant_str {classic} @@ -18513,7 +18907,7 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages { \bool_set_false:N \l_polyglossia_latin_use_j_bool \bool_set_false:N \l_polyglossia_latin_use_v_bool - \bool_set_true:N \l_polyglossia_latin_use_digraphs_bool + \bool_set_true:N \l_polyglossia_latin_use_ligatures_bool \bool_set_true:N \l_polyglossia_latin_capitalize_month_bool \bool_set_false:N \l_polyglossia_latin_punctuation_spacing_bool \str_set:Nn \l_polyglossia_latin_variant_str {medieval} @@ -18525,7 +18919,7 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages { \bool_set_false:N \l_polyglossia_latin_use_j_bool \bool_set_true:N \l_polyglossia_latin_use_v_bool - \bool_set_false:N \l_polyglossia_latin_use_digraphs_bool + \bool_set_false:N \l_polyglossia_latin_use_ligatures_bool \bool_set_true:N \l_polyglossia_latin_capitalize_month_bool \bool_set_false:N \l_polyglossia_latin_punctuation_spacing_bool \str_set:Nn \l_polyglossia_latin_variant_str {modern} @@ -18537,7 +18931,7 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages { \bool_set_false:N \l_polyglossia_latin_use_j_bool \bool_set_true:N \l_polyglossia_latin_use_v_bool - \bool_set_true:N \l_polyglossia_latin_use_digraphs_bool + \bool_set_true:N \l_polyglossia_latin_use_ligatures_bool \bool_set_false:N \l_polyglossia_latin_capitalize_month_bool \bool_set_true:N \l_polyglossia_latin_punctuation_spacing_bool \str_set:Nn \l_polyglossia_latin_variant_str {ecclesiastic} @@ -18632,7 +19026,7 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages { \def \prefacename { - \bool_if:NTF \l_polyglossia_latin_use_digraphs_bool {Præfatio} {Praefatio} + \bool_if:NTF \l_polyglossia_latin_use_ligatures_bool {Præfatio} {Praefatio} } \def \refname {Conspectus~librorum} \def \abstractname {Summarium} @@ -18658,7 +19052,7 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \cs_new:Npn \polyglossia_latin_month_name: { - \str_set:Nx \l_tmpa_str + \tl_set:Nx \l_tmpa_tl { \int_case:nn { \month } { @@ -18678,10 +19072,10 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages } \bool_if:NTF \l_polyglossia_latin_capitalize_month_bool { - \tl_mixed_case:n { \l_tmpa_str } + \text_titlecase:n { \l_tmpa_tl } } { - \str_use:N \l_tmpa_str + \l_tmpa_tl } } @@ -18830,28 +19224,28 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages { \str_case:nnF {#1} { - {A} { \polyglossia_latin_digraph_shorthand:Nnn E { Æ } + {A} { \polyglossia_latin_ligature_shorthand:Nnn E { Æ } { - \polyglossia_latin_digraph_shorthand:Nnn e { Æ } + \polyglossia_latin_ligature_shorthand:Nnn e { Æ } { \polyglossia_latin_allow_hyphens: A } } } - {a} { \polyglossia_latin_digraph_shorthand:Nnn e { æ } + {a} { \polyglossia_latin_ligature_shorthand:Nnn e { æ } { \polyglossia_latin_allow_hyphens: a } } - {O} { \polyglossia_latin_digraph_shorthand:Nnn E { Œ } + {O} { \polyglossia_latin_ligature_shorthand:Nnn E { Œ } { - \polyglossia_latin_digraph_shorthand:Nnn e { Œ } + \polyglossia_latin_ligature_shorthand:Nnn e { Œ } { \polyglossia_latin_allow_hyphens: O } } } - {o} { \polyglossia_latin_digraph_shorthand:Nnn e { œ } + {o} { \polyglossia_latin_ligature_shorthand:Nnn e { œ } { \polyglossia_latin_allow_hyphens: o } @@ -18861,23 +19255,20 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages {>} { » } } { - \token_if_letter:NTF #1 { \polyglossia_latin_allow_hyphens: #1 } + \tl_if_single_token:nTF {#1} { - \token_if_eq_meaning:NNTF #1 \AE { \polyglossia_latin_allow_hyphens: #1 } + \token_if_letter:NTF #1 { \polyglossia_latin_allow_hyphens: } { - \token_if_eq_meaning:NNTF #1 \ae { \polyglossia_latin_allow_hyphens: #1 } + \polyglossia_latin_if_ligature_command:NTF #1 { \polyglossia_latin_allow_hyphens: } { - \token_if_eq_meaning:NNTF #1 \OE { \polyglossia_latin_allow_hyphens: #1 } - { - \token_if_eq_meaning:NNTF #1 \oe { \polyglossia_latin_allow_hyphens: #1 } - { - \token_to_str:N " - #1 - } - } + \token_to_str:N " } } } + { + \token_to_str:N " + } + #1 } } @@ -18885,22 +19276,22 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages { \str_case:nnF {#1} { - {A} { \polyglossia_latin_digraph_shorthand:Nnn E { Ǽ } + {A} { \polyglossia_latin_ligature_shorthand:Nnn E { Ǽ } { - \polyglossia_latin_digraph_shorthand:Nnn e { Ǽ } { Á } + \polyglossia_latin_ligature_shorthand:Nnn e { Ǽ } { Á } } } - {a} { \polyglossia_latin_digraph_shorthand:Nnn e { ǽ } { á } } + {a} { \polyglossia_latin_ligature_shorthand:Nnn e { ǽ } { á } } {E} { É } {e} { é } {I} { Í } {i} { í } - {O} { \polyglossia_latin_digraph_shorthand:Nnn E { \'Œ } + {O} { \polyglossia_latin_ligature_shorthand:Nnn E { \'Œ } { - \polyglossia_latin_digraph_shorthand:Nnn e { \'Œ } { Ó } + \polyglossia_latin_ligature_shorthand:Nnn e { \'Œ } { Ó } } } - {o} { \polyglossia_latin_digraph_shorthand:Nnn e { \'œ } { ó } } + {o} { \polyglossia_latin_ligature_shorthand:Nnn e { \'œ } { ó } } {U} { Ú } {u} { ú } {V} { \' V } % V may be a vowel, but lowercase v is never used as a vowel. @@ -18912,20 +19303,17 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages {œ} { \'œ } } { - \token_if_eq_meaning:NNTF #1 \AE { Ǽ } + \tl_if_single_token:nTF {#1} { - \token_if_eq_meaning:NNTF #1 \ae { ǽ } + \polyglossia_latin_if_ligature_command:NTF #1 { \' } { - \token_if_eq_meaning:NNTF #1 \OE { \'Œ } - { - \token_if_eq_meaning:NNTF #1 \oe { \'œ } - { - \token_to_str:N ' - #1 - } - } + \token_to_str:N ' } } + { + \token_to_str:N ' + } + #1 } } @@ -18933,9 +19321,9 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages { \str_case:nnF {#1} { - {A} { \polyglossia_latin_diphthong_macron:NNn AE + {A} { \polyglossia_latin_ligature_macron:NNnn AE { Ǣ } { - \polyglossia_latin_diphthong_macron:NNn Ae + \polyglossia_latin_ligature_macron:NNnn Ae { Ǣ } { \polyglossia_latin_diphthong_macron:NNn AU { @@ -18944,7 +19332,7 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages } } } - {a} { \polyglossia_latin_diphthong_macron:NNn ae + {a} { \polyglossia_latin_ligature_macron:NNnn ae { ǣ } { \polyglossia_latin_diphthong_macron:NNn au { ā } } @@ -18957,12 +19345,12 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages {e} { \polyglossia_latin_diphthong_macron:NNn eu { ē } } {I} { Ī } {i} { ī } - {O} { \polyglossia_latin_diphthong_macron:NNn OE + {O} { \polyglossia_latin_ligature_macron:NNnn OE { \=Œ } { - \polyglossia_latin_diphthong_macron:NNn Oe { Ō } + \polyglossia_latin_ligature_macron:NNnn Oe { \=Œ } { Ō } } } - {o} { \polyglossia_latin_diphthong_macron:NNn oe { ō } } + {o} { \polyglossia_latin_ligature_macron:NNnn oe { \=œ } { ō } } {U} { Ū } {u} { ū } {V} { \= V } % V may be a vowel, but lowercase v is never used as a vowel. @@ -18970,7 +19358,16 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages {y} { ȳ } } { - \token_to_str:N = + \tl_if_single_token:nTF {#1} + { + \polyglossia_latin_if_ligature_command:NTF #1 { \= } + { + \token_to_str:N = + } + } + { + \token_to_str:N = + } #1 } } @@ -19007,12 +19404,12 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \bbl@allowhyphens } -\cs_new:Npn \polyglossia_latin_digraph_shorthand:Nnn #1#2#3 -% #1: second letter of digraph (E or e) -% #2: digraph character -% #3: non-digraph code +\cs_new:Npn \polyglossia_latin_ligature_shorthand:Nnn #1#2#3 +% #1: second letter of ligature (E or e) +% #2: ligature character +% #3: non-ligature code { - \bool_if:NTF \l_polyglossia_latin_use_digraphs_bool + \bool_if:NTF \l_polyglossia_latin_use_ligatures_bool { \peek_meaning_remove:NTF #1 {#2} {#3} } @@ -19021,12 +19418,60 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages } } +\msg_new:nnn {polyglossia} {latin / no-double-macron-font} + { + The~combining~double~macron~(U+035E)~is~not~available~in~the~current~ + font.~The~diphthong~is~typeset~without~macron~ \msg_line_context: . + } + \cs_new:Npn \polyglossia_latin_diphthong_macron:NNn #1#2#3 % #1: first character of diphthong % #2: second character of diphthong % #3: non-diphthong code { - \peek_meaning:NTF #2 { #1 \char "35E \relax } {#3} % U+35E: combining double macron + \peek_meaning:NTF #2 + { + #1 + \iffontchar \font "35E \relax % U+35E: combining double macron + \char "35E \relax + \else + \msg_warning:nn {polyglossia} {latin / no-double-macron-font} + \fi + } + { + #3 + } + } + +\cs_new:Npn \polyglossia_latin_ligature_macron:NNnn #1#2#3#4 +% #1: first character of diphthong +% #2: second character of diphthong +% #3: ligature code +% #4: false code + { + \polyglossia_latin_ligature_shorthand:Nnn #2 {#3} + { + \polyglossia_latin_diphthong_macron:NNn #1 #2 {#4} + } + } + +% The following conditional tests if the argument is a ligature command (\AE, +% \ae, \OE, or \oe). +\prg_new_conditional:Npnn \polyglossia_latin_if_ligature_command:N #1 {TF} + { + \token_if_eq_meaning:NNTF #1 \AE { \prg_return_true: } + { + \token_if_eq_meaning:NNTF #1 \ae { \prg_return_true: } + { + \token_if_eq_meaning:NNTF #1 \OE { \prg_return_true: } + { + \token_if_eq_meaning:NNTF #1 \oe { \prg_return_true: } + { + \prg_return_false: + } + } + } + } } \cs_new:Npn \polyglossia_latin_no_shorthands: @@ -19644,8 +20089,8 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \def\datemalay@indonesian{% \def\today{\number\day~\ifcase\month\or - Januari\or Pebruari\or Maret\or April\or Mei\or Juni\or - Juli\or Agustus\or September\or Oktober\or Nopember\or Desember\fi + Januari\or Februari\or Maret\or April\or Mei\or Juni\or + Juli\or Agustus\or September\or Oktober\or November\or Desember\fi \space \number\year}} \def\datemalay@malay{% @@ -20170,12 +20615,12 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages } \def\blockextras@mongolian{% - \ifcyrillic@numerals\mongolian@numbers\fi% - \ifmongolian@babelshorthands\mongolian@shorthands\fi% + \ifcyrillic@numerals\mongolian@numbers\else\nomongolian@numbers\fi% + \ifmongolian@babelshorthands\mongolian@shorthands\else\nomongolian@shorthands\fi% } \def\inlineextras@mongolian{% - \ifmongolian@babelshorthands\mongolian@shorthands\fi% + \ifmongolian@babelshorthands\mongolian@shorthands\else\nomongolian@shorthands\fi% } % \end{macrocode} @@ -20676,12 +21121,12 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \lccode\string"2019=\string"2019% \clubpenalty=3000 \@clubpenalty=3000 \widowpenalty=3000% \finalhyphendemerits=50000000% - \ifoccitan@babelshorthands\occitan@shorthands\fi% + \ifoccitan@babelshorthands\occitan@shorthands\else\nooccitan@shorthands\fi% } \def\inlineextras@occitan{% \lccode\string"2019=\string"2019% - \ifoccitan@babelshorthands\occitan@shorthands\fi% + \ifoccitan@babelshorthands\occitan@shorthands\else\nooccitan@shorthands\fi% } %% Distributable under the LaTeX Project Public License, %% version 1.3c or higher (your choice). The latest version of @@ -20958,12 +21403,12 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \lccode\string"2019=\string"2019% \clubpenalty=3000 \@clubpenalty=3000 \widowpenalty=3000% \finalhyphendemerits=50000000% - \ifpiedmontese@babelshorthands\piedmontese@shorthands\fi% + \ifpiedmontese@babelshorthands\piedmontese@shorthands\else\nopiedmontese@shorthands\fi% } \def\inlineextras@piedmontese{% \lccode\string"2019=\string"2019% - \ifpiedmontese@babelshorthands\piedmontese@shorthands\fi% + \ifpiedmontese@babelshorthands\piedmontese@shorthands\else\nopiedmontese@shorthands\fi% } %%% CHANGES END %%% % \end{macrocode} @@ -21082,6 +21527,10 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \setlanguagealias[variant=portuguese]{portuguese}{portuges} \setlanguagealias[variant=brazilian]{portuguese}{brazil} +\ifluatex + \RequirePackage{luavlna} +\fi + \def\portuguese@variant{portuges} \define@choicekey*+{portuguese}{variant}[\xpg@val\xpg@nr]{portuguese,brazilian}[portuguese]{% \ifcase\xpg@nr\relax @@ -21098,10 +21547,91 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \xpg@info{Option: portuguese, variant=\xpg@val}% }{\xpg@warning{Unknown portuguese variant `#1'}} +\define@boolkey{portuguese}[portuguese@]{babelshorthands}[true]{} + +\define@boolkey{portuguese}[portuguese@]{splithyphens}[true]{} % Register default options -\xpg@initialize@gloss@options{portuguese}{variant=portuguese} +\xpg@initialize@gloss@options{portuguese}{variant=portuguese, + babelshorthands=false, + splithyphens=true} + +\ifsystem@babelshorthands + \setkeys{portuguese}{babelshorthands=true} +\else + \setkeys{portuguese}{babelshorthands=false} +\fi + +\ifcsundef{initiate@active@char}{% + \input{babelsh.def}% + \initiate@active@char{"}% + \shorthandoff{"}% +}{} + +\def\portuguese@@splhyphen#1{% + \def\portuguese@sh@tmp{% + \if\portuguese@sh@next-#1% + \else\expandafter\portuguese@@@splhyphen{#1}\fi% + }% + \futurelet\portuguese@sh@next\portuguese@sh@tmp% +} +\def\portuguese@@@splhyphen#1{% + \ifnum\hyphenchar \font>0% + \kern\z@\discretionary{-}{\char\hyphenchar\the\font}{#1}% + \nobreak\hskip\z@% + \else% + #1% + \fi% +} + +\def\portuguese@splhyphen{% + \portuguese@@splhyphen{-}% +} + +\def\portuguese@shorthands{% + \bbl@activate{"}% + \def\language@group{portuguese}% + \declare@shorthand{portuguese}{"=}{\portuguese@splhyphen}% + \declare@shorthand{portuguese}{""}{\hskip\z@skip}% + \declare@shorthand{portuguese}{"~}{\textormath{\leavevmode\hbox{-}}{-}}% + \declare@shorthand{portuguese}{"-}{\nobreak\-\bbl@allowhyphens}% + \declare@shorthand{portuguese}{"|}{% + \textormath{\penalty\@M\discretionary{-}{}{\kern.03em}% + \bbl@allowhyphens}{}% + }% + \declare@shorthand{portuguese}{"/}{\textormath + {\bbl@allowhyphens\discretionary{/}{}{/}\bbl@allowhyphens}{}}% + \declare@shorthand{portuguese}{"<}{«}% + \declare@shorthand{portuguese}{">}{»}% +} + +\def\noportuguese@shorthands{% + \@ifundefined{initiate@active@char}{}{\bbl@deactivate{"}}% +} + +\ifxetex + % splithyphens + \newXeTeXintercharclass\portuguese@hyphen % - +\fi + +\def\portuguese@hyphens{% + \ifluatex + \AfterPreamble{\enablesplithyphens{portuguese}}% + \else + \XeTeXinterchartokenstate=1 + \XeTeXcharclass `\- \portuguese@hyphen + \XeTeXinterchartoks \z@ \portuguese@hyphen = {\portuguese@@splhyphen}% "-" -> "\portuguese@@splhyphen-" + \fi% +} + +\def\noportuguese@hyphens{% + \ifluatex + \AfterPreamble{\disablesplithyphens{portuguese}}% + \else + \XeTeXcharclass `\- \z@ + \fi% +} \def\portuguese@language{% \polyglossia@setup@language@patterns{\portuguese@variant}% @@ -21177,6 +21707,21 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \def\dateportuguese{% \csname dateportuguese@\portuguese@variant\endcsname% } + +\def\noextras@portuguese{% + \ifportuguese@babelshorthands\noportuguese@shorthands\fi% + \noportuguese@hyphens% +} + +\def\blockextras@portuguese{% + \ifportuguese@babelshorthands\portuguese@shorthands\else\noportuguese@shorthands\fi% + \ifportuguese@splithyphens\portuguese@hyphens\else\noportuguese@hyphens\fi% +} + +\def\inlineextras@portuguese{% + \ifportuguese@babelshorthands\portuguese@shorthands\else\noportuguese@shorthands\fi% + \ifportuguese@splithyphens\portuguese@hyphens\else\noportuguese@hyphens\fi% +} % \end{macrocode} % \iffalse @@ -21646,12 +22191,12 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \def\blockextras@russian{% \russian@capsformat% - \ifcyrillic@numerals\russian@numbers\fi% - \ifrussian@babelshorthands\russian@shorthands\fi% + \ifcyrillic@numerals\russian@numbers\else\norussian@numbers\fi% + \ifrussian@babelshorthands\russian@shorthands\else\norussian@shorthands\fi% } \def\inlineextras@russian{% - \ifrussian@babelshorthands\russian@shorthands\fi% + \ifrussian@babelshorthands\russian@shorthands\else\norussian@shorthands\fi% } %%% These lines taken from russianb.ldf, part of babel package. @@ -21875,8 +22420,9 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages % Register default options \xpg@initialize@gloss@options{sanskrit}{script=Devanagari,numerals=Devanagari} - -\newcommand{\sanskritnumerals}[2]{\sanskritnumber{#2}} +% Use \providecommand here as the ldf file might +% be reloaded via BCP. +\providecommand{\sanskritnumerals}[2]{\sanskritnumber{#2}} \def\sanskritnumber#1{% \ifsanskrit@devanagari@numerals @@ -21982,7 +22528,8 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages langtag=SRB, hyphennames={serbian}, hyphenmins={2,2}, - indentfirst=true, + frenchspacing=true, % Правопис српскога језика, Матица српска, 2010. (измењено и допуњено, четврто издање): т. 188, под Обликовање ступца и пасуса + indentfirst=true, % Правопис српскога језика, Матица српска, 2010. (измењено и допуњено, четврто издање): т. 188, под Обликовање ступца и пасуса fontsetup=false, localnumeral=serbiannumerals, Localnumeral=Serbiannumerals, @@ -21998,6 +22545,10 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages % Babel aliases \setlanguagealias[script=Cyrillic]{serbian}{serbianc} +\ifluatex + \RequirePackage{luavlna} +\fi + \newif\if@serbian@cyr \define@choicekey*+{serbian}{Script}[\xpg@val\xpg@nr]{cyrillic,latin}[cyrillic]{% \ifcase\xpg@nr\relax @@ -22041,10 +22592,12 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \xpg@info{Option: Serbian, numerals=\xpg@val}% }{\xpg@warning{Unknown Serbian numerals value `#1'}} +\define@boolkey{serbian}[serbian@]{splithyphens}[true]{} + \setkeys{serbian}{Script,numerals} % Register default options -\xpg@initialize@gloss@options{serbian}{script=Cyrillic,numerals=arabic} +\xpg@initialize@gloss@options{serbian}{script=Cyrillic,numerals=arabic,splithyphens=true} \def\captionsserbian{% \if@serbian@cyr\captionsserbian@cyr\else\captionsserbian@lat\fi @@ -22125,9 +22678,10 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages децембар\fi \space \number\year.}% } - -\newcommand{\serbiannumerals}[2]{\serbiannumber{#2}} -\newcommand{\Serbiannumerals}[2]{\Serbiannumber{#2}} +% Use \providecommand here as the ldf file might +% be reloaded via serbianc. +\providecommand{\serbiannumerals}[2]{\serbiannumber{#2}} +\providecommand{\Serbiannumerals}[2]{\Serbiannumber{#2}} \def\serbiannumber#1{% \ifcyrillic@numerals @@ -22172,12 +22726,65 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \let\@Alph\latin@Alph } +\def\serbian@@splhyphen#1{% + \def\serbian@sh@tmp{% + \if\serbian@sh@next-#1% + \else\expandafter\serbian@@@splhyphen{#1}\fi% + }% + \futurelet\serbian@sh@next\serbian@sh@tmp% +} + +\def\serbian@@@splhyphen#1{% + \ifnum\hyphenchar \font>0% + \kern\z@\discretionary{-}{\char\hyphenchar\the\font}{#1}% + \nobreak\hskip\z@% + \else% + #1% + \fi% +} + +\def\serbian@splhyphen{% + \serbian@@splhyphen{-}% +} + +\ifxetex + % splithyphens + \newXeTeXintercharclass\serbian@hyphen % - + \newXeTeXintercharclass\serbian@nonsyllabicpreposition% +\fi + +\def\serbian@hyphens{% + \ifluatex + \AfterPreamble{\enablesplithyphens{serbian}}% + \else + \XeTeXinterchartokenstate=1 + \XeTeXcharclass `\- \serbian@hyphen + \XeTeXinterchartoks \z@ \serbian@hyphen = {\serbian@@splhyphen}% "-" -> "\serbian@@splhyphen-" + % necessary if used together with vlna: + \XeTeXinterchartoks \serbian@nonsyllabicpreposition \serbian@hyphen = {\serbian@@splhyphen}% "-" -> "\serbian@@splhyphen-" + \fi% +} + +\def\noserbian@hyphens{% + \ifluatex + \AfterPreamble{\disablesplithyphens{serbian}}% + \else + \XeTeXcharclass `\- \z@ + \fi% +} + \def\blockextras@serbian{% - \ifcyrillic@numerals\serbian@numbers\fi + \ifcyrillic@numerals\serbian@numbers\else\noserbian@numbers\fi% + \ifserbian@splithyphens\serbian@hyphens\else\noserbian@hyphens\fi% +} + +\def\inlineextras@serbian{% + \ifserbian@splithyphens\serbian@hyphens\else\noserbian@hyphens\fi% } \def\noextras@serbian{% - \ifcyrillic@numerals\noserbian@numbers\fi + \ifcyrillic@numerals\noserbian@numbers\fi% + \noserbian@hyphens% } \def\Asbuk#1{\expandafter\serbian@asbuk@Alph\csname c@#1\endcsname} @@ -22186,21 +22793,21 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \def\AsbukTrad#1{\expandafter\cyr@Alph\csname c@#1\endcsname} \def\asbukTrad#1{\expandafter\cyr@alph\csname c@#1\endcsname} -% This is a poor man's cyrillic alphanumeric. It just uses the alphabet and -% thus ends at 30. +% This is a poor man's cyrillic alphanumeric. +% It just uses the alphabet and thus ends at 30. \def\serbian@asbuk@Alph#1{\ifcase#1\or - А\or Б\or В\or Г\or Д\or Е\or Ж\or - З\or И\or К\or Л\or М\or Н\or О\or - П\or Р\or С\or Т\or У\or Ф\or Х\or - Ц\or Ч\or Ш\or Щ\or Э\or Ю\or Я% + А\or Б\or В\or Г\or Д\or Ђ\or Е\or Ж\or + З\or И\or Ј\or К\or Л\or Љ\or М\or Н\or + Њ\or О\or П\or Р\or С\or Т\or Ћ\or У\or + Ф\or Х\or Ц\or Ч\or Џ\or Ш% \else\xpg@ill@value{#1}{serbian@asbuk@Alph}\fi% } \def\serbian@asbuk@alph#1{\ifcase#1\or - а\or б\or в\or г\or д\or е\or ж\or - з\or и\or к\or л\or м\or н\or о\or - п\or р\or с\or т\or у\or ф\or х\or - ц\or ч\or ш\or щ\or э\or ю\or я% + а\or б\or в\or г\or д\or ђ\or е\or ж\or + з\or и\or ј\or к\or л\or љ\or м\or н\or + њ\or о\or п\or р\or с\or т\or ћ\or у\or + ф\or х\or ц\or ч\or џ\or ш% \else\xpg@ill@value{#1}{serbian@asbuk@alph}\fi% } @@ -22268,6 +22875,14 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages }{} \def\slovak@@splhyphen#1{% + \def\slovak@sh@tmp{% + \if\slovak@sh@next-#1% + \else\expandafter\slovak@@@splhyphen{#1}\fi% + }% + \futurelet\slovak@sh@next\slovak@sh@tmp% +} + +\def\slovak@@@splhyphen#1{% \ifnum\hyphenchar \font>0% \kern\z@\discretionary{-}{\char\hyphenchar\the\font}{#1}% \nobreak\hskip\z@% @@ -22463,13 +23078,13 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages } \def\blockextras@slovak{% - \ifslovak@babelshorthands\slovak@shorthands\fi% + \ifslovak@babelshorthands\slovak@shorthands\else\noslovak@shorthands\fi% \ifslovak@vlna\slovak@vlna\else\noslovak@vlna\fi% \ifslovak@splithyphens\slovak@hyphens\else\noslovak@hyphens\fi% } \def\inlineextras@slovak{% - \ifslovak@babelshorthands\slovak@shorthands\fi% + \ifslovak@babelshorthands\slovak@shorthands\else\noslovak@shorthands\fi% \ifslovak@vlna\slovak@vlna\else\noslovak@vlna\fi% \ifslovak@splithyphens\slovak@hyphens\else\noslovak@hyphens\fi% } @@ -22933,7 +23548,9 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \let\tgh\relax% } -\newcommand*\spanishoperator[2][]{% +% Use \providecommand here as the ldf file might +% be reloaded via babel aliases. +\providecommand*\spanishoperator[2][]{% \ifx#1\\\\ \protected@csxdef{#2}{\mathop{\operator@font #2}\nolimits}% \else @@ -23590,8 +24207,10 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \def\tmp@tibetan{tibetan} \define@key{tibetan}{numerals}[tibetan]{% \def\@tmpa{#1}% - \ifx\@tmpa\tmp@tibetan\@tibetan@numeralstrue\else - \@tibetan@numeralsfalse\fi + \ifx\@tmpa\tmp@tibetan\@tibetan@numeralstrue% + \else + \@tibetan@numeralsfalse% + \fi% } \ifluatex @@ -23600,23 +24219,23 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \fi \def\tibetan@eol{% - \ifluatex % - \xpg@tibteol=1\relax % + \ifluatex% + \xpg@tibteol=1\relax% \directlua{polyglossia.activate_tibt_eol()}% - \else % + \else% \XeTeXlinebreaklocale "bo"% \XeTeXlinebreakskip=0pt plus 0.1em% doesn't do much, but doesn't harm I guess... - \fi % + \fi% } \def\notibetan@eol{% - \ifluatex % - \xpg@tibteol=0\relax % + \ifluatex% + \xpg@tibteol=0\relax% %\directlua{polyglossia.activate_tibt_eol()}% - \else % + \else% \XeTeXlinebreaklocale "en"% en? really? \XeTeXlinebreakskip=0pt plus 0pt% - \fi % + \fi% } % Register default options @@ -23649,6 +24268,7 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \def\proofname{བདེན་དཔང་།}% not sure about this one... \def\glossaryname{མིང་ཚིག་རེའུ་མིག།}% } + \def\datetibetan{% \def\tibetan@month{% \ifcase\month\or @@ -23673,6 +24293,7 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages } \def\tibetandigits#1{\expandafter\@tibetan@digits #1@} + \def\@tibetan@digits#1{% \ifx @#1% then terminate \else @@ -23691,14 +24312,28 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \fi} \def\@tibetanalph#1{% - \ifcase#1\or ཀ\or ཁ\or ག\or ང\or ཅ\or ཆ\or ཇ\or ཉ\or ཏ\or ཐ\or ད\or ན\or པ\or - ཕ\or བ\or མ\or ཙ\or ཚ\or ཛ\or ཝ\or ཞ\or ཟ\or འ\or ཡ\or ར\or ལ\or ཤ\or ས\or ཧ\or ཨ - \else\xpg@ill@value{#1}{@tibetanalph}\fi} -\def\tibetanAlph#1{\expandafter\@tibetanAlph\csname c@#1\endcsname} + \ifcase#1\or ཀ\or ཁ\or ག\or ང\or ཅ\or ཆ\or + ཇ\or ཉ\or ཏ\or ཐ\or ད\or ན\or པ\or ཕ\or + བ\or མ\or ཙ\or ཚ\or ཛ\or ཝ\or ཞ\or ཟ\or + འ\or ཡ\or ར\or ལ\or ཤ\or ས\or ཧ\or ཨ + \else% + \xpg@ill@value{#1}{@tibetanalph}% + \fi% +} + +\def\tibetanAlph#1{% + \expandafter\@tibetanAlph\csname c@#1\endcsname% +} + \def\@tibetanAlph#1{% - \ifcase#1\or ཀ\or ཁ\or ག\or ང\or ཅ\or ཆ\or ཇ\or ཉ\or ཏ\or ཐ\or ད\or ན\or པ\or - ཕ\or བ\or མ\or ཙ\or ཚ\or ཛ\or ཝ\or ཞ\or ཟ\or འ\or ཡ\or ར\or ལ\or ཤ\or ས\or ཧ\or ཨ - \else\xpg@ill@value{#1}{@tibetanalph}\fi} + \ifcase#1\or ཀ\or ཁ\or ག\or ང\or ཅ\or ཆ\or ཇ\or + ཉ\or ཏ\or ཐ\or ད\or ན\or པ\or ཕ\or བ\or མ\or ཙ\or + ཚ\or ཛ\or ཝ\or ཞ\or ཟ\or འ\or ཡ\or ར\or ལ\or ཤ\or + ས\or ཧ\or ཨ% + \else% + \xpg@ill@value{#1}{@tibetanalph}% + \fi% +} \newcommand{\tibetanumerals}[2]{\tibetannumber{#2}} @@ -23708,13 +24343,16 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \let\@Alph\@tibetanAlph% \fi } + \def\notibetan@numbers{% \let\@alph\latin@alph% \let\@Alph\latin@Alph% } +% Store original definition +\let\xpg@orig@arabic\@arabic + \def\tibetan@globalnumbers{% - \let\xpg@orig@arabic\@arabic% \let\@arabic\tibetannumber% \renewcommand{\thefootnote}{\localnumeral*{footnote}}% } @@ -23725,17 +24363,31 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \def\noextras@tibetan{% \notibetan@eol% - \ifcsname xpg@orig@baselinestretch\endcsname\renewcommand{\baselinestretch}{\xpg@orig@baselinestretch}\fi % - } + \ifcsname xpg@orig@baselinestretch\endcsname% + \renewcommand{\baselinestretch}{\xpg@orig@baselinestretch}% + \fi% +} \def\inlineextras@tibetan{% - \xdef\xpg@orig@baselinestretch{\ifcsname baselinestretch\endcsname \baselinestretch \else 1\fi}% + \xdef\xpg@orig@baselinestretch{% + \ifcsname baselinestretch\endcsname + \baselinestretch + \else + 1% + \fi% + }% \renewcommand{\baselinestretch}{1.2}% \tibetan@eol% - } +} \def\blockextras@tibetan{% - \xdef\xpg@orig@baselinestretch{\ifcsname baselinestretch\endcsname \baselinestretch \else 1\fi}% + \xdef\xpg@orig@baselinestretch{% + \ifcsname baselinestretch\endcsname + \baselinestretch + \else + 1% + \fi% + }% \renewcommand{\baselinestretch}{1.2}% \tibetan@eol% } @@ -24134,8 +24786,8 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \let\ukrainiannumeral=\ukrainiannumber \let\Ukrainiannumeral=\Ukrainiannumber -\def\Asbuk#1{\expandafter\ukranian@asbuk@Alph\csname c@#1\endcsname} -\def\asbuk#1{\expandafter\ukranian@asbuk@alph\csname c@#1\endcsname} +\def\Asbuk#1{\expandafter\ukrainian@asbuk@Alph\csname c@#1\endcsname} +\def\asbuk#1{\expandafter\ukrainian@asbuk@alph\csname c@#1\endcsname} \def\AsbukTrad#1{\expandafter\cyr@Alph\csname c@#1\endcsname} \def\asbukTrad#1{\expandafter\cyr@alph\csname c@#1\endcsname} @@ -24180,12 +24832,12 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages \def\blockextras@ukrainian{% \ukrainian@capsformat% - \ifcyrillic@numerals\ukrainian@numbers\fi% - \ifukrainian@babelshorthands\ukrainian@shorthands\fi% + \ifcyrillic@numerals\ukrainian@numbers\else\noukrainian@numbers\fi% + \ifukrainian@babelshorthands\ukrainian@shorthands\else\noukrainian@shorthands\fi% } \def\inlineextras@ukrainian{% - \ifukrainian@babelshorthands\ukrainian@shorthands\fi% + \ifukrainian@babelshorthands\ukrainian@shorthands\else\noukrainian@shorthands\fi% } %%% stuff from Babel diff --git a/macros/unicodetex/latex/polyglossia/polyglossia.pdf b/macros/unicodetex/latex/polyglossia/polyglossia.pdf Binary files differindex efbcbab0cb..74e64410ad 100644 --- a/macros/unicodetex/latex/polyglossia/polyglossia.pdf +++ b/macros/unicodetex/latex/polyglossia/polyglossia.pdf diff --git a/systems/win32/miktex/tm/packages/next/pr.ini b/systems/win32/miktex/tm/packages/next/pr.ini index 30419a9226..11aa21bf5c 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=1648329431
+date=1648412278
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=7408ff645dcc9f430041903271d25128
+lstdigest=360f852029301e5e08eaae9b75d7ff5b
numpkg=5465
relstate=next
-version=8120
+version=8121
;;;;This configuration file is signed by a MiKTeX maintainer. The signature follows.
;;;;-----BEGIN MIKTEX SIGNATURE-----
-;;;; signature/miktex: p3/1CIHoOFoX6Rj0i916mKmVqsv9j80DfTrmaoiJoSK6/Z8XcMswqmIFL0Qf5xVcTbdHKBHVJBrWacb6HVf3r79/EMbDKPinmKNIdXytPs0AunDkwwT+nutKP+9ZU4yvD5IGZSUlLwxsROjEcfGH6+co8iCcAIdEKr9u96XL1qrnXuaKdwq7AXa+fllSba9gPNJ/QC0Rwt17DkQPUuqtAdyk3zP8Cs0apn2z1T46EYeCR+fxuQRu8fuKttLYwUSANCniKSQPBjOYl+7ECUEng9MQO25Id2VmTq0CMTcPkmGVRjUeWbdXDgegYqYatZflTtKbSwUdKx0nhlOqL1efug==
+;;;; signature/miktex: krycG7kk0BMZAQYeuM9+/untzWB0Vxe69UjmkgWwOGNTAL1kiEhIZq36YRbbg64xmy9zCJ+ut0PQg7o17Hko4WNbw0j5TEPG8UyfJDgRwwzYHXJ2fQgv6CwXNoAcKfps6ZcG/yyTuTYze1vtOiRs79PytaZ1SCkoPXt1IhmV3yE3QepLkGF9BElfD/d4Nlas5Wq0B/V71dzQb/N8GLxciHMDl/CGUuBQk5IlqIOaZNsTn9LSk0AAQnsVQ/0Tla2SZHfKQwwZIWf+fYFp6TJG8P0QHqJOLow7yBOVt0VM65rJO61sBwXTFA1tbXHJMmBBkSsrihh/WsUSYtPsgBUYow==
;;;;-----END MIKTEX SIGNATURE-----
diff --git a/systems/win32/miktex/tm/packages/pr.ini b/systems/win32/miktex/tm/packages/pr.ini index dfee1f7ca2..c7f6292740 100644 --- a/systems/win32/miktex/tm/packages/pr.ini +++ b/systems/win32/miktex/tm/packages/pr.ini @@ -1,13 +1,13 @@ [repository]
-date=1648329076
+date=1648411868
lastupd=altsubsup altsubsup__doc altsubsup__source asmeconf asmeconf__doc asmeconf__source babel-polish babel-polish__doc babel-polish__source biblatex-gb7714-2015 biblatex-gb7714-2015__doc biblatex-gb7714-2015__source bxorigcapt bxorigcapt__doc chemmacros chemmacros__doc chemmacros__source dehyph-exptl dehyph-exptl__doc dehyph-exptl__source
-lstdigest=7587c6cdeeba9ae4184869205a85a1e8
+lstdigest=3b25d1dec293b0adbac8f53e6bb2ad84
numpkg=5465
relstate=stable
-version=8120
+version=8121
;;;;This configuration file is signed by a MiKTeX maintainer. The signature follows.
;;;;-----BEGIN MIKTEX SIGNATURE-----
-;;;; signature/miktex: HP5F3V2IywM6gxIqpmOZLUoD8mo7IXcwQE4B1DL5BqPtfX+USNjdjMy45MvzA0p6aeiekTHLRx5ejE62Em5RFQozVftAhLsmag1siu2EDXl2yT52twenbfsOXstBSgDwnHhGuB7kmxFieAAfm9aoKN1l28FRVnjDO/tF5fI4+9iKCdmvP2opaxpPtFFvBfM1mxYhBwBXX+lNZ+KuF20x74d5uqQRk2JGu/uzFz0Qr6PAh/jb2C/pcnniy8E+ksdxcX0eKs0KvY5sdUg6wqLCiVJtnha3gKXZOZHAX0iCP3446Nzg5JyH0MQ6Tt9RtO+/0ffC3iZbSerlurylrfftOQ==
+;;;; signature/miktex: KBPlYR9Mp8dExO9lnN0cW9wewwl6CU9b5xGr/7VKDg/TBl5LhUzjB3SUAnJO3ULbjEEGaJihRSEFY5PEqiixLUyUj5EcT07HpfqpJHSDOj6EfGEADkcfUNby3Kux2bb2K0LVFP/UbrRABGkSYSG0YyjU+PdFog2YS/Td/0L7zSfoPJNkQxxMFLge4XWOojWRjNYM8cz6xVBALlX7PwKqCNWIi3ODLCd0t64I5euSKnN/UAlXzQwxevbkqxj45OjsbECI+Fu7J8YQ5kQEpbKwybyAZu0C3UYy/3m55nOx2OVsLZOt0IUBTS4w0NU44RRWJWBBoESiq8FLxN4tk358kw==
;;;;-----END MIKTEX SIGNATURE-----
@@ -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: -2022-03-27-02-02 +2022-03-28-02-02 |