summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--FILES.byname803
-rw-r--r--FILES.byname.gzbin2264669 -> 2264631 bytes
-rw-r--r--FILES.last07days770
-rw-r--r--fonts/haranoaji-extra/HaranoAjiGothic-ExtraLight.otfbin4408232 -> 4408088 bytes
-rw-r--r--fonts/haranoaji-extra/HaranoAjiGothic-Light.otfbin4679168 -> 4679024 bytes
-rw-r--r--fonts/haranoaji-extra/HaranoAjiGothic-Normal.otfbin4701536 -> 4701392 bytes
-rw-r--r--fonts/haranoaji-extra/HaranoAjiMincho-ExtraLight.otfbin5834860 -> 5834604 bytes
-rw-r--r--fonts/haranoaji-extra/HaranoAjiMincho-Heavy.otfbin6480136 -> 6479916 bytes
-rw-r--r--fonts/haranoaji-extra/HaranoAjiMincho-Medium.otfbin6395224 -> 6394968 bytes
-rw-r--r--fonts/haranoaji-extra/HaranoAjiMincho-SemiBold.otfbin6431008 -> 6430788 bytes
-rw-r--r--fonts/haranoaji-extra/README2
-rw-r--r--fonts/haranoaji/HaranoAjiGothic-Bold.otfbin4857996 -> 4857852 bytes
-rw-r--r--fonts/haranoaji/HaranoAjiGothic-Heavy.otfbin5058776 -> 5058632 bytes
-rw-r--r--fonts/haranoaji/HaranoAjiGothic-Medium.otfbin4729932 -> 4729788 bytes
-rw-r--r--fonts/haranoaji/HaranoAjiGothic-Regular.otfbin4712220 -> 4712076 bytes
-rw-r--r--fonts/haranoaji/HaranoAjiMincho-Bold.otfbin6582336 -> 6582116 bytes
-rw-r--r--fonts/haranoaji/HaranoAjiMincho-Light.otfbin6240940 -> 6240708 bytes
-rw-r--r--fonts/haranoaji/HaranoAjiMincho-Regular.otfbin6322332 -> 6322076 bytes
-rw-r--r--fonts/haranoaji/README2
-rw-r--r--graphics/mcf2graph/CHANGELOG10
-rw-r--r--graphics/mcf2graph/README2
-rw-r--r--graphics/mcf2graph/mcf2graph.mf516
-rw-r--r--graphics/mcf2graph/mcf_exa_soc.mf65
-rw-r--r--graphics/mcf2graph/mcf_example.pdfbin527360 -> 534937 bytes
-rw-r--r--graphics/mcf2graph/mcf_example.tex12
-rw-r--r--graphics/mcf2graph/mcf_man_soc.mf43
-rw-r--r--graphics/mcf2graph/mcf_manual.pdfbin597299 -> 634517 bytes
-rw-r--r--graphics/mcf2graph/mcf_manual.tex167
-rw-r--r--graphics/mcf2graph/mcf_mplib_exa.pdfbin201986 -> 201163 bytes
-rw-r--r--graphics/mcf2graph/mcf_mplib_exa.tex4
-rw-r--r--macros/generic/witharrows/witharrows-french.pdfbin267392 -> 270367 bytes
-rw-r--r--macros/generic/witharrows/witharrows.dtx73
-rw-r--r--macros/generic/witharrows/witharrows.pdfbin640153 -> 640821 bytes
-rw-r--r--macros/latex/contrib/biblatex-contrib/windycity/CHANGES.md44
-rw-r--r--macros/latex/contrib/biblatex-contrib/windycity/american-windycity.lbx14
-rw-r--r--macros/latex/contrib/biblatex-contrib/windycity/doc/windycity.bib77
-rw-r--r--macros/latex/contrib/biblatex-contrib/windycity/doc/windycity.pdfbin425304 -> 436673 bytes
-rw-r--r--macros/latex/contrib/biblatex-contrib/windycity/doc/windycity.tex210
-rw-r--r--macros/latex/contrib/biblatex-contrib/windycity/windycity.bbx440
-rw-r--r--macros/latex/contrib/biblatex-contrib/windycity/windycity.cbx111
-rw-r--r--macros/latex/contrib/biblatex-contrib/windycity/windycity.dbx4
-rw-r--r--macros/latex/contrib/easybook/doc/easybook-demo.pdfbin308556 -> 308548 bytes
-rw-r--r--macros/latex/contrib/easybook/doc/easybook-demo.tex2
-rw-r--r--macros/latex/contrib/easybook/doc/easybook.pdfbin234567 -> 232038 bytes
-rw-r--r--macros/latex/contrib/easybook/doc/easybook.tex6
-rw-r--r--macros/latex/contrib/easybook/easybook.cls10
-rw-r--r--macros/latex/contrib/fontsize/README2
-rw-r--r--macros/latex/contrib/fontsize/fontsize.dtx399
-rw-r--r--macros/latex/contrib/fontsize/fontsize.pdfbin287477 -> 296971 bytes
-rw-r--r--macros/latex/contrib/xsim/HISTORY (renamed from macros/latex/contrib/xsim/doc/xsim.history)22
-rw-r--r--macros/latex/contrib/xsim/README46
-rw-r--r--macros/latex/contrib/xsim/code/xsim.auxfile.code.tex221
-rw-r--r--macros/latex/contrib/xsim/code/xsim.base.code.tex287
-rw-r--r--macros/latex/contrib/xsim/code/xsim.blanks.code.tex162
-rw-r--r--macros/latex/contrib/xsim/code/xsim.collections.code.tex397
-rw-r--r--macros/latex/contrib/xsim/code/xsim.definitions.code.tex482
-rw-r--r--macros/latex/contrib/xsim/code/xsim.environments.code.tex529
-rw-r--r--macros/latex/contrib/xsim/code/xsim.exercises.code.tex637
-rw-r--r--macros/latex/contrib/xsim/code/xsim.goals.code.tex385
-rw-r--r--macros/latex/contrib/xsim/code/xsim.grades.code.tex153
-rw-r--r--macros/latex/contrib/xsim/code/xsim.interface.code.tex696
-rw-r--r--macros/latex/contrib/xsim/code/xsim.modules.code.tex220
-rw-r--r--macros/latex/contrib/xsim/code/xsim.properties.code.tex540
-rw-r--r--macros/latex/contrib/xsim/code/xsim.random.code.tex315
-rw-r--r--macros/latex/contrib/xsim/code/xsim.solutions.code.tex414
-rw-r--r--macros/latex/contrib/xsim/code/xsim.sty136
-rw-r--r--macros/latex/contrib/xsim/code/xsim.style.layouts.code.tex121
-rw-r--r--macros/latex/contrib/xsim/code/xsim.tags.code.tex211
-rw-r--r--macros/latex/contrib/xsim/code/xsim.templates.code.tex182
-rw-r--r--macros/latex/contrib/xsim/code/xsim.translations.code.tex147
-rw-r--r--macros/latex/contrib/xsim/code/xsimverb.sty97
-rw-r--r--macros/latex/contrib/xsim/doc/examples/xsim.collections.pdfbin33206 -> 0 bytes
-rw-r--r--macros/latex/contrib/xsim/doc/examples/xsim.collections.tex62
-rw-r--r--macros/latex/contrib/xsim/doc/examples/xsim.difficulties.pdfbin31555 -> 0 bytes
-rw-r--r--macros/latex/contrib/xsim/doc/examples/xsim.randomexercises.pdfbin23102 -> 0 bytes
-rw-r--r--macros/latex/contrib/xsim/doc/examples/xsim.texsx-369636.pdfbin46504 -> 0 bytes
-rw-r--r--macros/latex/contrib/xsim/doc/examples/xsim.texsx-391530.pdfbin25040 -> 0 bytes
-rw-r--r--macros/latex/contrib/xsim/doc/xsim.ideas29
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.blanks.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.blanks.pdf)bin29952 -> 38256 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.blanks.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.blanks.tex)1
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.boxed-headings.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.boxed-headings.pdf)bin38376 -> 38372 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.boxed-headings.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.boxed-headings.tex)0
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.code-and-output.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.code-and-output.pdf)bin30938 -> 30939 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.code-and-output.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.code-and-output.tex)2
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.collections.pdfbin0 -> 30259 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.collections.tex44
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.crossref.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.crossref.pdf)bin38749 -> 38748 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.crossref.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.crossref.tex)2
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.description-list.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.description-list.pdf)bin41167 -> 41171 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.description-list.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.description-list.tex)0
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.different-point-types.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.different-point-types.pdf)bin42153 -> 42156 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.different-point-types.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.different-point-types.tex)0
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.difficulties.pdfbin0 -> 31763 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.difficulties.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.difficulties.tex)0
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.floating.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.floating.pdf)bin37708 -> 37717 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.floating.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.floating.tex)0
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.golatex-80640.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.golatex-80640.pdf)bin46308 -> 46317 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.golatex-80640.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.golatex-80640.tex)1
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.golatex-91339.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.golatex-91339.pdf)bin65379 -> 64956 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.golatex-91339.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.golatex-91339.tex)3
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.grade-distribution.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.grade-distribution.pdf)bin23204 -> 23204 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.grade-distribution.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.grade-distribution.tex)0
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.hints.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.hints.pdf)bin45719 -> 45722 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.hints.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.hints.tex)7
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.issues-49.pdfbin0 -> 95608 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.issues-49.tex122
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.listings.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.listings.pdf)bin45738 -> 45747 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.listings.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.listings.tex)2
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.listofexercises.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.listofexercises.pdf)bin57220 -> 57220 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.listofexercises.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.listofexercises.tex)0
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.multiplechoice.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.multiplechoice.pdf)bin31016 -> 31019 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.multiplechoice.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.multiplechoice.tex)0
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.pointsums.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.pointsums.pdf)bin28127 -> 28126 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.pointsums.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.pointsums.tex)0
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.randomexercises.pdfbin0 -> 23048 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.randomexercises.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.randomexercises.tex)18
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-13635.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-13635.pdf)bin86047 -> 86049 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-13635.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-13635.tex)2
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-155630.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-155630.pdf)bin20045 -> 20048 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-155630.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-155630.tex)3
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-199360.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-199360.pdf)bin56153 -> 56106 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-199360.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-199360.tex)0
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-299534.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-299534.pdf)bin48094 -> 48095 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-299534.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-299534.tex)2
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-305110.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-305110.pdf)bin36968 -> 36974 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-305110.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-305110.tex)0
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-308883.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-308883.pdf)bin27155 -> 27157 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-308883.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-308883.tex)0
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-338165.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-338165.pdf)bin57235 -> 56911 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-338165.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-338165.tex)38
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-350028.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-350028.pdf)bin130569 -> 130588 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-350028.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-350028.tex)80
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-369065.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-369065.pdf)bin65721 -> 65714 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-369065.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-369065.tex)36
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-369636.pdfbin0 -> 91296 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-369636.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-369636.tex)27
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-369803.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-369803.pdf)bin55079 -> 55077 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-369803.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-369803.tex)24
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-370642.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-370642.pdf)bin28426 -> 28428 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-370642.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-370642.tex)0
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-391530-exercises.tex12
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-391530.pdfbin0 -> 26102 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-391530.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-391530.tex)35
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-395273.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-395273.pdf)bin50580 -> 50575 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-395273.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-395273.tex)0
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-466584.pdfbin0 -> 60453 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-466584.tex56
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-498299.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-498299.pdf)bin42513 -> 42514 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-498299.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texsx-498299.tex)1
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-576998.pdfbin0 -> 49333 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-576998.tex135
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-580636.pdfbin0 -> 51800 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texsx-580636.tex92
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texwelt-15093.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texwelt-15093.pdf)bin36256 -> 36259 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texwelt-15093.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texwelt-15093.tex)1
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texwelt-23968.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texwelt-23968.pdf)bin46008 -> 46009 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texwelt-23968.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texwelt-23968.tex)7
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texwelt-6698.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texwelt-6698.pdf)bin43899 -> 43907 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.texwelt-6698.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.texwelt-6698.tex)1
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.various.pdf (renamed from macros/latex/contrib/xsim/doc/examples/xsim.various.pdf)bin86646 -> 86588 bytes
-rw-r--r--macros/latex/contrib/xsim/examples/xsim.various.tex (renamed from macros/latex/contrib/xsim/doc/examples/xsim.various.tex)3
-rw-r--r--macros/latex/contrib/xsim/xsim-manual.cls (renamed from macros/latex/contrib/xsim/doc/xsim-manual.cls)42
-rw-r--r--macros/latex/contrib/xsim/xsim-manual.pdf (renamed from macros/latex/contrib/xsim/doc/xsim_manual.pdf)bin1269638 -> 1308757 bytes
-rw-r--r--macros/latex/contrib/xsim/xsim-manual.tex (renamed from macros/latex/contrib/xsim/doc/xsim_manual.tex)314
-rw-r--r--macros/latex/contrib/xsim/xsim.sty5629
-rw-r--r--macros/latex/contrib/xsim/xsimverb.sty (renamed from macros/latex/contrib/xsim/code/xsim.verbwrite.code.tex)162
-rw-r--r--macros/luatex/latex/hu-berlin-bundle/README.md6
-rw-r--r--macros/luatex/latex/hu-berlin-bundle/hu-berlin-bundle.dtx19
-rw-r--r--macros/luatex/latex/hu-berlin-bundle/hu-berlin-bundle.pdfbin305252 -> 307011 bytes
-rw-r--r--macros/luatex/latex/hu-berlin-bundle/makefile2
-rw-r--r--macros/unicodetex/latex/texnegar/INSTALL.txt26
-rw-r--r--macros/unicodetex/latex/texnegar/doc-ligature-texnegar.pdfbin13132 -> 13141 bytes
-rw-r--r--macros/unicodetex/latex/texnegar/doc-ligature-xep.pdfbin10111 -> 10116 bytes
-rw-r--r--macros/unicodetex/latex/texnegar/doc-samples-glyph.pdfbin63437 -> 63436 bytes
-rw-r--r--macros/unicodetex/latex/texnegar/doc-samples-hrule.pdfbin62969 -> 62969 bytes
-rw-r--r--macros/unicodetex/latex/texnegar/doc-samples-xep.pdfbin65546 -> 65544 bytes
-rw-r--r--macros/unicodetex/latex/texnegar/texnegar-doc.ltx32
-rw-r--r--macros/unicodetex/latex/texnegar/texnegar-doc.pdfbin2868138 -> 2873970 bytes
-rw-r--r--macros/unicodetex/latex/texnegar/texnegar-luatex-glyph.pdfbin878555 -> 878555 bytes
-rw-r--r--macros/unicodetex/latex/texnegar/texnegar-luatex-leaders-glyph.pdfbin278471 -> 278471 bytes
-rw-r--r--macros/unicodetex/latex/texnegar/texnegar-luatex-leaders-hrule.pdfbin169438 -> 169438 bytes
-rw-r--r--macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-glyph.pdfbin157991 -> 157990 bytes
-rw-r--r--macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-leaders-glyph.pdfbin212563 -> 212553 bytes
-rw-r--r--macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-leaders-hrule.pdfbin156643 -> 156635 bytes
-rw-r--r--macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-glyph.pdfbin156631 -> 156636 bytes
-rw-r--r--macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-leaders-glyph.pdfbin194659 -> 194661 bytes
-rw-r--r--macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-leaders-hrule.pdfbin155935 -> 155945 bytes
-rw-r--r--macros/unicodetex/latex/texnegar/texnegar.dtx116
-rw-r--r--macros/unicodetex/latex/texnegar/texnegar.ins4
-rw-r--r--macros/unicodetex/latex/texnegar/texnegar.pdfbin564734 -> 563702 bytes
-rw-r--r--macros/unicodetex/latex/texnegar/xepersian-XB.pdfbin106692 -> 106691 bytes
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb58
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.md52
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha5122
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc14
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.xzbin2274792 -> 2272796 bytes
-rw-r--r--systems/win32/miktex/tm/packages/next/pr.ini8
-rw-r--r--systems/win32/miktex/tm/packages/pr.ini8
-rw-r--r--timestamp2
199 files changed, 9039 insertions, 8443 deletions
diff --git a/FILES.byname b/FILES.byname
index f0d622bc20..de1f0e79c4 100644
--- a/FILES.byname
+++ b/FILES.byname
@@ -5087,7 +5087,7 @@
1990/10/02 | 5440 | dviware/vutex/vaxvms.hlp
1990/10/02 | 812 | dviware/vutex/vaxvms.ins
1990/10/02 | 127576 | dviware/vutex/vutex.web
-2021/01/30 | 80942 | FILES.last07days
+2021/01/31 | 86270 | FILES.last07days
2020/08/14 | 104065 | fonts/academicons/academicons.pdf
2020/08/14 | 17247 | fonts/academicons/academicons.sty
2020/08/14 | 6546 | fonts/academicons/academicons.tex
@@ -50499,28 +50499,28 @@
1992/09/27 | 415 | fonts/hands/reverse.mf
1992/09/27 | 518 | fonts/hands/rvmirror.mf
2005/05/20 | 3188 | fonts/hands.zip
-2021/01/02 | 4408232 | fonts/haranoaji-extra/HaranoAjiGothic-ExtraLight.otf
-2021/01/02 | 4679168 | fonts/haranoaji-extra/HaranoAjiGothic-Light.otf
-2021/01/02 | 4701536 | fonts/haranoaji-extra/HaranoAjiGothic-Normal.otf
-2021/01/02 | 5834860 | fonts/haranoaji-extra/HaranoAjiMincho-ExtraLight.otf
-2021/01/02 | 6480136 | fonts/haranoaji-extra/HaranoAjiMincho-Heavy.otf
-2021/01/02 | 6395224 | fonts/haranoaji-extra/HaranoAjiMincho-Medium.otf
-2021/01/02 | 6431008 | fonts/haranoaji-extra/HaranoAjiMincho-SemiBold.otf
+2021/01/30 | 4408088 | fonts/haranoaji-extra/HaranoAjiGothic-ExtraLight.otf
+2021/01/30 | 4679024 | fonts/haranoaji-extra/HaranoAjiGothic-Light.otf
+2021/01/30 | 4701392 | fonts/haranoaji-extra/HaranoAjiGothic-Normal.otf
+2021/01/30 | 5834604 | fonts/haranoaji-extra/HaranoAjiMincho-ExtraLight.otf
+2021/01/30 | 6479916 | fonts/haranoaji-extra/HaranoAjiMincho-Heavy.otf
+2021/01/30 | 6394968 | fonts/haranoaji-extra/HaranoAjiMincho-Medium.otf
+2021/01/30 | 6430788 | fonts/haranoaji-extra/HaranoAjiMincho-SemiBold.otf
2021/01/01 | 4301 | fonts/haranoaji-extra/LICENSE
-2021/01/02 | 3209 | fonts/haranoaji-extra/README
-2021/01/02 | 32959304 | fonts/haranoaji-extra.zip
-2021/01/02 | 4857996 | fonts/haranoaji/HaranoAjiGothic-Bold.otf
+2021/01/31 | 3209 | fonts/haranoaji-extra/README
+2021/01/31 | 32958110 | fonts/haranoaji-extra.zip
+2021/01/30 | 4857852 | fonts/haranoaji/HaranoAjiGothic-Bold.otf
2020/04/14 | 214 | fonts/haranoaji/HaranoAjiGothic.fontspec
-2021/01/02 | 5058776 | fonts/haranoaji/HaranoAjiGothic-Heavy.otf
-2021/01/02 | 4729932 | fonts/haranoaji/HaranoAjiGothic-Medium.otf
-2021/01/02 | 4712220 | fonts/haranoaji/HaranoAjiGothic-Regular.otf
-2021/01/02 | 6582336 | fonts/haranoaji/HaranoAjiMincho-Bold.otf
+2021/01/30 | 5058632 | fonts/haranoaji/HaranoAjiGothic-Heavy.otf
+2021/01/30 | 4729788 | fonts/haranoaji/HaranoAjiGothic-Medium.otf
+2021/01/30 | 4712076 | fonts/haranoaji/HaranoAjiGothic-Regular.otf
+2021/01/30 | 6582116 | fonts/haranoaji/HaranoAjiMincho-Bold.otf
2020/04/14 | 211 | fonts/haranoaji/HaranoAjiMincho.fontspec
-2021/01/02 | 6240940 | fonts/haranoaji/HaranoAjiMincho-Light.otf
-2021/01/02 | 6322332 | fonts/haranoaji/HaranoAjiMincho-Regular.otf
+2021/01/30 | 6240708 | fonts/haranoaji/HaranoAjiMincho-Light.otf
+2021/01/30 | 6322076 | fonts/haranoaji/HaranoAjiMincho-Regular.otf
2021/01/01 | 4301 | fonts/haranoaji/LICENSE
-2021/01/02 | 3209 | fonts/haranoaji/README
-2021/01/02 | 32821582 | fonts/haranoaji.zip
+2021/01/31 | 3209 | fonts/haranoaji/README
+2021/01/31 | 32820523 | fonts/haranoaji.zip
2020/05/19 | 56515 | fonts/helmholtz-ellis-ji-notation/font/HEJI2Text.otf
2020/05/19 | 14207 | fonts/helmholtz-ellis-ji-notation/helmholtz-ellis-ji-notation.dtx
2020/05/19 | 1915 | fonts/helmholtz-ellis-ji-notation/helmholtz-ellis-ji-notation.ins
@@ -138864,19 +138864,19 @@
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
-2021/01/02 | 10852 | graphics/mcf2graph/CHANGELOG
-2021/01/03 | 89301 | graphics/mcf2graph/mcf2graph.mf
-2021/01/03 | 527360 | graphics/mcf2graph/mcf_example.pdf
-2021/01/03 | 2715 | graphics/mcf2graph/mcf_example.tex
-2021/01/03 | 36449 | graphics/mcf2graph/mcf_exa_soc.mf
-2021/01/02 | 36851 | graphics/mcf2graph/mcf_man_soc.mf
-2021/01/03 | 597299 | graphics/mcf2graph/mcf_manual.pdf
-2021/01/03 | 49980 | graphics/mcf2graph/mcf_manual.tex
-2021/01/03 | 201986 | graphics/mcf2graph/mcf_mplib_exa.pdf
-2021/01/01 | 16610 | graphics/mcf2graph/mcf_mplib_exa.tex
+2021/01/31 | 11069 | graphics/mcf2graph/CHANGELOG
+2021/01/31 | 90679 | graphics/mcf2graph/mcf2graph.mf
+2021/01/31 | 534937 | graphics/mcf2graph/mcf_example.pdf
+2021/01/23 | 2722 | graphics/mcf2graph/mcf_example.tex
+2021/01/31 | 36617 | graphics/mcf2graph/mcf_exa_soc.mf
+2021/01/31 | 38029 | graphics/mcf2graph/mcf_man_soc.mf
+2021/01/31 | 634517 | graphics/mcf2graph/mcf_manual.pdf
+2021/01/30 | 51049 | graphics/mcf2graph/mcf_manual.tex
+2021/01/31 | 201163 | graphics/mcf2graph/mcf_mplib_exa.pdf
+2021/01/25 | 16610 | graphics/mcf2graph/mcf_mplib_exa.tex
2020/08/30 | 3638 | graphics/mcf2graph/mcf_setup.sty
-2020/12/13 | 3711 | graphics/mcf2graph/README
-2021/01/03 | 1324978 | graphics/mcf2graph.zip
+2021/01/25 | 3711 | graphics/mcf2graph/README
+2021/01/31 | 1368423 | 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
@@ -172091,7 +172091,7 @@
2020/02/21 | 1370731 | install/macros/unicodetex/latex/fontspec.tds.zip
2020/12/08 | 1020393 | install/macros/unicodetex/latex/polyglossia.tds.zip
2016/02/13 | 111305 | install/macros/unicodetex/latex/realscripts.tds.zip
-2021/01/27 | 4913381 | install/macros/unicodetex/latex/texnegar.tds.zip
+2021/01/31 | 4918660 | install/macros/unicodetex/latex/texnegar.tds.zip
2020/01/31 | 1873940 | install/macros/unicodetex/latex/unicode-math.tds.zip
2016/05/14 | 185871 | install/macros/xetex/generic/zhspacing.tds.zip
2015/09/04 | 718623 | install/macros/xetex/latex/arabxetex.tds.zip
@@ -186463,12 +186463,12 @@
1994/03/19 | 4184 | macros/generic/vrb/vrb.tex
2005/09/25 | 2555 | macros/generic/vrb.zip
2020/06/22 | 1393 | macros/generic/witharrows/README.md
-2021/01/12 | 280653 | macros/generic/witharrows/witharrows.dtx
-2021/01/12 | 267392 | macros/generic/witharrows/witharrows-french.pdf
+2021/01/31 | 279828 | macros/generic/witharrows/witharrows.dtx
+2021/01/31 | 270367 | macros/generic/witharrows/witharrows-french.pdf
2020/09/08 | 93113 | macros/generic/witharrows/witharrows-french.tex
2021/01/07 | 1487 | macros/generic/witharrows/witharrows.ins
-2021/01/12 | 640153 | macros/generic/witharrows/witharrows.pdf
-2021/01/12 | 964228 | macros/generic/witharrows.zip
+2021/01/31 | 640821 | macros/generic/witharrows/witharrows.pdf
+2021/01/31 | 964006 | macros/generic/witharrows.zip
2010/05/14 | 252 | macros/generic/xcomment/Changes
2010/05/14 | 1836 | macros/generic/xcomment/Makefile
2010/05/14 | 372 | macros/generic/xcomment/README
@@ -191795,18 +191795,18 @@
2013/08/10 | 82924 | macros/latex/contrib/biblatex-contrib/uni-wtal-lin/uni-wtal-lin.pdf
2013/08/10 | 15521 | macros/latex/contrib/biblatex-contrib/uni-wtal-lin/uni-wtal-lin.tex
2013/08/10 | 97430 | macros/latex/contrib/biblatex-contrib/uni-wtal-lin.zip
-2020/11/11 | 11561 | macros/latex/contrib/biblatex-contrib/windycity/american-windycity.lbx
-2020/11/11 | 14252 | macros/latex/contrib/biblatex-contrib/windycity/CHANGES.md
-2020/11/11 | 74908 | macros/latex/contrib/biblatex-contrib/windycity/doc/windycity.bib
-2020/11/11 | 425304 | macros/latex/contrib/biblatex-contrib/windycity/doc/windycity.pdf
-2020/11/11 | 9129 | macros/latex/contrib/biblatex-contrib/windycity/doc/windycity.sty
-2020/11/11 | 121472 | macros/latex/contrib/biblatex-contrib/windycity/doc/windycity.tex
-2020/11/11 | 19106 | macros/latex/contrib/biblatex-contrib/windycity/LICENCE
-2020/11/11 | 3863 | macros/latex/contrib/biblatex-contrib/windycity/README.md
-2020/11/11 | 74912 | macros/latex/contrib/biblatex-contrib/windycity/windycity.bbx
-2020/11/11 | 17248 | macros/latex/contrib/biblatex-contrib/windycity/windycity.cbx
-2020/11/11 | 503 | macros/latex/contrib/biblatex-contrib/windycity/windycity.dbx
-2020/11/11 | 509095 | macros/latex/contrib/biblatex-contrib/windycity.zip
+2021/01/31 | 11876 | macros/latex/contrib/biblatex-contrib/windycity/american-windycity.lbx
+2021/01/31 | 16320 | macros/latex/contrib/biblatex-contrib/windycity/CHANGES.md
+2021/01/31 | 76314 | macros/latex/contrib/biblatex-contrib/windycity/doc/windycity.bib
+2021/01/31 | 436673 | macros/latex/contrib/biblatex-contrib/windycity/doc/windycity.pdf
+2021/01/31 | 9129 | macros/latex/contrib/biblatex-contrib/windycity/doc/windycity.sty
+2021/01/31 | 125063 | macros/latex/contrib/biblatex-contrib/windycity/doc/windycity.tex
+2021/01/31 | 19106 | macros/latex/contrib/biblatex-contrib/windycity/LICENCE
+2021/01/31 | 3863 | macros/latex/contrib/biblatex-contrib/windycity/README.md
+2021/01/31 | 79664 | macros/latex/contrib/biblatex-contrib/windycity/windycity.bbx
+2021/01/31 | 17924 | macros/latex/contrib/biblatex-contrib/windycity/windycity.cbx
+2021/01/31 | 537 | macros/latex/contrib/biblatex-contrib/windycity/windycity.dbx
+2021/01/31 | 522890 | macros/latex/contrib/biblatex-contrib/windycity.zip
2020/12/31 | 1598244 | macros/latex/contrib/biblatex/doc/biblatex.pdf
2020/12/31 | 1034510 | macros/latex/contrib/biblatex/doc/biblatex.tex
2020/12/31 | 167962 | macros/latex/contrib/biblatex/doc/examples/01-introduction-biber.pdf
@@ -195936,19 +195936,19 @@
2008/02/10 | 19110 | macros/latex/contrib/ean13isbn/License.txt
2021/01/24 | 422 | macros/latex/contrib/ean13isbn/README
2021/01/24 | 322624 | macros/latex/contrib/ean13isbn.zip
-2021/01/19 | 308556 | macros/latex/contrib/easybook/doc/easybook-demo.pdf
-2021/01/19 | 2540 | macros/latex/contrib/easybook/doc/easybook-demo.tex
-2021/01/19 | 234567 | macros/latex/contrib/easybook/doc/easybook.pdf
-2021/01/19 | 25498 | macros/latex/contrib/easybook/doc/easybook.tex
+2021/01/31 | 308548 | macros/latex/contrib/easybook/doc/easybook-demo.pdf
+2021/01/31 | 2540 | macros/latex/contrib/easybook/doc/easybook-demo.tex
+2021/01/31 | 232038 | macros/latex/contrib/easybook/doc/easybook.pdf
+2021/01/31 | 25497 | macros/latex/contrib/easybook/doc/easybook.tex
2021/01/02 | 175 | macros/latex/contrib/easybook/doc/pages/appendix.tex
2021/01/05 | 4106 | macros/latex/contrib/easybook/doc/pages/chapter1.tex
2021/01/11 | 3856 | macros/latex/contrib/easybook/doc/pages/chapter2.tex
2021/01/13 | 2958 | macros/latex/contrib/easybook/doc/pages/chapter3.tex
2021/01/10 | 1108 | macros/latex/contrib/easybook/doc/pages/preface.tex
2020/12/23 | 794 | macros/latex/contrib/easybook/doc/ref/refs.bib
-2021/01/19 | 42906 | macros/latex/contrib/easybook/easybook.cls
+2021/01/31 | 42870 | macros/latex/contrib/easybook/easybook.cls
2021/01/14 | 3005 | macros/latex/contrib/easybook/README.md
-2021/01/19 | 544132 | macros/latex/contrib/easybook.zip
+2021/01/31 | 543135 | macros/latex/contrib/easybook.zip
2009/06/17 | 82589 | macros/latex/contrib/easy/doc/docbib.pdf
2009/06/17 | 78378 | macros/latex/contrib/easy/doc/docbmat.pdf
2009/06/17 | 99132 | macros/latex/contrib/easy/doc/doceqn.pdf
@@ -198417,10 +198417,10 @@
2020/07/21 | 126590 | macros/latex/contrib/fontaxes/fontaxes.pdf
2014/03/23 | 1645 | macros/latex/contrib/fontaxes/README
2020/07/22 | 137019 | macros/latex/contrib/fontaxes.zip
-2021/01/25 | 42980 | macros/latex/contrib/fontsize/fontsize.dtx
-2021/01/25 | 287477 | macros/latex/contrib/fontsize/fontsize.pdf
-2021/01/25 | 1510 | macros/latex/contrib/fontsize/README
-2021/01/25 | 294528 | macros/latex/contrib/fontsize.zip
+2021/01/31 | 52741 | macros/latex/contrib/fontsize/fontsize.dtx
+2021/01/31 | 296971 | macros/latex/contrib/fontsize/fontsize.pdf
+2021/01/31 | 1511 | macros/latex/contrib/fontsize/README
+2021/01/31 | 304757 | macros/latex/contrib/fontsize.zip
2017/07/14 | 46046 | macros/latex/contrib/fonttable/fonttable.dtx
2017/07/14 | 2505 | macros/latex/contrib/fonttable/fonttable.ins
2017/07/14 | 309980 | macros/latex/contrib/fonttable/fonttable.pdf
@@ -215839,108 +215839,97 @@
2020/03/04 | 11973 | macros/latex/contrib/xsavebox/xsavebox.sty
2020/03/04 | 10242 | macros/latex/contrib/xsavebox/xsavebox.tex
2020/03/04 | 376333 | macros/latex/contrib/xsavebox.zip
-2020/04/04 | 7136 | macros/latex/contrib/xsim/code/xsim.auxfile.code.tex
-2020/04/04 | 8979 | macros/latex/contrib/xsim/code/xsim.base.code.tex
-2020/04/04 | 5838 | macros/latex/contrib/xsim/code/xsim.blanks.code.tex
-2020/04/04 | 13024 | macros/latex/contrib/xsim/code/xsim.collections.code.tex
-2020/04/04 | 15212 | macros/latex/contrib/xsim/code/xsim.definitions.code.tex
-2020/04/04 | 16708 | macros/latex/contrib/xsim/code/xsim.environments.code.tex
-2020/04/04 | 22101 | macros/latex/contrib/xsim/code/xsim.exercises.code.tex
-2020/04/04 | 11751 | macros/latex/contrib/xsim/code/xsim.goals.code.tex
-2020/04/04 | 4706 | macros/latex/contrib/xsim/code/xsim.grades.code.tex
-2020/04/04 | 22238 | macros/latex/contrib/xsim/code/xsim.interface.code.tex
-2020/04/04 | 6841 | macros/latex/contrib/xsim/code/xsim.modules.code.tex
-2020/04/04 | 16513 | macros/latex/contrib/xsim/code/xsim.properties.code.tex
-2020/04/04 | 10697 | macros/latex/contrib/xsim/code/xsim.random.code.tex
-2020/04/04 | 13440 | macros/latex/contrib/xsim/code/xsim.solutions.code.tex
-2020/04/04 | 4675 | macros/latex/contrib/xsim/code/xsim.sty
-2020/04/04 | 3898 | macros/latex/contrib/xsim/code/xsim.style.layouts.code.tex
-2020/04/04 | 6642 | macros/latex/contrib/xsim/code/xsim.tags.code.tex
-2020/04/04 | 5704 | macros/latex/contrib/xsim/code/xsim.templates.code.tex
-2020/04/04 | 4826 | macros/latex/contrib/xsim/code/xsim.translations.code.tex
-2020/04/04 | 3419 | macros/latex/contrib/xsim/code/xsimverb.sty
-2020/04/04 | 7268 | macros/latex/contrib/xsim/code/xsim.verbwrite.code.tex
-2020/04/04 | 29952 | macros/latex/contrib/xsim/doc/examples/xsim.blanks.pdf
-2020/04/04 | 469 | macros/latex/contrib/xsim/doc/examples/xsim.blanks.tex
-2020/04/04 | 38376 | macros/latex/contrib/xsim/doc/examples/xsim.boxed-headings.pdf
-2020/04/04 | 570 | macros/latex/contrib/xsim/doc/examples/xsim.boxed-headings.tex
-2020/04/04 | 30938 | macros/latex/contrib/xsim/doc/examples/xsim.code-and-output.pdf
-2020/04/04 | 1069 | macros/latex/contrib/xsim/doc/examples/xsim.code-and-output.tex
-2020/04/04 | 33206 | macros/latex/contrib/xsim/doc/examples/xsim.collections.pdf
-2020/04/04 | 1381 | macros/latex/contrib/xsim/doc/examples/xsim.collections.tex
-2020/04/04 | 38749 | macros/latex/contrib/xsim/doc/examples/xsim.crossref.pdf
-2020/04/04 | 1351 | macros/latex/contrib/xsim/doc/examples/xsim.crossref.tex
-2020/04/04 | 41167 | macros/latex/contrib/xsim/doc/examples/xsim.description-list.pdf
-2020/04/04 | 776 | macros/latex/contrib/xsim/doc/examples/xsim.description-list.tex
-2020/04/04 | 42153 | macros/latex/contrib/xsim/doc/examples/xsim.different-point-types.pdf
-2020/04/04 | 1337 | macros/latex/contrib/xsim/doc/examples/xsim.different-point-types.tex
-2020/04/04 | 31555 | macros/latex/contrib/xsim/doc/examples/xsim.difficulties.pdf
-2020/04/04 | 1345 | macros/latex/contrib/xsim/doc/examples/xsim.difficulties.tex
-2020/04/04 | 37708 | macros/latex/contrib/xsim/doc/examples/xsim.floating.pdf
-2020/04/04 | 1013 | macros/latex/contrib/xsim/doc/examples/xsim.floating.tex
-2020/04/04 | 46308 | macros/latex/contrib/xsim/doc/examples/xsim.golatex-80640.pdf
-2020/04/04 | 3442 | macros/latex/contrib/xsim/doc/examples/xsim.golatex-80640.tex
-2020/04/04 | 65379 | macros/latex/contrib/xsim/doc/examples/xsim.golatex-91339.pdf
-2020/04/04 | 2259 | macros/latex/contrib/xsim/doc/examples/xsim.golatex-91339.tex
-2020/04/04 | 23204 | macros/latex/contrib/xsim/doc/examples/xsim.grade-distribution.pdf
-2020/04/04 | 894 | macros/latex/contrib/xsim/doc/examples/xsim.grade-distribution.tex
-2020/04/04 | 45719 | macros/latex/contrib/xsim/doc/examples/xsim.hints.pdf
-2020/04/04 | 1313 | macros/latex/contrib/xsim/doc/examples/xsim.hints.tex
-2020/04/04 | 45738 | macros/latex/contrib/xsim/doc/examples/xsim.listings.pdf
-2020/04/04 | 821 | macros/latex/contrib/xsim/doc/examples/xsim.listings.tex
-2020/04/04 | 57220 | macros/latex/contrib/xsim/doc/examples/xsim.listofexercises.pdf
-2020/04/04 | 1792 | macros/latex/contrib/xsim/doc/examples/xsim.listofexercises.tex
-2020/04/04 | 31016 | macros/latex/contrib/xsim/doc/examples/xsim.multiplechoice.pdf
-2020/04/04 | 1425 | macros/latex/contrib/xsim/doc/examples/xsim.multiplechoice.tex
-2020/04/04 | 28127 | macros/latex/contrib/xsim/doc/examples/xsim.pointsums.pdf
-2020/04/04 | 653 | macros/latex/contrib/xsim/doc/examples/xsim.pointsums.tex
-2020/04/04 | 23102 | macros/latex/contrib/xsim/doc/examples/xsim.randomexercises.pdf
-2020/04/04 | 948 | macros/latex/contrib/xsim/doc/examples/xsim.randomexercises.tex
-2020/04/04 | 86047 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-13635.pdf
-2020/04/04 | 1913 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-13635.tex
-2020/04/04 | 20045 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-155630.pdf
-2020/04/04 | 443 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-155630.tex
-2020/04/04 | 56153 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-199360.pdf
-2020/04/04 | 1183 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-199360.tex
-2020/04/04 | 48094 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-299534.pdf
-2020/04/04 | 613 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-299534.tex
-2020/04/04 | 36968 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-305110.pdf
-2020/04/04 | 1072 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-305110.tex
-2020/04/04 | 27155 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-308883.pdf
-2020/04/04 | 247 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-308883.tex
-2020/04/04 | 57235 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-338165.pdf
-2020/04/04 | 1828 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-338165.tex
-2020/04/04 | 130569 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-350028.pdf
-2020/04/04 | 3549 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-350028.tex
-2020/04/04 | 65721 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-369065.pdf
-2020/04/04 | 1862 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-369065.tex
-2020/04/04 | 46504 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-369636.pdf
-2020/04/04 | 927 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-369636.tex
-2020/04/04 | 55079 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-369803.pdf
-2020/04/04 | 1404 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-369803.tex
-2020/04/04 | 28426 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-370642.pdf
-2020/04/04 | 542 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-370642.tex
-2020/04/04 | 25040 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-391530.pdf
-2020/04/04 | 1385 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-391530.tex
-2020/04/04 | 50580 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-395273.pdf
-2020/04/04 | 1923 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-395273.tex
-2020/04/04 | 42513 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-498299.pdf
-2020/04/04 | 1496 | macros/latex/contrib/xsim/doc/examples/xsim.texsx-498299.tex
-2020/04/04 | 36256 | macros/latex/contrib/xsim/doc/examples/xsim.texwelt-15093.pdf
-2020/04/04 | 3142 | macros/latex/contrib/xsim/doc/examples/xsim.texwelt-15093.tex
-2020/04/04 | 46008 | macros/latex/contrib/xsim/doc/examples/xsim.texwelt-23968.pdf
-2020/04/04 | 1658 | macros/latex/contrib/xsim/doc/examples/xsim.texwelt-23968.tex
-2020/04/04 | 43899 | macros/latex/contrib/xsim/doc/examples/xsim.texwelt-6698.pdf
-2020/04/04 | 1777 | macros/latex/contrib/xsim/doc/examples/xsim.texwelt-6698.tex
-2020/04/04 | 86646 | macros/latex/contrib/xsim/doc/examples/xsim.various.pdf
-2020/04/04 | 5844 | macros/latex/contrib/xsim/doc/examples/xsim.various.tex
-2020/04/04 | 8751 | macros/latex/contrib/xsim/doc/xsim.history
-2020/04/04 | 1048 | macros/latex/contrib/xsim/doc/xsim.ideas
-2020/04/04 | 29793 | macros/latex/contrib/xsim/doc/xsim-manual.cls
-2020/04/04 | 1269638 | macros/latex/contrib/xsim/doc/xsim_manual.pdf
-2020/04/04 | 106072 | macros/latex/contrib/xsim/doc/xsim_manual.tex
-2020/04/04 | 3932 | macros/latex/contrib/xsim/README
-2020/04/04 | 3001808 | macros/latex/contrib/xsim.zip
+2021/01/31 | 38256 | macros/latex/contrib/xsim/examples/xsim.blanks.pdf
+2021/01/31 | 441 | macros/latex/contrib/xsim/examples/xsim.blanks.tex
+2021/01/31 | 38372 | macros/latex/contrib/xsim/examples/xsim.boxed-headings.pdf
+2021/01/31 | 570 | macros/latex/contrib/xsim/examples/xsim.boxed-headings.tex
+2021/01/31 | 30939 | macros/latex/contrib/xsim/examples/xsim.code-and-output.pdf
+2021/01/31 | 1067 | macros/latex/contrib/xsim/examples/xsim.code-and-output.tex
+2021/01/31 | 30259 | macros/latex/contrib/xsim/examples/xsim.collections.pdf
+2021/01/31 | 840 | macros/latex/contrib/xsim/examples/xsim.collections.tex
+2021/01/31 | 38748 | macros/latex/contrib/xsim/examples/xsim.crossref.pdf
+2021/01/31 | 1368 | macros/latex/contrib/xsim/examples/xsim.crossref.tex
+2021/01/31 | 41171 | macros/latex/contrib/xsim/examples/xsim.description-list.pdf
+2021/01/31 | 776 | macros/latex/contrib/xsim/examples/xsim.description-list.tex
+2021/01/31 | 42156 | macros/latex/contrib/xsim/examples/xsim.different-point-types.pdf
+2021/01/31 | 1337 | macros/latex/contrib/xsim/examples/xsim.different-point-types.tex
+2021/01/31 | 31763 | macros/latex/contrib/xsim/examples/xsim.difficulties.pdf
+2021/01/31 | 1345 | macros/latex/contrib/xsim/examples/xsim.difficulties.tex
+2021/01/31 | 37717 | macros/latex/contrib/xsim/examples/xsim.floating.pdf
+2021/01/31 | 1013 | macros/latex/contrib/xsim/examples/xsim.floating.tex
+2021/01/31 | 46317 | macros/latex/contrib/xsim/examples/xsim.golatex-80640.pdf
+2021/01/31 | 3414 | macros/latex/contrib/xsim/examples/xsim.golatex-80640.tex
+2021/01/31 | 64956 | macros/latex/contrib/xsim/examples/xsim.golatex-91339.pdf
+2021/01/31 | 2226 | macros/latex/contrib/xsim/examples/xsim.golatex-91339.tex
+2021/01/31 | 23204 | macros/latex/contrib/xsim/examples/xsim.grade-distribution.pdf
+2021/01/31 | 894 | macros/latex/contrib/xsim/examples/xsim.grade-distribution.tex
+2021/01/31 | 45722 | macros/latex/contrib/xsim/examples/xsim.hints.pdf
+2021/01/31 | 1221 | macros/latex/contrib/xsim/examples/xsim.hints.tex
+2021/01/31 | 95608 | macros/latex/contrib/xsim/examples/xsim.issues-49.pdf
+2021/01/31 | 2741 | macros/latex/contrib/xsim/examples/xsim.issues-49.tex
+2021/01/31 | 45747 | macros/latex/contrib/xsim/examples/xsim.listings.pdf
+2021/01/31 | 832 | macros/latex/contrib/xsim/examples/xsim.listings.tex
+2021/01/31 | 57220 | macros/latex/contrib/xsim/examples/xsim.listofexercises.pdf
+2021/01/31 | 1792 | macros/latex/contrib/xsim/examples/xsim.listofexercises.tex
+2021/01/31 | 31019 | macros/latex/contrib/xsim/examples/xsim.multiplechoice.pdf
+2021/01/31 | 1425 | macros/latex/contrib/xsim/examples/xsim.multiplechoice.tex
+2021/01/31 | 28126 | macros/latex/contrib/xsim/examples/xsim.pointsums.pdf
+2021/01/31 | 653 | macros/latex/contrib/xsim/examples/xsim.pointsums.tex
+2021/01/31 | 23048 | macros/latex/contrib/xsim/examples/xsim.randomexercises.pdf
+2021/01/31 | 774 | macros/latex/contrib/xsim/examples/xsim.randomexercises.tex
+2021/01/31 | 86049 | macros/latex/contrib/xsim/examples/xsim.texsx-13635.pdf
+2021/01/31 | 1934 | macros/latex/contrib/xsim/examples/xsim.texsx-13635.tex
+2021/01/31 | 20048 | macros/latex/contrib/xsim/examples/xsim.texsx-155630.pdf
+2021/01/31 | 413 | macros/latex/contrib/xsim/examples/xsim.texsx-155630.tex
+2021/01/31 | 56106 | macros/latex/contrib/xsim/examples/xsim.texsx-199360.pdf
+2021/01/31 | 1183 | macros/latex/contrib/xsim/examples/xsim.texsx-199360.tex
+2021/01/31 | 48095 | macros/latex/contrib/xsim/examples/xsim.texsx-299534.pdf
+2021/01/31 | 624 | macros/latex/contrib/xsim/examples/xsim.texsx-299534.tex
+2021/01/31 | 36974 | macros/latex/contrib/xsim/examples/xsim.texsx-305110.pdf
+2021/01/31 | 1072 | macros/latex/contrib/xsim/examples/xsim.texsx-305110.tex
+2021/01/31 | 27157 | macros/latex/contrib/xsim/examples/xsim.texsx-308883.pdf
+2021/01/31 | 247 | macros/latex/contrib/xsim/examples/xsim.texsx-308883.tex
+2021/01/31 | 56911 | macros/latex/contrib/xsim/examples/xsim.texsx-338165.pdf
+2021/01/31 | 1788 | macros/latex/contrib/xsim/examples/xsim.texsx-338165.tex
+2021/01/31 | 130588 | macros/latex/contrib/xsim/examples/xsim.texsx-350028.pdf
+2021/01/31 | 3443 | macros/latex/contrib/xsim/examples/xsim.texsx-350028.tex
+2021/01/31 | 65714 | macros/latex/contrib/xsim/examples/xsim.texsx-369065.pdf
+2021/01/31 | 1820 | macros/latex/contrib/xsim/examples/xsim.texsx-369065.tex
+2021/01/31 | 91296 | macros/latex/contrib/xsim/examples/xsim.texsx-369636.pdf
+2021/01/31 | 871 | macros/latex/contrib/xsim/examples/xsim.texsx-369636.tex
+2021/01/31 | 55077 | macros/latex/contrib/xsim/examples/xsim.texsx-369803.pdf
+2021/01/31 | 1317 | macros/latex/contrib/xsim/examples/xsim.texsx-369803.tex
+2021/01/31 | 28428 | macros/latex/contrib/xsim/examples/xsim.texsx-370642.pdf
+2021/01/31 | 542 | macros/latex/contrib/xsim/examples/xsim.texsx-370642.tex
+2021/01/31 | 258 | macros/latex/contrib/xsim/examples/xsim.texsx-391530-exercises.tex
+2021/01/31 | 26102 | macros/latex/contrib/xsim/examples/xsim.texsx-391530.pdf
+2021/01/31 | 1260 | macros/latex/contrib/xsim/examples/xsim.texsx-391530.tex
+2021/01/31 | 50575 | macros/latex/contrib/xsim/examples/xsim.texsx-395273.pdf
+2021/01/31 | 1923 | macros/latex/contrib/xsim/examples/xsim.texsx-395273.tex
+2021/01/31 | 60453 | macros/latex/contrib/xsim/examples/xsim.texsx-466584.pdf
+2021/01/31 | 1386 | macros/latex/contrib/xsim/examples/xsim.texsx-466584.tex
+2021/01/31 | 42514 | macros/latex/contrib/xsim/examples/xsim.texsx-498299.pdf
+2021/01/31 | 1537 | macros/latex/contrib/xsim/examples/xsim.texsx-498299.tex
+2021/01/31 | 49333 | macros/latex/contrib/xsim/examples/xsim.texsx-576998.pdf
+2021/01/31 | 2790 | macros/latex/contrib/xsim/examples/xsim.texsx-576998.tex
+2021/01/31 | 51800 | macros/latex/contrib/xsim/examples/xsim.texsx-580636.pdf
+2021/01/31 | 2292 | macros/latex/contrib/xsim/examples/xsim.texsx-580636.tex
+2021/01/31 | 36259 | macros/latex/contrib/xsim/examples/xsim.texwelt-15093.pdf
+2021/01/31 | 3114 | macros/latex/contrib/xsim/examples/xsim.texwelt-15093.tex
+2021/01/31 | 46009 | macros/latex/contrib/xsim/examples/xsim.texwelt-23968.pdf
+2021/01/31 | 1566 | macros/latex/contrib/xsim/examples/xsim.texwelt-23968.tex
+2021/01/31 | 43907 | macros/latex/contrib/xsim/examples/xsim.texwelt-6698.pdf
+2021/01/31 | 1749 | macros/latex/contrib/xsim/examples/xsim.texwelt-6698.tex
+2021/01/31 | 86588 | macros/latex/contrib/xsim/examples/xsim.various.pdf
+2021/01/31 | 5868 | macros/latex/contrib/xsim/examples/xsim.various.tex
+2021/01/31 | 9923 | macros/latex/contrib/xsim/HISTORY
+2021/01/31 | 3596 | macros/latex/contrib/xsim/README
+2021/01/31 | 30178 | macros/latex/contrib/xsim/xsim-manual.cls
+2021/01/31 | 1308757 | macros/latex/contrib/xsim/xsim-manual.pdf
+2021/01/31 | 107071 | macros/latex/contrib/xsim/xsim-manual.tex
+2021/01/31 | 175513 | macros/latex/contrib/xsim/xsim.sty
+2021/01/31 | 10100 | macros/latex/contrib/xsim/xsimverb.sty
+2021/01/31 | 3323538 | macros/latex/contrib/xsim.zip
2019/06/23 | 1140 | macros/latex/contrib/xskak/README.md
2019/06/23 | 21142 | macros/latex/contrib/xskak/skak-comment-test.pdf
2019/06/23 | 195 | macros/latex/contrib/xskak/skak-comment-test.tex
@@ -217685,12 +217674,12 @@
2019/08/06 | 1982 | macros/luatex/latex/hmtrump/nkd04_playing_cards_index/readme.txt
2019/08/06 | 2678 | macros/luatex/latex/hmtrump/README.md
2019/08/06 | 1072162 | macros/luatex/latex/hmtrump.zip
-2021/01/10 | 66273 | macros/luatex/latex/hu-berlin-bundle/hu-berlin-bundle.dtx
-2021/01/10 | 305252 | macros/luatex/latex/hu-berlin-bundle/hu-berlin-bundle.pdf
-2021/01/10 | 14903 | macros/luatex/latex/hu-berlin-bundle/img/texografie-logo.pdf
-2021/01/10 | 3760 | macros/luatex/latex/hu-berlin-bundle/makefile
-2021/01/10 | 6698 | macros/luatex/latex/hu-berlin-bundle/README.md
-2021/01/10 | 238603 | macros/luatex/latex/hu-berlin-bundle.zip
+2021/01/31 | 66767 | macros/luatex/latex/hu-berlin-bundle/hu-berlin-bundle.dtx
+2021/01/31 | 307011 | macros/luatex/latex/hu-berlin-bundle/hu-berlin-bundle.pdf
+2021/01/31 | 14903 | macros/luatex/latex/hu-berlin-bundle/img/texografie-logo.pdf
+2021/01/31 | 3754 | macros/luatex/latex/hu-berlin-bundle/makefile
+2021/01/31 | 6921 | macros/luatex/latex/hu-berlin-bundle/README.md
+2021/01/31 | 240154 | macros/luatex/latex/hu-berlin-bundle.zip
2013/09/26 | 12220 | macros/luatex/latex/luabibentry/luabibentry.dtx
2013/09/26 | 157304 | macros/luatex/latex/luabibentry/luabibentry.pdf
2013/09/26 | 2749 | macros/luatex/latex/luabibentry/Makefile
@@ -225949,39 +225938,39 @@
2016/02/13 | 1755 | macros/unicodetex/latex/realscripts/realscripts.ins
2016/02/13 | 106569 | macros/unicodetex/latex/realscripts/realscripts.pdf
2016/02/13 | 108915 | macros/unicodetex/latex/realscripts.zip
-2021/01/27 | 13132 | macros/unicodetex/latex/texnegar/doc-ligature-texnegar.pdf
-2021/01/27 | 10111 | macros/unicodetex/latex/texnegar/doc-ligature-xep.pdf
-2021/01/27 | 63437 | macros/unicodetex/latex/texnegar/doc-samples-glyph.pdf
-2021/01/27 | 62969 | macros/unicodetex/latex/texnegar/doc-samples-hrule.pdf
-2021/01/27 | 65546 | macros/unicodetex/latex/texnegar/doc-samples-xep.pdf
-2021/01/27 | 1561 | macros/unicodetex/latex/texnegar/INSTALL.txt
-2021/01/27 | 1142 | macros/unicodetex/latex/texnegar/README.txt
-2021/01/27 | 26999 | macros/unicodetex/latex/texnegar/texnegar-doc.ltx
-2021/01/27 | 2868138 | macros/unicodetex/latex/texnegar/texnegar-doc.pdf
-2021/01/27 | 94317 | macros/unicodetex/latex/texnegar/texnegar.dtx
-2021/01/27 | 2618 | macros/unicodetex/latex/texnegar/texnegar.ins
-2021/01/27 | 878555 | macros/unicodetex/latex/texnegar/texnegar-luatex-glyph.pdf
-2021/01/27 | 3519 | macros/unicodetex/latex/texnegar/texnegar-luatex-glyph.tex
-2021/01/27 | 278471 | macros/unicodetex/latex/texnegar/texnegar-luatex-leaders-glyph.pdf
-2021/01/27 | 3615 | macros/unicodetex/latex/texnegar/texnegar-luatex-leaders-glyph.tex
-2021/01/27 | 169438 | macros/unicodetex/latex/texnegar/texnegar-luatex-leaders-hrule.pdf
-2021/01/27 | 3615 | macros/unicodetex/latex/texnegar/texnegar-luatex-leaders-hrule.tex
-2021/01/27 | 564734 | macros/unicodetex/latex/texnegar/texnegar.pdf
-2021/01/27 | 157991 | macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-glyph.pdf
-2021/01/27 | 3804 | macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-glyph.tex
-2021/01/27 | 212563 | macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-leaders-glyph.pdf
-2021/01/27 | 3900 | macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-leaders-glyph.tex
-2021/01/27 | 156643 | macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-leaders-hrule.pdf
-2021/01/27 | 3900 | macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-leaders-hrule.tex
-2021/01/27 | 156631 | macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-glyph.pdf
-2021/01/27 | 3608 | macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-glyph.tex
-2021/01/27 | 194659 | macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-leaders-glyph.pdf
-2021/01/27 | 3693 | macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-leaders-glyph.tex
-2021/01/27 | 155935 | macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-leaders-hrule.pdf
-2021/01/27 | 3694 | macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-leaders-hrule.tex
-2021/01/27 | 106692 | macros/unicodetex/latex/texnegar/xepersian-XB.pdf
-2021/01/27 | 3113 | macros/unicodetex/latex/texnegar/xepersian-XB.tex
-2021/01/27 | 4888102 | macros/unicodetex/latex/texnegar.zip
+2021/01/31 | 13141 | macros/unicodetex/latex/texnegar/doc-ligature-texnegar.pdf
+2021/01/31 | 10116 | macros/unicodetex/latex/texnegar/doc-ligature-xep.pdf
+2021/01/31 | 63436 | macros/unicodetex/latex/texnegar/doc-samples-glyph.pdf
+2021/01/31 | 62969 | macros/unicodetex/latex/texnegar/doc-samples-hrule.pdf
+2021/01/31 | 65544 | macros/unicodetex/latex/texnegar/doc-samples-xep.pdf
+2021/01/31 | 1551 | macros/unicodetex/latex/texnegar/INSTALL.txt
+2021/01/31 | 1142 | macros/unicodetex/latex/texnegar/README.txt
+2021/01/31 | 28671 | macros/unicodetex/latex/texnegar/texnegar-doc.ltx
+2021/01/31 | 2873970 | macros/unicodetex/latex/texnegar/texnegar-doc.pdf
+2021/01/31 | 95053 | macros/unicodetex/latex/texnegar/texnegar.dtx
+2021/01/31 | 2628 | macros/unicodetex/latex/texnegar/texnegar.ins
+2021/01/31 | 878555 | macros/unicodetex/latex/texnegar/texnegar-luatex-glyph.pdf
+2021/01/31 | 3519 | macros/unicodetex/latex/texnegar/texnegar-luatex-glyph.tex
+2021/01/31 | 278471 | macros/unicodetex/latex/texnegar/texnegar-luatex-leaders-glyph.pdf
+2021/01/31 | 3615 | macros/unicodetex/latex/texnegar/texnegar-luatex-leaders-glyph.tex
+2021/01/31 | 169438 | macros/unicodetex/latex/texnegar/texnegar-luatex-leaders-hrule.pdf
+2021/01/31 | 3615 | macros/unicodetex/latex/texnegar/texnegar-luatex-leaders-hrule.tex
+2021/01/31 | 563702 | macros/unicodetex/latex/texnegar/texnegar.pdf
+2021/01/31 | 157990 | macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-glyph.pdf
+2021/01/31 | 3804 | macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-glyph.tex
+2021/01/31 | 212553 | macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-leaders-glyph.pdf
+2021/01/31 | 3900 | macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-leaders-glyph.tex
+2021/01/31 | 156635 | macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-leaders-hrule.pdf
+2021/01/31 | 3900 | macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-leaders-hrule.tex
+2021/01/31 | 156636 | macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-glyph.pdf
+2021/01/31 | 3608 | macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-glyph.tex
+2021/01/31 | 194661 | macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-leaders-glyph.pdf
+2021/01/31 | 3693 | macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-leaders-glyph.tex
+2021/01/31 | 155945 | macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-leaders-hrule.pdf
+2021/01/31 | 3694 | macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-leaders-hrule.tex
+2021/01/31 | 106691 | macros/unicodetex/latex/texnegar/xepersian-XB.pdf
+2021/01/31 | 3113 | macros/unicodetex/latex/texnegar/xepersian-XB.tex
+2021/01/31 | 4893277 | macros/unicodetex/latex/texnegar.zip
2020/01/31 | 15419 | macros/unicodetex/latex/unicode-math/CHANGES.md
2020/01/31 | 19106 | macros/unicodetex/latex/unicode-math/LICENSE
2020/01/31 | 9203 | macros/unicodetex/latex/unicode-math/MANIFEST.md
@@ -265183,8 +265172,8 @@
2020/03/02 | 40304 | systems/texlive/tlnet/archive/kpathsea.x86_64-linux.r53999.tar.xz
2020/03/02 | 44708 | systems/texlive/tlnet/archive/kpathsea.x86_64-solaris.r53999.tar.xz
2020/06/24 | 1759292 | systems/texlive/tlnet/archive/kpfonts.doc.r55643.tar.xz
-2020/11/20 | 2070208 | systems/texlive/tlnet/archive/kpfonts-otf.doc.r56965.tar.xz
-2020/11/20 | 1011932 | systems/texlive/tlnet/archive/kpfonts-otf.r56965.tar.xz
+2021/01/31 | 2055036 | systems/texlive/tlnet/archive/kpfonts-otf.doc.r57563.tar.xz
+2021/01/31 | 1071952 | systems/texlive/tlnet/archive/kpfonts-otf.r57563.tar.xz
2020/06/24 | 2205528 | systems/texlive/tlnet/archive/kpfonts.r55643.tar.xz
2020/06/24 | 223556 | systems/texlive/tlnet/archive/kpfonts.source.r55643.tar.xz
2019/02/28 | 3968 | systems/texlive/tlnet/archive/ksfh_nat.r24825.tar.xz
@@ -265675,8 +265664,8 @@
2019/02/28 | 34736 | systems/texlive/tlnet/archive/levy.r21750.tar.xz
2019/02/28 | 40844 | systems/texlive/tlnet/archive/lewis.doc.r15878.tar.xz
2019/02/28 | 1028 | systems/texlive/tlnet/archive/lewis.r15878.tar.xz
-2020/03/24 | 141744 | systems/texlive/tlnet/archive/lexend.doc.r54512.tar.xz
-2020/03/24 | 186872 | systems/texlive/tlnet/archive/lexend.r54512.tar.xz
+2021/01/31 | 143084 | systems/texlive/tlnet/archive/lexend.doc.r57564.tar.xz
+2021/01/31 | 186932 | systems/texlive/tlnet/archive/lexend.r57564.tar.xz
2019/02/28 | 180172 | systems/texlive/tlnet/archive/lexikon.doc.r17364.tar.xz
2019/02/28 | 2196 | systems/texlive/tlnet/archive/lexikon.r17364.tar.xz
2019/02/28 | 386412 | systems/texlive/tlnet/archive/lexref.doc.r36026.tar.xz
@@ -270145,13 +270134,13 @@
2020/03/02 | 109508 | systems/texlive/tlnet/archive/tex4ht.amd64-freebsd.r53999.tar.xz
2020/03/02 | 87376 | systems/texlive/tlnet/archive/tex4ht.amd64-netbsd.r53995.tar.xz
2020/03/04 | 72564 | systems/texlive/tlnet/archive/tex4ht.armhf-linux.r54033.tar.xz
-2021/01/30 | 136160 | systems/texlive/tlnet/archive/tex4ht.doc.r57555.tar.xz
+2021/01/31 | 136160 | systems/texlive/tlnet/archive/tex4ht.doc.r57565.tar.xz
2020/06/02 | 51092 | systems/texlive/tlnet/archive/tex4ht.i386-cygwin.r55384.tar.xz
2020/03/02 | 90676 | systems/texlive/tlnet/archive/tex4ht.i386-freebsd.r53999.tar.xz
2020/03/02 | 89232 | systems/texlive/tlnet/archive/tex4ht.i386-linux.r53999.tar.xz
2020/03/06 | 76276 | systems/texlive/tlnet/archive/tex4ht.i386-netbsd.r54104.tar.xz
2020/03/02 | 83968 | systems/texlive/tlnet/archive/tex4ht.i386-solaris.r53999.tar.xz
-2021/01/30 | 903656 | systems/texlive/tlnet/archive/tex4ht.r57555.tar.xz
+2021/01/31 | 903628 | systems/texlive/tlnet/archive/tex4ht.r57565.tar.xz
2020/10/29 | 57840 | systems/texlive/tlnet/archive/tex4ht.win32.r56792.tar.xz
2020/06/02 | 57936 | systems/texlive/tlnet/archive/tex4ht.x86_64-cygwin.r55384.tar.xz
2020/03/02 | 85024 | systems/texlive/tlnet/archive/tex4ht.x86_64-darwinlegacy.r53999.tar.xz
@@ -270329,8 +270318,8 @@
2020/03/24 | 280 | systems/texlive/tlnet/archive/texlive-cz.r54496.tar.xz
2020/12/26 | 1338744 | systems/texlive/tlnet/archive/texlive-de.doc.r57223.tar.xz
2020/12/26 | 272 | systems/texlive/tlnet/archive/texlive-de.r57223.tar.xz
-2021/01/30 | 171808 | systems/texlive/tlnet/archive/texlive-docindex.doc.r57548.tar.xz
-2021/01/30 | 388 | systems/texlive/tlnet/archive/texlive-docindex.r57548.tar.xz
+2021/01/31 | 172728 | systems/texlive/tlnet/archive/texlive-docindex.doc.r57557.tar.xz
+2021/01/31 | 388 | systems/texlive/tlnet/archive/texlive-docindex.r57557.tar.xz
2020/04/16 | 1891392 | systems/texlive/tlnet/archive/texlive-en.doc.r54755.tar.xz
2020/04/16 | 272 | systems/texlive/tlnet/archive/texlive-en.r54755.tar.xz
2020/03/22 | 3090144 | systems/texlive/tlnet/archive/texlive-es.doc.r54465.tar.xz
@@ -272078,16 +272067,16 @@
2020/07/18 | 47816 | systems/texlive/tlnet/archive/zztex.doc.r55862.tar.xz
2020/07/18 | 101724 | systems/texlive/tlnet/archive/zztex.r55862.tar.xz
2021/01/06 | 106039 | systems/texlive/tlnet/install-tl
-2021/01/30 | 5521149 | systems/texlive/tlnet/install-tl-unx.tar.gz
-2021/01/30 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
-2021/01/30 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2021/01/31 | 5521166 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2021/01/31 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2021/01/31 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
2020/08/23 | 4889 | systems/texlive/tlnet/install-tl-windows.bat
-2021/01/30 | 19418407 | systems/texlive/tlnet/install-tl-windows.exe
-2021/01/30 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
-2021/01/30 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2021/01/30 | 24290322 | systems/texlive/tlnet/install-tl.zip
-2021/01/30 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
-2021/01/30 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2021/01/31 | 19418921 | systems/texlive/tlnet/install-tl-windows.exe
+2021/01/31 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2021/01/31 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2021/01/31 | 24290322 | systems/texlive/tlnet/install-tl.zip
+2021/01/31 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2021/01/31 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
2020/03/05 | 1215 | systems/texlive/tlnet/README.md
2020/04/06 | 5961 | systems/texlive/tlnet/tlpkg/gpg/pubring.gpg
2016/04/12 | 600 | systems/texlive/tlnet/tlpkg/gpg/random_seed
@@ -272143,12 +272132,12 @@
2020/05/17 | 20322 | systems/texlive/tlnet/tlpkg/TeXLive/TLCrypto.pm
2020/05/03 | 4786 | systems/texlive/tlnet/tlpkg/TeXLive/TLDownload.pm
2020/09/22 | 27563 | systems/texlive/tlnet/tlpkg/TeXLive/TLPaper.pm
-2021/01/30 | 17011902 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
-2021/01/30 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2021/01/31 | 17012006 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2021/01/31 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
2020/05/13 | 86417 | systems/texlive/tlnet/tlpkg/TeXLive/TLPDB.pm
-2021/01/30 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
-2021/01/30 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2021/01/30 | 2274792 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2021/01/31 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2021/01/31 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2021/01/31 | 2272796 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
2020/04/15 | 58761 | systems/texlive/tlnet/tlpkg/TeXLive/TLPOBJ.pm
2020/03/20 | 41736 | systems/texlive/tlnet/tlpkg/TeXLive/TLPSRC.pm
2020/05/11 | 15010 | systems/texlive/tlnet/tlpkg/TeXLive/TLTREE.pm
@@ -276738,7 +276727,7 @@
2020/10/03 | 318630 | systems/win32/miktex/tm/packages/filehook.tar.lzma
2012/12/04 | 924573 | systems/win32/miktex/tm/packages/fileinfo.tar.lzma
2011/09/21 | 281409 | systems/win32/miktex/tm/packages/filemod.tar.lzma
-2021/01/30 | 564823 | systems/win32/miktex/tm/packages/files.csv.lzma
+2021/01/31 | 564823 | 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
@@ -277922,9 +277911,9 @@
2018/01/12 | 157226 | systems/win32/miktex/tm/packages/miktex-zip-bin-x64.tar.lzma
2021/01/16 | 39515 | systems/win32/miktex/tm/packages/miktex-zlib-bin-2.9.tar.lzma
2021/01/16 | 43377 | systems/win32/miktex/tm/packages/miktex-zlib-bin-x64-2.9.tar.lzma
-2021/01/30 | 206667 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
-2021/01/30 | 1249174 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
-2021/01/30 | 1165647 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
+2021/01/31 | 206592 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
+2021/01/31 | 1248807 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
+2021/01/31 | 1167435 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
2021/01/16 | 13454 | systems/win32/miktex/tm/packages/miktex-zzip-bin-2.9.tar.lzma
2021/01/16 | 14322 | 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
@@ -278082,187 +278071,187 @@
2018/04/09 | 400132 | systems/win32/miktex/tm/packages/newunicodechar.tar.lzma
2011/09/19 | 101312 | systems/win32/miktex/tm/packages/newvbtm.tar.lzma
2020/09/06 | 231669 | systems/win32/miktex/tm/packages/newverbs.tar.lzma
-2021/01/30 | 565009 | systems/win32/miktex/tm/packages/next/files.csv.lzma
-2021/01/30 | 50702 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
-2021/01/30 | 56455 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
-2021/01/30 | 969228 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
-2021/01/30 | 1078966 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
-2021/01/30 | 29023 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
-2021/01/30 | 31345 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
-2021/01/30 | 29511 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
-2021/01/30 | 34304 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
-2021/01/30 | 50031 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
-2021/01/30 | 57609 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
-2021/01/30 | 85302 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
-2021/01/30 | 94597 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
-2021/01/30 | 67495 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
-2021/01/30 | 75340 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
-2021/01/30 | 27204 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
-2021/01/30 | 30874 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
-2021/01/30 | 329920 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
-2021/01/30 | 392681 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
-2021/01/30 | 32544 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
-2021/01/30 | 36677 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
-2021/01/30 | 51410 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
-2021/01/30 | 56599 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
-2021/01/30 | 231667 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
-2021/01/30 | 254185 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
-2021/01/30 | 179466 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
-2021/01/30 | 195675 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
-2021/01/30 | 52497 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
-2021/01/30 | 59145 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
-2021/01/30 | 21130 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
-2021/01/30 | 23312 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
-2021/01/30 | 461385 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
-2021/01/30 | 45636 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
-2021/01/30 | 51184 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
-2021/01/30 | 281360 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
-2021/01/30 | 320796 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
-2021/01/30 | 40962 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
-2021/01/30 | 45272 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
-2021/01/30 | 116935 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
-2021/01/30 | 131490 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
-2021/01/30 | 1281720 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
-2021/01/30 | 1417675 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
-2021/01/30 | 87637 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
-2021/01/30 | 99483 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
-2021/01/30 | 43071 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
-2021/01/30 | 47903 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
-2021/01/30 | 25128 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
-2021/01/30 | 28006 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
-2021/01/30 | 55850 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
-2021/01/30 | 62740 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
-2021/01/30 | 135012 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
-2021/01/30 | 152744 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
-2021/01/30 | 73323 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
-2021/01/30 | 77840 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
-2021/01/30 | 71574 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
-2021/01/30 | 80639 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
-2021/01/30 | 258630 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
-2021/01/30 | 295623 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
-2021/01/30 | 22044 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
-2021/01/30 | 25039 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
-2021/01/30 | 97402 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
-2021/01/30 | 112281 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
-2021/01/30 | 63830 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
-2021/01/30 | 72842 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
-2021/01/30 | 94788 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
-2021/01/30 | 113934 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
-2021/01/30 | 38058 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
-2021/01/30 | 42663 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
-2021/01/30 | 484326 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
-2021/01/30 | 568173 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
-2021/01/30 | 147187 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
-2021/01/30 | 159865 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
-2021/01/30 | 94803 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
-2021/01/30 | 109149 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
-2021/01/30 | 16339 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
-2021/01/30 | 17958 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
-2021/01/30 | 28229 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
-2021/01/30 | 30031 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
-2021/01/30 | 624933 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
-2021/01/30 | 680060 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
-2021/01/30 | 531715 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
-2021/01/30 | 596721 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
-2021/01/30 | 475817 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
-2021/01/30 | 514087 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
-2021/01/30 | 94374 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
-2021/01/30 | 103331 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
-2021/01/30 | 1685634 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
-2021/01/30 | 2002727 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
-2021/01/30 | 67684 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
-2021/01/30 | 74156 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
-2021/01/30 | 27462 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
-2021/01/30 | 31542 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
-2021/01/30 | 7746 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
-2021/01/30 | 8773 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
-2021/01/30 | 195625 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
-2021/01/30 | 213737 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
-2021/01/30 | 250201 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
-2021/01/30 | 283984 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
-2021/01/30 | 97121 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
-2021/01/30 | 101859 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
-2021/01/30 | 60607 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
-2021/01/30 | 67914 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
-2021/01/30 | 124938 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
-2021/01/30 | 136345 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
-2021/01/30 | 147087 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
-2021/01/30 | 163794 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
-2021/01/30 | 199584 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
-2021/01/30 | 180158 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
-2021/01/30 | 67355 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
-2021/01/30 | 77430 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
-2021/01/30 | 31228 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
-2021/01/30 | 35065 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
-2021/01/30 | 38070 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
-2021/01/30 | 42550 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
-2021/01/30 | 42871 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
-2021/01/30 | 46958 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
-2021/01/30 | 45897 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
-2021/01/30 | 52403 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
-2021/01/30 | 193759 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
-2021/01/30 | 210930 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
-2021/01/30 | 35424 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
-2021/01/30 | 40228 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
-2021/01/30 | 740141 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
-2021/01/30 | 813999 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
-2021/01/30 | 198079 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
-2021/01/30 | 202649 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
-2021/01/30 | 208088 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
-2021/01/30 | 243510 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
-2021/01/30 | 78748 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
-2021/01/30 | 87770 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
-2021/01/30 | 1171815 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
-2021/01/30 | 1307388 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
-2021/01/30 | 20118 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
-2021/01/30 | 23880 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
-2021/01/30 | 31549 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
-2021/01/30 | 37250 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
-2021/01/30 | 63928 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
-2021/01/30 | 71966 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
-2021/01/30 | 43564 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
-2021/01/30 | 52056 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
-2021/01/30 | 1291601 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
-2021/01/30 | 1421908 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
-2021/01/30 | 42398 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
-2021/01/30 | 51863 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
-2021/01/30 | 56324 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
-2021/01/30 | 59808 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
-2021/01/30 | 25332 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
-2021/01/30 | 27442 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
-2021/01/30 | 16112 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
-2021/01/30 | 18107 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
-2021/01/30 | 63763 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
-2021/01/30 | 70202 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
-2021/01/30 | 153807 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
-2021/01/30 | 167737 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
-2021/01/30 | 56977 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
-2021/01/30 | 65322 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
-2021/01/30 | 99606 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
-2021/01/30 | 104759 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
-2021/01/30 | 2495614 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
-2021/01/30 | 2617419 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
-2021/01/30 | 55374 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
-2021/01/30 | 62080 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
-2021/01/30 | 33532 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
-2021/01/30 | 37310 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
-2021/01/30 | 27218 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
-2021/01/30 | 33142 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
-2021/01/30 | 65814 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
-2021/01/30 | 70425 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
-2021/01/30 | 310966 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
-2021/01/30 | 345231 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
-2021/01/30 | 583738 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
-2021/01/30 | 619142 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
-2021/01/30 | 39536 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
-2021/01/30 | 43384 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
-2021/01/30 | 206562 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
-2021/01/30 | 1249096 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
-2021/01/30 | 1165831 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
-2021/01/30 | 13465 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
-2021/01/30 | 14343 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
+2021/01/31 | 565009 | systems/win32/miktex/tm/packages/next/files.csv.lzma
+2021/01/31 | 50704 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
+2021/01/31 | 56455 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
+2021/01/31 | 969229 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
+2021/01/31 | 1078967 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
+2021/01/31 | 29024 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
+2021/01/31 | 31345 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
+2021/01/31 | 29512 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
+2021/01/31 | 34306 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
+2021/01/31 | 50031 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
+2021/01/31 | 57610 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
+2021/01/31 | 85306 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
+2021/01/31 | 94597 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
+2021/01/31 | 67496 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
+2021/01/31 | 75340 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
+2021/01/31 | 27204 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
+2021/01/31 | 30873 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
+2021/01/31 | 329919 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
+2021/01/31 | 392682 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
+2021/01/31 | 32544 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
+2021/01/31 | 36677 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
+2021/01/31 | 51410 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
+2021/01/31 | 56599 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
+2021/01/31 | 231668 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
+2021/01/31 | 254184 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
+2021/01/31 | 179467 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
+2021/01/31 | 195676 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
+2021/01/31 | 52498 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
+2021/01/31 | 59146 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
+2021/01/31 | 21129 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
+2021/01/31 | 23313 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
+2021/01/31 | 461385 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
+2021/01/31 | 45637 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
+2021/01/31 | 51184 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
+2021/01/31 | 281360 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
+2021/01/31 | 320796 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
+2021/01/31 | 40963 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
+2021/01/31 | 45271 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
+2021/01/31 | 116935 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
+2021/01/31 | 131491 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
+2021/01/31 | 1281722 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
+2021/01/31 | 1417673 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
+2021/01/31 | 87639 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
+2021/01/31 | 99483 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
+2021/01/31 | 43071 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
+2021/01/31 | 47903 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
+2021/01/31 | 25128 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
+2021/01/31 | 28006 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
+2021/01/31 | 55852 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
+2021/01/31 | 62741 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
+2021/01/31 | 135012 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
+2021/01/31 | 152746 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
+2021/01/31 | 73322 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
+2021/01/31 | 77839 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
+2021/01/31 | 71574 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
+2021/01/31 | 80639 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
+2021/01/31 | 258631 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
+2021/01/31 | 295622 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
+2021/01/31 | 22045 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
+2021/01/31 | 25038 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
+2021/01/31 | 97401 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
+2021/01/31 | 112281 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
+2021/01/31 | 63831 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
+2021/01/31 | 72843 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
+2021/01/31 | 94787 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
+2021/01/31 | 113933 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
+2021/01/31 | 38058 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
+2021/01/31 | 42663 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
+2021/01/31 | 484327 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
+2021/01/31 | 568173 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
+2021/01/31 | 147187 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
+2021/01/31 | 159865 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
+2021/01/31 | 94803 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
+2021/01/31 | 109148 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
+2021/01/31 | 16339 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
+2021/01/31 | 17958 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
+2021/01/31 | 28228 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
+2021/01/31 | 30031 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
+2021/01/31 | 624932 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
+2021/01/31 | 680060 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
+2021/01/31 | 531717 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
+2021/01/31 | 596722 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
+2021/01/31 | 475819 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
+2021/01/31 | 514089 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
+2021/01/31 | 94377 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
+2021/01/31 | 103332 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
+2021/01/31 | 1685635 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
+2021/01/31 | 2002728 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
+2021/01/31 | 67685 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
+2021/01/31 | 74158 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
+2021/01/31 | 27463 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
+2021/01/31 | 31543 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
+2021/01/31 | 7747 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
+2021/01/31 | 8774 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
+2021/01/31 | 195626 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
+2021/01/31 | 213738 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
+2021/01/31 | 250200 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
+2021/01/31 | 283982 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
+2021/01/31 | 97122 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
+2021/01/31 | 101860 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
+2021/01/31 | 60606 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
+2021/01/31 | 67915 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
+2021/01/31 | 124938 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
+2021/01/31 | 136346 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
+2021/01/31 | 147087 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
+2021/01/31 | 163796 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
+2021/01/31 | 199586 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
+2021/01/31 | 180159 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
+2021/01/31 | 67356 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
+2021/01/31 | 77430 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
+2021/01/31 | 31227 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
+2021/01/31 | 35065 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
+2021/01/31 | 38071 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
+2021/01/31 | 42551 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
+2021/01/31 | 42872 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
+2021/01/31 | 46959 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
+2021/01/31 | 45897 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
+2021/01/31 | 52403 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
+2021/01/31 | 193759 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
+2021/01/31 | 210931 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
+2021/01/31 | 35425 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
+2021/01/31 | 40229 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
+2021/01/31 | 740140 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
+2021/01/31 | 813998 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
+2021/01/31 | 198079 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
+2021/01/31 | 202649 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
+2021/01/31 | 208087 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
+2021/01/31 | 243512 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
+2021/01/31 | 78748 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
+2021/01/31 | 87770 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
+2021/01/31 | 1171816 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
+2021/01/31 | 1307386 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
+2021/01/31 | 20118 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
+2021/01/31 | 23882 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
+2021/01/31 | 31550 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
+2021/01/31 | 37250 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
+2021/01/31 | 63929 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
+2021/01/31 | 71967 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
+2021/01/31 | 43564 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
+2021/01/31 | 52056 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
+2021/01/31 | 1291602 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
+2021/01/31 | 1421911 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
+2021/01/31 | 42397 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
+2021/01/31 | 51864 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
+2021/01/31 | 56324 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
+2021/01/31 | 59809 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
+2021/01/31 | 25332 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
+2021/01/31 | 27441 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
+2021/01/31 | 16113 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
+2021/01/31 | 18106 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
+2021/01/31 | 63764 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
+2021/01/31 | 70202 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
+2021/01/31 | 153806 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
+2021/01/31 | 167738 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
+2021/01/31 | 56977 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
+2021/01/31 | 65322 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
+2021/01/31 | 99606 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
+2021/01/31 | 104761 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
+2021/01/31 | 2495614 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
+2021/01/31 | 2617420 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
+2021/01/31 | 55375 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
+2021/01/31 | 62082 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
+2021/01/31 | 33533 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
+2021/01/31 | 37311 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
+2021/01/31 | 27216 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
+2021/01/31 | 33143 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
+2021/01/31 | 65815 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
+2021/01/31 | 70426 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
+2021/01/31 | 310964 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
+2021/01/31 | 345230 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
+2021/01/31 | 583743 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
+2021/01/31 | 619143 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
+2021/01/31 | 39537 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
+2021/01/31 | 43384 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
+2021/01/31 | 206640 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
+2021/01/31 | 1249117 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
+2021/01/31 | 1166112 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
+2021/01/31 | 13465 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
+2021/01/31 | 14342 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
2019/03/12 | 1412 | systems/win32/miktex/tm/packages/nextpage.tar.lzma
-2021/01/30 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini
+2021/01/31 | 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
@@ -278592,7 +278581,7 @@
2020/10/20 | 342254 | systems/win32/miktex/tm/packages/preview.tar.lzma
2019/06/20 | 375963 | systems/win32/miktex/tm/packages/prftree.tar.lzma
2020/10/27 | 357822 | systems/win32/miktex/tm/packages/principia.tar.lzma
-2021/01/30 | 843 | systems/win32/miktex/tm/packages/pr.ini
+2021/01/31 | 843 | 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
@@ -279989,7 +279978,7 @@
2004/06/04 | 404 | tds/tds.sed
2004/06/23 | 65418 | tds/tds.tex
2019/05/29 | 304264 | tds.zip
-2021/01/31 | 186 | timestamp
+2021/02/01 | 186 | timestamp
2002/08/26 | 61898 | usergrps/dante/antrag.pdf
2002/08/26 | 118217 | usergrps/dante/antrag.ps
2017/06/30 | 917 | usergrps/dante/dtk/doc/beispiel.bib
diff --git a/FILES.byname.gz b/FILES.byname.gz
index 2319f32e1c..1f361bf14a 100644
--- a/FILES.byname.gz
+++ b/FILES.byname.gz
Binary files differ
diff --git a/FILES.last07days b/FILES.last07days
index 7229c1e0bf..8ffa6c6d45 100644
--- a/FILES.last07days
+++ b/FILES.last07days
@@ -1,255 +1,466 @@
-2021/01/30 | 99606 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
-2021/01/30 | 99483 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
-2021/01/30 | 97402 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
-2021/01/30 | 97121 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
-2021/01/30 | 969228 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
+2021/01/31 | 99606 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
+2021/01/31 | 99483 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
+2021/01/31 | 9923 | macros/latex/contrib/xsim/HISTORY
+2021/01/31 | 97401 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
+2021/01/31 | 97122 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
+2021/01/31 | 969229 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
+2021/01/31 | 964006 | macros/generic/witharrows.zip
+2021/01/31 | 95608 | macros/latex/contrib/xsim/examples/xsim.issues-49.pdf
+2021/01/31 | 95053 | macros/unicodetex/latex/texnegar/texnegar.dtx
+2021/01/31 | 94803 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
+2021/01/31 | 94787 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
+2021/01/31 | 94597 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
+2021/01/31 | 94377 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
+2021/01/31 | 9129 | macros/latex/contrib/biblatex-contrib/windycity/doc/windycity.sty
+2021/01/31 | 91296 | macros/latex/contrib/xsim/examples/xsim.texsx-369636.pdf
+2021/01/31 | 90679 | graphics/mcf2graph/mcf2graph.mf
+2021/01/31 | 903628 | systems/texlive/tlnet/archive/tex4ht.r57565.tar.xz
+2021/01/31 | 894 | macros/latex/contrib/xsim/examples/xsim.grade-distribution.tex
+2021/01/31 | 878555 | macros/unicodetex/latex/texnegar/texnegar-luatex-glyph.pdf
+2021/01/31 | 87770 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
+2021/01/31 | 8774 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
+2021/01/31 | 87639 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
+2021/01/31 | 871 | macros/latex/contrib/xsim/examples/xsim.texsx-369636.tex
+2021/01/31 | 86588 | macros/latex/contrib/xsim/examples/xsim.various.pdf
+2021/01/31 | 86049 | macros/latex/contrib/xsim/examples/xsim.texsx-13635.pdf
+2021/01/31 | 85306 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
+2021/01/31 | 843 | systems/win32/miktex/tm/packages/pr.ini
+2021/01/31 | 840 | macros/latex/contrib/xsim/examples/xsim.collections.tex
+2021/01/31 | 832 | macros/latex/contrib/xsim/examples/xsim.listings.tex
+2021/01/31 | 813998 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
+2021/01/31 | 80639 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
+2021/01/31 | 79664 | macros/latex/contrib/biblatex-contrib/windycity/windycity.bbx
+2021/01/31 | 78748 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
+2021/01/31 | 77839 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
+2021/01/31 | 776 | macros/latex/contrib/xsim/examples/xsim.description-list.tex
+2021/01/31 | 774 | macros/latex/contrib/xsim/examples/xsim.randomexercises.tex
+2021/01/31 | 7747 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
+2021/01/31 | 77430 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
+2021/01/31 | 76314 | macros/latex/contrib/biblatex-contrib/windycity/doc/windycity.bib
+2021/01/31 | 75340 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
+2021/01/31 | 74158 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
+2021/01/31 | 740140 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
+2021/01/31 | 73322 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
+2021/01/31 | 72843 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
+2021/01/31 | 71967 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
+2021/01/31 | 71574 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
+2021/01/31 | 70426 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
+2021/01/31 | 70202 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
+2021/01/31 | 6921 | macros/luatex/latex/hu-berlin-bundle/README.md
+2021/01/31 | 680060 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
+2021/01/31 | 67915 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
+2021/01/31 | 67685 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
+2021/01/31 | 67496 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
+2021/01/31 | 67356 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
+2021/01/31 | 66767 | macros/luatex/latex/hu-berlin-bundle/hu-berlin-bundle.dtx
+2021/01/31 | 65815 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
+2021/01/31 | 65714 | macros/latex/contrib/xsim/examples/xsim.texsx-369065.pdf
+2021/01/31 | 65544 | macros/unicodetex/latex/texnegar/doc-samples-xep.pdf
+2021/01/31 | 653 | macros/latex/contrib/xsim/examples/xsim.pointsums.tex
+2021/01/31 | 65322 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
+2021/01/31 | 64956 | macros/latex/contrib/xsim/examples/xsim.golatex-91339.pdf
+2021/01/31 | 640821 | macros/generic/witharrows/witharrows.pdf
+2021/01/31 | 63929 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
+2021/01/31 | 63831 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
+2021/01/31 | 63764 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
+2021/01/31 | 634517 | graphics/mcf2graph/mcf_manual.pdf
+2021/01/31 | 63436 | macros/unicodetex/latex/texnegar/doc-samples-glyph.pdf
+2021/01/31 | 62969 | macros/unicodetex/latex/texnegar/doc-samples-hrule.pdf
+2021/01/31 | 62741 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
+2021/01/31 | 624 | macros/latex/contrib/xsim/examples/xsim.texsx-299534.tex
+2021/01/31 | 624932 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
+2021/01/31 | 62082 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
+2021/01/31 | 619143 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
+2021/01/31 | 60606 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
+2021/01/31 | 60453 | macros/latex/contrib/xsim/examples/xsim.texsx-466584.pdf
+2021/01/31 | 59809 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
+2021/01/31 | 596722 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
+2021/01/31 | 59146 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
+2021/01/31 | 5868 | macros/latex/contrib/xsim/examples/xsim.various.tex
+2021/01/31 | 583743 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
+2021/01/31 | 57610 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
+2021/01/31 | 57220 | macros/latex/contrib/xsim/examples/xsim.listofexercises.pdf
+2021/01/31 | 570 | macros/latex/contrib/xsim/examples/xsim.boxed-headings.tex
+2021/01/31 | 56977 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
+2021/01/31 | 56911 | macros/latex/contrib/xsim/examples/xsim.texsx-338165.pdf
+2021/01/31 | 568173 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
+2021/01/31 | 56599 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
+2021/01/31 | 565009 | systems/win32/miktex/tm/packages/next/files.csv.lzma
+2021/01/31 | 564823 | systems/win32/miktex/tm/packages/files.csv.lzma
+2021/01/31 | 56455 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
+2021/01/31 | 563702 | macros/unicodetex/latex/texnegar/texnegar.pdf
+2021/01/31 | 56324 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
+2021/01/31 | 56106 | macros/latex/contrib/xsim/examples/xsim.texsx-199360.pdf
+2021/01/31 | 55852 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
+2021/01/31 | 55375 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
+2021/01/31 | 5521166 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2021/01/31 | 55077 | macros/latex/contrib/xsim/examples/xsim.texsx-369803.pdf
+2021/01/31 | 543135 | macros/latex/contrib/easybook.zip
+2021/01/31 | 542 | macros/latex/contrib/xsim/examples/xsim.texsx-370642.tex
+2021/01/31 | 537 | macros/latex/contrib/biblatex-contrib/windycity/windycity.dbx
+2021/01/31 | 534937 | graphics/mcf2graph/mcf_example.pdf
+2021/01/31 | 531717 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
+2021/01/31 | 52741 | macros/latex/contrib/fontsize/fontsize.dtx
+2021/01/31 | 52498 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
+2021/01/31 | 52403 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
+2021/01/31 | 522890 | macros/latex/contrib/biblatex-contrib/windycity.zip
+2021/01/31 | 52056 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
+2021/01/31 | 51864 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
+2021/01/31 | 51800 | macros/latex/contrib/xsim/examples/xsim.texsx-580636.pdf
+2021/01/31 | 51410 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
+2021/01/31 | 514089 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
+2021/01/31 | 51184 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
+2021/01/31 | 50704 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
+2021/01/31 | 50575 | macros/latex/contrib/xsim/examples/xsim.texsx-395273.pdf
+2021/01/31 | 50031 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
+2021/01/31 | 49333 | macros/latex/contrib/xsim/examples/xsim.texsx-576998.pdf
+2021/01/31 | 4918660 | install/macros/unicodetex/latex/texnegar.tds.zip
+2021/01/31 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2021/01/31 | 4893277 | macros/unicodetex/latex/texnegar.zip
+2021/01/31 | 484327 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
+2021/01/31 | 48095 | macros/latex/contrib/xsim/examples/xsim.texsx-299534.pdf
+2021/01/31 | 47903 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
+2021/01/31 | 475819 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
+2021/01/31 | 46959 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
+2021/01/31 | 46317 | macros/latex/contrib/xsim/examples/xsim.golatex-80640.pdf
+2021/01/31 | 461385 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
+2021/01/31 | 46009 | macros/latex/contrib/xsim/examples/xsim.texwelt-23968.pdf
+2021/01/31 | 45897 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
+2021/01/31 | 45747 | macros/latex/contrib/xsim/examples/xsim.listings.pdf
+2021/01/31 | 45722 | macros/latex/contrib/xsim/examples/xsim.hints.pdf
+2021/01/31 | 45637 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
+2021/01/31 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2021/01/31 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2021/01/31 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2021/01/31 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2021/01/31 | 45271 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
+2021/01/31 | 441 | macros/latex/contrib/xsim/examples/xsim.blanks.tex
+2021/01/31 | 43907 | macros/latex/contrib/xsim/examples/xsim.texwelt-6698.pdf
+2021/01/31 | 436673 | macros/latex/contrib/biblatex-contrib/windycity/doc/windycity.pdf
+2021/01/31 | 43564 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
+2021/01/31 | 43384 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
+2021/01/31 | 43071 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
+2021/01/31 | 42872 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
+2021/01/31 | 42870 | macros/latex/contrib/easybook/easybook.cls
+2021/01/31 | 42663 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
+2021/01/31 | 42551 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
+2021/01/31 | 42514 | macros/latex/contrib/xsim/examples/xsim.texsx-498299.pdf
+2021/01/31 | 42397 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
+2021/01/31 | 42156 | macros/latex/contrib/xsim/examples/xsim.different-point-types.pdf
+2021/01/31 | 413 | macros/latex/contrib/xsim/examples/xsim.texsx-155630.tex
+2021/01/31 | 41171 | macros/latex/contrib/xsim/examples/xsim.description-list.pdf
+2021/01/31 | 40963 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
+2021/01/31 | 40229 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
+2021/01/31 | 39537 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
+2021/01/31 | 392682 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
+2021/01/31 | 3900 | macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-leaders-hrule.tex
+2021/01/31 | 3900 | macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-leaders-glyph.tex
+2021/01/31 | 388 | systems/texlive/tlnet/archive/texlive-docindex.r57557.tar.xz
+2021/01/31 | 38748 | macros/latex/contrib/xsim/examples/xsim.crossref.pdf
+2021/01/31 | 3863 | macros/latex/contrib/biblatex-contrib/windycity/README.md
+2021/01/31 | 38372 | macros/latex/contrib/xsim/examples/xsim.boxed-headings.pdf
+2021/01/31 | 38256 | macros/latex/contrib/xsim/examples/xsim.blanks.pdf
+2021/01/31 | 38071 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
+2021/01/31 | 38058 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
+2021/01/31 | 3804 | macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-glyph.tex
+2021/01/31 | 38029 | graphics/mcf2graph/mcf_man_soc.mf
+2021/01/31 | 37717 | macros/latex/contrib/xsim/examples/xsim.floating.pdf
+2021/01/31 | 3754 | macros/luatex/latex/hu-berlin-bundle/makefile
+2021/01/31 | 37311 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
+2021/01/31 | 37250 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
+2021/01/31 | 36974 | macros/latex/contrib/xsim/examples/xsim.texsx-305110.pdf
+2021/01/31 | 3694 | macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-leaders-hrule.tex
+2021/01/31 | 3693 | macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-leaders-glyph.tex
+2021/01/31 | 36677 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
+2021/01/31 | 36617 | graphics/mcf2graph/mcf_exa_soc.mf
+2021/01/31 | 36259 | macros/latex/contrib/xsim/examples/xsim.texwelt-15093.pdf
+2021/01/31 | 3615 | macros/unicodetex/latex/texnegar/texnegar-luatex-leaders-hrule.tex
+2021/01/31 | 3615 | macros/unicodetex/latex/texnegar/texnegar-luatex-leaders-glyph.tex
+2021/01/31 | 3608 | macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-glyph.tex
+2021/01/31 | 3596 | macros/latex/contrib/xsim/README
+2021/01/31 | 35425 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
+2021/01/31 | 3519 | macros/unicodetex/latex/texnegar/texnegar-luatex-glyph.tex
+2021/01/31 | 35065 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
+2021/01/31 | 345230 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
+2021/01/31 | 3443 | macros/latex/contrib/xsim/examples/xsim.texsx-350028.tex
+2021/01/31 | 34306 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
+2021/01/31 | 3414 | macros/latex/contrib/xsim/examples/xsim.golatex-80640.tex
+2021/01/31 | 33533 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
+2021/01/31 | 3323538 | macros/latex/contrib/xsim.zip
+2021/01/31 | 33143 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
+2021/01/31 | 329919 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
+2021/01/31 | 32958110 | fonts/haranoaji-extra.zip
+2021/01/31 | 32820523 | fonts/haranoaji.zip
+2021/01/31 | 32544 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
+2021/01/31 | 3209 | fonts/haranoaji/README
+2021/01/31 | 3209 | fonts/haranoaji-extra/README
+2021/01/31 | 320796 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
+2021/01/31 | 31763 | macros/latex/contrib/xsim/examples/xsim.difficulties.pdf
+2021/01/31 | 31550 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
+2021/01/31 | 31543 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
+2021/01/31 | 31345 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
+2021/01/31 | 31227 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
+2021/01/31 | 3114 | macros/latex/contrib/xsim/examples/xsim.texwelt-15093.tex
+2021/01/31 | 3113 | macros/unicodetex/latex/texnegar/xepersian-XB.tex
+2021/01/31 | 310964 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
+2021/01/31 | 31019 | macros/latex/contrib/xsim/examples/xsim.multiplechoice.pdf
+2021/01/31 | 30939 | macros/latex/contrib/xsim/examples/xsim.code-and-output.pdf
+2021/01/31 | 30873 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
+2021/01/31 | 308548 | macros/latex/contrib/easybook/doc/easybook-demo.pdf
+2021/01/31 | 307011 | macros/luatex/latex/hu-berlin-bundle/hu-berlin-bundle.pdf
+2021/01/31 | 304757 | macros/latex/contrib/fontsize.zip
+2021/01/31 | 30259 | macros/latex/contrib/xsim/examples/xsim.collections.pdf
+2021/01/31 | 30178 | macros/latex/contrib/xsim/xsim-manual.cls
+2021/01/31 | 30031 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
+2021/01/31 | 296971 | macros/latex/contrib/fontsize/fontsize.pdf
+2021/01/31 | 295622 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
+2021/01/31 | 29512 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
+2021/01/31 | 29024 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
+2021/01/31 | 2873970 | macros/unicodetex/latex/texnegar/texnegar-doc.pdf
+2021/01/31 | 28671 | macros/unicodetex/latex/texnegar/texnegar-doc.ltx
+2021/01/31 | 28428 | macros/latex/contrib/xsim/examples/xsim.texsx-370642.pdf
+2021/01/31 | 283982 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
+2021/01/31 | 28228 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
+2021/01/31 | 281360 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
+2021/01/31 | 28126 | macros/latex/contrib/xsim/examples/xsim.pointsums.pdf
+2021/01/31 | 28006 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
+2021/01/31 | 279828 | macros/generic/witharrows/witharrows.dtx
+2021/01/31 | 2790 | macros/latex/contrib/xsim/examples/xsim.texsx-576998.tex
+2021/01/31 | 278471 | macros/unicodetex/latex/texnegar/texnegar-luatex-leaders-glyph.pdf
+2021/01/31 | 27463 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
+2021/01/31 | 27441 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
+2021/01/31 | 2741 | macros/latex/contrib/xsim/examples/xsim.issues-49.tex
+2021/01/31 | 27216 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
+2021/01/31 | 27204 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
+2021/01/31 | 27157 | macros/latex/contrib/xsim/examples/xsim.texsx-308883.pdf
+2021/01/31 | 270367 | macros/generic/witharrows/witharrows-french.pdf
+2021/01/31 | 2628 | macros/unicodetex/latex/texnegar/texnegar.ins
+2021/01/31 | 2617420 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
+2021/01/31 | 26102 | macros/latex/contrib/xsim/examples/xsim.texsx-391530.pdf
+2021/01/31 | 258 | macros/latex/contrib/xsim/examples/xsim.texsx-391530-exercises.tex
+2021/01/31 | 258631 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
+2021/01/31 | 25497 | macros/latex/contrib/easybook/doc/easybook.tex
+2021/01/31 | 254184 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
+2021/01/31 | 2540 | macros/latex/contrib/easybook/doc/easybook-demo.tex
+2021/01/31 | 25332 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
+2021/01/31 | 25128 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
+2021/01/31 | 25038 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
+2021/01/31 | 250200 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
+2021/01/31 | 2495614 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
+2021/01/31 | 247 | macros/latex/contrib/xsim/examples/xsim.texsx-308883.tex
+2021/01/31 | 243512 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
+2021/01/31 | 24290322 | systems/texlive/tlnet/install-tl.zip
+2021/01/31 | 240154 | macros/luatex/latex/hu-berlin-bundle.zip
+2021/01/31 | 23882 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
+2021/01/31 | 23313 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
+2021/01/31 | 23204 | macros/latex/contrib/xsim/examples/xsim.grade-distribution.pdf
+2021/01/31 | 232038 | macros/latex/contrib/easybook/doc/easybook.pdf
+2021/01/31 | 231668 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
+2021/01/31 | 23048 | macros/latex/contrib/xsim/examples/xsim.randomexercises.pdf
+2021/01/31 | 2292 | macros/latex/contrib/xsim/examples/xsim.texsx-580636.tex
+2021/01/31 | 2272796 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2021/01/31 | 2226 | macros/latex/contrib/xsim/examples/xsim.golatex-91339.tex
+2021/01/31 | 22045 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
+2021/01/31 | 213738 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
+2021/01/31 | 212553 | macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-leaders-glyph.pdf
+2021/01/31 | 21129 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
+2021/01/31 | 210931 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
+2021/01/31 | 208087 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
+2021/01/31 | 206640 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
+2021/01/31 | 206592 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
+2021/01/31 | 2055036 | systems/texlive/tlnet/archive/kpfonts-otf.doc.r57563.tar.xz
+2021/01/31 | 202649 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
+2021/01/31 | 20118 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
+2021/01/31 | 201163 | graphics/mcf2graph/mcf_mplib_exa.pdf
+2021/01/31 | 20048 | macros/latex/contrib/xsim/examples/xsim.texsx-155630.pdf
+2021/01/31 | 2002728 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
+2021/01/31 | 199586 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
+2021/01/31 | 198079 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
+2021/01/31 | 195676 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
+2021/01/31 | 195626 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
+2021/01/31 | 194661 | macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-leaders-glyph.pdf
+2021/01/31 | 19418921 | systems/texlive/tlnet/install-tl-windows.exe
+2021/01/31 | 193759 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
+2021/01/31 | 1934 | macros/latex/contrib/xsim/examples/xsim.texsx-13635.tex
+2021/01/31 | 1923 | macros/latex/contrib/xsim/examples/xsim.texsx-395273.tex
+2021/01/31 | 19106 | macros/latex/contrib/biblatex-contrib/windycity/LICENCE
+2021/01/31 | 186932 | systems/texlive/tlnet/archive/lexend.r57564.tar.xz
+2021/01/31 | 1820 | macros/latex/contrib/xsim/examples/xsim.texsx-369065.tex
+2021/01/31 | 18106 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
+2021/01/31 | 180159 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
+2021/01/31 | 17958 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
+2021/01/31 | 179467 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
+2021/01/31 | 1792 | macros/latex/contrib/xsim/examples/xsim.listofexercises.tex
+2021/01/31 | 17924 | macros/latex/contrib/biblatex-contrib/windycity/windycity.cbx
+2021/01/31 | 1788 | macros/latex/contrib/xsim/examples/xsim.texsx-338165.tex
+2021/01/31 | 175513 | macros/latex/contrib/xsim/xsim.sty
+2021/01/31 | 1749 | macros/latex/contrib/xsim/examples/xsim.texwelt-6698.tex
+2021/01/31 | 172728 | systems/texlive/tlnet/archive/texlive-docindex.doc.r57557.tar.xz
+2021/01/31 | 17012006 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2021/01/31 | 169438 | macros/unicodetex/latex/texnegar/texnegar-luatex-leaders-hrule.pdf
+2021/01/31 | 1685635 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
+2021/01/31 | 167738 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
+2021/01/31 | 163796 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
+2021/01/31 | 16339 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
+2021/01/31 | 16320 | macros/latex/contrib/biblatex-contrib/windycity/CHANGES.md
+2021/01/31 | 16113 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
+2021/01/31 | 159865 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
+2021/01/31 | 157990 | macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-glyph.pdf
+2021/01/31 | 1566 | macros/latex/contrib/xsim/examples/xsim.texwelt-23968.tex
+2021/01/31 | 156636 | macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-glyph.pdf
+2021/01/31 | 156635 | macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-leaders-hrule.pdf
+2021/01/31 | 155945 | macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-leaders-hrule.pdf
+2021/01/31 | 1551 | macros/unicodetex/latex/texnegar/INSTALL.txt
+2021/01/31 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2021/01/31 | 153806 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
+2021/01/31 | 1537 | macros/latex/contrib/xsim/examples/xsim.texsx-498299.tex
+2021/01/31 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2021/01/31 | 152746 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
+2021/01/31 | 1511 | macros/latex/contrib/fontsize/README
+2021/01/31 | 14903 | macros/luatex/latex/hu-berlin-bundle/img/texografie-logo.pdf
+2021/01/31 | 147187 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
+2021/01/31 | 147087 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
+2021/01/31 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2021/01/31 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2021/01/31 | 14342 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
+2021/01/31 | 143084 | systems/texlive/tlnet/archive/lexend.doc.r57564.tar.xz
+2021/01/31 | 1425 | macros/latex/contrib/xsim/examples/xsim.multiplechoice.tex
+2021/01/31 | 1421911 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
+2021/01/31 | 1417673 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
+2021/01/31 | 1386 | macros/latex/contrib/xsim/examples/xsim.texsx-466584.tex
+2021/01/31 | 1368 | macros/latex/contrib/xsim/examples/xsim.crossref.tex
+2021/01/31 | 1368423 | graphics/mcf2graph.zip
+2021/01/31 | 136346 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
+2021/01/31 | 136160 | systems/texlive/tlnet/archive/tex4ht.doc.r57565.tar.xz
+2021/01/31 | 135012 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
+2021/01/31 | 13465 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
+2021/01/31 | 1345 | macros/latex/contrib/xsim/examples/xsim.difficulties.tex
+2021/01/31 | 1337 | macros/latex/contrib/xsim/examples/xsim.different-point-types.tex
+2021/01/31 | 1317 | macros/latex/contrib/xsim/examples/xsim.texsx-369803.tex
+2021/01/31 | 131491 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
+2021/01/31 | 13141 | macros/unicodetex/latex/texnegar/doc-ligature-texnegar.pdf
+2021/01/31 | 1308757 | macros/latex/contrib/xsim/xsim-manual.pdf
+2021/01/31 | 1307386 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
+2021/01/31 | 130588 | macros/latex/contrib/xsim/examples/xsim.texsx-350028.pdf
+2021/01/31 | 1291602 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
+2021/01/31 | 1281722 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
+2021/01/31 | 1260 | macros/latex/contrib/xsim/examples/xsim.texsx-391530.tex
+2021/01/31 | 125063 | macros/latex/contrib/biblatex-contrib/windycity/doc/windycity.tex
+2021/01/31 | 124938 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
+2021/01/31 | 1249117 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
+2021/01/31 | 1248807 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
+2021/01/31 | 1221 | macros/latex/contrib/xsim/examples/xsim.hints.tex
+2021/01/31 | 11876 | macros/latex/contrib/biblatex-contrib/windycity/american-windycity.lbx
+2021/01/31 | 1183 | macros/latex/contrib/xsim/examples/xsim.texsx-199360.tex
+2021/01/31 | 1171816 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
+2021/01/31 | 116935 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
+2021/01/31 | 1167435 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
+2021/01/31 | 1166112 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
+2021/01/31 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini
+2021/01/31 | 1142 | macros/unicodetex/latex/texnegar/README.txt
+2021/01/31 | 113933 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
+2021/01/31 | 112281 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
+2021/01/31 | 11069 | graphics/mcf2graph/CHANGELOG
+2021/01/31 | 109148 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
+2021/01/31 | 1078967 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
+2021/01/31 | 1072 | macros/latex/contrib/xsim/examples/xsim.texsx-305110.tex
+2021/01/31 | 1071952 | systems/texlive/tlnet/archive/kpfonts-otf.r57563.tar.xz
+2021/01/31 | 107071 | macros/latex/contrib/xsim/xsim-manual.tex
+2021/01/31 | 1067 | macros/latex/contrib/xsim/examples/xsim.code-and-output.tex
+2021/01/31 | 106691 | macros/unicodetex/latex/texnegar/xepersian-XB.pdf
+2021/01/31 | 104761 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
+2021/01/31 | 103332 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
+2021/01/31 | 101860 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
+2021/01/31 | 1013 | macros/latex/contrib/xsim/examples/xsim.floating.tex
+2021/01/31 | 10116 | macros/unicodetex/latex/texnegar/doc-ligature-xep.pdf
+2021/01/31 | 10100 | macros/latex/contrib/xsim/xsimverb.sty
2021/01/30 | 95504 | systems/texlive/tlnet/archive/l3experimental.source.r57554.tar.xz
2021/01/30 | 95408 | fonts/kpfonts-otf/fonts/KpSans-Bold.otf
2021/01/30 | 9503 | fonts/lexend/doc/lexend.tex
2021/01/30 | 94940 | fonts/kpfonts-otf/fonts/KpSans-Regular.otf
-2021/01/30 | 94803 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
-2021/01/30 | 94788 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
-2021/01/30 | 94597 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
-2021/01/30 | 94374 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
-2021/01/30 | 903656 | systems/texlive/tlnet/archive/tex4ht.r57555.tar.xz
-2021/01/30 | 87770 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
-2021/01/30 | 8773 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
-2021/01/30 | 87637 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
2021/01/30 | 85751 | systems/win32/miktex/tm/packages/footnotehyper.tar.lzma
-2021/01/30 | 85302 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
-2021/01/30 | 843 | systems/win32/miktex/tm/packages/pr.ini
2021/01/30 | 838456 | systems/win32/miktex/tm/packages/fancyhdr.tar.lzma
2021/01/30 | 836063 | systems/win32/miktex/tm/packages/l3backend.tar.lzma
-2021/01/30 | 813999 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
-2021/01/30 | 80639 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
2021/01/30 | 788908 | systems/texlive/tlnet/archive/l3backend.doc.r57554.tar.xz
2021/01/30 | 7884 | systems/texlive/tlnet/archive/changes.r57549.tar.xz
-2021/01/30 | 78748 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
-2021/01/30 | 77840 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
-2021/01/30 | 7746 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
-2021/01/30 | 77430 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
2021/01/30 | 753572 | systems/win32/miktex/tm/packages/fontsetup.tar.lzma
-2021/01/30 | 75340 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
2021/01/30 | 7418 | systems/win32/miktex/tm/packages/cmap.tar.lzma
-2021/01/30 | 74156 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
-2021/01/30 | 740141 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
2021/01/30 | 740076 | systems/texlive/tlnet/archive/fontsetup.doc.r57553.tar.xz
-2021/01/30 | 73323 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
-2021/01/30 | 72842 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
-2021/01/30 | 71966 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
-2021/01/30 | 71574 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
-2021/01/30 | 70425 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
2021/01/30 | 70252 | systems/texlive/tlnet/archive/footnotehyper.doc.r57551.tar.xz
-2021/01/30 | 70202 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
-2021/01/30 | 680060 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
-2021/01/30 | 67914 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
-2021/01/30 | 67684 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
-2021/01/30 | 67495 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
2021/01/30 | 674371 | systems/win32/miktex/tm/packages/pmx.tar.lzma
-2021/01/30 | 67355 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
2021/01/30 | 66092 | fonts/kpfonts-otf/fonts/KpMono-Italic.otf
-2021/01/30 | 65814 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
+2021/01/30 | 6582116 | fonts/haranoaji/HaranoAjiMincho-Bold.otf
2021/01/30 | 65372952 | macros/latex/contrib/rmannot.zip
-2021/01/30 | 65322 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
+2021/01/30 | 6479916 | fonts/haranoaji-extra/HaranoAjiMincho-Heavy.otf
2021/01/30 | 64788 | fonts/kpfonts-otf/fonts/KpMono-BoldItalic.otf
-2021/01/30 | 63928 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
-2021/01/30 | 63830 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
-2021/01/30 | 63763 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
+2021/01/30 | 6430788 | fonts/haranoaji-extra/HaranoAjiMincho-SemiBold.otf
+2021/01/30 | 6394968 | fonts/haranoaji-extra/HaranoAjiMincho-Medium.otf
+2021/01/30 | 6322076 | fonts/haranoaji/HaranoAjiMincho-Regular.otf
2021/01/30 | 631521 | fonts/lexend.zip
-2021/01/30 | 62740 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
-2021/01/30 | 624933 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
+2021/01/30 | 6240708 | fonts/haranoaji/HaranoAjiMincho-Light.otf
2021/01/30 | 622013 | systems/win32/miktex/tm/packages/multirow.tar.lzma
-2021/01/30 | 62080 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
-2021/01/30 | 619142 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
-2021/01/30 | 60607 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
-2021/01/30 | 59808 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
2021/01/30 | 597148 | systems/texlive/tlnet/archive/multirow.doc.r57552.tar.xz
-2021/01/30 | 596721 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
-2021/01/30 | 59145 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
2021/01/30 | 58696 | fonts/kpfonts-otf/fonts/KpMono-Regular.otf
-2021/01/30 | 583738 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
+2021/01/30 | 5834604 | fonts/haranoaji-extra/HaranoAjiMincho-ExtraLight.otf
2021/01/30 | 5828 | systems/texlive/tlnet/archive/fontsetup.r57553.tar.xz
-2021/01/30 | 57609 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
2021/01/30 | 57568 | fonts/kpfonts-otf/fonts/KpMono-Bold.otf
-2021/01/30 | 56977 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
-2021/01/30 | 568173 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
-2021/01/30 | 56599 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
-2021/01/30 | 565009 | systems/win32/miktex/tm/packages/next/files.csv.lzma
-2021/01/30 | 564823 | systems/win32/miktex/tm/packages/files.csv.lzma
-2021/01/30 | 56455 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
-2021/01/30 | 56324 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
-2021/01/30 | 55850 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
2021/01/30 | 5560 | systems/texlive/tlnet/archive/cmap.r57550.tar.xz
-2021/01/30 | 55374 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
-2021/01/30 | 5521149 | systems/texlive/tlnet/install-tl-unx.tar.gz
-2021/01/30 | 531715 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
-2021/01/30 | 52497 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
-2021/01/30 | 52403 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
-2021/01/30 | 52056 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
-2021/01/30 | 51863 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
2021/01/30 | 515632 | systems/win32/miktex/tm/packages/ebproof.tar.lzma
-2021/01/30 | 51410 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
-2021/01/30 | 514087 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
-2021/01/30 | 51184 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
-2021/01/30 | 50702 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
-2021/01/30 | 50031 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
+2021/01/30 | 51049 | graphics/mcf2graph/mcf_manual.tex
+2021/01/30 | 5058632 | fonts/haranoaji/HaranoAjiGothic-Heavy.otf
2021/01/30 | 4964286 | macros/latex/contrib/rmannot/doc/rmannot_man.pdf
-2021/01/30 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
-2021/01/30 | 484326 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
-2021/01/30 | 47903 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
-2021/01/30 | 475817 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
-2021/01/30 | 46958 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
-2021/01/30 | 461385 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
-2021/01/30 | 45897 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
-2021/01/30 | 45636 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
-2021/01/30 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2021/01/30 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
-2021/01/30 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2021/01/30 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2021/01/30 | 4857852 | fonts/haranoaji/HaranoAjiGothic-Bold.otf
+2021/01/30 | 4729788 | fonts/haranoaji/HaranoAjiGothic-Medium.otf
+2021/01/30 | 4712076 | fonts/haranoaji/HaranoAjiGothic-Regular.otf
+2021/01/30 | 4701392 | fonts/haranoaji-extra/HaranoAjiGothic-Normal.otf
+2021/01/30 | 4679024 | fonts/haranoaji-extra/HaranoAjiGothic-Light.otf
2021/01/30 | 455424 | fonts/kpfonts-otf/fonts/KpMath-Light.otf
-2021/01/30 | 45272 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
-2021/01/30 | 43564 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
+2021/01/30 | 4408088 | fonts/haranoaji-extra/HaranoAjiGothic-ExtraLight.otf
2021/01/30 | 434 | fonts/kpfonts-otf/tex/KpLight.fontspec
-2021/01/30 | 43384 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
2021/01/30 | 433595 | macros/latex/contrib/rmannot/doc/rmannot.pdf
2021/01/30 | 4320 | fonts/kpfonts-otf/README.md
-2021/01/30 | 43071 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
-2021/01/30 | 42871 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
2021/01/30 | 428692 | fonts/kpfonts-otf/fonts/KpMath-Regular.otf
2021/01/30 | 427197 | macros/latex/contrib/profcollege/latex/ProfCollege.sty
-2021/01/30 | 42663 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
-2021/01/30 | 42550 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
2021/01/30 | 423 | fonts/kpfonts-otf/tex/KpRoman.fontspec
-2021/01/30 | 42398 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
2021/01/30 | 4237328 | fonts/kpfonts-otf.zip
2021/01/30 | 4096552 | systems/win32/miktex/tm/packages/l3experimental.tar.lzma
-2021/01/30 | 40962 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
-2021/01/30 | 40228 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
2021/01/30 | 3969140 | systems/texlive/tlnet/archive/l3experimental.doc.r57554.tar.xz
-2021/01/30 | 39536 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
-2021/01/30 | 392681 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
-2021/01/30 | 388 | systems/texlive/tlnet/archive/texlive-docindex.r57548.tar.xz
-2021/01/30 | 38070 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
-2021/01/30 | 38058 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
-2021/01/30 | 37310 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
-2021/01/30 | 37250 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
-2021/01/30 | 36677 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
-2021/01/30 | 35424 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
-2021/01/30 | 35065 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
-2021/01/30 | 345231 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
-2021/01/30 | 34304 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
-2021/01/30 | 33532 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
-2021/01/30 | 33142 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
-2021/01/30 | 329920 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
-2021/01/30 | 32544 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
2021/01/30 | 32527 | fonts/kpfonts-otf/doc/Kpfonts-OTF-Doc-French.ltx
-2021/01/30 | 320796 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
-2021/01/30 | 31549 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
-2021/01/30 | 31542 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
-2021/01/30 | 31345 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
-2021/01/30 | 31228 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
2021/01/30 | 31144 | systems/texlive/tlnet/archive/l3backend.source.r57554.tar.xz
-2021/01/30 | 310966 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
-2021/01/30 | 30874 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
-2021/01/30 | 30031 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
2021/01/30 | 29850 | fonts/kpfonts-otf/doc/Kpfonts-OTF-Doc-English.ltx
2021/01/30 | 29696 | systems/texlive/tlnet/archive/l3experimental.r57554.tar.xz
-2021/01/30 | 295623 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
-2021/01/30 | 29511 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
2021/01/30 | 2904 | systems/texlive/tlnet/archive/footnotehyper.r57551.tar.xz
-2021/01/30 | 29023 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
-2021/01/30 | 283984 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
-2021/01/30 | 28229 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
-2021/01/30 | 281360 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
-2021/01/30 | 28006 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
2021/01/30 | 2782919 | macros/latex/contrib/profcollege.zip
2021/01/30 | 2760 | systems/texlive/tlnet/archive/multirow.r57552.tar.xz
2021/01/30 | 275380 | fonts/kpfonts-otf/fonts/KpMath-Sans.otf
-2021/01/30 | 27462 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
-2021/01/30 | 27442 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
-2021/01/30 | 27218 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
-2021/01/30 | 27204 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
-2021/01/30 | 2617419 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
-2021/01/30 | 258630 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
2021/01/30 | 2584 | fonts/lexend/README.md
2021/01/30 | 2574022 | systems/win32/miktex/tm/packages/asymptote.tar.lzma
-2021/01/30 | 254185 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
-2021/01/30 | 25332 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
-2021/01/30 | 25128 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
-2021/01/30 | 25039 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
-2021/01/30 | 250201 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
-2021/01/30 | 2495614 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
2021/01/30 | 2481585 | systems/win32/miktex/tm/packages/changes.tar.lzma
2021/01/30 | 2455088 | systems/texlive/tlnet/archive/changes.doc.r57549.tar.xz
-2021/01/30 | 243510 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
-2021/01/30 | 24290322 | systems/texlive/tlnet/install-tl.zip
2021/01/30 | 241 | fonts/kpfonts-otf/tex/KpSans.fontspec
-2021/01/30 | 23880 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
-2021/01/30 | 23312 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
-2021/01/30 | 231667 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
-2021/01/30 | 2274792 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
2021/01/30 | 2228 | systems/texlive/tlnet/archive/cmap.doc.r57550.tar.xz
-2021/01/30 | 22044 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
2021/01/30 | 218820 | systems/texlive/tlnet/archive/texlive-scripts.doc.r57548.tar.xz
-2021/01/30 | 213737 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
-2021/01/30 | 21130 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
-2021/01/30 | 210930 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
-2021/01/30 | 208088 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
-2021/01/30 | 206667 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
-2021/01/30 | 206562 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
-2021/01/30 | 202649 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
-2021/01/30 | 20118 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
2021/01/30 | 20112 | systems/texlive/tlnet/archive/multirow.source.r57552.tar.xz
-2021/01/30 | 2002727 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
-2021/01/30 | 199584 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
2021/01/30 | 198620 | fonts/kpfonts-otf/fonts/KpMath-Semibold.otf
-2021/01/30 | 198079 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
2021/01/30 | 196892 | fonts/kpfonts-otf/fonts/KpMath-Bold.otf
-2021/01/30 | 195675 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
-2021/01/30 | 195625 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
-2021/01/30 | 19418407 | systems/texlive/tlnet/install-tl-windows.exe
-2021/01/30 | 193759 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
2021/01/30 | 19106 | fonts/lexend/LICENSE
2021/01/30 | 187563 | fonts/kpfonts-otf/doc/Kpfonts-OTF-Doc-French.pdf
2021/01/30 | 186140 | fonts/kpfonts-otf/doc/Kpfonts-OTF-Doc-English.pdf
2021/01/30 | 185 | fonts/kpfonts-otf/tex/KpMono.fontspec
-2021/01/30 | 18107 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
-2021/01/30 | 180158 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
-2021/01/30 | 17958 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
-2021/01/30 | 179466 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
2021/01/30 | 1788053 | fonts/kpfonts-otf/doc/unimath-kpfonts.pdf
2021/01/30 | 17832 | fonts/kpfonts-otf/tex/kpfonts-otf.sty
-2021/01/30 | 171808 | systems/texlive/tlnet/archive/texlive-docindex.doc.r57548.tar.xz
2021/01/30 | 1702509 | macros/latex/contrib/profcollege/doc/ProfCollege-doc.pdf
-2021/01/30 | 17011902 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
-2021/01/30 | 1685634 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
2021/01/30 | 16804 | systems/texlive/tlnet/archive/changes.source.r57549.tar.xz
-2021/01/30 | 167737 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
2021/01/30 | 16745 | fonts/kpfonts-otf/doc/unimath-kpfonts.ltx
-2021/01/30 | 163794 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
-2021/01/30 | 16339 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
-2021/01/30 | 16112 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
-2021/01/30 | 159865 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
-2021/01/30 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
-2021/01/30 | 153807 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
-2021/01/30 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
2021/01/30 | 152 | fonts/lexend/tex/LexendZetta.fontspec
-2021/01/30 | 152744 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
2021/01/30 | 151 | fonts/lexend/tex/LexendTera.fontspec
2021/01/30 | 151 | fonts/lexend/tex/LexendPeta.fontspec
2021/01/30 | 151 | fonts/lexend/tex/LexendMega.fontspec
2021/01/30 | 151 | fonts/lexend/tex/LexendGiga.fontspec
2021/01/30 | 151 | fonts/lexend/tex/LexendDeca.fontspec
2021/01/30 | 150 | fonts/lexend/tex/LexendExa.fontspec
-2021/01/30 | 147187 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
-2021/01/30 | 147087 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
-2021/01/30 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
-2021/01/30 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
2021/01/30 | 14460 | systems/texlive/tlnet/archive/l3backend.r57554.tar.xz
-2021/01/30 | 14343 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
2021/01/30 | 142532 | fonts/kpfonts-otf/fonts/KpRoman-BoldItalic.otf
-2021/01/30 | 1421908 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
-2021/01/30 | 1417675 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
2021/01/30 | 140432 | fonts/kpfonts-otf/fonts/KpRoman-SemiboldItalic.otf
2021/01/30 | 139936 | fonts/lexend/font/LexendGiga-Regular.ttf
2021/01/30 | 139896 | fonts/lexend/font/LexendExa-Regular.ttf
@@ -259,44 +470,21 @@
2021/01/30 | 138904 | fonts/lexend/font/LexendZetta-Regular.ttf
2021/01/30 | 138556 | fonts/lexend/font/LexendDeca-Regular.ttf
2021/01/30 | 136507 | fonts/lexend/doc/lexend.pdf
-2021/01/30 | 136345 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
-2021/01/30 | 136160 | systems/texlive/tlnet/archive/tex4ht.doc.r57555.tar.xz
-2021/01/30 | 135012 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
2021/01/30 | 134964 | fonts/kpfonts-otf/fonts/KpRoman-LightItalic.otf
-2021/01/30 | 13465 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
2021/01/30 | 132824 | fonts/kpfonts-otf/fonts/KpRoman-Italic.otf
2021/01/30 | 132224 | systems/texlive/tlnet/archive/texlive-scripts.r57548.tar.xz
2021/01/30 | 131844 | fonts/kpfonts-otf/fonts/KpRoman-Bold.otf
-2021/01/30 | 131490 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
2021/01/30 | 130740 | fonts/kpfonts-otf/fonts/KpRoman-Regular.otf
-2021/01/30 | 1307388 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
2021/01/30 | 1304 | macros/latex/contrib/rmannot/README.md
2021/01/30 | 130212 | fonts/kpfonts-otf/fonts/KpRoman-Light.otf
2021/01/30 | 12976 | systems/texlive/tlnet/archive/footnotehyper.source.r57551.tar.xz
-2021/01/30 | 1291601 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
2021/01/30 | 129108 | fonts/kpfonts-otf/fonts/KpRoman-Semibold.otf
2021/01/30 | 129066 | macros/latex/contrib/rmannot/rmannot.dtx
-2021/01/30 | 1281720 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
-2021/01/30 | 124938 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
-2021/01/30 | 1249174 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
-2021/01/30 | 1249096 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
2021/01/30 | 1243 | fonts/lexend/tex/lexend.sty
2021/01/30 | 1216103 | macros/latex/contrib/profcollege/doc/ProfCollege-doc.zip
2021/01/30 | 119067 | systems/win32/miktex/tm/packages/chinese-jfm.tar.lzma
-2021/01/30 | 1171815 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
-2021/01/30 | 116935 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
-2021/01/30 | 1165831 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
-2021/01/30 | 1165647 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
-2021/01/30 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini
-2021/01/30 | 113934 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
-2021/01/30 | 112281 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
-2021/01/30 | 109149 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
-2021/01/30 | 1078966 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
-2021/01/30 | 104759 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
-2021/01/30 | 103331 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
2021/01/30 | 103212 | fonts/kpfonts-otf/fonts/KpSans-BoldItalic.otf
2021/01/30 | 103092 | fonts/kpfonts-otf/fonts/KpSans-Italic.otf
-2021/01/30 | 101859 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
2021/01/30 | 101344 | macros/latex/contrib/rmannot/doc/rmannot_man.tex
2021/01/29 | 96089 | macros/latex/contrib/l3experimental/l3galley.dtx
2021/01/29 | 9501 | macros/luatex/generic/chinese-jfm/jfm-zh_TW.lua
@@ -699,9 +887,7 @@
2021/01/28 | 104164 | macros/latex/contrib/changes/examples/changes.example.packageoptions.todonotes.pdf
2021/01/28 | 1036 | macros/unicodetex/latex/fontsetup/fspgfsdidotclassicot.sty
2021/01/27 | 99723556 | systems/win32/w32tex/web2c-lib.tar.xz
-2021/01/27 | 94317 | macros/unicodetex/latex/texnegar/texnegar.dtx
2021/01/27 | 87948 | language/japanese/BX/bxjscls/bxjscls-manual.tex
-2021/01/27 | 878555 | macros/unicodetex/latex/texnegar/texnegar-luatex-glyph.pdf
2021/01/27 | 8410804 | systems/win32/w32tex/uptex-w32.tar.xz
2021/01/27 | 812088 | systems/win32/miktex/tm/packages/miktex-pdftex-bin-x64-2.9.tar.lzma
2021/01/27 | 805200 | systems/texlive/tlnet/archive/babel.doc.r57530.tar.xz
@@ -713,42 +899,20 @@
2021/01/27 | 672933 | graphics/pgf/contrib/sankey/sankey-doc.pdf
2021/01/27 | 672668 | systems/texlive/tlnet/archive/babel.source.r57530.tar.xz
2021/01/27 | 6621116 | systems/win32/w32tex/ptex-ng-w32.tar.xz
-2021/01/27 | 65546 | macros/unicodetex/latex/texnegar/doc-samples-xep.pdf
-2021/01/27 | 63437 | macros/unicodetex/latex/texnegar/doc-samples-glyph.pdf
-2021/01/27 | 62969 | macros/unicodetex/latex/texnegar/doc-samples-hrule.pdf
2021/01/27 | 6052 | systems/texlive/tlnet/archive/ocgx2.doc.r57531.tar.xz
2021/01/27 | 5959 | language/japanese/BX/bxjscls/README.md
-2021/01/27 | 564734 | macros/unicodetex/latex/texnegar/texnegar.pdf
2021/01/27 | 5177720 | systems/win32/w32tex/aleph-w32.tar.xz
2021/01/27 | 49829 | graphics/pgf/contrib/sankey/sankey-doc.tex
2021/01/27 | 49446 | systems/texlive/tlnet/tlpkg/installer/config.guess
-2021/01/27 | 4913381 | install/macros/unicodetex/latex/texnegar.tds.zip
2021/01/27 | 49058856 | systems/win32/w32tex/xetex-w32.tar.xz
-2021/01/27 | 4888102 | macros/unicodetex/latex/texnegar.zip
2021/01/27 | 4054 | macros/latex/contrib/rmannot/examples/rm3da/tst_rm3da.tex
2021/01/27 | 401085 | language/japanese/BX/bxjscls/bxjscls.dtx
-2021/01/27 | 3900 | macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-leaders-hrule.tex
-2021/01/27 | 3900 | macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-leaders-glyph.tex
2021/01/27 | 381683 | language/japanese/BX/bxjscls/bxjscls-manual.pdf
-2021/01/27 | 3804 | macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-glyph.tex
2021/01/27 | 3716680 | systems/texlive/tlnet/archive/media9.doc.r57529.tar.xz
-2021/01/27 | 3694 | macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-leaders-hrule.tex
-2021/01/27 | 3693 | macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-leaders-glyph.tex
-2021/01/27 | 3615 | macros/unicodetex/latex/texnegar/texnegar-luatex-leaders-hrule.tex
-2021/01/27 | 3615 | macros/unicodetex/latex/texnegar/texnegar-luatex-leaders-glyph.tex
-2021/01/27 | 3608 | macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-glyph.tex
-2021/01/27 | 3519 | macros/unicodetex/latex/texnegar/texnegar-luatex-glyph.tex
-2021/01/27 | 3113 | macros/unicodetex/latex/texnegar/xepersian-XB.tex
-2021/01/27 | 2868138 | macros/unicodetex/latex/texnegar/texnegar-doc.pdf
-2021/01/27 | 278471 | macros/unicodetex/latex/texnegar/texnegar-luatex-leaders-glyph.pdf
-2021/01/27 | 26999 | macros/unicodetex/latex/texnegar/texnegar-doc.ltx
-2021/01/27 | 2618 | macros/unicodetex/latex/texnegar/texnegar.ins
2021/01/27 | 247 | graphics/pgf/contrib/sankey/README
2021/01/27 | 23122 | graphics/pgf/contrib/sankey/sankey.sty
2021/01/27 | 212607 | macros/latex/contrib/suftesi/suftesi.dtx
-2021/01/27 | 212563 | macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-leaders-glyph.pdf
2021/01/27 | 1994600 | systems/win32/miktex/tm/packages/miktex-luatex-bin-x64-2.9.tar.lzma
-2021/01/27 | 194659 | macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-leaders-glyph.pdf
2021/01/27 | 1894372 | systems/texlive/tlnet/archive/media9.r57529.tar.xz
2021/01/27 | 18743516 | systems/win32/w32tex/luatex-exp-w32.tar.xz
2021/01/27 | 18738160 | systems/win32/w32tex/luatex-dev-w32.tar.xz
@@ -757,30 +921,20 @@
2021/01/27 | 1776784 | systems/texlive/tlnet/archive/media9.source.r57529.tar.xz
2021/01/27 | 173424 | systems/texlive/tlnet/archive/babel.r57530.tar.xz
2021/01/27 | 1716780 | systems/win32/miktex/tm/packages/miktex-luatex-bin-2.9.tar.lzma
-2021/01/27 | 169438 | macros/unicodetex/latex/texnegar/texnegar-luatex-leaders-hrule.pdf
2021/01/27 | 1669 | macros/latex/contrib/suftesi/README
2021/01/27 | 1667944 | language/japanese/BX/bxjscls.zip
-2021/01/27 | 157991 | macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-glyph.pdf
-2021/01/27 | 156643 | macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-leaders-hrule.pdf
-2021/01/27 | 156631 | macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-glyph.pdf
2021/01/27 | 15652 | language/japanese/BX/bxjscls/README-ja.md
-2021/01/27 | 1561 | macros/unicodetex/latex/texnegar/INSTALL.txt
-2021/01/27 | 155935 | macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-leaders-hrule.pdf
2021/01/27 | 1526239 | install/macros/latex/contrib/suftesi.tds.zip
2021/01/27 | 1510330 | macros/latex/contrib/suftesi.zip
2021/01/27 | 1461 | language/japanese/BX/bxjscls/LICENSE
2021/01/27 | 1423137 | systems/win32/miktex/tm/packages/miktex-runtime-bin-x64-2.9.tar.lzma
2021/01/27 | 13444 | systems/texlive/tlnet/archive/ocgx2.r57531.tar.xz
-2021/01/27 | 13132 | macros/unicodetex/latex/texnegar/doc-ligature-texnegar.pdf
2021/01/27 | 1294518 | systems/win32/miktex/tm/packages/miktex-runtime-bin-2.9.tar.lzma
2021/01/27 | 125992 | systems/texlive/tlnet/archive/media4svg.doc.r57528.tar.xz
2021/01/27 | 119094 | macros/latex/contrib/rmannot/examples/rm3da/tst_rm3da.pdf
2021/01/27 | 1173834 | language/japanese/BX/bxjscls/bxjscls.pdf
-2021/01/27 | 1142 | macros/unicodetex/latex/texnegar/README.txt
2021/01/27 | 10959 | graphics/pgf/contrib/sankey/tikzlibrarydubins.code.tex
-2021/01/27 | 106692 | macros/unicodetex/latex/texnegar/xepersian-XB.pdf
2021/01/27 | 10633688 | systems/win32/w32tex/ptex-w32.tar.xz
-2021/01/27 | 10111 | macros/unicodetex/latex/texnegar/doc-ligature-xep.pdf
2021/01/27 | 1000 | macros/latex/contrib/rmannot/rmannot.cfg
2021/01/26 | 815772 | macros/latex/required/babel/base/babel.pdf
2021/01/26 | 808376 | systems/win32/w32tex/win64/dvipdfm-w64.tar.xz
@@ -852,18 +1006,16 @@
2021/01/25 | 5012 | macros/latex/contrib/dccpaper/dccpaper-by.pdf
2021/01/25 | 49316 | macros/latex/contrib/media9/pdfbase.sty
2021/01/25 | 440 | systems/texlive/tlnet/archive/tlshell.doc.r57512.tar.xz
-2021/01/25 | 42980 | macros/latex/contrib/fontsize/fontsize.dtx
2021/01/25 | 41648 | macros/latex/contrib/media4svg/example/beamer-example-4.svg
2021/01/25 | 41398 | macros/latex/contrib/ran_toks/docs/rantoks_man.tex
2021/01/25 | 3763 | macros/latex/contrib/dccpaper/README.md
2021/01/25 | 3737599 | macros/latex/contrib/media9/doc/media9.pdf
2021/01/25 | 372 | macros/latex/contrib/media4svg/ChangeLog
+2021/01/25 | 3711 | graphics/mcf2graph/README
2021/01/25 | 3527 | macros/latex/contrib/ran_toks/examples/ran-toks.tex
2021/01/25 | 347104 | macros/latex/contrib/dccpaper.zip
2021/01/25 | 321608 | systems/texlive/tlnet/archive/ean13isbn.doc.r57514.tar.xz
2021/01/25 | 305770 | macros/latex/contrib/dccpaper/dccpaper.pdf
-2021/01/25 | 294528 | macros/latex/contrib/fontsize.zip
-2021/01/25 | 287477 | macros/latex/contrib/fontsize/fontsize.pdf
2021/01/25 | 28544 | systems/texlive/tlnet/archive/tlshell.r57512.tar.xz
2021/01/25 | 2821 | macros/latex/contrib/dccpaper/Makefile
2021/01/25 | 280081 | support/ltximg.zip
@@ -877,7 +1029,7 @@
2021/01/25 | 21894 | macros/latex/contrib/ocgx2.zip
2021/01/25 | 1945172 | systems/texlive/tlnet/archive/biblatex-oxref.doc.r57513.tar.xz
2021/01/25 | 1828 | systems/texlive/tlnet/archive/ean13isbn.r57514.tar.xz
-2021/01/25 | 1510 | macros/latex/contrib/fontsize/README
+2021/01/25 | 16610 | graphics/mcf2graph/mcf_mplib_exa.tex
2021/01/25 | 15000 | macros/latex/contrib/media4svg/example/beamer-example-3.svg
2021/01/25 | 14524 | macros/latex/contrib/media9/ChangeLog
2021/01/25 | 12551 | macros/latex/contrib/ocgx2/ocgbase.sty
@@ -885,139 +1037,3 @@
2021/01/25 | 110747 | systems/texlive/tlnet/tlpkg/translations/sr.po
2021/01/25 | 103122 | macros/latex/contrib/dccpaper/dccpaper.dtx
2021/01/25 | 100632 | systems/texlive/tlnet/tlpkg/translations/fr.po
-2021/01/24 | 988837 | systems/win32/miktex/tm/packages/penrose.tar.lzma
-2021/01/24 | 966168 | systems/texlive/tlnet/archive/penrose.doc.r57508.tar.xz
-2021/01/24 | 9400 | systems/texlive/tlnet/archive/fnpct.r57508.tar.xz
-2021/01/24 | 92 | systems/win32/miktex/setup/deb/dists/stretch/universe/binary-amd64/Release
-2021/01/24 | 89 | systems/win32/miktex/setup/deb/dists/xenial/universe/binary-amd64/Release
-2021/01/24 | 89 | systems/win32/miktex/setup/deb/dists/buster/universe/binary-amd64/Release
-2021/01/24 | 89 | systems/win32/miktex/setup/deb/dists/bionic/universe/binary-amd64/Release
-2021/01/24 | 88633 | support/ltximg/ltximg-doc.tex
-2021/01/24 | 86 | systems/win32/miktex/setup/deb/dists/focal/universe/binary-amd64/Release
-2021/01/24 | 8320 | systems/texlive/tlnet/archive/matapli.r57508.tar.xz
-2021/01/24 | 7843 | systems/win32/miktex/setup/rpm/opensuse/15/repodata/edf5be2cca4631c5bc6d0b80b9da54127936a6d9ba795906cd27925a5fd8a6bd-filelists.sqlite.bz2
-2021/01/24 | 761 | systems/win32/miktex/setup/rpm/fedora/28/repodata/fd8d66513cdd220c412ba706b960af332660b2f4ad90a54c1ed4b74229cabcac-other.xml.gz
-2021/01/24 | 756 | systems/win32/miktex/setup/rpm/opensuse/15/repodata/a1ce5be9ec66407b56acec4233c38007639b93e46e661eb634f52c0a55e3a73e-other.xml.gz
-2021/01/24 | 7448 | systems/texlive/tlnet/archive/penrose.r57508.tar.xz
-2021/01/24 | 729900 | systems/texlive/tlnet/archive/translation-biblatex-de.doc.r57508.tar.xz
-2021/01/24 | 698 | macros/latex/contrib/ran_toks/examples/viewDB.tex
-2021/01/24 | 685 | macros/latex/contrib/ran_toks/examples/rt-cb.tex
-2021/01/24 | 6608 | systems/texlive/tlnet/archive/ut-thesis.source.r57508.tar.xz
-2021/01/24 | 6560 | systems/texlive/tlnet/archive/pixelart.source.r57508.tar.xz
-2021/01/24 | 6390 | support/ltximg/README.md
-2021/01/24 | 6366441 | systems/win32/miktex/tm/packages/newcomputermodern.tar.lzma
-2021/01/24 | 618662 | systems/win32/miktex/tm/packages/miktex-yap-bin-x64-2.9.tar.lzma
-2021/01/24 | 598 | systems/win32/miktex/setup/rpm/fedora/30/repodata/1f903c7ff148290bbeae68278d8e510bfee919b62b7f40fa52aac2b5a8b00122-other.xml.gz
-2021/01/24 | 583440 | systems/win32/miktex/tm/packages/miktex-yap-bin-2.9.tar.lzma
-2021/01/24 | 52436 | systems/win32/miktex/setup/rpm/fedora/30/repodata/76861cb11c2ce5ce5a04c84879860aa7a6ec1208450eac109e7b70b31428b4ea-filelists.sqlite.bz2
-2021/01/24 | 51985 | systems/win32/miktex/setup/rpm/fedora/28/repodata/0598965c999f2a1c61f5bed959eb5f51b78e2278229802eb3f80880f410e2d7b-filelists.sqlite.bz2
-2021/01/24 | 513436 | systems/texlive/tlnet/archive/biblatex-swiss-legal.doc.r57508.tar.xz
-2021/01/24 | 511 | systems/win32/miktex/setup/rpm/fedora/32/repodata/721c38a59d8028a108a2c9739f03d90631fe77b6d86f4c136055a3fab794748e-other.xml.gz
-2021/01/24 | 511088 | systems/texlive/tlnet/archive/oup-authoring-template.doc.r57508.tar.xz
-2021/01/24 | 495755 | systems/win32/miktex/tm/packages/fnpct.tar.lzma
-2021/01/24 | 488 | systems/win32/miktex/setup/rpm/opensuse/15/repodata/repomd.xml.asc
-2021/01/24 | 488 | systems/win32/miktex/setup/rpm/fedora/32/repodata/repomd.xml.asc
-2021/01/24 | 488 | systems/win32/miktex/setup/rpm/fedora/30/repodata/repomd.xml.asc
-2021/01/24 | 488 | systems/win32/miktex/setup/rpm/fedora/28/repodata/repomd.xml.asc
-2021/01/24 | 481820 | systems/texlive/tlnet/archive/fnpct.doc.r57508.tar.xz
-2021/01/24 | 4811364 | systems/texlive/tlnet/archive/lm.source.r57508.tar.xz
-2021/01/24 | 4744456 | systems/texlive/tlnet/archive/matapli.doc.r57508.tar.xz
-2021/01/24 | 473 | systems/win32/miktex/setup/deb/dists/xenial/Release.gpg
-2021/01/24 | 473 | systems/win32/miktex/setup/deb/dists/stretch/Release.gpg
-2021/01/24 | 473 | systems/win32/miktex/setup/deb/dists/focal/Release.gpg
-2021/01/24 | 473 | systems/win32/miktex/setup/deb/dists/buster/Release.gpg
-2021/01/24 | 473 | systems/win32/miktex/setup/deb/dists/bionic/Release.gpg
-2021/01/24 | 4708092 | systems/texlive/tlnet/archive/newcomputermodern.r57508.tar.xz
-2021/01/24 | 46596 | systems/texlive/tlnet/archive/chhaya.doc.r57508.tar.xz
-2021/01/24 | 4233 | systems/win32/miktex/setup/rpm/fedora/28/repodata/44dcf1a7eb68f5078d6270caf6df93876a05ff48f98c69fcf93f33a8006c9153-primary.xml.gz
-2021/01/24 | 4209 | systems/win32/miktex/setup/rpm/opensuse/15/repodata/a1dbc37d5215495c3094f917cd98c14dfbbae9110a2173787ea6448cc2b6e27b-primary.xml.gz
-2021/01/24 | 4207 | systems/win32/miktex/setup/rpm/fedora/30/repodata/5167223ed42fe5a4c1272eec3d0a9b8f1f35a4f2fdd9d2afe71c886cbfe0157c-primary.xml.gz
-2021/01/24 | 41450 | systems/win32/miktex/setup/rpm/fedora/32/repodata/6daa162fee251a483f3d9cbd1823f8e62748f04a33169898589129192227a068-filelists.sqlite.bz2
-2021/01/24 | 4140 | systems/texlive/tlnet/archive/chhaya.source.r57508.tar.xz
-2021/01/24 | 40844 | macros/latex/contrib/ran_toks/ran_toks.dtx
-2021/01/24 | 384 | systems/texlive/tlnet/archive/translation-biblatex-de.r57508.tar.xz
-2021/01/24 | 37898 | systems/win32/miktex/setup/rpm/fedora/30/repodata/915e51136f81da11b8a7f3ff9c0210b94493460b502e174d31e2c88d5dd58952-primary.sqlite.bz2
-2021/01/24 | 3784 | systems/win32/miktex/setup/rpm/fedora/32/repodata/5a9f4006d165ba02113d71aee6743a5a8627c848f76f3d518e6215996f2fb314-primary.xml.gz
-2021/01/24 | 37704 | systems/win32/miktex/setup/rpm/fedora/28/repodata/ecff3dddf38312afe0dc23474e5033c1e3b579442d7f2d08ecaae04ec86d348b-primary.sqlite.bz2
-2021/01/24 | 37490 | systems/win32/miktex/setup/rpm/opensuse/15/repodata/d4cb1b2ae0f5c9594d82ef284406942aacf207cee627a2402ab7da3027d5d9ce-primary.sqlite.bz2
-2021/01/24 | 3513867 | systems/win32/miktex/tm/packages/eqexam.tar.lzma
-2021/01/24 | 33787 | systems/win32/miktex/setup/rpm/fedora/30/repodata/251260fa45dd7d98d1b81873718be1371c3ecc0b1a16718c0aebb91c71c49c0d-filelists.xml.gz
-2021/01/24 | 3369 | systems/win32/miktex/setup/rpm/opensuse/15/repodata/93b0baf6cb93873f92718e20c44261e1511bf1581cf8c1ff5d8766a7bedfd1c9-filelists.xml.gz
-2021/01/24 | 33521 | systems/win32/miktex/setup/rpm/fedora/28/repodata/a5c9b2067b00b254db227d8c7d73d396e4c5a78a421594b794a8a83ab6c6d4f4-filelists.xml.gz
-2021/01/24 | 322624 | macros/latex/contrib/ean13isbn.zip
-2021/01/24 | 31727532 | systems/win32/miktex/setup/deb/pool/universe/m/miktex/miktex_21.1-bionic1_amd64.deb
-2021/01/24 | 316588 | support/ltximg/ltximg-doc.pdf
-2021/01/24 | 31556 | systems/win32/miktex/setup/rpm/fedora/32/repodata/701c92a21ce7a5b0fb6be76fa0cae19035ba6488a8a374a6fb9027006cf935e1-primary.sqlite.bz2
-2021/01/24 | 31540866 | systems/win32/miktex/setup/deb/pool/universe/m/miktex/miktex_21.1-focal1_amd64.deb
-2021/01/24 | 3133703 | systems/win32/miktex/tm/packages/acrotex.tar.lzma
-2021/01/24 | 31167682 | systems/win32/miktex/setup/deb/pool/universe/m/miktex/miktex_21.1-stretch1_amd64.deb
-2021/01/24 | 31060864 | systems/win32/miktex/setup/deb/pool/universe/m/miktex/miktex_21.1-buster1_amd64.deb
-2021/01/24 | 3058 | macros/latex/contrib/ran_toks/examples/rt-tst-qz.tex
-2021/01/24 | 30419582 | systems/win32/miktex/setup/deb/pool/universe/m/miktex/miktex_21.1-xenial1_amd64.deb
-2021/01/24 | 2980 | systems/win32/miktex/setup/rpm/fedora/30/repodata/repomd.xml
-2021/01/24 | 2980 | systems/win32/miktex/setup/rpm/fedora/28/repodata/repomd.xml
-2021/01/24 | 2979 | systems/win32/miktex/setup/rpm/fedora/32/repodata/repomd.xml
-2021/01/24 | 2976 | systems/win32/miktex/setup/rpm/opensuse/15/repodata/repomd.xml
-2021/01/24 | 27866 | support/ltximg/ltximg.man1.pdf
-2021/01/24 | 276611 | systems/win32/miktex/tm/packages/moderncv.tar.lzma
-2021/01/24 | 26084 | systems/texlive/tlnet/archive/spath3.source.r57508.tar.xz
-2021/01/24 | 25839 | systems/win32/miktex/setup/rpm/fedora/32/repodata/af957cec93bc9724ae26651ff87944024132d26d5990a97891f1928938b3f2da-filelists.xml.gz
-2021/01/24 | 2544 | systems/texlive/tlnet/archive/ut-thesis.r57508.tar.xz
-2021/01/24 | 24313796 | systems/win32/miktex/setup/rpm/fedora/28/miktex-21.1-1.fc28.x86_64.rpm
-2021/01/24 | 2348 | systems/texlive/tlnet/archive/chhaya.r57508.tar.xz
-2021/01/24 | 22293216 | systems/win32/miktex/setup/rpm/opensuse/15/miktex-21.1-1.x86_64.rpm
-2021/01/24 | 2195 | systems/win32/miktex/setup/deb/dists/buster/universe/binary-amd64/Packages.bz2
-2021/01/24 | 2180 | systems/win32/miktex/setup/deb/dists/stretch/universe/binary-amd64/Packages.bz2
-2021/01/24 | 21792520 | systems/win32/miktex/setup/rpm/fedora/30/miktex-21.1-1.fc30.x86_64.rpm
-2021/01/24 | 2163 | systems/win32/miktex/setup/deb/dists/xenial/universe/binary-amd64/Packages.bz2
-2021/01/24 | 2140 | systems/win32/miktex/setup/deb/dists/bionic/universe/binary-amd64/Packages.bz2
-2021/01/24 | 2038 | systems/win32/miktex/setup/deb/dists/stretch/InRelease
-2021/01/24 | 2034 | systems/win32/miktex/setup/deb/dists/xenial/InRelease
-2021/01/24 | 2034 | systems/win32/miktex/setup/deb/dists/buster/InRelease
-2021/01/24 | 2034 | systems/win32/miktex/setup/deb/dists/bionic/InRelease
-2021/01/24 | 2030 | systems/win32/miktex/setup/deb/dists/focal/InRelease
-2021/01/24 | 1982 | macros/latex/contrib/ran_toks/examples/mc-db.tex
-2021/01/24 | 1974 | systems/win32/miktex/setup/deb/dists/focal/universe/binary-amd64/Packages.bz2
-2021/01/24 | 19383124 | systems/win32/miktex/setup/rpm/fedora/32/miktex-21.1-1.fc32.x86_64.rpm
-2021/01/24 | 1852 | systems/win32/miktex/setup/deb/dists/xenial/universe/Contents-amd64.gz
-2021/01/24 | 1852 | systems/win32/miktex/setup/deb/dists/stretch/universe/Contents-amd64.gz
-2021/01/24 | 1852 | systems/win32/miktex/setup/deb/dists/buster/universe/Contents-amd64.gz
-2021/01/24 | 1852 | systems/win32/miktex/setup/deb/dists/bionic/universe/Contents-amd64.gz
-2021/01/24 | 18148 | systems/texlive/tlnet/archive/biblatex-swiss-legal.r57508.tar.xz
-2021/01/24 | 1771 | macros/latex/contrib/ran_toks/examples/rt-tst-eqe.tex
-2021/01/24 | 17556 | systems/texlive/tlnet/archive/spath3.r57508.tar.xz
-2021/01/24 | 1753 | systems/win32/miktex/setup/deb/dists/stretch/universe/binary-amd64/Packages.gz
-2021/01/24 | 1750 | systems/win32/miktex/setup/deb/dists/buster/universe/binary-amd64/Packages.gz
-2021/01/24 | 1749 | systems/win32/miktex/setup/deb/dists/focal/universe/Contents-amd64.gz
-2021/01/24 | 1724 | systems/win32/miktex/setup/deb/dists/bionic/universe/binary-amd64/Packages.gz
-2021/01/24 | 1721 | systems/win32/miktex/setup/deb/dists/xenial/universe/binary-amd64/Packages.gz
-2021/01/24 | 1699 | macros/latex/contrib/ran_toks/examples/ctrl-build.tex
-2021/01/24 | 1662988 | systems/texlive/tlnet/archive/newcomputermodern.doc.r57508.tar.xz
-2021/01/24 | 1630284 | systems/texlive/tlnet/archive/lm.doc.r57508.tar.xz
-2021/01/24 | 1618 | systems/win32/miktex/setup/deb/dists/focal/universe/binary-amd64/Packages.gz
-2021/01/24 | 1595 | systems/win32/miktex/setup/rpm/fedora/28/repodata/10202a0548e49491aa678b9316d889c6c66d8560edb386d91dd368ea4390009e-other.sqlite.bz2
-2021/01/24 | 1590 | systems/win32/miktex/setup/rpm/opensuse/15/repodata/a4206fe9519fdf4896787e97f94e8773ea38bc97a40efe411208805b99d6f19c-other.sqlite.bz2
-2021/01/24 | 1580 | systems/texlive/tlnet/archive/pixelart.r57508.tar.xz
-2021/01/24 | 154092 | systems/texlive/tlnet/archive/pixelart.doc.r57508.tar.xz
-2021/01/24 | 1522 | macros/latex/contrib/ran_toks/examples/mc-dbu.tex
-2021/01/24 | 1516 | systems/win32/miktex/setup/deb/dists/stretch/Release
-2021/01/24 | 15132 | systems/texlive/tlnet/archive/oup-authoring-template.r57508.tar.xz
-2021/01/24 | 1512 | systems/win32/miktex/setup/deb/dists/xenial/Release
-2021/01/24 | 1512 | systems/win32/miktex/setup/deb/dists/buster/Release
-2021/01/24 | 1512 | systems/win32/miktex/setup/deb/dists/bionic/Release
-2021/01/24 | 1508 | systems/win32/miktex/setup/deb/dists/focal/Release
-2021/01/24 | 134800 | support/ltximg/ltximg.pl
-2021/01/24 | 1330698 | systems/win32/miktex/tm/packages/spath3.tar.lzma
-2021/01/24 | 13256 | systems/texlive/tlnet/archive/penrose.source.r57508.tar.xz
-2021/01/24 | 1287960 | systems/texlive/tlnet/archive/spath3.doc.r57508.tar.xz
-2021/01/24 | 1273 | macros/latex/contrib/ran_toks/examples/mc-dbu-ctrld.tex
-2021/01/24 | 12444 | systems/win32/miktex/setup/deb/dists/buster/universe/binary-amd64/Packages
-2021/01/24 | 12353 | systems/win32/miktex/setup/deb/dists/stretch/universe/binary-amd64/Packages
-2021/01/24 | 1234 | systems/win32/miktex/setup/rpm/fedora/30/repodata/ff1193b53aec31d9be5c4894ce8260fcdba9e195d53f10f95919f532629ff49d-other.sqlite.bz2
-2021/01/24 | 12146 | systems/win32/miktex/setup/deb/dists/xenial/universe/binary-amd64/Packages
-2021/01/24 | 11944800 | systems/texlive/tlnet/archive/lm.r57508.tar.xz
-2021/01/24 | 11886 | systems/win32/miktex/setup/deb/dists/bionic/universe/binary-amd64/Packages
-2021/01/24 | 116940 | systems/texlive/tlnet/archive/ut-thesis.doc.r57508.tar.xz
-2021/01/24 | 10903 | systems/win32/miktex/setup/deb/dists/focal/universe/binary-amd64/Packages
-2021/01/24 | 1082 | systems/win32/miktex/setup/rpm/fedora/32/repodata/6e8a58e6168b7a98ef2bc0a62b181244ff7379b3b5e65b3b9a2e65960a95a84a-other.sqlite.bz2
-2021/01/24 | 10599 | support/ltximg/ltximg.1
diff --git a/fonts/haranoaji-extra/HaranoAjiGothic-ExtraLight.otf b/fonts/haranoaji-extra/HaranoAjiGothic-ExtraLight.otf
index 114352112a..c5891f9ba1 100644
--- a/fonts/haranoaji-extra/HaranoAjiGothic-ExtraLight.otf
+++ b/fonts/haranoaji-extra/HaranoAjiGothic-ExtraLight.otf
Binary files differ
diff --git a/fonts/haranoaji-extra/HaranoAjiGothic-Light.otf b/fonts/haranoaji-extra/HaranoAjiGothic-Light.otf
index 5304c9e9d7..773f048638 100644
--- a/fonts/haranoaji-extra/HaranoAjiGothic-Light.otf
+++ b/fonts/haranoaji-extra/HaranoAjiGothic-Light.otf
Binary files differ
diff --git a/fonts/haranoaji-extra/HaranoAjiGothic-Normal.otf b/fonts/haranoaji-extra/HaranoAjiGothic-Normal.otf
index 5d97e8e15c..c5efda2eb7 100644
--- a/fonts/haranoaji-extra/HaranoAjiGothic-Normal.otf
+++ b/fonts/haranoaji-extra/HaranoAjiGothic-Normal.otf
Binary files differ
diff --git a/fonts/haranoaji-extra/HaranoAjiMincho-ExtraLight.otf b/fonts/haranoaji-extra/HaranoAjiMincho-ExtraLight.otf
index ca53f5e1a1..48ac030dab 100644
--- a/fonts/haranoaji-extra/HaranoAjiMincho-ExtraLight.otf
+++ b/fonts/haranoaji-extra/HaranoAjiMincho-ExtraLight.otf
Binary files differ
diff --git a/fonts/haranoaji-extra/HaranoAjiMincho-Heavy.otf b/fonts/haranoaji-extra/HaranoAjiMincho-Heavy.otf
index 3755e00b91..335cc4e716 100644
--- a/fonts/haranoaji-extra/HaranoAjiMincho-Heavy.otf
+++ b/fonts/haranoaji-extra/HaranoAjiMincho-Heavy.otf
Binary files differ
diff --git a/fonts/haranoaji-extra/HaranoAjiMincho-Medium.otf b/fonts/haranoaji-extra/HaranoAjiMincho-Medium.otf
index 7676acd31f..ceea4d0f3d 100644
--- a/fonts/haranoaji-extra/HaranoAjiMincho-Medium.otf
+++ b/fonts/haranoaji-extra/HaranoAjiMincho-Medium.otf
Binary files differ
diff --git a/fonts/haranoaji-extra/HaranoAjiMincho-SemiBold.otf b/fonts/haranoaji-extra/HaranoAjiMincho-SemiBold.otf
index 963b184cbd..71b3b865d8 100644
--- a/fonts/haranoaji-extra/HaranoAjiMincho-SemiBold.otf
+++ b/fonts/haranoaji-extra/HaranoAjiMincho-SemiBold.otf
Binary files differ
diff --git a/fonts/haranoaji-extra/README b/fonts/haranoaji-extra/README
index bd350d3541..75a43133a4 100644
--- a/fonts/haranoaji-extra/README
+++ b/fonts/haranoaji-extra/README
@@ -1,4 +1,4 @@
-# Harano Aji Fonts ver. 20210102
+# Harano Aji Fonts ver. 20210130
https://github.com/trueroad/HaranoAjiFonts
diff --git a/fonts/haranoaji/HaranoAjiGothic-Bold.otf b/fonts/haranoaji/HaranoAjiGothic-Bold.otf
index d7459b8c7e..7b7e1365a0 100644
--- a/fonts/haranoaji/HaranoAjiGothic-Bold.otf
+++ b/fonts/haranoaji/HaranoAjiGothic-Bold.otf
Binary files differ
diff --git a/fonts/haranoaji/HaranoAjiGothic-Heavy.otf b/fonts/haranoaji/HaranoAjiGothic-Heavy.otf
index 19d785387e..1f274776bd 100644
--- a/fonts/haranoaji/HaranoAjiGothic-Heavy.otf
+++ b/fonts/haranoaji/HaranoAjiGothic-Heavy.otf
Binary files differ
diff --git a/fonts/haranoaji/HaranoAjiGothic-Medium.otf b/fonts/haranoaji/HaranoAjiGothic-Medium.otf
index 5f7cb2c85b..55e6372425 100644
--- a/fonts/haranoaji/HaranoAjiGothic-Medium.otf
+++ b/fonts/haranoaji/HaranoAjiGothic-Medium.otf
Binary files differ
diff --git a/fonts/haranoaji/HaranoAjiGothic-Regular.otf b/fonts/haranoaji/HaranoAjiGothic-Regular.otf
index 6d77d94a2f..bba0366804 100644
--- a/fonts/haranoaji/HaranoAjiGothic-Regular.otf
+++ b/fonts/haranoaji/HaranoAjiGothic-Regular.otf
Binary files differ
diff --git a/fonts/haranoaji/HaranoAjiMincho-Bold.otf b/fonts/haranoaji/HaranoAjiMincho-Bold.otf
index e79c9aa164..95a35376de 100644
--- a/fonts/haranoaji/HaranoAjiMincho-Bold.otf
+++ b/fonts/haranoaji/HaranoAjiMincho-Bold.otf
Binary files differ
diff --git a/fonts/haranoaji/HaranoAjiMincho-Light.otf b/fonts/haranoaji/HaranoAjiMincho-Light.otf
index f55fd10975..e43701a123 100644
--- a/fonts/haranoaji/HaranoAjiMincho-Light.otf
+++ b/fonts/haranoaji/HaranoAjiMincho-Light.otf
Binary files differ
diff --git a/fonts/haranoaji/HaranoAjiMincho-Regular.otf b/fonts/haranoaji/HaranoAjiMincho-Regular.otf
index 5a1ec7992f..5a0c6cfb00 100644
--- a/fonts/haranoaji/HaranoAjiMincho-Regular.otf
+++ b/fonts/haranoaji/HaranoAjiMincho-Regular.otf
Binary files differ
diff --git a/fonts/haranoaji/README b/fonts/haranoaji/README
index bd350d3541..75a43133a4 100644
--- a/fonts/haranoaji/README
+++ b/fonts/haranoaji/README
@@ -1,4 +1,4 @@
-# Harano Aji Fonts ver. 20210102
+# Harano Aji Fonts ver. 20210130
https://github.com/trueroad/HaranoAjiFonts
diff --git a/graphics/mcf2graph/CHANGELOG b/graphics/mcf2graph/CHANGELOG
index 919160a9ce..21f32d1af1 100644
--- a/graphics/mcf2graph/CHANGELOG
+++ b/graphics/mcf2graph/CHANGELOG
@@ -1,6 +1,14 @@
*******************************************************************************
- Changelog of mcf2graph software package by Akira Yamaji 2021-01-03
+ Changelog of mcf2graph software package by Akira Yamaji 2021-01-31
*******************************************************************************
+[ver. 4.56 / 2021-01-31]
+ -fix bug in molecular weight calculation
+ -fix bug in report output
+ -fix bug in MOL file output
+ -improve parts definition
+ -improve global ext() setting
+ -update MCF manual,example
+
[ver. 4.55 / 2021-01-03]
-fix bug in molecular weight calculation
-fix bug in charged atom calculation
diff --git a/graphics/mcf2graph/README b/graphics/mcf2graph/README
index f44677ee94..741ccc8dca 100644
--- a/graphics/mcf2graph/README
+++ b/graphics/mcf2graph/README
@@ -1,7 +1,7 @@
********************************************************************************
mcf2graph : Convert Molecular Coding Format to graphics with METAFONT/METAPOST
Author : Akira Yamaji
- version : 4.55 2021-01-03
+ version : 4.56 2021-01-31
E-mail : mcf2graph@gmail.com
Located at : http://www.ctan.org/pkg/mcf2graph
********************************************************************************
diff --git a/graphics/mcf2graph/mcf2graph.mf b/graphics/mcf2graph/mcf2graph.mf
index 49c50f0263..af136209e3 100644
--- a/graphics/mcf2graph/mcf2graph.mf
+++ b/graphics/mcf2graph/mcf2graph.mf
@@ -1,5 +1,5 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% mcf2graph ver 4.55 Copyright (c) 2013-2021 Akira Yamaji
+% mcf2graph ver 4.56 Copyright (c) 2013-2021 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,
@@ -37,9 +37,7 @@
% Set to use plain.mp (label,arrow,atom) : mpost -s labeloffset=2 FILENAME
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
tracingstats:=1;
-message "---------------------------------------------";
-message "This is mcf2graph ver 4.55 2021.01";
-message "---------------------------------------------";
+message "* This is mcf2graph ver 4.56 2021.01";
%-------------------------------------------------------------------------------------------------
newinternal cntA,cntB,cntM,minX,minY,maxX,maxY,sftX,sftY,com,par,envT,envB,lenT,lineT,angT,rotT,
crR,nA,nB,nC,nD,nE,nF,nN,nP,nU,nP,nL,nR,nS,nW,xpos,ypos,markA,markB,saveA,saveB,bondL;
@@ -47,18 +45,16 @@ numeric save_num[],comD[][],parD[][],adrD[][],cntD[],tbl_atom[],tbl_group[][],f_
tbl_atom_wt[],tbl_atom_mi[],tbl_char_wd[],tbl_char_ht[],andA[],and_rot[],chargeA[],
com_group[][],par_group[][],cnt_group[],colorA[],colorB[],sumA[],bondC[],hideH[],
lineB[],sB[],eB[],angB[],angA[],lenB[],angX[],numS[],wdM[],htM[],wdA[],dxA[];
-string info[],save_str[],tbl_atom_str[],strD[],tag[],mpc_name[],out_file_name,out_file_aux,
- out_file_rep,out_file_mpc,aux_delimiter,atomfont,save_atomfont,save_defaultfont,temp_c,
- s_tag,s_var,cal_FM,cal_MW,cal_MW_str,cal_MI,cal_MI_str,
- inf_NO,inf_EN,inf_JN,inf_FM,inf_CAS,inf_USE,inf_EXA,inf_EXB,inf_MW;
-pair save_pair[],posA[],posM[][],msize,mposition,fsize,fmargin,save_mposition,posBs,posBe,
- temp_p;
+string info[],save_str[],tbl_atom_str[],strD[],tag[],out_file_name,out_file_aux,
+ out_file_rep,out_file_mpc,aux_delimiter,atomfont,mpfont,s_tag,s_var,
+ cal_FM,cal_MW,cal_MI,inf_NO,inf_EN,inf_JN,inf_FM,inf_CAS,inf_USE,inf_EXA,inf_EXB,inf_MW;
+pair save_pair[],posA[],posM[][],msize,mposition,fsize,fmargin,save_mposition,posBs,posBe;
picture mol_stru[],atom_picture,save_picture,temp_picture;
path arrow_path,dottedline_path,line_path,arrow_head;
%-------------------------------------------------------------------------------------------------
-char_num:=str_cnt:=tbl_cnt:=proc_end:=mangle:=sw_label_emu:=sw_calc:=sw_ext_all:=0;
+char_num:=str_cnt:=tbl_cnt:=proc_end:=mangle:=sw_calc:=sw_ext_all:=0;
sw_numberA:=sw_numberB:=sw_aux_out:=sw_expand:=sw_fframe:=sw_mframe:=sw_aframe:=sw_trimming:=0;
-sw_rep_out:=sw_mol_out:=sw_group_off:=sw_single:=sw_arrow:=0;
+sw_rep_out:=sw_mol_out:=sw_group_off:=sw_single:=sw_arrow_emu:=0;
numberA_start:=numberB_start:=1; numberA_end:=numberB_end:=4095;
%-------------------------------------------------------------------------------------------------
aux_max:=max_inf_num:=20;
@@ -69,6 +65,7 @@ if (known green)and(known ahlength):
f_MP:=1;
color color_list[];
prologues:=3;
+ mpfont:="uhvr8r";
%-----------------------------------------------------------------------------------------
atomfont:=defaultfont:="";
out_file_aux:=jobname&"-info.aux";
@@ -78,12 +75,13 @@ if (known green)and(known ahlength):
%--default ahangle=45---------------------------------------------------------------------
if ahangle=0: outputformat:="eps"; % eps format(.mps)
elseif ahangle=1: outputformat:="png"; hppp:=vppp:=0.12; % png format(600dpi)
- elseif ahangle=2: outputformat:="svg"; % svg format
- elseif ahangle=3: outputformat:="eps"; % eps format(.eps)
- %
elseif ahangle=11: outputformat:="png"; hppp:=vppp:=0.24; % png format(300dpi)
elseif ahangle=12: outputformat:="png"; hppp:=vppp:=0.10; % png format(720dpi)
elseif ahangle=13: outputformat:="png"; hppp:=vppp:=0.06; % png format(1200dpi)
+ elseif ahangle=14: outputformat:="png"; hppp:=vppp:=0.04; % png format(1800dpi)
+ elseif ahangle=15: outputformat:="png"; hppp:=vppp:=0.03; % png format(2400dpi)
+ elseif ahangle=2: outputformat:="svg"; % svg format
+ elseif ahangle=3: outputformat:="eps"; % eps format(.eps)
fi
%--default ahlength=4---------------------------------------------------------------------
if ahlength=1: sw_aux_out:=1; bboxmargin:=0; % output aux file
@@ -98,8 +96,8 @@ if (known green)and(known ahlength):
elseif bboxmargin=3: def shipit = enddef;proc_end:=1; % No image file ,first font only
fi
%--default labeloffset=3------------------------------------------------------------------
- if labeloffset=1: sw_arrow:=1; defaultfont:="uhvr8r"; % plain.mp label
- elseif labeloffset=2: sw_arrow:=1; defaultfont:=atomfont:="uhvr8r"; % plain.mp label,atom
+ if labeloffset=1: defaultfont:=mpfont; % mpost label
+ elseif labeloffset=2: defaultfont:=atomfont:=mpfont; % mpost label,atom
fi
%--default outputtemplate:="%j-%3c."&"mps"------------------------------------------------
if (outputformat="eps")and(ahangle<>3): outputtemplate:="%j-%3c."&"mps";
@@ -114,8 +112,8 @@ if (known green)and(known ahlength):
if atomfont="": atomfont:="draw"; fi % default atom font
if defaultfont="": defaultfont:="draw"; fi % default label font
%-----------------------------------------------------------------------------------------
-else: f_MP:=0;
- %------------------------------------
+else:
+ f_MP:=0;
def image = image_emu enddef;
def llcorner = llcorner_emu enddef;
def lrcorner = lrcorner_emu enddef;
@@ -126,7 +124,6 @@ else: f_MP:=0;
dotlabeldiam:=3bp;
def Cp(expr s) = enddef;
def color = transform enddef;
- sw_arrow:=0;
atomfont:="draw";
defaultfont:="draw";
mode_setup;
@@ -134,28 +131,27 @@ fi
clearit;
%--------------------------------------------------------------------------------------------------
if f_MP=1:
- if bboxmargin=0: message "output no image file";
- elseif bboxmargin=1: message "output first font only";
- elseif bboxmargin=3: message "no image,first only";
+ if bboxmargin=0: message "* output no image file";
+ elseif bboxmargin=1: message "* output first font only";
+ elseif bboxmargin=3: message "* no image,first only";
fi
- message "jobname="&jobname;
- message "numbersystem="&numbersystem;
- if ahlength=1: message "output aux file";
- message "out_file_aux="&out_file_aux;
- message "aux_delimiter="&aux_delimiter;
- elseif ahlength=2: message "output report file";
- message "out_file_rep="&out_file_rep;
- elseif ahlength=5: message "output MOL file(V2000)";
- message jobname&"-nnn-"&"inf_EN"&".mol";
- elseif ahlength=6: message "output MOL file(V3000)";
- message jobname&"-nnn-"&"inf_EN"&".mol";
+ message "* jobname="&jobname;
+ message "* numbersystem="&numbersystem;
+ if ahlength=1: message "* output aux file";
+ message "* out_file_aux="&out_file_aux;
+ message "* aux_delimiter="&aux_delimiter;
+ elseif ahlength=2: message "* output report file";
+ message "* out_file_rep="&out_file_rep;
+ elseif ahlength=5: message "* output MOL file(V2000)";
+ message "* "&jobname&"-nnn-"&"inf_EN"&".mol";
+ elseif ahlength=6: message "* output MOL file(V3000)";
+ message "* "&jobname&"-nnn-"&"inf_EN"&".mol";
fi
- message "outputformat="&outputformat;
- if outputformat="png": message "hppp="&decimal(hppp)&"/vppp="&decimal(vppp); fi
- message "outputtemplate="&outputtemplate;
- message "atomfont="&atomfont;
- message "defaultfont="&defaultfont;
- message "---------------------------------------------";
+ message "* outputformat="&outputformat;
+ if outputformat="png": message "* hppp="&decimal(hppp)&"/vppp="&decimal(vppp); fi
+ message "* outputtemplate="&outputtemplate;
+ message "* atomfont="&atomfont;
+ message "* defaultfont="&defaultfont;
fi
%--------------------------------------------------------------------------------------------------
let DIV= /; let MUL= *; let LT= <; let GT= >; let AND= &; let :: = : ; let == = =; let ef=elseif;
@@ -195,20 +191,20 @@ def def_com(expr n)(text tx)= nA:=n; forsuffixes list=tx:: list:=nA; nA:=nA+1; e
def_com(-4090)(_com,_jp_atom,_jp_absA,_jp_bond,_cyc,_cyc_sB,_cyc_eB,_set_line,_tmp_line,
_chg_len,_get_len,_ring_len,_tmp_len,_rot_ang,_adj_ang,_chg_env,_tmp_env,_set_colorA,_set_colorB,
_group_si,_set_adr,_mk_bond,_set_atom,_arg_ang,_chg_atom,_tmp_rot,_fuse,_size_atom,_numeric,
- _jump_at,_connect_at,_set_and,_chg_charge,_nop,_mark,_moff,_term,_len_s,_len_e,_len_ss,_len_ee,
- _group_s,_group_e,_rest,si,dl,dr,db,dm,tm,wf,wb,bd,bz,zf,zb,dt,wv,nl,vf,vb,nb,si_,wf_,wb_,bd_);
+ _jump_at,_connect_at,_set_and,_chg_and,_nop,_mark,_moff,_term,_len_s,_len_e,_len_ss,_len_ee,
+ _group_s,_group_e,_rest,
+ si,dl,dr,db,dm,tm,wf,wb,bd,bz,zf,zb,dt,wv,nl,vf,vb,nb,si_,dl_,dr_,dm_,wf_,wb_,zf_,zb_,wv_,bd_);
%--------------------------------------------------------------------------------------------------
def parameter_list=
- sw_rep_out,sw_numberA,sw_numberB,sw_mframe,sw_aux_out,sw_expand,sw_mol_out,sw_calc,sw_single,
- sw_ext_all,sw_aframe,sw_fframe,sw_group_off,sw_trimming,sw_arrow,sw_label_emu,
+ sw_rep_out,sw_numberA,sw_numberB,sw_mframe,sw_aux_out,sw_expand,sw_mol_out,sw_calc,
+ sw_single,sw_ext_all,sw_aframe,sw_fframe,sw_group_off,sw_trimming,sw_arrow_emu,
ratio_atom_bond,ratio_thickness_bond,ratio_char_bond,ratio_chain_ring,ratio_bondgap_bond,
ratio_zebra_black,ratio_zebragap_bond,ratio_thickness_char,ratio_wedge_bond,ratio_atomgap_atom,
lonepairdiam,lonepairspace,blength,offset_atom,offset_wedge,max_blength,offset_zebra_gap,
offset_bond_gap,thickness_fframe,thickness_mframe,thickness_aframe,offset_thickness,
numberA_start,numberA_end,numberB_start,numberB_end,defaultsize,defaultscale,labeloffset,mangle,
fsize,fmargin,msize,mposition,defaultfont,atomfont,dottedline_gap,
- Me,Et,Pr,Bu,iPr,tBu,CH3,NH,NH2,NO2,OH,CHO,COOH,CN,SH,
- !CH3,!NH2,!NO2,!OH,!CHO,!COOH,!CN,!SH
+ Me,Et,CH3,NH,NH2,NO,NO2,OH,CHO,COOH,CN,SH,!CH3,!NH2,!NO2,!OH,!CHO,!COOH,!CN,!SH
enddef;
%--------------------------------------------------------------------------------------------------
def ]]]=] ] ] enddef;
@@ -251,13 +247,14 @@ enddef;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
def beginfont(text s)=
begingroup
- save f_beginchar,f_ext,blen,ext,add,ang_br;
+ save ',f_beginchar,f_ext,blen,ext,add,ang_br;
%------------------------------------------------------------------------------------------------
def ext=ext_to_font enddef;
def add=add_to_molecule enddef;
+ vardef '(text TXT)== read_mcf(incr parts_cnt)((_com,_mark),TXT,(_com,_rest)); parts_cnt enddef;
%------------------------------------------------------------------------------------------------
inf_NO:=inf_EN:=inf_JN:=inf_MW:=inf_FM:=inf_CAS:=inf_USE:=inf_EXA:=inf_EXB:="-";
- cal_MW:=cal_MW_str:=cal_MI:=cal_MI_str:=cal_FM:="";
+ cal_MW:=cal_MI:=cal_FM:="";
%------------------------------------------------------------------------------------------------
parts_cnt:=parts_usr_start;
parts_int:=parts_int_start;
@@ -316,8 +313,8 @@ def endfont=
endgroup;
if proc_end=1: scantokens("bye"); fi
%-----------------------------------------------------------------------------------------------
-%% message "parts_cnt (0)="& decimal(parts_cnt) &" "& decimal(parts_usr-parts_usr_start);
-%% message "parts_int (0)="& decimal(parts_int) &" "& decimal(parts_int-parts_int_start);
+%% message "* parts_cnt (0)="& decimal(parts_cnt) &" "& decimal(parts_usr-parts_usr_start);
+%% message "* parts_int (0)="& decimal(parts_int) &" "& decimal(parts_int-parts_int_start);
%-----------------------------------------------------------------------------------------------
enddef;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -479,7 +476,7 @@ vardef change_atom(expr a,b)=
ef b==_connect_at:: CP(_cyc,a)
fi
ef pair b::
- if xpart(b)==_set_and:: CP(_set_and,ypart(b)) CP(_chg_charge,a)
+ if xpart(b)==_set_and:: CP(_set_and,ypart(b)) CP(_chg_and,a)
else:: CP(_com,_group_s) CPx(a)(xpart(b),ypart(b)) CP(_com,_group_e)
fi
ef color b:: color_list[incr cntC]:=b; CPe(a)(_set_colorA,cntC)
@@ -502,30 +499,27 @@ def com_par_ex(expr f)(expr c)(expr a,b)=
enddef;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
def puts(expr POS)(expr STR)=
+ begingroup
+ save temp_c,temp_p;
+ pair temp_p;
+ string temp_c;
temp_p:=POS;
- nB:=defaultscale*defaultsize;
- nC:=0;
- %------------------------------------------------------------------------------------------------
- for i=0 upto length(STR)-1:
- temp_c:=subc(i,STR);
- if sw_label_emu=1:
- if temp_c="_": nC:=iif(nC=-0.5,0,-0.5);
- elseif temp_c="^": nC:=iif(nC= 0.5,0, 0.5);
- else:
- if defaultfont="draw":
- draw_char(temp_c,temp_p+(0,nB*nC),nB,ratio_thickness_char*defaultscale*defaultsize,0);
- temp_p:=temp_p+(nB*tbl_char_wd[ASCII(temp_c)],0);
- else:
- temp_picture:=temp_c infont defaultfont scaled defaultscale;
- addto currentpicture also temp_picture shifted (temp_p+(0,nB*nC));
- temp_p:=temp_p+(lrcorner temp_picture-llcorner temp_picture);
- fi
- fi
- else:
- draw_char(temp_c,temp_p,nB,ratio_thickness_char*defaultscale*defaultsize,0);
- temp_p:=temp_p+(nB*tbl_char_wd[ASCII(temp_c)],0);
- fi
- endfor
+ nC:=defaultscale*defaultsize;
+ if (defaultfont="draw")or(f_MP=0):
+ for i=0 upto length(STR)-1:
+ temp_c:=subc(i,STR);
+ draw_char(temp_c,temp_p,nC,ratio_thickness_char*nC,0);
+ temp_p:=temp_p+(nC*tbl_char_wd[ASCII(temp_c)],0);
+ endfor
+ else:
+ for i=0 upto length(STR)-1:
+ temp_c:=subc(i,STR);
+ temp_picture:=temp_c infont defaultfont scaled defaultscale;
+ addto currentpicture also temp_picture shifted temp_p;
+ temp_p:=temp_p+(lrcorner temp_picture-llcorner temp_picture);
+ endfor
+ fi
+ endgroup
enddef;
%==================================================================================================
def ext_setup=
@@ -534,14 +528,14 @@ def ext_setup=
labeloffset:=3bp;
save em;
em=defaultscale*defaultsize;
- if (f_MP=0)or(sw_label_emu=1):
+ if (defaultfont="draw")or(f_MP=0):
save label,dotlabel;
def label = label_emu enddef;
def dotlabel = dotlabel_emu enddef;
else:
- defaultfont:="uhvr8r";
+ defaultfont:=mpfont;
fi
- if (sw_arrow=0)or(f_MP=0):
+ if (sw_arrow_emu=1)or(f_MP=0):
save drawarrow,drawdblarrow;
def drawarrow = drawarrow_emu enddef;
def drawdblarrow = drawdblarrow_emu enddef;
@@ -587,7 +581,7 @@ enddef;
%--------------------------------------------------------------------------------------------------
def ext_to_font(text TXT)=
begingroup
- save w,h,wd,ht,n,p,am,aw,__,**,<<,=>,/*;
+ save w,h,An,Bn,wd,ht,n,p,am,aw,__,**,<<,=>,/*;
pair __,p[];
let ** = scaled;
let << = rotated;
@@ -598,6 +592,8 @@ def ext_to_font(text TXT)=
ext_setup;
w:=xpart(fsize);
h:=ypart(fsize);
+ An:=cntA;
+ Bn:=cntB;
w0:=w-2margin_lr;
h0:=h-2margin_tb;
p0:=(margin_lr,margin_tb);
@@ -667,23 +663,20 @@ vardef lone_pair_add expr ANG=
enddef;
%--------------------------------------------------------------------------------------------------
vardef label_emu@#(expr OBJ,POS) = %% modified 'thelabel@#(expr s,z)' of plain.mp
- save oft,fx,fy,wds,sC,pA,pB,pC,pD;
+ save oft,fx,fy,wds,pA,pB,pC,pD,sC;
pair oft,oft.lft,oft.rt,oft.top,oft.bot,oft.ulft,oft.llft,oft.urt,oft.lrt,pA,pB,pC,pD;
- string sC;
wds:=0;
+ nC:=defaultscale*defaultsize;
%---------------------------------------------------------------
if string OBJ:
- for i=0 upto length(OBJ)-1:
- sC:=subc(i,OBJ);
- if not((sw_label_emu=1)and((sC="_")or(sC="^"))):
- if (defaultfont="draw")or(f_MP=0):
- wds:=wds+defaultscale*defaultsize*tbl_char_wd[ASCII(sC)];
- else:
- temp_picture:=sC infont defaultfont scaled defaultscale;
- wds:=wds+xpart(lrcorner temp_picture-llcorner temp_picture);
- fi
- fi
- endfor
+ if (defaultfont="draw")or(f_MP=0):
+ for i=0 upto length(OBJ)-1: wds:=wds+nC*tbl_char_wd[ASCII(subc(i,OBJ))]; endfor
+ else:
+ for i=0 upto length(OBJ)-1:
+ temp_picture:=subc(i,OBJ) infont defaultfont scaled defaultscale;
+ wds:=wds+xpart(lrcorner temp_picture-llcorner temp_picture);
+ endfor
+ fi
fi
%---------------------------------------------------------------
oft:= ( 0, 0); fx:=0.5; fy:=0.5;
@@ -697,7 +690,7 @@ vardef label_emu@#(expr OBJ,POS) = %% modified 'thelabel@#(expr s,z)' of plain.m
oft.lrt:= ( .7,-.7); fx.lrt:=0; fy.lrt:=1;
%---------------------------------------------------------------
if string OBJ:
- puts(POS+(labeloffset*oft@#)-(wds*fx@#,defaultscale*defaultsize*fy@#))(OBJ);
+ puts(POS+(labeloffset*oft@#)-(wds*fx@#,nC*fy@#))(OBJ);
elseif picture OBJ:
pA:=llcorner(OBJ);
pB:=urcorner(OBJ);
@@ -748,9 +741,9 @@ enddef;
def MC(text TXT)=
begingroup
save f_bra,strAT,cnt_group,temp_lenE,temp_lenF,temp_cntB,f_end,f_term,f_at,f_lineT,f_rotT,
- f_lenT,f_envT,sA,sC,factor,m_wd,m_ht,defaultsize,defaultscale;
- %-----------------------------------------------------------------------------------------------
- string sA,sC;
+ f_lenT,f_envT,sA,factor,m_wd,m_ht,temp_p,defaultsize,defaultscale;
+ string sA;
+ pair temp_p;
%-----------------------------------------------------------------------------------------------
if (sw_numberA>=1)or(sw_numberB>=1): ratio_atom_bond:=0.25; fi
if (sw_expand=1)or(sw_mol_out>=1): expand_set; fi
@@ -805,10 +798,7 @@ def MC(text TXT)=
draw_char(sA,temp_p,atom_wd,bond_pen_wd*ratio_char_bond,0);
else: sA:="";
fi
- nA:=length(strD[numS[i]]); sC:=substring(nA-3,nA-2) of strD[numS[i]];
- if (sA="+")or(sC="+"): chargeA[i]:=1; ef (sA="-")or(sC="-"): chargeA[i]:=-1;
- else: chargeA[i]:=0;
- fi
+ if sA="+": chargeA[i]:=1; elseif sA="-": chargeA[i]:=-1; else: chargeA[i]:=0; fi
endfor
%-draw bond-------------------------------------------------------------------------------------
for i=1 upto cntB: if lineB[i]<si_ : draw_bond(i); fi endfor
@@ -859,7 +849,7 @@ def MC(text TXT)=
mol_stru[cntM]:=currentpicture;
clearit;
endgroup;
- if ((sw_aux_out>=1)or(sw_rep_out=1)or(sw_mol_out>=1)or(sw_calc=1))and(f_MP=1): proc_calc; fi
+ if ((sw_aux_out>=1)or(sw_rep_out=1)or(sw_mol_out>=1)or(sw_calc=1)): proc_calc; fi
enddef;
%-------------------------------------------------------------------------------------------------
def add_group=
@@ -1000,7 +990,7 @@ def proc_bond_atom(expr a)(expr n)=
ef com=_set_colorA: colorA[getA(adrT)]:=par;
ef com=_set_colorB: colorB[getB(adrT)]:=par;
ef com=_set_and: andAT:=par;
- ef com=_chg_charge: andA[getA(par)]:=andAT; andAT:=0; if rotT<>0: and_rot[getA(par)]:=rotT; fi
+ ef com=_chg_and: andA[getA(par)]:=andAT; andAT:=0; if rotT<>0: and_rot[getA(par)]:=rotT; fi
else:
fi
endfor
@@ -1139,7 +1129,13 @@ def draw_atom(expr NUM)=
if sB="_": pB:=iif(pB=(0,0),(0,-.5atom_wd),(0,0));
elseif sB="^": pB:=iif(pB=(0,0),(0, .5atom_wd),(0,0));
elseif (sB<>"{")and(sB<>"}"):
- if (atomfont<>"draw")and(f_MP=1):
+ if (atomfont="draw")or(f_MP=0):
+ f_wd:=atom_wd*tbl_char_wd[ASCII(sB)];
+ if dx=-1: pA:=pA-(f_wd,0); fi
+ draw_char(sB,pA+pB,atom_wd,bond_pen_wd*ratio_char_bond,NUM);
+ if sw_aframe=1: draw_frame(pA+pB,f_wd,atom_wd,thickness_aframe); fi
+ if dx=1: pA:=pA+(f_wd,0); fi
+ else:
atom_picture:=sB infont atomfont;
f_wd:=(xpart(lrcorner atom_picture)-xpart(llcorner atom_picture))*r_ff;
f_ht:=(ypart(urcorner atom_picture)-ypart(llcorner atom_picture))*r_ff;
@@ -1148,12 +1144,6 @@ def draw_atom(expr NUM)=
shifted (pA+pB+(f_wd*ratio_atomgap_atom,f_ht*ratio_atomgap_atom)) Cp(colorA[NUM]);
if sw_aframe=1: draw_frame(pA+pB,f_wd,f_ht,thickness_aframe); fi
if dx=1: pA:=pA+(f_wd,0); fi
- else:
- f_wd:=atom_wd*tbl_char_wd[ASCII(sB)];
- if dx=-1: pA:=pA-(f_wd,0); fi
- draw_char(sB,pA+pB,atom_wd,bond_pen_wd*ratio_char_bond,NUM);
- if sw_aframe=1: draw_frame(pA+pB,f_wd,atom_wd,thickness_aframe); fi
- if dx=1: pA:=pA+(f_wd,0); fi
fi
wdA[NUM]:=wdA[NUM]+f_wd;
fi
@@ -1201,12 +1191,26 @@ def draw_bond(expr NUM)=
ef nL=vf: draw zA Cp(col);draw sfrt(Le,bondgap,ang-150)--Le--sfrt(Le,bondgap,ang+150) Cp(col);
ef nL=vb: draw zA Cp(col);draw sfrt(Ls,bondgap,ang-30)--Ls--sfrt(Ls,bondgap,ang+30) Cp(col);
ef nL=si_: erase draw subpath (0.15,0.85) of zA wpcs 0.8bondgap; draw zA Cp(col);
+ ef nL=dl_: erase draw subpath (0.15,0.85) of sfrt(subpath pA of zA,.5bondgap,ap) wpcs 1.8bondgap;
+ draw zA Cp(col); draw sfrt(subpath pA of zA,bondgap,ap) Cp(col);
+ ef nL=dr_: erase draw subpath (0.15,0.85) of sfrt(subpath pA of zA,.5bondgap,am) wpcs 1.8bondgap;
+ draw zA Cp(col); draw sfrt(subpath pA of zA,bondgap,am) Cp(col);
+ ef nL=dm_: erase draw subpath(0.15,0.85) of zA wpcs 1.8 bondgap;
+ draw sfrt(zA,bondgap/1.75,ap) Cp(col); draw sfrt(zA,bondgap/1.75,am) Cp(col);
ef nL=wf_: erase draw subpath (0.15,0.85) of (Ls--sfrt(Le,ww,am)) wpcs 0.8bondgap;
erase draw subpath (0.15,0.85) of (Ls--sfrt(Le,ww,ap)) wpcs 0.8bondgap;
fill Ls--sfrt(Le,ww,am)--sfrt(Le,ww,ap)--cycle Cp(col);
ef nL=wb_: erase draw subpath (0.15,0.85) of (sfrt(Ls,ww,am)--Le) wpcs 0.8bondgap;
erase draw subpath (0.15,0.85) of (sfrt(Ls,ww,ap)--Le) wpcs 0.8bondgap;
fill sfrt(Ls,ww,am)--Le--sfrt(Ls,ww,ap)--cycle Cp(col);
+ ef nL=zf_: erase draw subpath (0.15,0.85) of (Ls--sfrt(Le,ww,am)) wpcs 0.8bondgap;
+ erase draw subpath (0.15,0.85) of zA wpcs 0.8bondgap;
+ erase draw subpath (0.15,0.85) of (Ls--sfrt(Le,ww,ap)) wpcs 0.8bondgap;
+ wz_put(Ls,sfrt(Le,ww,ap),sfrt(Le,ww,am));
+ ef nL=zb_: erase draw subpath (0.15,0.85) of (sfrt(Ls,ww,am)--Le) wpcs 0.8bondgap;
+ erase draw subpath (0.15,0.85) of zA wpcs 0.8bondgap;
+ erase draw subpath (0.15,0.85) of (sfrt(Ls,ww,ap)--Le) wpcs 0.8bondgap;
+ wz_put(Le,sfrt(Ls,ww,am),sfrt(Ls,ww,ap));
ef nL=bd_: erase draw subpath(0.15,0.85) of zA wpcs 1.6bondgap;
draw zA withpen penrazor rotated ap scaled bondgap Cp(col);
ef nL=nb:
@@ -1235,114 +1239,6 @@ vardef frame_str(expr NUM)=
(posA[NUM]-(.5nA+iif((dxA[NUM]=-1)and(wdA[NUM]>atom_wd),nB-nA,0),.5nA))
enddef;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-vardef STa(expr ATOM,WT,MI)=
- str_cnt:=str_cnt+1; parts_cnt:=parts_cnt+1; tbl_cnt:=tbl_cnt+1;
- comD[parts_cnt][1]:=_set_atom; parD[parts_cnt][1]:=str_cnt; cntD[parts_cnt]:=1;
- strD[str_cnt]:=tbl_atom_str[tbl_cnt]:=ATOM;
- tbl_atom[tbl_cnt]:=0;
- tbl_atom_wt[tbl_cnt]:=WT; tbl_atom_mi[tbl_cnt]:=MI;
- parts_cnt
-enddef;
-%-------------------------------------------------------------------------------------------------
-vardef STb(expr ATOM)(text TXT)=
- str_cnt:=str_cnt+1; parts_cnt:=parts_cnt+1; tbl_cnt:=tbl_cnt+1;
- comD[parts_cnt][1]:=_set_atom; parD[parts_cnt][1]:=str_cnt; cntD[parts_cnt]:=1;
- strD[str_cnt]:=tbl_atom_str[tbl_cnt]:=ATOM;
- tbl_atom[tbl_cnt]:=0;
- for list=TXT:
- tbl_atom[tbl_cnt]:=tbl_atom[tbl_cnt]+1;
- tbl_group[tbl_cnt][tbl_atom[tbl_cnt]]:=list-parts_emb_start;
- endfor
- parts_cnt
-enddef;
-%=================================================================================================
-parts_int:=parts_emi_start;
-parts_cnt:=parts_emb_start;
-%-------------------------------------------------------------------------------------------------
-C:= STa("C" ,12.0107, 12.0000000); H:= STa("H" , 1.00794, 1.00782503223);
-Al:=STa("{Al}",26.9815, 26.98153853); As:=STa("{As}",74.9216, 74.92159457);
-B:= STa("B" ,10.811, 11.00930536); Br:=STa("{Br}",79.904, 78.9183376);
-Ca:=STa("{Ca}",40.078, 39.962590863); Cl:=STa("{Cl}",35.453, 34.968852);
-Co:=STa("{Co}",58.933194, 58.93319429); Cr:=STa("{Cr}",51.9961, 51.94050623);
-Cu:=STa("{Cu}",63.546, 62.92959772); D:= STa("D" ,2.012, 2.01410177812);
-F:= STa("F" ,18.9984, 18.99840316273); Fe:=STa("{Fe}",55.845, 55.93493633);
-Hg:=STa("{Hg}",200.59, 201.97064340); I:= STa("I" ,126.90447,126.9044719);
-K:= STa("K" ,39.0983, 38.9637064864); Li:=STa("{Li}",6.941, 7.0160034366);
-Mg:=STa("{Mg}",24.305, 23.985041697); Mn:=STa("{Mn}",54.938044, 54.93804391);
-Na:=STa("{Na}",22.98977, 22.9897692820); Ni:=STa("{Ni}",58.693, 57.93534241);
-N:= STa("N" ,14.0067, 14.00307400443); O:= STa("O" ,15.9994, 15.99491461957);
-P:= STa("P" ,30.973762, 30.97376199842); S:= STa("S" ,32.065, 31.9720711744);
-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); Zn:=STa("{Zn}",65.409, 63.92914201);
-tbl_atom_end:=tbl_cnt;
-%-------------------------------------------------------------------------------------------------
-CH3:=STb("C{H_3_}")(C,H,H,H); CH2:=STb("C{H_3_}")(C,H,H); CN:=STb("CN")(C,N); OH:=STb("OH")(O,H);
-COOH:=STb("COOH")(C,O,O,H); SH:= STb("SH")(S,H); CHO:=STb("CHO")(C,H,O);
-NO2:=STb("N{O_2_}")(N,O,O); NH2:=STb("N{H_2_}")(N,H,H);
-ONa:=STb("O{Na}")(O,Na); SO3Na:=STb("S{O_3_}{Na}")(S,O,O,O,Na);
-%-------------------------------------------------------------------------------------------------
-str_plus:=str_cnt;
-N[1]:=STb("{N^+^}")(N); H[1]:=STb("{H^+^}")(H); Na[1]:=STb("{Na^+^}")(Na); K[1]:=STb("{K^+^}")(K);
-NH3[1]:= STb("{N^+^}{H_3_}")(N,H,H,H); NH4[1]:= STb("{N^+^}{H_4_}")(N,H,H,H,H);
-S[1]:= STb("{S^+^}")(S);
-str_minus:=str_cnt;
-O[-1]:=STb("{O^-^}")(O); COO[-1]:=STb("COO^-^")(C,O,O); SO3[-1]:=STb("S{O_3_}^-^")(S,O,O,O);
-Cl[-1]:=STb("{Cl^-^}")(Cl); Br[-1]:=STb("{Br^-^}")(Br); I[-1]:=STb("{I^-^}")(I);
-%-------------------------------------------------------------------------------------------------
-str_minus_end:=str_cnt;
-tbl_group_end:=tbl_cnt;
-parts_atom_end:=parts_cnt;
-%=================================================================================================
-for i==3 upto 20: ?[i]:='(|<<,(_get_len,_ring_len),<((-180 DIV i)-90)
- for j==2 upto i:: ,(360 DIV i) endfor,(_cyc_sB,1-i),>>|); endfor
-Ph:=Ph1:='(?6,-2=dl,-4=dl,-6=dl); Ph2:='(?6,-1=dl,-3=dl,-5=dl);
-!:=!1:='((_mk_bond,_arg_ang)); !!:='(!~db); !!!:='(!~tm);
-for i==2 upto 20: ![i]:='(|<<,(_get_len,_tmp_len),! for j==2 upto i::,! endfor ,>>|); endfor
-Me:='(); Et:='(!); Pr:='(!,!); Bu:='(!,!,!); iPr:=?!:='(/_,!); tBu:=??!:='(/_,/_^60,60);
-%-------------------------------------------------------------------------------------------------
-NH:='(N,/H~nl); N!:='(N,/_); N!2:='(N,/!); SO:='(S,//O); SOO:='(S,//O^-35,//O^35);
-O!:='(O,!); O!2:='(O,!,!); O!3:='(O,!,!,!); O!?!:='(O,!,?!); O!??!:='(O,!,??!);
-S!:='(S,!); S!2:='(S,!,!); S!3:='(S,!,!,!); S!?!:='(S,!,?!); S!??!:='(S,!,??!);
-%-------------------------------------------------------------------------------------------------
-COO:='(//O,!,O); COO!:='(COO,!); COO!2:='(COO,!,!); COO!??:='(COO,!,?!); COO!3:='(COO,!,!,!);
-CO!:='(//O,!); CO!2:='(//O,!,!); CO!3:='(//O,!,!,!); OCO!:='(O,!,//O,!);
-N?!:='(N!,!); N?!2:='(N!,!,!); NH!:='(NH,!); NH!2:='(NH,!,!); NH!3:='(NH,!,!,!);
-NH!?!:='(NH,!,?!); NHCO!:='(NH,!,//O,!); CONH2:='(//O,!,NH2); ??:='(/_^35,/_^-35);
-%-------------------------------------------------------------------------------------------------
-!OH:='(!,OH); !SH:='(!,SH); !NH2:='(!,NH2); !CO!:='(!,//O,!); !CO!2:='(!,CO!2); !CO!3:='(!,CO!3);
-!O!:='(!,O!); !O!2:='(!,O!2); !O!3:='(!,O!3);
-!S!:='(!,S!); !S!2:='(!,S!2); !S!3:='(!,S!3);
-!NH!:='(!,NH!); !NH!2:='(!,NH!2); !NH!3:='(!,NH!3);
-!COOH:='(!,COOH); !COO!:='(!,COO!); !COO!2:='(!,COO!2);
-!CH3:='(!,CH3); !CN:='(!,CN); !?!:='(!,?!); !??!:='(!,??!);
-!CHO:='(!,CHO); !NO2:='(!,NO2); !Cl:='(!,Cl); !Br:='(!,Br); !F:='(!,F);
-!?3:='(!,?3); !?4:='(!,?4); !?5:='(!,?5); !?6:='(!,?6); !?7:='(!,?7); !?8:='(!,?8); !Ph:='(!,Ph);
-%-------------------------------------------------------------------------------------------------
-CF2:='(/F,60,F); CCl2:='(/Cl,60,Cl); CBr2:='(/Br,60,Br);
-CF3:='(/F,/F^60,60,F); CCl3:='(/Cl,/Cl^60,60,Cl); CBr3:='(/Br,/Br^60,60,Br);
-%-------------------------------------------------------------------------------------------------
-lr:='(60 for i==1 upto 10:: ,-60,60 endfor); rl:='(-60,lr);
-for i=4,5,6: for j=2 upto i-2: ?[i][j]:='((_fuse,i),(j,0)); endfor endfor
-for i=5,6,7,8: for j=11 upto 15: ?[i][j]:='((_fuse,i),(j,0)); endfor endfor
-%-------------------------------------------------------------------------------------------------
-R:='("R"); R1:='("{R^1^}"); R2:='("{R^2^}"); R3:='("{R^3^}"); R4:='("R^4^"); R5:='("{R^5^}");
-R6:='("R6"); R7:='("{R^7^}"); R8:='("{R^8^}"); R9:='("{R^9^}"); R10:='("R^10^"); R11:='("{R^11^}");
-%-------------------------------------------------------------------------------------------------
-xCH3:='(/H,/H^60,60,H); xNH:='(N,/H); xNH2:='(N,/H,60,H); xNO2:='(N,//O,60~dm,O); xOH:='(O,!,H);
-xCHO:='(//O,!,H); xCOOH:='(//O,!,O,!,H); xCN:='(!~tm,N); xSH:='(S,!,H);
-%=================================================================================================
-init_par(parameter_list);
-%-------------------------------------------------------------------------------------------------
-%%%%message "parts_emb =" & decimal(parts_emb_start) &" => " & decimal(parts_cnt);
-%%%%message "parts_emi =" & decimal(parts_emi_start) &" => " & decimal(parts_int);
-%-------------------------------------------------------------------------------------------------
-def expand_set=
- CH3:=xCH3; NH:=xNH; NH2:=xNH2; NO2:=xNO2; OH:=xOH; CHO:=xCHO; COOH:=xCOOH; CN:=xCN; SH:=xSH;
- !CH3:='(!,CH3); !OH:='(!,OH); !NH2:='(!,NH2); !CHO:='(!,CHO); !COOH:='(!,COOH); !CN:='(!,CN);
- !SH:='(!,SH); !NO2:='(!,NO2);
-enddef;
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
def char_size_set(expr WD)(expr HT)(expr STR)=
for j=0 upto length(STR)-1:
nA:=ASCII(subc(j,STR)); tbl_char_wd[nA]:=WD; tbl_char_ht[nA]:=HT;
@@ -1352,9 +1248,9 @@ enddef;
char_size_set( 1)( 1)("CGHMNOQW");
char_size_set( .9)( 1)("ABDFIJKPRSTUVXY/><#\%@");
char_size_set( .8)( 1)("ELZ&");
-char_size_set( .7)( 1)(" ()[]0123456789nh=tfg?~");
+char_size_set( .7)( 1)(" ()[]0123456789nh=tfg?~^");
char_size_set( .7)( .9)("$");
-char_size_set( .7)( .7)("-+*");
+char_size_set( .7)( .7)("-+*_");
char_size_set(.45)(.95)("l");
char_size_set(.75)( .8)("opq");
char_size_set( .8)( .8)("e");
@@ -1363,7 +1259,7 @@ char_size_set( .7)( .8)("abdcksuvrxyz");
char_size_set(.35)( .9)("i");
char_size_set( .5)( .9)("j");
char_size_set(.35)( 1)("!|");
-char_size_set( .4)( 1)(".,:;'`^");
+char_size_set( .4)( 1)(".,:;'`");
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
def draw_char(expr CHR,POS,WD,PEN,NUM)=
begingroup
@@ -1496,6 +1392,8 @@ ef sC="~": dw (hP,.8aH)..(.3aW,.9aH)..(.6aW,.7aH)..(fW,.8aH);
ef sC="&": cdw Z21..(hW,.35aH)..(.25aW,.75aH)..(hW,.fH)..(.75aW,.75fH)..(hP,.3aH)..(hW,.hP)..Z10;
ef sC="@": cdw sbp(0,.7)zO; dwv (fW,hH)--(fW,0);
dw (fW,.45aH)..(.7aW,.75aH)..(.3aW,.45aH)..(.7aW,.15aH)..cycle;
+ef sC="_": dwh Z01--Z04;
+ef sC="^": dwv (hP,.6aH)..(.5aW,.7aH)..(fW,.6aH);
else:
fi
endgroup
@@ -1515,16 +1413,23 @@ def warning_bond(expr a)=
enddef;
%-------------------------------------------------------------------------------------------------
vardef cut_paren(expr ATOM)=
- if length(ATOM)=4: substring (1,3) of ATOM
- elseif length(ATOM)=6: substring (1,2) of ATOM
- else: ATOM
- fi
+ save temp_c,temp_s;
+ string temp_c,temp_s;
+ temp_s:="";
+ if (length(ATOM)>=4)and(ATOM<>"COOH"):
+ for i=0 upto length(ATOM)-1:
+ temp_c:=subc(i,ATOM);
+ if (temp_c<>"{")and(temp_c<>"}")and(temp_c<>"_")and(temp_c<>"^"): temp_s:=temp_s&temp_c; fi
+ endfor
+ temp_s
+ else: ATOM
+ fi
enddef;
%=================================================================================================
def proc_calc=
begingroup
- save warning_cnt,MWp,knownA,bondC,tmp_wtp,bond_cnt,hideH_cnt;
- hideH_cnt:=warning_cnt:=num_MW:=num_MI:=MWp:=tbl_atom_max:=0;
+ save warning_cnt,knownA,bondC,tmp_wtp,bond_cnt,hideH_cnt;
+ hideH_cnt:=warning_cnt:=num_MW:=num_MI:=cen_MW:=cen_MI:=tbl_atom_max:=0;
nE:=parts_emb_start;
for i=1 upto tbl_atom_end: sumA[i]:=0; endfor
for i=1 upto cntA:
@@ -1582,8 +1487,10 @@ def proc_calc=
for i=1 upto tbl_atom_max:
if sumA[i]>=1:
nA:=tbl_atom_wt[i]/100*sumA[i];
- MWp:=MWp+nA;
- if (MWp<40)and(nA<40):
+ nB:=tbl_atom_mi[i]/100*sumA[i];
+ cen_MW:=cen_MW+nA;
+ cen_MI:=cen_MI+nB;
+ if (cen_MW<40)and(cen_MI<40):
num_MW:= num_MW+tbl_atom_wt[i]*sumA[i];
num_MI:= num_MI+tbl_atom_mi[i]*sumA[i];
fi
@@ -1591,8 +1498,10 @@ def proc_calc=
fi
endfor
%-------------------------------------------------------------------------------------
- cal_MI:=substring (0,10) of decimal(num_MI);
- cal_MW:=substring (0,8) of decimal(num_MW);
+ if cen_MW<40: cal_MW:=substring (0,8) of decimal(num_MW);
+ else: num_MW:=cen_MW; cal_MW:=fdr(6)(cen_MW)&"*100"; fi
+ if cen_MI<40: cal_MI:=substring (0,10) of decimal(num_MI);
+ else: num_MI:=cen_MI; cal_MI:=fdr(8)(cen_MI)&"*100"; fi
if sw_aux_out>=1: proc_auxfile_out; fi
if sw_rep_out=1: proc_report_out; fi
if sw_mol_out>=1: proc_mol_out; fi
@@ -1655,49 +1564,44 @@ def proc_report_out=
printf " Atom count="&fdr(3)(cntA)&" Bond count="&fdr(3)(cntB)&
" Ring count="&fdr(3)(cntB-cntA+1)&" Hide H count="&fdr(3)(hideH_cnt);
printf "------------------------------------------------------------------";
- printf "< NO. >( x axis , y axis )< atom(s) ><bond><hideH><chg>";
+ printf "< NO. ><atom(s) >( x axis , y axis )<bond><hideH><chg>";
for i=1 upto cntA:
- printf " A"&fdl(4)(i)&" ("&fdr(10)(round_auto(xpart(posA[i])/blen))&" , "&
- fdr(10)(round_auto(ypart(posA[i])/blen))&" ) "&
- fixed_l(12)(strD[numS[i]])&" "&fdr(3)(Bcnt[i])
- &iif(hideH[i]>0,fdr(6)(hideH[i])," ")
+ printf " A"&fdl(6)(i)&fixed_l(8)(cut_paren(strD[numS[i]]))&
+ " ("&fdr(10)(round_auto(xpart(posA[i])/blen))&" , "&
+ fdr(10)(round_auto(ypart(posA[i])/blen))&" ) "&fdr(4)(Bcnt[i])&
+ iif(hideH[i]>0,fdr(6)(hideH[i])," ")
if chargeA[i]<>0: &fdr(4)(chargeA[i]) fi;
endfor
printf "------------------------------------------------------------------";
- printf "< NO. >< bond (sdt)><angle + ( +- )><length ( pt )>";
+ printf "< NO. >< bond (sdt)><angle +( +- )><length ( pt )>";
for i=1 upto cntB:
nC:=lenB[i]; if nC=_size_atom: nC:=ratio_atom_bond; elseif nC<0: nC:=-nC; fi
if lineB[i]<>0:
nB:=angB[i]; if nB>180: nB:=nB-360; fi
printf " B"&fdl(4)(i)&fdr(3)(sB[i])&" -> "&fdr(3)(eB[i])&
- " ("&fdr(3)(bondC[i]-si+1)&")"&fdr(9)(round_auto(angB[i]))&
+ " ("&fdr(3)(bondC[i])&")"&fdr(8)(round_auto(angB[i]))&
" ("&fdr(6)(round_auto(nB))&")"&fdr(8)(nC)&" ("&fdr(8)(round_auto(nC*blen))&")";
fi
endfor
printf "------------------------------------------------------------------";
printf "<atom>( atom wt )[ mi wt ] < cnt > < sum wt >[ sum mi wt ]";
- if MWp<=40: cal_MW_str:=cal_MW; cal_MI_str:=cal_MI;
- else: cal_MW_str:=fdr(10)(MWp)&" * 100"; cal_MI_str:=fdr(10)(MIp)&" * 100";
- fi
for i=1 upto tbl_atom_max:
if sumA[i]>=1:
nA:=tbl_atom_wt[i]/100*sumA[i]; nB:=tbl_atom_mi[i]/100*sumA[i];
printf " "&
fixed_l(5)(cut_paren(tbl_atom_str[i]))&
- "("&fdr(9)(tbl_atom_wt[i])&")"&"["&fdr(9)(tbl_atom_mi[i])&"]"&
- " * "&fdr(4)(sumA[i])&" = "
- if nA<40: &fdr(12)(tbl_atom_wt[i]*sumA[i])&"["&fdr(12)(tbl_atom_mi[i]*sumA[i])&"]";
- else: &fdr(12)(nA)&" * 100"&"["&fdr(12)(nA)&" * 100"&"]";
+ "("&fdr(9)(tbl_atom_wt[i])&")"&"["&fdr(9)(tbl_atom_mi[i])&"]"&" * "&fdr(4)(sumA[i])
+ if nA<40: &fdr(15)(tbl_atom_wt[i]*sumA[i])&"["&fdr(12)(tbl_atom_mi[i]*sumA[i])&"]";
+ else: &fdr(11)(nA)&"*100"&"["&fdr(9)(nB)&"*100"&"]";
fi
fi
endfor
- printf " Molecular Weight [Mono Isotopic] = "&
- fixed_r(12)(cal_MW_str)&"["&fixed_r(12)(cal_MI_str)&"]";
+ printf " Molecular Weight [Mono Isotopic] = "&fixed_r(12)(cal_MW)&"["&fixed_r(12)(cal_MI)&"]";
printf "------------------------------------------------------------------";
- printf " Weight Calc: " &cal_MW_str &" / Input: "
- if inf_MW<>"": &inf_MW &" / weight gap= " &decimal(num_MW-scantokens(inf_MW)) fi;
+ 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_FM<>"-": &inf_FM&" / "& iif(inf_FM=cal_FM,"MACTCH","NOT MACTCH") fi;
printf "==================================================================";
enddef;
%=================================================================================================
@@ -1761,7 +1665,7 @@ def proc_vtk=
printf "M END";
enddef;
%-------------------------------------------------------------------------------------------------
-vardef fit_zero(expr n)=if n<=9: "00" elseif n<=99: "0" fi &decimal(n) enddef;
+vardef fit_zero(expr n)=if n<=9: "00" elseif n<=99: "0" else: "" fi &decimal(n) enddef;
%-------------------------------------------------------------------------------------------------
def proc_bond_class(expr n)=
if (n=dl)or(n=dr)or(n=dm): nA:=2;
@@ -1772,4 +1676,118 @@ def proc_bond_class(expr n)=
else: nA:=1; nB:=0;
fi
enddef;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+vardef STa(expr ATOM,WT,MI)=
+ str_cnt:=str_cnt+1; tbl_cnt:=tbl_cnt+1; parts_cnt:=parts_cnt+1;
+ comD[parts_cnt][1]:=_set_atom; parD[parts_cnt][1]:=str_cnt; cntD[parts_cnt]:=1;
+ strD[str_cnt]:=tbl_atom_str[tbl_cnt]:=ATOM;
+ tbl_atom[tbl_cnt]:=0;
+ tbl_atom_wt[tbl_cnt]:=WT; tbl_atom_mi[tbl_cnt]:=MI;
+ parts_cnt
+enddef;
+%-------------------------------------------------------------------------------------------------
+vardef STb(expr ATOM)(text TXT)=
+ str_cnt:=str_cnt+1; tbl_cnt:=tbl_cnt+1; parts_cnt:=parts_cnt+1;
+ comD[parts_cnt][1]:=_set_atom; parD[parts_cnt][1]:=str_cnt; cntD[parts_cnt]:=1;
+ strD[str_cnt]:=tbl_atom_str[tbl_cnt]:=ATOM;
+ tbl_atom[tbl_cnt]:=0;
+ for list=TXT:
+ tbl_atom[tbl_cnt]:=tbl_atom[tbl_cnt]+1;
+ tbl_group[tbl_cnt][tbl_atom[tbl_cnt]]:=list-parts_emb_start;
+ endfor
+ parts_cnt
+enddef;
+%=================================================================================================
+parts_int:=parts_emi_start;
+parts_cnt:=parts_emb_start;
+%-------------------------------------------------------------------------------------------------
+C:= STa("C" ,12.0107, 12.0000000); H:= STa("H" , 1.00794, 1.00782503223);
+D:= STa("D" ,2.012, 2.01410177812); Ag:=STa("{Ag}",107.868, 106.905095);
+Al:=STa("{Al}",26.9815, 26.98153853); As:=STa("{As}",74.9216, 74.92159457);
+B:= STa("B" ,10.811, 11.00930536); Ba:=STa("{Ba}",137.33, 136.905816);
+Bi:=STa("{Bi}",208.9804, 208.980338); Br:=STa("{Br}",79.904, 78.9183376);
+Ca:=STa("{Ca}",40.078, 39.962590863); Cd:=STa("{Cd}",112.41, 110.904182);
+Cl:=STa("{Cl}",35.453, 34.968852); Co:=STa("{Co}",58.933194, 58.93319429);
+Cr:=STa("{Cr}",51.9961, 51.94050623); Cu:=STa("{Cu}",63.546, 62.92959772);
+F:= STa("F" ,18.9984, 18.99840316273); Fe:=STa("{Fe}",55.845, 55.93493633);
+Hg:=STa("{Hg}",200.59, 201.97064340); I:= STa("I" ,126.90447,126.9044719);
+K:= STa("K" ,39.0983, 38.9637064864); Li:=STa("{Li}",6.941, 7.0160034366);
+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, 0.0);
+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, 0.0);
+W:= STa("W", 183.85, 181.948225); Zn:=STa("{Zn}",65.409, 63.92914201);
+tbl_atom_end:=tbl_cnt;
+%-------------------------------------------------------------------------------------------------
+CH3:=STb("C{H_3_}")(C,H,H,H); CH2:=STb("C{H_3_}")(C,H,H); CN:=STb("CN")(C,N); OH:=STb("OH")(O,H);
+COOH:=STb("COOH")(C,O,O,H); SH:= STb("SH")(S,H); CHO:=STb("CHO")(C,H,O);
+NO:=STb("NO")(N,O); NO2:=STb("N{O_2_}")(N,O,O); NH2:=STb("N{H_2_}")(N,H,H);
+SO2H:=STb("S{O_2_}H")(S,O,O,H); SO3H:=STb("S{O_3_}H")(S,O,O,O,H);
+ONa:=STb("O{Na}")(O,Na); SO3Na:=STb("S{O_3_}{Na}")(S,O,O,O,Na);
+%-------------------------------------------------------------------------------------------------
+str_plus:=str_cnt;
+N[1]:=STb("{N^+^}")(N); H[1]:=STb("{H^+^}")(H); Na[1]:=STb("{Na^+^}")(Na); K[1]:=STb("{K^+^}")(K);
+NH3[1]:= STb("{N^+^}{H_3_}")(N,H,H,H); NH4[1]:= STb("{N^+^}{H_4_}")(N,H,H,H,H);
+S[1]:= STb("{S^+^}")(S);
+str_minus:=str_cnt;
+O[-1]:=STb("{O^-^}")(O); COO[-1]:=STb("COO^-^")(C,O,O); SO3[-1]:=STb("S{O_3_}^-^")(S,O,O,O);
+Cl[-1]:=STb("{Cl^-^}")(Cl); Br[-1]:=STb("{Br^-^}")(Br); I[-1]:=STb("{I^-^}")(I);
+%-------------------------------------------------------------------------------------------------
+str_minus_end:=str_cnt;
+tbl_group_end:=tbl_cnt;
+parts_atom_end:=parts_cnt;
+%=================================================================================================
+for i==3 upto 20: ?[i]:='(|<<,(_get_len,_ring_len),<((-180 DIV i)-90)
+ for j==2 upto i:: ,(360 DIV i) endfor,(_cyc_sB,1-i),>>|); endfor
+Ph:=Ph1:='(?6,-2=dl,-4=dl,-6=dl); Ph2:='(?6,-1=dl,-3=dl,-5=dl);
+!:=!1:='((_mk_bond,_arg_ang)); !!:='(!~db); !!!:='(!~tm);
+for i==2 upto 20: ![i]:='(|<<,(_get_len,_tmp_len),! for j==2 upto i::,! endfor ,>>|); endfor
+Me:='(); Et:='(!); iPr:=?!:='(/_,!); tBu:=??!:='(/_,/_^60,60); !?!:='(!,?!); !??!:='(!,??!);
+%-------------------------------------------------------------------------------------------------
+NH:='(N,/H~nl); N!:='(N,/_); N!2:='(N,/!); SO:='(S,//O); SOO:='(S,//O^-35,//O^35);
+O!:='(O,!); O!2:='(O,!,!); O!3:='(O,!,!,!); O!?!:='(O,!,?!); O!??!:='(O,!,??!);
+S!:='(S,!); S!2:='(S,!,!); S!3:='(S,!,!,!); S!?!:='(S,!,?!); S!??!:='(S,!,??!);
+%-------------------------------------------------------------------------------------------------
+COO:='(//O,!,O); COO!:='(COO,!); COO!2:='(COO,!,!); COO!??:='(COO,!,?!); COO!3:='(COO,!,!,!);
+CO!:='(//O,!); CO!2:='(//O,!,!); CO!3:='(//O,!,!,!); OCO!:='(O,!,//O,!);
+N?!:='(N!,!); N?!2:='(N!,!,!); NH!:='(NH,!); NH!2:='(NH,!,!); NH!3:='(NH,!,!,!);
+NH!?!:='(NH,!,?!); NHCO!:='(NH,!,//O,!); CONH2:='(//O,!,NH2); ??:='(/_^35,/_^-35);
+%-------------------------------------------------------------------------------------------------
+!OH:='(!,OH); !SH:='(!,SH); !NH2:='(!,NH2); !CO!:='(!,//O,!); !CO!2:='(!,CO!2); !CO!3:='(!,CO!3);
+!O!:='(!,O!); !O!2:='(!,O!2); !O!3:='(!,O!3); !S!:='(!,S!); !S!2:='(!,S!2); !S!3:='(!,S!3);
+!NH!:='(!,NH!); !NH!2:='(!,NH!2); !NH!3:='(!,NH!3);
+!COOH:='(!,COOH); !COO!:='(!,COO!); !COO!2:='(!,COO!2); !CH3:='(!,CH3); !CN:='(!,CN);
+!CHO:='(!,CHO); !NO2:='(!,NO2); !Cl:='(!,Cl); !Br:='(!,Br); !F:='(!,F);
+!?3:='(!,?3); !?4:='(!,?4); !?5:='(!,?5); !?6:='(!,?6); !?7:='(!,?7); !?8:='(!,?8); !Ph:='(!,Ph);
+%-------------------------------------------------------------------------------------------------
+CF2:='(/F,60,F); CCl2:='(/Cl,60,Cl); CBr2:='(/Br,60,Br);
+CF3:='(/F,/F^60,60,F); CCl3:='(/Cl,/Cl^60,60,Cl); CBr3:='(/Br,/Br^60,60,Br);
+%-------------------------------------------------------------------------------------------------
+lr:='(60 for i==1 upto 10:: ,-60,60 endfor); rl:='(-60,lr);
+for i=4,5,6: for j=2 upto i-2: ?[i][j]:='((_fuse,i),(j,0)); endfor endfor
+for i=5,6,7,8: for j=11 upto 15: ?[i][j]:='((_fuse,i),(j,0)); endfor endfor
+%-------------------------------------------------------------------------------------------------
+R:='("R"); R1:='("{R^1^}"); R2:='("{R^2^}"); R3:='("{R^3^}"); R4:='("R^4^"); R5:='("{R^5^}");
+R6:='("R6"); R7:='("{R^7^}"); R8:='("{R^8^}"); R9:='("{R^9^}"); R10:='("R^10^"); R11:='("{R^11^}");
+%-------------------------------------------------------------------------------------------------
+xCH3:='(/H,/H^60,60,H); xNH:='(N,/H); xNH2:='(N,/H,60,H); xNO2:='(N,//O,60~dm,O); xNO:='(N,!~dm,O);
+xSO2H:='(S,//O,!,O,!,H); xSO3H:='(S,//O^35,//O^-35,!,O,!,H); xCOO:='(//O,!,O);
+xOH:='(O,!,H); xCHO:='(//O,!,H); xCOOH:='(//O,!,O,!,H); xCN:='(!~tm,N); xSH:='(S,!,H);
+%=================================================================================================
+init_par(parameter_list);
+%-------------------------------------------------------------------------------------------------
+%%%%message "parts_emb =" & decimal(parts_emb_start) &" => " & decimal(parts_cnt);
+%%%%message "parts_emi =" & decimal(parts_emi_start) &" => " & decimal(parts_int);
+%-------------------------------------------------------------------------------------------------
+def expand_set=
+ CH3:=xCH3; NH:=xNH; NH2:=xNH2; NO:=xNO; NO2:=xNO2; OH:=xOH; CHO:=xCHO; COOH:=xCOOH; CN:=xCN;
+ SH:=xSH; SO2H:=xSO2H; SO3H:=xSO3H; COO[-1]:=xCOO;
+ !CH3:='(!,CH3); !OH:='(!,OH); !NH2:='(!,NH2); !CHO:='(!,CHO); !COOH:='(!,COOH); !CN:='(!,CN);
+ !SH:='(!,SH); !NO2:='(!,NO2);
+enddef;
%-------------------------------------------------------------------------------------------------
diff --git a/graphics/mcf2graph/mcf_exa_soc.mf b/graphics/mcf2graph/mcf_exa_soc.mf
index f91483eb72..bb1984b27a 100644
--- a/graphics/mcf2graph/mcf_exa_soc.mf
+++ b/graphics/mcf2graph/mcf_exa_soc.mf
@@ -1,8 +1,8 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Molecular Coding Format for mcf_example.tex by Akira Yamaji 2021.01.03
+% Molecular Coding Format for mcf_example.tex by Akira Yamaji 2021.01.31
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-input mcf2graph.mf; %%% it must be version 4.55 or later
-message "mcf_exa_soc 2021.01.03";
+input mcf2graph.mf; %%% it must be version 4.56 or later
+message "* mcf_exa_soc 2021.01.31";
message "";
%-------------------------------------------------------------------------
fsize:=(35mm,24mm);
@@ -32,21 +32,22 @@ tag1:="F"; tag2:="C"; tag3:="fm"; tag4:="mw"; tag5:="EN"; tag6:="MW";
%%%%sw_calc:=1;
%%%%ext(defaultfont:="uhvr8r"; defaultscale:=.3;
%%%% label.lrt(decimal(char_num)&":"&inf_EN&" MW="&cal_MW
-%%%% if inf_MW<>"-": &"("& decimal(num_MW-scantokens(inf_MW))&")"
-%%%% else: &"(-)" fi ,(-2bp,1.5bp));)
-%***********************************************************************
+%%%% if (inf_MW<>"-")and(cen_MW<40):
+%%%% &"("& decimal(num_MW-scantokens(inf_MW))&")"
+%%%% else: &"(-)" fi ,(-2bp,1.5bp));)
+%***************************************************************************
beginfont("EN:Adenine","MW:135.13")
MC(<30,?6,3=?5,{1,3,5,9}=dl,{2,6,9}:N,5:/NH2,7:NH)
endfont
-%***********************************************************************
+%***************************************************************************
beginfont("EN:Guanine","MW:151.13")
MC(<30,?6,3=?5,{1,3,9}=dl,{2,9}:N,{6,7}:NH,5://O,1:/NH2)
endfont
-%***********************************************************************
+%***************************************************************************
beginfont("EN:Cytosine","MW:111.10")
MC(<30,?6,{4,6}=dl,4:N,3://O,2:NH,5:/NH2)
endfont
-%***********************************************************************
+%***************************************************************************
beginfont("EN:Thymine","MW:126.11")
MC(<30,?6,3=dl,{2,6}:NH,{1,5}://O,4:/_)
endfont
@@ -148,9 +149,8 @@ beginfont("EN:Hexaphenylbenzene","MW:534.6876")
endfont
%***************************************************************************
beginfont("EN:Kekulene","MW:600.7")
- MC(<30,?6,{2,-3,-2,-3,-2,-3,-2,-3,-2,-3}=?6,|=1,4:\,-1:#,-3:\,5:#,=|,
- {2,15,55}=dr,
- {6,8,10,13,18,20,23,27,29,31,33,37,39,41,43,47,49,51,53,57,60}=dl)
+ MC(<30,Ph,{3,-2,-3,-2,-3,-2,-3,-2,-3,-2}=?6,(-3,6)=?6[3],-4@#6,
+ {8,12,14,16,18,22,24,26,28,32,34,36,38,42,44,46,48,52,54,56,58}=dl)
endfont
%***************************************************************************
beginfont("EN:18-Crown-6","MW:264.32")
@@ -158,6 +158,21 @@ beginfont("EN:18-Crown-6","MW:264.32")
O,-60,60,60,O,-60,60,60,O,-60,60,1:#)
endfont
%***************************************************************************
+beginfont("EN:Porphyrin","MW:310.4")
+MC(<9,|=1,?5,3:\,54,?5,-2:\,54,?5,-2:\,54,?5,-2:\,5:#,=|,
+ {1,4,6,8,10,14,16,18,21,23,27}=dl,{4,17}:N,{11,23}:NH)
+endfont
+%***************************************************************************
+beginfont("EN:Sulflower","MW:448.69")
+ MC(<67.5,?8,{1,3,5,7}=?5,11:@,30`1.15,12:#,14:@,30`1.15,15:#,
+ 17:@,30`1.15,18:#,20:@,30`1.15,9:#,{9,12,13,16,17,20,21,24}=dl,
+ {10,13,16,19,21,22,23,24}:S)
+endfont
+%***************************************************************************
+beginfont("EN:Arsphenamine x5","MW:915.2")
+ MC(<18,?5,{1,2,3,4,5}:As,{1,2,3,4,5}:/'(Ph,3:/NH2,4:/OH))
+endfont
+%***************************************************************************
beginfont("EN:Melamine","MW:126.12")
MC(<30,Ph,{2,4,6}:N,{1,3,5}:/NH2)
endfont
@@ -178,10 +193,6 @@ beginfont("EN:Vat blue 1","MW:262.27")
MC(<30,Ph,3=?5,8:\\,?5,-3=dr,-3=Ph,{7,14}:NH,{9,11}://O)
endfont
%***************************************************************************
-beginfont("EN:Mordant red 11","MW:240.22")
- MC(<30,Ph,3=?6,-3=dr,9=Ph,{7,10}://O,{-1,-2}:/OH)
-endfont
-%***************************************************************************
beginfont("EN:Atrazine","MW:215.7")
MC(<30,Ph,{2,4,6}:N,5:/Cl,1:/NH!2,3:/NH!?!)
endfont
@@ -200,10 +211,6 @@ MC(<30,?6`1.3,3=?6,6=dl,9=?3,-1:O,
{1,2,5,6,12^-210,12^-150}:/Cl)
endfont
%***************************************************************************
-beginfont("EN:Bromacil","MW:261.119")
-MC(<30,?6,6=dl,3:N,1:/Br,{2,4}://O,5:NH,6:/_,3:\,/_,!2)
-endfont
-%***************************************************************************
beginfont("EN:Acrinathrin","MW:541.45")
MC(<-30,?3,2^-35:*/_,2^35:/*Me,
1:\,!~dl,!,//O,!,O,!,/CF3,!,CF3,3:\,//O,!,O,!,/CN,!,Ph,-4:\,O,-60,Ph)
@@ -226,10 +233,6 @@ beginfont("EN:Clomazone","MW:239.7")
MC(<30,Ph,2:/Cl,3:\,!,|,?5,1:N,2:O,-2^-35:/_,-2^35:/_,-1://O)
endfont
%***************************************************************************
-beginfont("EN:Ethofenprox","MW:376.5")
-MC(<30,Ph,5:\,O,!,Ph,10:\,O,!3,??,!,Ph,-3:/O!2)
-endfont
-%***************************************************************************
beginfont("EN:Halfenprox","MW:477.4")
MC(<30,Ph,6:\,O,!,/F^35,/F^-35,!,Br,3:\,!,??,!,O,!,!,Ph,-2:\,O,60,Ph)
endfont
@@ -383,7 +386,7 @@ beginfont("EN:Uniconazole-P","MW:291.779")
endfont
%***************************************************************************
beginfont("EN:Oxadiargyl","MW:341.19")
- MC(<30,Ph,{1,3}:/Cl,6:/'(O,!2,!!!),4:\,|,?5,2=dl,{1,2}:N,4:O,5://O,-3:/??!)
+ MC(<30,Ph,{1,3}:/Cl,6:/'(O,!2,!!!),4:\,|,?5,2=dl,{1,2}:N,4:O,5://O,3:/??!)
endfont
%***************************************************************************
beginfont("EN:Oxaziclomefone","MW:376.277")
@@ -664,12 +667,10 @@ beginfont("EN:Luciferin","MW:280.33")
endfont
%***************************************************************************
beginfont("EN:Chlorophyll a","MW:893.509")
-MC(<54,|=1,?5,{2,5}=dl,4:N,3:\,54~dl,|,?5,{2,4}=dl,5:N,
- -2:\,54~dl,|,?5,2=dl,5:N,-2:\~dl,54,|,?5,5=dl,5:N,-2:\~dl,$5:#,
- -1:@,24,/*COO!^15,72,//O,$1:#,=|,||,
- {2,9,15,20~zf}:/_,8:/!,14:\,!!,
- 4:\`1.45,Mg,17:#,-1:@,11~vb:#,-1:@,23~vb:#,
- 21:@,-6~wf,!2,//O,!,O,!2,!!,|,!13,{1,5,9,13}:/_)
+MC(<-36,|=1,?5,3:\,54,?5,-2:\,54,?5,-2:\,54,?5,-2:\,5:#,6:@,22,70,8:#,=|,
+ {4,6,8,10,14,16,18,21,23,27}=dl,4:\`1.48~vf,Mg,17:#~vb,11@#27,27@#23,
+ {4,11,17,23}:N,{1~zf,9,15,21}:/_,14:/!,20:/!!,25:/*COO!,26://O,
+ 2:*\^-6,!2,//O,!,O,!2,!!,|,!13,{1,5,9,13}:/_)
endfont
%**************************************************************************
beginfont("EN:Quercetin","MW:302.24")
@@ -745,7 +746,7 @@ beginfont("EN:Pyrethrin I","MW:328.452");
endfont;
%***********************************************************************
beginfont("EN:Oseltamivir","MW:312.40")
- MC(<30,?6,3=dl,6:*/NH2,1:\*,NH,!,//O,!,2:*\,!,/!,!2,4:\,//O,!,O,!2)
+ MC(<30,?6,3=dl,6:*/NH2,1:\*,NH,!,//O,!,2:*\,O,!,/!,!2,4:\,//O,!,O,!2)
endfont
%**************************************************************************
beginfont("EN:Paclitaxel","MW:853.918")
diff --git a/graphics/mcf2graph/mcf_example.pdf b/graphics/mcf2graph/mcf_example.pdf
index b0dbe23357..467d9c47b6 100644
--- a/graphics/mcf2graph/mcf_example.pdf
+++ b/graphics/mcf2graph/mcf_example.pdf
Binary files differ
diff --git a/graphics/mcf2graph/mcf_example.tex b/graphics/mcf2graph/mcf_example.tex
index c09fbd17f2..1bac0a43d5 100644
--- a/graphics/mcf2graph/mcf_example.tex
+++ b/graphics/mcf2graph/mcf_example.tex
@@ -8,7 +8,7 @@
%%%%\pdfpkresolution=1200
%---------------------
\pagestyle{empty}
-\topmargin=-20mm
+\topmargin=-24mm
\oddsidemargin=-12mm
\textwidth=190mm
\textheight=280mm
@@ -35,12 +35,12 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\begin{center}
- {\Huge\sf Molecular Coding Format examples}\vspace{5mm}\\
- Author : Akira Yamaji \quad Date : \today\\
- Located at : http://www.ctan.org/pkg/mcf2graph\vspace{3mm}\\
+ {\Huge\sf Molecular Coding Format examples} \vspace{5mm} \\
+ Author : Akira Yamaji \quad Date : \today \\
+ Located at : http://www.ctan.org/pkg/mcf2graph \vspace{3mm} \\
\end{center}
{\small ** FM:Molecular formula calculated by mcf2graph \quad
- ** MW:Molecular weight calculated by mcf2graph}\vspace{3mm}\\
+ ** MW:Molecular weight calculated by mcf2graph} \vspace{3mm} \\
%------------------------------------------------------------------------
\noindent%
\openin\@auxf=\jobname-info.aux%
@@ -49,7 +49,7 @@
\read\@auxf to \@info%
\ifeof\@auxf\CONT@false\else\@sfor\@info{\tag@var\@list}%
%------------------------------------------------------------
- \begin{picture}(3750,3300)%
+ \begin{picture}(3750,3350)%
\put(20,3000){\footnotesize\bf \the\f@num:\EN}%
\put(20,2750){\labelM MW:\mw { / }FM:\fm}%
\put(20,2530){\labelM MW:\MW(data)}%
diff --git a/graphics/mcf2graph/mcf_man_soc.mf b/graphics/mcf2graph/mcf_man_soc.mf
index aca042c93d..84b9fc6bee 100644
--- a/graphics/mcf2graph/mcf_man_soc.mf
+++ b/graphics/mcf2graph/mcf_man_soc.mf
@@ -1,8 +1,8 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Molecular Coding Format file for mcf_manual.tex by Akira.Yamaji 2021.01.03
+% Molecular Coding Format file for mcf_manual.tex by Akira.Yamaji 2021.01.31
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-input mcf2graph.mf; %% it must be version 4.55 or later
-message "mcf_man_soc 2021.01.03"; message "";
+input mcf2graph.mf; %% it must be version 4.56 or later
+message "mcf_man_soc 2021.01.31"; message "";
%------------------------------------------------------------------------
sw_mframe:=0;
sw_expand:=0;
@@ -301,9 +301,11 @@ endfont
%***********************************************************************
beginfont("EN:over line")
sw_trimming:=1;
- fsize:=(60mm,20mm);
+ fsize:=(75mm,20mm);
ratio_chain_ring:=1;
- MC(<30,!8,!,60,90`8,{2~si_,4~wf_,6~wb_,8~bd_}:/_`2)
+ MC(<30,!18,!,60,90`17,
+ {2~si_,4~wf_,6~wb_,8~zf_,10~zb_,
+ 12~bd_,14~dl_,16~dr_,18~dm_}:/_`2)
endfont
%***********************************************************************
beginfont("EN:change bond length1")
@@ -1160,16 +1162,39 @@ beginfont("EN:Quinine","MW:324.42")
)
endfont
%***************************************************************************
+sw_calc:=1;
+ext(defaultfont:="uhvr8r"; defaultscale:=.75;
+ label.urt("NO = "&decimal(char_num),(0.1w,0.60h));
+ label.urt("EN = "&inf_EN ,(0.1w,0.56h));
+ label.urt("MW = "&inf_MW ,(0.1w,0.52h));
+ label.urt("mw = "&cal_MW ,(0.1w,0.48h));
+ label.urt("fm = "&cal_FM ,(0.1w,0.44h));
+ label.urt("w = "&decimal(w) ,(0.1w,0.40h));
+ label.urt("h = "&decimal(h) ,(0.1w,0.36h));
+ label.urt("n = "&decimal(n) ,(0.1w,0.32h));
+ label.urt("ratio_thickness_bond = "&decimal(ratio_thickness_bond),
+ (0.1w,0.28h));
+ label.urt("ratio_atom_bond = "&decimal(ratio_atom_bond),
+ (0.1w,0.24h));
+ label.urt("ratio_bondgap_bond = "&decimal(ratio_bondgap_bond),
+ (0.1w,0.20h));
+ label.urt("ratio_chain_ring = "&decimal(ratio_chain_ring),
+ (0.1w,0.16h));
+ label.urt("sw_fframe = "&decimal(sw_fframe),(0.1w,0.12h));
+ label.urt("sw_aframe = "&decimal(sw_aframe),(0.1w,0.08h));
+ label.urt("sw_trimming = "&decimal(sw_trimming),(0.1w,0.04h));
+)
+%***************************************************************************
beginfont("EN:Ampicillin","MW:349.405")
- fsize:=(60mm,15mm);
- MC(<45,?4,-3=?5,2:N,7:S,
+ fsize:=(60mm,90mm);
+ MCat(0.5,1)(<45,?4,-3=?5,2:N,7:S,
{3^45,4^-45}:/*H,1://O^15,5:/*COOH^-18,6:??,
4:*\^75,NH,!,//O,!,/*NH2,!,Ph)
endfont
%***************************************************************************
beginfont("EN:Cholesterol","CAS:57-88-5","FM:C27H46O","MW:386.65")
- fsize:=(60mm,15mm);
- MC(
+ fsize:=(60mm,90mm);
+ MCat(0.5,1)(
<30,?6,{-4,-2}=?6,-4=?5,7=dl,
1:*/OH,{4,12}:*/_^60,9:*/H^60,
10:/*H^180,11:/*H^-60,17:/*H^-54,
diff --git a/graphics/mcf2graph/mcf_manual.pdf b/graphics/mcf2graph/mcf_manual.pdf
index 848ca9fe42..fa14700a11 100644
--- a/graphics/mcf2graph/mcf_manual.pdf
+++ b/graphics/mcf2graph/mcf_manual.pdf
Binary files differ
diff --git a/graphics/mcf2graph/mcf_manual.tex b/graphics/mcf2graph/mcf_manual.tex
index 2573d33c6d..f8678eb716 100644
--- a/graphics/mcf2graph/mcf_manual.tex
+++ b/graphics/mcf2graph/mcf_manual.tex
@@ -1,18 +1,14 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Molecular Coding Format manual by Akira Yamaji 2021.01.03
+% Molecular Coding Format manual by Akira Yamaji 2021.01.31
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\documentclass[a4paper]{article}
-%%%%\documentclass[a4paper,twoside]{article}
-%%%%\usepackage{graphicx}
\usepackage[pdftex]{graphicx}
-%%%%\usepackage{epstopdf}
-%%%%\usepackage[dvipdfmx]{graphicx}
\usepackage[pdftex]{hyperref}
\usepackage{makeidx}
\makeindex
-%%%%\usepackage[dvipdfmx]{hyperref}
%---------------------
\usepackage{mcf_setup}
+%%%%\pdfpkresolution=1200
%---------------------
\hypersetup{colorlinks=true,linkcolor=blue}
\topmargin=-18mm
@@ -56,9 +52,9 @@
}%
%---------------------------------------------------------------------------
\def\put@char{%
- \begin{picture}(75,28)%
- \put(0,23){\bf [\NO]\EN}%
- \put(5,18){\small\tt FM:\fm{ }MW:\mw}%
+ \begin{picture}(75,110)%
+ \put(0,100){\bf [\NO]\EN}%
+ \put(5,95){\small\tt FM:\fm{ }MW:\mw}%
\put(5,0){\font\@strufont=\File\relax%
\hbox{\@strufont\char\Char}}%
\end{picture}%
@@ -174,6 +170,7 @@ exact mass, molecular formula.
%-----------------------------------------------------------------------------
\subsubsection{Connect atom}
\index{\#}%
+\index{"@\#}%
\begin{verbatim}
n:# : Connect to An
n1@#n2 : n1:@,n2:#
@@ -208,6 +205,7 @@ exact mass, molecular formula.
\index{"!"!"!}%
\index{dm}%
\index{dl}%
+\index{dr}%
\index{db}%
\index{tm}%
\begin{verbatim}
@@ -291,15 +289,26 @@ exact mass, molecular formula.
\index{si\_}%
\index{wf\_}%
\index{wb\_}%
+\index{zf\_}%
+\index{zb\_}%
\index{bd\_}%
+\index{dl\_}%
+\index{dr\_}%
+\index{dm\_}%
\begin{verbatim}
si_ : single over line
wf_ : wedge forward over line
wb_ : wedge backward over line
+ zf_ : wedge dotted forward over line
+ zb_ : wedge dotted backward over line
bd_ : broad over line
+ dl_ : duble left over line
+ dr_ : duble right over line
+ dm_ : duble over line
- <30,!8,!,60,90`8,
- {2~si_,4~wf_,6~wb_,8~bd_}:/_`2
+ <30,!8,!,60,90`18,
+ {2~si_,4~wf_,6~wb_,8~zf_,10~zb_,
+ 12~bd_,14~dl_,16~dr_,18~dm_}:/_`2
\end{verbatim}
\MCFgraph
%-----------------------------------------------------------------------------
@@ -311,7 +320,7 @@ exact mass, molecular formula.
<-30,!2,!2`1.2,!2
- ** !2`1.2 : '`1.2,!2
+ ** !2`1.2 : !`1.2,!`1.2
\end{verbatim}
\MCFgraph
%-----------------------------------------------------------------------------
@@ -483,6 +492,8 @@ exact mass, molecular formula.
%-----------------------------------------------------------------------------
\subsection{Group}
\subsubsection{Insert group}
+\index{/}%
+\index{Ph}%
\begin{verbatim}
/ : single
<-30,!,/_,!,/!,!3,/!2,!,/?!,
@@ -559,6 +570,7 @@ exact mass, molecular formula.
\subsubsection{Horizontal,vertical}
\index{hz}%
\index{vt}%
+\index{"'}%
\begin{verbatim}
>hz : horizontal environment (default)
>vt : vertical environment
@@ -605,7 +617,11 @@ exact mass, molecular formula.
\subsection{Miscellaneous}
%-----------------------------------------------------------------------------
\subsubsection{Abbreviated parts}
-\index{N!}%
+\index{NH}%
+\index{N"!}%
+\index{N"!2}%
+\index{SO}%
+\index{SOO}%
\begin{verbatim}
NH : N,/H~nl
N! : N,/_
@@ -616,8 +632,10 @@ exact mass, molecular formula.
<-30,!2,NH,!2,N!,!2,N!2,SO,!2,SOO,!
\end{verbatim}
\MCFgraph
-\index{?!}%
+\index{?"!}%
\index{??}%
+\index{??"!}%
+\index{N?"!}%
\begin{verbatim}
?! : /_,!
?? : /_^35,/_-35
@@ -631,7 +649,8 @@ exact mass, molecular formula.
\MCFgraph
%-----------------------------------------------------------------------------
\subsubsection{Make block}
-\index{\textbar= =\textbar}% |=
+\index{\textbar=}% |=
+\index{=\textbar}% =|
\begin{verbatim}
|= : start brock / bond length=n
=| : end brock
@@ -1018,6 +1037,8 @@ MCat(1, .5)(<30,Ph,4:/COOH,3:/NH2)
%-----------------------------------------------------------------------------
\subsection{Parameter setting}
\subsubsection{Local parameter setting}
+\index{beginfont()}%
+\index{endfont}%
\begin{verbatim}
beginfont()
MC(Ph)
@@ -1117,12 +1138,37 @@ MCat(1, .5)(<30,Ph,4:/COOH,3:/NH2)
\index{minus}%
\index{lonepair}%
\index{lonepairdiam}%
-\index{lonepairdiam}%
+\index{lonepairspace}%
\index{circlediam}%
\index{circlepen}%
+\index{w}%
+\index{h}%
+\index{aw}%
+\index{em}%
+\index{p0}%
+\index{l}%
\index{/*}%
\index{**}%
\index{\textgreater\textgreater}%
+\index{An}%
+\index{A[]}%
+\index{A[]ang}%
+\index{A[]up}%
+\index{A[]left}%
+\index{A[]right}%
+\index{A[]down}%
+\index{Bn}%
+\index{B[]}%
+\index{B[]s}%
+\index{B[]m}%
+\index{B[]e}%
+\index{B[]ang}%
+\index{B[]up}%
+\index{B[]left}%
+\index{B[]right}%
+\index{B[]down}%
+\index{defaultscale}%
+\index{labeloffset}%
\begin{verbatim}
(Add graphic to molecule)
@@ -1231,6 +1277,13 @@ endfont
\newpage
\subsection{Function ext()}
\index{ext()}%
+\index{w0}%
+\index{h0}%
+\index{aw}%
+\index{em}%
+\index{n}%
+\index{ratio\_thickness\_char}%
+\index{defaultscale}%
\begin{verbatim}
(Extra graphic to font)
@@ -1429,7 +1482,10 @@ endfont
\onecolumn
\section{Example to use mcf2graph}
\subsection{Molecular definition file}
+\index{mcf2graph.mf}%
\index{sw\_aux\_out}%
+\index{tag}%
+\index{var}%
\begin{verbatim}
%-------------------------------------------------------------------------
input mcf2graph.mf; % input macro
@@ -1481,6 +1537,20 @@ bye
\newpage
\subsection{Information auxfile output}
\paragraph{(Insert option parameter setting)}
+\index{F}%
+\index{C}%
+\index{NO}%
+\index{MW}%
+\index{MI}%
+\index{EN}%
+\index{JN}%
+\index{FM}%
+\index{USE}%
+\index{mw}%
+\index{fm}%
+\index{mi}%
+\index{w}%
+\index{h}%
\begin{verbatim}
sw_aux_out=1 : tag1:var1;tag2:var2
sw_aux_out=2 : tag1;tag2 var1;var2
@@ -1533,6 +1603,7 @@ EN : english name
JN : japanese name
FM : formula from literature data
MW : molecular weight from literature data
+MI : monoisotopic mass from literature data
USE : the use
mw : molecular weight calculated
mi : monoisotopic mass calculated
@@ -1558,46 +1629,46 @@ h : font height
\begin{verbatim}
------------------------------------------------------------------
Molecular name = Nicotine
- Warnings = 0 / Command count= 40
+ Warnings = 0 / Command count= 44
Width * Height = 49.57332 * 41.37605
Shift width * height = 0 * -9.07253
Bond length = 12.75589 Atom size = 5.38914
Atom count= 12 Bond count= 13 Ring count= 2 Hide H count= 14
------------------------------------------------------------------
-< NO. >( x axis , y axis )< atom >< bond >< hide_H >
- A1 ( 0 , 0 ) C 3 1
- A2 ( 0.866 , -0.5 ) N 3
- A3 ( 1.732 , 0 ) C 3 1
- A4 ( 1.732 , 1 ) C 4
- A5 ( 0.866 , 1.5 ) C 3 1
- A6 ( 0 , 1 ) C 3 1
- A7 ( 2.304 , 1.33 ) C 3 1
- A8 ( 3.217 , 0.923 ) N 3
- A9 ( 3.886 , 1.666 ) C 2 2
- A10 ( 3.386 , 2.532 ) C 2 2
- A11 ( 2.408 , 2.325 ) C 2 2
- A12 ( 3.399 , 0.067 ) C 1 3
+< NO. ><atom(s) >( x axis , y axis )<bond><hideH><chg>
+ A1 C ( 0 , 0 ) 3 1
+ A2 N ( 0.866 , -0.5 ) 3
+ A3 C ( 1.732 , 0 ) 3 1
+ A4 C ( 1.732 , 1 ) 4
+ A5 C ( 0.866 , 1.5 ) 3 1
+ A6 C ( 0 , 1 ) 3 1
+ A7 C ( 2.304 , 1.33 ) 3 1
+ A8 N ( 3.217 , 0.923 ) 3
+ A9 C ( 3.886 , 1.666 ) 2 2
+ A10 C ( 3.386 , 2.532 ) 2 2
+ A11 C ( 2.408 , 2.325 ) 2 2
+ A12 C ( 3.399 , 0.067 ) 1 3
------------------------------------------------------------------
-< NO. >< bond (sdt)><angle + ( +- )><length ( pt )>
- B1 1 -> 2 ( 2) 330 ( -30) 1 ( 12.76)
- B2 2 -> 3 ( 1) 30 ( 30) 1 ( 12.76)
- B3 3 -> 4 ( 2) 90 ( 90) 1 ( 12.76)
- B4 4 -> 5 ( 1) 150 ( 150) 1 ( 12.76)
- B5 5 -> 6 ( 2) 210 ( -150) 1 ( 12.76)
- B6 6 -> 1 ( 1) 270 ( -90) 1 ( 12.76)
- B7 4 -> 7 ( 1) 30 ( 30) 0.66 ( 8.42)
- B8 7 -> 8 ( 1) 336 ( -24) 1 ( 12.76)
- B9 8 -> 9 ( 1) 48 ( 48) 1 ( 12.76)
- B10 9 -> 10 ( 1) 120 ( 120) 1 ( 12.76)
- B11 10 -> 11 ( 1) 192 ( -168) 1 ( 12.76)
- B12 11 -> 7 ( 1) 264 ( -96) 1 ( 12.76)
- B13 8 -> 12 ( 1) 282 ( -78) 0.66 ( 8.42)
+< NO. >< bond (sdt)><angle +( +- )><length ( pt )>
+ B1 1 -> 2 ( 2) 330 ( -30) 1 ( 12.76)
+ B2 2 -> 3 ( 1) 30 ( 30) 1 ( 12.76)
+ B3 3 -> 4 ( 2) 90 ( 90) 1 ( 12.76)
+ B4 4 -> 5 ( 1) 150 ( 150) 1 ( 12.76)
+ B5 5 -> 6 ( 2) 210 ( -150) 1 ( 12.76)
+ B6 6 -> 1 ( 1) 270 ( -90) 1 ( 12.76)
+ B7 4 -> 7 ( 1) 30 ( 30) 0.66 ( 8.42)
+ B8 7 -> 8 ( 1) 336 ( -24) 1 ( 12.76)
+ B9 8 -> 9 ( 1) 48 ( 48) 1 ( 12.76)
+ B10 9 -> 10 ( 1) 120 ( 120) 1 ( 12.76)
+ B11 10 -> 11 ( 1) 192 ( -168) 1 ( 12.76)
+ B12 11 -> 7 ( 1) 264 ( -96) 1 ( 12.76)
+ B13 8 -> 12 ( 1) 282 ( -78) 0.66 ( 8.42)
------------------------------------------------------------------
<atom>( atom wt )[ mi wt ] < cnt > < sum wt >[ sum mi wt ]
- C ( 12.0107)[ 12] * 10 = 120.10696[ 120]
- H ( 1.00793)[ 1.00783] * 14 = 14.11108[ 14.10959]
- N ( 14.0067)[ 14.00307] * 2 = 28.0134[ 28.00613]
- Molecular Weight [Mono Isotopic] = 162.2314[ 162.11572]
+ C ( 12.0107)[ 12] * 10 120.10696[ 120]
+ H ( 1.00793)[ 1.00783] * 14 14.11108[ 14.10959]
+ N ( 14.0067)[ 14.00307] * 2 28.0134[ 28.00613]
+ Molecular Weight [Mono Isotopic] = 162.2314[ 162.11572]
------------------------------------------------------------------
Weight Calc: 162.2314 / Input: 162.23 / weight gap= 0.00145
Fomula Calc: C10H14N2 / Input:
diff --git a/graphics/mcf2graph/mcf_mplib_exa.pdf b/graphics/mcf2graph/mcf_mplib_exa.pdf
index c901af300b..11b156b318 100644
--- a/graphics/mcf2graph/mcf_mplib_exa.pdf
+++ b/graphics/mcf2graph/mcf_mplib_exa.pdf
Binary files differ
diff --git a/graphics/mcf2graph/mcf_mplib_exa.tex b/graphics/mcf2graph/mcf_mplib_exa.tex
index 520379ffe1..df8c4bc5eb 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 2021.01.03
+% Example of MCF typest with LuaLaTeX(luamplib) by A.Yamaji 2021.01.31
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%% mcf2graph.mf it must be version 4.55 or later
+%%% mcf2graph.mf it must be version 4.56 or later
\documentclass{article}
%------------------------------------------------------------------------------
\usepackage{luamplib}%
diff --git a/macros/generic/witharrows/witharrows-french.pdf b/macros/generic/witharrows/witharrows-french.pdf
index 418b113d7f..8ea76ae1de 100644
--- a/macros/generic/witharrows/witharrows-french.pdf
+++ b/macros/generic/witharrows/witharrows-french.pdf
Binary files differ
diff --git a/macros/generic/witharrows/witharrows.dtx b/macros/generic/witharrows/witharrows.dtx
index 567911b1bc..f14d21114a 100644
--- a/macros/generic/witharrows/witharrows.dtx
+++ b/macros/generic/witharrows/witharrows.dtx
@@ -15,8 +15,8 @@
%
% \fi
% \iffalse
-\def\myfileversion{2.6a}
-\def\myfiledate{2021/01/12}
+\def\myfileversion{2.6b}
+\def\myfiledate{2021/01/31}
%
%
%<*batchfile>
@@ -101,7 +101,7 @@ version 2005/12/01 or later.
% see p.~\pageref{plain-TeX}). This package can be used with |xelatex|,
% |lualatex|, |pdflatex| but also by the classical workflow
% |latex|-|dvips|-|ps2pdf| (or Adobe Distiller). This package loads the packages
-% \pkg{l3keys2e}, \pkg{xparse}, \pkg{varwidth}, \pkg{tikz} and the Tikz libraries
+% \pkg{l3keys2e}, \pkg{varwidth}, \pkg{tikz} and the Tikz libraries
% \pkg{arrows.meta} and \pkg{bending}. The arrows are drawn with Tikz and that's
% why several compilations may be necessary.
%
@@ -2557,7 +2557,7 @@ version 2005/12/01 or later.
% Assume we want to draw a loop of numbered arrows. In this purpose, it's
% possible to write a dedicated command |\NumberedLoop| which will do the job
% when used in |code-after|. In the following example, we write this command with
-% |\NewDocumentCommand| of \pkg{xparse} and |\foreach| of \pkg{pgffor} (both
+% |\NewDocumentCommand| (of \pkg{xparse}) and |\foreach| of \pkg{pgffor} (both
% packages are loaded when \pkg{witharrows} is loaded).
%
% \begin{Verbatim}
@@ -2686,7 +2686,6 @@ version 2005/12/01 or later.
%
% \bigskip
% \begin{macrocode}
-\RequirePackage { xparse } [ 2019-01-01 ]
\RequirePackage { varwidth }
%</LaTeX>
% \end{macrocode}
@@ -2767,17 +2766,8 @@ version 2005/12/01 or later.
\ProcessKeysOptions { WithArrows / package }
% \end{macrocode}
%
-%
% \medskip
% \begin{macrocode}
-\@@_msg_new:nn { Option~incompatible~with~Beamer }
- {
- The~option~'\l_keys_key_str'\ is~incompatible~
- with~Beamer~because~Beamer~has~its~own~system~to~extract~footnotes.
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
\@@_msg_new:nn { footnote~with~footnotehyper~package }
{
You~can't~use~the~option~'footnote'~because~the~package~
@@ -2805,8 +2795,12 @@ version 2005/12/01 or later.
% \begin{macrocode}
\bool_if:NT \c_@@_footnote_bool
{
+% \end{macrocode}
+% The class \cls{beamer} has its own system to extract footnotes and that's why
+% we have nothing to do if \cls{beamer} is used.
+% \begin{macrocode}
\@ifclassloaded { beamer }
- { \msg_info:nn { witharrows } { Option~incompatible~with~Beamer } }
+ { \bool_set_false:N \c_@@_footnote_bool }
{
\@ifpackageloaded { footnotehyper }
{ \@@_error:n { footnote~with~footnotehyper~package } }
@@ -2818,14 +2812,18 @@ version 2005/12/01 or later.
% \begin{macrocode}
\bool_if:NT \c_@@_footnotehyper_bool
{
+% \end{macrocode}
+% The class \cls{beamer} has its own system to extract footnotes and that's why
+% we have nothing to do if \cls{beamer} is used.
+% \begin{macrocode}
\@ifclassloaded { beamer }
- { \@@_info:n { Option~incompatible~with~Beamer } }
+ { \bool_set_false:N \c_@@_footnote_bool }
{
\@ifpackageloaded { footnote }
{ \@@_error:n { footnotehyper~with~footnote~package } }
{ \usepackage { footnotehyper } }
+ \bool_set_true:N \c_@@_footnote_bool
}
- \bool_set_true:N \c_@@_footnote_bool
}
% \end{macrocode}
% The flag |\c_@@_footnote_bool| is raised and so, we will only have to test
@@ -2892,22 +2890,7 @@ version 2005/12/01 or later.
% \end{macrocode}
%
% \bigskip
-% We define a command |\@@_strcmp:nn| to compare two token lists. It will be
-% available whether the engine is pdfTeX, XeTeX or LuaTeX.
-% \begin{macrocode}
-\sys_if_engine_luatex:TF
- {
- \cs_new_protected:Npn \@@_strcmp:nn #1 #2
- { \lua_now:e { l3kernel.strcmp('#1','#2') } }
- }
- {
- \cs_new_protected:Npn \@@_strcmp:nn #1 #2
- { \tex_strcmp:D { #1 } { #2 } }
- }
-% \end{macrocode}
-%
-% \bigskip
-% We can now define a command |\@@_sort_seq:N| which will sort a sequence.
+% We define a command |\@@_sort_seq:N| which will sort a sequence.
% \begin{macrocode}
\cs_new_protected:Npn \@@_sort_seq:N #1
{
@@ -2915,7 +2898,7 @@ version 2005/12/01 or later.
{
\int_compare:nNnTF
{
- \@@_strcmp:nn
+ \tex_strcmp:D
{ \str_lower_case:n { ##1 } }
{ \str_lower_case:n { ##2 } }
}
@@ -2929,27 +2912,11 @@ version 2005/12/01 or later.
% \bigskip
% The following command creates a sequence of strings (|str|) from a |clist|.
%
-%
-% The following command converts all the elements of a sequence (which are token
-% lists) into strings.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_convert_to_str_seq:N #1
- {
- \seq_clear:N \l_tmpa_seq
- \seq_map_inline:Nn #1
- {
- \seq_put_left:Nx \l_tmpa_seq { \tl_to_str:n { ##1 } }
- }
- \seq_set_eq:NN #1 \l_tmpa_seq
- }
-% \end{macrocode}
-%
-% The following command creates a sequence of strings (|str|) from a |clist|.
% \begin{macrocode}
\cs_new_protected:Npn \@@_set_seq_of_str_from_clist:Nn #1 #2
{
\seq_set_from_clist:Nn #1 { #2 }
- \@@_convert_to_str_seq:N #1
+ \seq_set_map_x:NNn #1 #1 { \tl_to_str:n { ##1 } }
}
% \end{macrocode}
%
@@ -7926,10 +7893,10 @@ version 2005/12/01 or later.
%
% \subsection*{Changes between 2.5.1 and 2.6}
%
-% The key |format| now support the letters |R|, |C| and |L|.
+% The key |format| now supports the letters |R|, |C| and |L|.
%
%
-% \subsection*{Changes between 2.6 and 2.6a}
+% \subsection*{Changes between 2.6 and 2.6a (and 2.6b)}
%
% Replacement of |\hbox_unpack_clear:N| by |\hbox_unpack_drop:N| since
% |\hbox_unpack_clear:N| is now deprecated in \pkg{expl3}.
diff --git a/macros/generic/witharrows/witharrows.pdf b/macros/generic/witharrows/witharrows.pdf
index bd8cdb7be4..7727d27d1c 100644
--- a/macros/generic/witharrows/witharrows.pdf
+++ b/macros/generic/witharrows/witharrows.pdf
Binary files differ
diff --git a/macros/latex/contrib/biblatex-contrib/windycity/CHANGES.md b/macros/latex/contrib/biblatex-contrib/windycity/CHANGES.md
index cf718404ab..960197f84f 100644
--- a/macros/latex/contrib/biblatex-contrib/windycity/CHANGES.md
+++ b/macros/latex/contrib/biblatex-contrib/windycity/CHANGES.md
@@ -8,6 +8,48 @@ indicate updates to Windy City's [repository on
GitHub](https://github.com/brianchase/windycity "GitHub:
brianchase/windycity").
+## 2021-01-30
+
+* added support for the `pubstate` field to indicate when a work is
+ forthcoming (with value *forthcoming*), a preprint (with value
+ preprint*), a working paper (with value *working*), or an electronic
+ article published ahead of the official publication date (with value
+ *prepub*)
+* added support for the `eprint` field, plus related fields and
+ options
+* added `shortlinks` preamble option to "shorten" embedded links from
+ `bibhyperref` in standard citations; instead of encompassing an
+ entire citation, links apply to just one element: the title or, if
+ no title is present, whatever part of the citation occupies the
+ author's position, such as the author's name, *ibid.*, or a
+ shorthand
+* somewhat related to the previous, changed preamble option
+ `firstshort` to `shortfirst`
+* sorting in bibliographies and reference lists now respond to the
+ month, day, hour, and minute or entries (e.g. in a reference list,
+ two articles by the same author published on the same day, minutes
+ apart, will sort the earliest article first)
+* added `noreprint` entry option to exclude the `reprint` bibliography
+ string from citations of certain reprints
+* fixed the `shortauthor` field printing in long, first citations
+ (sorry about that!)
+* fixed several bugs, mostly affecting parenthetical citations, having
+ to do with the placement, punctuation, and tracking of citations
+ with `journaltitle`, `organization`, or `blogtitle` in the author's
+ position
+* related to the previous, added support for the `shortjournal` field
+ and added `shortorganization` and `shortblog` fields
+* fixed several macros in which the preamble option `reflist` could
+ cause errors in standard citations
+* fixed parenthetical citations for `@online` entries that should have
+ nothing in the date's position, not even "n.d." (no date), such as
+ when you cite a blog but not any particular post
+* fixed punctuation after `title` when an `@unpublished` entry has no
+ `type`, `location`, or `pubstate` field
+* [accidentally dropped from previous release:] fixed `autopunct` when
+ `\footcites` follows `\cite` plus an `autopunct` mark (e.g.
+ `\cite{key1}?\footcites{key2}{key3}`)
+
## 2020-11-10
* added support for updaters, which, like other editorial roles, you
@@ -43,8 +85,6 @@ brianchase/windycity").
* added support for printing ISSNs with `issn` entry and bibliography
options
* fixed `nameaddon` and `handle` fields printing in short citations
-* fixed `autopunct` when `\footcites` follows `\cite` plus an
- `autopunct` mark (e.g. `\cite{key1}?\footcites{key2}{key3}`)
## 2020-09-29
diff --git a/macros/latex/contrib/biblatex-contrib/windycity/american-windycity.lbx b/macros/latex/contrib/biblatex-contrib/windycity/american-windycity.lbx
index 640202d8c0..c368285793 100644
--- a/macros/latex/contrib/biblatex-contrib/windycity/american-windycity.lbx
+++ b/macros/latex/contrib/biblatex-contrib/windycity/american-windycity.lbx
@@ -1,4 +1,4 @@
-% Last modified: Tue 10 Nov 2020 05:25:31 PM CST
+% Last modified: Sat 30 Jan 2021 06:17:59 PM CST
% Permission is granted to copy, distribute and/or modify this
% software under the terms of the LaTeX Project Public License (LPPL),
@@ -11,7 +11,7 @@
% implied warranties of merchantability and fitness for a particular
% purpose.
-\ProvidesFile{american-windycity.lbx}[2020/11/10 Windy City
+\ProvidesFile{american-windycity.lbx}[2021/01/30 Windy City
localization module for biblatex]
\InheritBibliographyExtras{american}
\InheritBibliographyStrings{american}
@@ -127,6 +127,8 @@
\NewBibliographyString{origpub}
\NewBibliographyString{part}
\NewBibliographyString{preface}
+\NewBibliographyString{preprint}
+\NewBibliographyString{prepub}
\NewBibliographyString{pseudo}
\NewBibliographyString{reprint,reprinted}
\NewBibliographyString{review,reviewnoauth}
@@ -139,6 +141,7 @@
\NewBibliographyString{upcomp,upcomp+,updater,updater+,uped,uped+,uprev,uprev+,uptrans,uptrans+}
\NewBibliographyString{updated}
\NewBibliographyString{updater}
+\NewBibliographyString{working}
\DeclareBibliographyStrings{%
am = {{a\adddot m\adddot}{a\adddot m\adddot}},
@@ -186,7 +189,9 @@
phdthesis = {{PhD diss\adddot}{PhD diss\adddot}},
pm = {{p\adddot m\adddot}{p\adddot m\adddot}},
preface = {{preface to}{preface to}},
- pseudo = {{pseud\adddot}{pseud\adddot}},
+ preprint = {{preprint\addcomma\space submitted}{preprint\addcomma\space submitted}},
+ prepub = {{published ahead of print}{published ahead of print}},
+ pseudo = {{pseud\adddot}{pseud\adddot}},
references = {{Bibliography}{Bibliography}},
reprint = {{reprint}{repr\adddot}},
reprinted = {{reprinted in}{reprinted in}},
@@ -230,7 +235,8 @@
uptrans+ = {{updated and translated by}{up\adddotspace and trans\adddot}},
urlseen = {{accessed}{accessed}},
volume = {{vol\adddot}{vol\adddot}},
- volumes = {{vols\adddot}{vols\adddot}}
+ volumes = {{vols\adddot}{vols\adddot}},
+ working = {{working paper}{working paper}}
}
\endinput
diff --git a/macros/latex/contrib/biblatex-contrib/windycity/doc/windycity.bib b/macros/latex/contrib/biblatex-contrib/windycity/doc/windycity.bib
index 9a7b80d5fc..c26415de37 100644
--- a/macros/latex/contrib/biblatex-contrib/windycity/doc/windycity.bib
+++ b/macros/latex/contrib/biblatex-contrib/windycity/doc/windycity.bib
@@ -343,7 +343,7 @@
@Article{lovell1960,
author = {Lovell, John},
title = {Appreciating Whitman},
- subtitle = {'Passage to India'},
+ subtitle = {`Passage to India'},
journal = {Modern Language Quarterly},
volume = {21},
number = {2},
@@ -539,7 +539,7 @@
@Online{akmuckraker2008,
author = {{AK Muckraker}},
-% authortype = {pseudo},% alternative
+% authortype = {pseudo},% alternative to below:
nameaddon = {pseud.},
title = {Palin Is Back at Work},
blogtitle = {Mudflats},
@@ -682,6 +682,7 @@
@Book{maclean1976,
author = {Maclean, Norman},
title = {A River Runs through It, and Other Stories},
+ shorttitle = {A River Runs through It},
address = {Chicago},
publisher = ucp,
year = {1976}
@@ -1630,7 +1631,8 @@
title = {Book Title},
address = {Place},
publisher = {Publisher},
- year = {forthcoming}
+% year = {forthcoming}% alternative to below:
+ pubstate = {forthcoming}
}
@Book{writer,
keywords = {notinbib,notinref},
@@ -1638,7 +1640,8 @@
title = {Another Book Title},
address = {Place},
publisher = {Publisher},
- year = {forthcoming}
+% year = {forthcoming}% alternative to below:
+ pubstate = {forthcoming}
}
@InCollection{contributor,
keywords = {notinbib,notinref},
@@ -1652,7 +1655,8 @@
editor = {Editor, Ellen},
address = {Place},
publisher = {Publisher},
- year = {forthcoming}
+% year = {forthcoming}% alternative to below:
+ pubstate = {forthcoming}
}
% 14.159 Books requiring a specific application or device (e-books)
@@ -1789,7 +1793,28 @@
title = {Article Title},
journal = {Journal Name},
volume = {98},
- year = {forthcoming}
+% year = {forthcoming}% alternative to below:
+ pubstate = {forthcoming}
+}
+@Article{jubb2015,
+ author = {Jubb, Robert},
+ title = {The Real Value of Equality},
+ journal = {Journal of Politics},
+ volume = {77},
+ number = {3},
+ pubstate = {prepub},
+ date = {2015-04-14},
+ url = {https://doi.org/10.1086/681262}
+}
+
+% 14.173 Journal article preprints
+
+@Unpublished{huang2015,
+ author = {Huang, Zhiqi},
+ title = {Revisiting the Cosmological Bias Due to Local Gravitational Redshifts},
+ pubstate = {preprint},
+ date = {2015-04-24},
+ url = {http://arxiv.org/abs/1504.06600v1}
}
% 14.174 Journal page references
@@ -1926,13 +1951,12 @@
% 14.184 New series for journal volumes
@Article{sewall1896,
- sortname = {Proceedings},
title = {Letter of Jonathan Sewall},
journal = {Proceedings of the Massachusetts Historical Society},
series = {2nd ser.},
volume = {10},
date = {1896-01},
- pages = {414}
+ pages = {413--15}
}
@Article{moraes1950,
author = {Moraes, G. M.},
@@ -2040,7 +2064,6 @@
date = {1992-09-23}
}
@Article{forester2000,
- sortname = {{Lake Forester}},
title = {Pushcarts Evolve to Trendy Kiosks},
journal = {Lake Forester},
address = {Lake Forest, IL},
@@ -2067,7 +2090,6 @@
url = {http://www.nytimes.com/2015/03/08/style/finding-equilibrium-in-seesawing-libidos.html}
}
@Article{editorial2015,
- sortname = {{New York Times}},
title = {Junk Science at the F.B.I.},
journal = {New York Times},
note = {editorial},
@@ -2089,7 +2111,6 @@
% 15.49 Newspapers and magazines in reference lists
@Article{nytimes2002,
- sortname = {{New York Times}},
title = {In Texas, Ad Heats Up Race for Governor},
journal = {New York Times},
date = {2002-07-30}
@@ -2164,7 +2185,6 @@
% 14.204 Unsigned reviews
@Review{zeitung1828,
- sortname = {Ergänzungsblätter},
journal = {Ergänzungsblätter zur Allgemeinen Literatur-Zeitung},
date = {1828-02},
number = {23–24},
@@ -2290,11 +2310,21 @@
author = {Lucki, Deborah D. and Pollay, Richard W.},
title = {Content Analyses of Advertising},
subtitle = {A Review of the Literature},
- type = {working paper},
+% type = {working},% alternative to below:
+ pubstate = {working},
institution = {History of Advertising Archives, Faculty of Commerce, University of British Columbia},
address = {Vancouver},
year = {1980}
}
+@Unpublished{bronfenbrenner2011,
+ author = {Bronfenbrenner, Kate and Warren, Dorian},
+ title = {The Empirical Case for Streamlining the NLRB Certification Process},
+ subtitle = {The Role of Date of Unfair Labor Practice Occurrence},
+ institution = {ISERP Working Papers Series 2011.01, Columbia University},
+ address = {New York, NY},
+ date = {2011-06},
+ url = {http://hdl.handle.net/10022/AC:P:10603}
+}
% 14.220 Pamphlets, reports, and the like
@@ -2327,7 +2357,7 @@
crossref = {britannica1980}
}
@Reference{britannica1980,
- organization = {{\emph{Encyclopaedia Britannica}}},
+ organization = {\emph{Encyclopaedia Britannica}},
edition = {15},
year = {1980}
}
@@ -2336,14 +2366,14 @@
crossref = {oxford2009}
}
@Reference{oxford2009,
- organization = {{\emph{Oxford English Dictionary}}},
+ organization = {\emph{Oxford English Dictionary}},
edition = {2},
howpublished = {CD-ROM},
version = {4.0},
year = {2009}
}
@Reference{dab1937,
- organization = {{\emph{Dictionary of American Biography}}},
+ organization = {\emph{Dictionary of American Biography}},
title = {Wadsworth, Jeremiah},
year = {1937}
}
@@ -2374,7 +2404,7 @@
crossref = {britannica2016}
}
@Reference{britannica2016,
- organization = {{\emph{Encyclopaedia Britannica Online}}},
+ organization = {\emph{Encyclopaedia Britannica Online}},
edition = {Academic ed\adddot},
}
@Reference{cairns2016,
@@ -2753,6 +2783,16 @@
origpublisher = {T. Egerton},
addendum = {citations refer to the Penguin edition}
}
+@Book{darwin1964,
+ options = {noreprint},
+ author = {Darwin, Charles},
+ title = {On the Origin of Species},
+ edition = {facsimile of the first edition, with an introduction by Ernest Mayr},
+ address = {Cambridge, MA},
+ publisher = {Harvard University Press},
+ origdate = {1859},
+ year = {1964}
+}
@Book{maitland1998,
author = {Maitland, Frederic W.},
title = {Roman Canon Law in the Church of England},
@@ -2790,7 +2830,8 @@
editor = {Oring, James},
address = {Cape Canaveral, FL},
publisher = {Launch Press},
- year = {forthcoming}
+% year = {forthcoming}% alternative to below:
+ pubstate = {forthcoming}
}
% 15.47 Parentheses or comma with issue number
diff --git a/macros/latex/contrib/biblatex-contrib/windycity/doc/windycity.pdf b/macros/latex/contrib/biblatex-contrib/windycity/doc/windycity.pdf
index 82c61cb5a5..02d6ab3aa1 100644
--- a/macros/latex/contrib/biblatex-contrib/windycity/doc/windycity.pdf
+++ b/macros/latex/contrib/biblatex-contrib/windycity/doc/windycity.pdf
Binary files differ
diff --git a/macros/latex/contrib/biblatex-contrib/windycity/doc/windycity.tex b/macros/latex/contrib/biblatex-contrib/windycity/doc/windycity.tex
index e69a97ac38..f6ca4e6426 100644
--- a/macros/latex/contrib/biblatex-contrib/windycity/doc/windycity.tex
+++ b/macros/latex/contrib/biblatex-contrib/windycity/doc/windycity.tex
@@ -1,4 +1,4 @@
-% Last modified: Tue 10 Nov 2020 05:20:31 PM CST
+% Last modified: Sat 30 Jan 2021 06:32:36 PM CST
\documentclass[11pt,letterpaper,oneside]{article}
\usepackage{windycity}
@@ -8,7 +8,7 @@
\author{Brian Chase}
\email{brianmichaelchase@gmail.com}
\website{https://github.com/brianchase/windycity}
-\version{2020-11-10}
+\version{2021-01-30}
\maketitle
\begingroup
\hypersetup{linkcolor=black}
@@ -17,7 +17,7 @@
\section{Introduction}
-\nfootnote{Copyright \textcopyright\ 2014--2020 Brian Chase. Under the
+\nfootnote{Copyright \textcopyright\ 2014--2021 Brian Chase. Under the
terms of the \LaTeX\ Project Public License, version 1.3, permission
is granted to copy, distribute, or modify this software. See
\url{http://www.ctan.org/tex-archive/macros/latex/base/lppl.txt} or
@@ -235,12 +235,12 @@ A shorter form of this passage appears in \textit{CMOS}
feature of the style. For demonstration purposes, though, it's
possible.}
-% The use of 'firstshort' below might be confusing. It's necessary to
+% The use of 'shortfirst' below might be confusing. It's necessary to
% simulate the effect of 'short' within a document that otherwise
% gives default output.
\begin{citeonly}
-\AtNextCitekey{\toggletrue{short}\toggletrue{firstshort}}
+\AtNextCitekey{\toggletrue{short}\toggletrue{shortfirst}}
\item \cite[3]{morrison2004a}
\AtNextCitekey{\toggletrue{short}}
\item \cite[18]{morrison2004a}
@@ -248,11 +248,11 @@ possible.}
\item \cite[18]{morrison2004a}
\AtNextCitekey{\toggletrue{short}}
\item \cite[24--26]{morrison2004a}
-\AtNextCitekey{\toggletrue{short}\toggletrue{firstshort}}
+\AtNextCitekey{\toggletrue{short}\toggletrue{shortfirst}}
\item \cite[401-2]{morrison2004b}
\AtNextCitekey{\toggletrue{short}}
\item \cite[433]{morrison2004b}
-\AtNextCitekey{\toggletrue{short}\toggletrue{firstshort}}
+\AtNextCitekey{\toggletrue{short}\toggletrue{shortfirst}}
\item \cite[37--38]{diaz2008}
\AtNextCitekey{\toggletrue{short}}
\item \cite[403]{morrison2004b}
@@ -282,7 +282,7 @@ explained in section \ref{preamble}, Windy City won't print
break here may affect the output.}
\begin{citeonly}
-\AtNextCitekey{\toggletrue{short}\toggletrue{firstshort}\toggletrue{ibid}}
+\AtNextCitekey{\toggletrue{short}\toggletrue{shortfirst}\toggletrue{ibid}}
\item \cite[3]{morrison2004a}
\AtNextCitekey{\toggletrue{short}\toggletrue{ibid}}
\item \cite[18]{morrison2004a}
@@ -290,11 +290,11 @@ break here may affect the output.}
\item \cite[18]{morrison2004a}
\AtNextCitekey{\toggletrue{short}\toggletrue{ibid}}
\item \cite[24--26]{morrison2004a}
-\AtNextCitekey{\toggletrue{short}\toggletrue{firstshort}\toggletrue{ibid}}
+\AtNextCitekey{\toggletrue{short}\toggletrue{shortfirst}\toggletrue{ibid}}
\item \cite[401-2]{morrison2004b}
\AtNextCitekey{\toggletrue{short}\toggletrue{ibid}}
\item \cite[433]{morrison2004b}
-\AtNextCitekey{\toggletrue{short}\toggletrue{firstshort}\toggletrue{ibid}}
+\AtNextCitekey{\toggletrue{short}\toggletrue{shortfirst}\toggletrue{ibid}}
\item \cite[37--38]{diaz2008}
\AtNextCitekey{\toggletrue{short}\toggletrue{ibid}}
\item \cite[403]{morrison2004b}
@@ -302,14 +302,14 @@ break here may affect the output.}
\item \cite[152]{diaz2008}
\AtNextCitekey{\toggletrue{short}\toggletrue{ibid}}
\item \cite[201-2]{diaz2008}
-\AtNextMultiCite{\toggletrue{short}\toggletrue{firstshort}}
+\AtNextMultiCite{\toggletrue{short}\toggletrue{shortfirst}}
\item \cites[240]{morrison2004b}[32]{morrison2004a}
\AtNextCitekey{\toggletrue{short}\toggletrue{ibid}}
\item \cite[33]{morrison2004a}
\end{citeonly}
Other ways to make citations more concise: For a compromise between
-standard and short forms, try the preamble option \opt{firstshort}.
+standard and short forms, try the preamble option \opt{shortfirst}.
It swaps long first citations for short ones but otherwise follows the
standard (see section \ref{preamble}). Also with standard citations,
the preamble option \opt{idemtracker} shortens the author's name of a
@@ -375,16 +375,6 @@ it does filter out chapters of books, books in books, and volumes of
collections. For discussion of multivolume works, see section
\ref{multivolume}.
-\optitem[false]{firstshort}{\opt{true}, \opt{false}}
-
-\noindent Use this option to shorten a work's first citation. The
-resulting output consists mainly of the author's name and the work's
-title. According to \textit{CMOS}, this approach is optional for
-documents with complete bibliographies. (See \textit{CMOS}
-\ref{14.23}, also 14.29--14.36.) You may use \opt{firstshort} in
-conjunction with \opt{ibid}. However, it adds nothing to \opt{short},
-which has the same effect on first citations.
-
\optitem[false]{ibid}{\opt{true}, \opt{false}}
\noindent This option controls whether consecutive citations of a work
@@ -464,9 +454,59 @@ the title minus the subtitle or the content of the
\bibfield{shorttitle} field, if available.
As noted earlier, \opt{short} has the same effect on first citations
-as \opt{firstshort}. But recall from section \ref{short} that you can
+as \opt{shortfirst}. But recall from section \ref{short} that you can
combine \opt{short} and \opt{ibid} for more concise output.
+\optitem[false]{shortfirst}{\opt{true}, \opt{false}}
+
+\noindent Use this option to shorten a work's first citation. The
+resulting output consists mainly of the author's name and the work's
+title. According to \textit{CMOS}, this approach is optional for
+documents with complete bibliographies. (See \textit{CMOS}
+\ref{14.23}, also 14.29--14.36.) You may use \opt{shortfirst} in
+conjunction with \opt{ibid}. However, it adds nothing to \opt{short},
+which has the same effect on first citations.
+
+\optitem[false]{shortlinks}{\opt{true}, \opt{false}}
+
+\noindent If you use Windy City with
+\href{http://www.ctan.org/pkg/hyperref}{\textcolor{blue}{hyerref}},
+citations contain embedded links to their respective entries in the
+bibliography. In standard citations, these links encompass the entire
+citation (minus some punctuation). With \opt{shortlinks}, they're
+embedded in just one element: the title or, if no title is present,
+whatever part of the citation occupies the author's position, such as
+the author's name, \textit{ibid.}, or a shorthand. For comparison,
+here's what default links are like in blue:
+
+\hypersetup{citecolor=blue}
+\begin{citeonly}
+\item \cite[24--25]{morley1995}
+\item \cite{schwartz1992}
+\item \cite{kaiser1964}
+\item \cite[43]{morley1995}
+\item \cite[138]{schwartz1992}
+\item \cite[189--90]{kaiser1964}
+\end{citeonly}
+
+\noindent And here they are with \opt{shortlinks}:
+
+\begin{citeonly}
+\AtNextCitekey{\toggletrue{shortlinks}}
+\item \cite[24--25]{morley1995}
+\AtNextCitekey{\toggletrue{shortlinks}}
+\item \cite{schwartz1992}
+\AtNextCitekey{\toggletrue{shortlinks}}
+\item \cite{kaiser1964}
+\AtNextCitekey{\toggletrue{shortlinks}}
+\item \cite[43]{morley1995}
+\AtNextCitekey{\toggletrue{shortlinks}}
+\item \cite[138]{schwartz1992}
+\AtNextCitekey{\toggletrue{shortlinks}}
+\item \cite[189--90]{kaiser1964}
+\end{citeonly}
+\hypersetup{citecolor=}
+
\optitem[false]{swapvol}{\opt{true}, \opt{false}}
\noindent In bibliographies and long citations, works in collections
@@ -533,6 +573,26 @@ title's position. Below is an example from \textit{CMOS} \ref{14.105}:
affecting the bibliography, use starred versions of citation commands,
such as \cmd{cite*}, \cmd{footcite*}, and \cmd{parencite*}.
+\optitem[false]{noreprint}{\opt{true}, \opt{false}}
+
+\noindent This option helps if you need to indicate a work's original
+year of publication with the \bibfield{origdate} or
+\bibfield{origyear} field but want to depart from the style's usual
+output by excluding the \textit{reprint} bibliography string. First,
+an example of the default output from \textit{CMOS} \ref{15.40} (in
+the author-year format):
+
+\begin{refonly}
+\nocite{maitland1998}
+\end{refonly}
+
+\noindent Now, from the same section, an example that requires
+\opt{noreprint}:
+
+\begin{refonly}
+\nocite{darwin1964}
+\end{refonly}
+
\optitem[false]{skipdate}{\opt{true}, \opt{false}}
\noindent On rare occasions, you may need an entry in a reference list
@@ -975,13 +1035,22 @@ Schleyer}:
edition, such as \textit{Sunday Book Review} (see \textit{CMOS}
\ref{14.202}).
-\item[issue] Windy City uses this field with the \bibtype{article},
-\bibtype{online}, and \bibtype{review} entry types to record a work's
-season of publication (spring, summer, autumn/fall, winter). The
-\bibtype{date} field also records seasons---but the value \textit{23},
-for the third season, returns \textit{Autumn}. To print \textit{Fall},
-use the \bibfield{issue} field. In other words, for \textit{Fall
-2013}, a work's bibliography database entry should contain:
+\item[eprint] Windy City supports the built-in resources that
+\biblatex provides for electronic publishing information, even though
+the output doesn't conform to \textit{CMOS}. To that end, you may use
+the \bibfield{eprint} field, along with its cousins
+\bibfield{eprinttype} and \bibfield{eprintclass}, and all the
+associated options (\opt{eprint}, \opt{doi}, and \opt{url}), which are
+set to \textit{true} by default.
+
+\item[issue] Windy City uses this field with \bibtype{article},
+\bibtype{online}, and \bibtype{review} entry types (and their aliases)
+to record a work's season of publication (spring, summer, autumn/fall,
+winter). The \bibtype{date} field also records seasons---but the value
+\textit{23}, for the third season, returns \textit{Autumn}. To print
+\textit{Fall}, use the \bibfield{issue} field. In other words, for
+\textit{Fall 2013}, a work's bibliography database entry should
+contain:
\begin{verbatim}
issue = {Fall},
@@ -1001,11 +1070,28 @@ use the \bibfield{issue} field. In other words, for \textit{Fall
date = {2013},
\end{verbatim}
-\noindent Remember that when \bibfield{date} contains just a year of
+\noindent Note that when \bibfield{date} contains just a year of
publication, you may use the classic \bibfield{year} field.
-\item[pages] See comments on the \opt{nopages} bibliography
-option in section \ref{preamble}.
+\item[pages] See comments on the \opt{nopages} bibliography option in
+section \ref{preamble}.
+
+\item[pubstate] This fields indicates when a work is forthcoming (with
+value \textit{forthcoming}), a preprint (with value
+\textit{preprint}), a working paper (with value \textit{working}), or
+an electronic article published ahead of the official publication date
+(with value \textit{prepub}). A preprint or working paper needs an
+\bibtype{unpublished} entry in your bibliography database (see
+\textit{CMOS} \ref{14.173} and \ref{14.218}). A prepublication should
+have an \bibtype{article} or \bibtype{periodical} entry (see
+\textit{CMOS} \ref{14.172}). For forthcoming works, see \textit{CMOS}
+\ref{14.146}, \ref{14.172}, and \ref{15.45}. Forthcoming works also
+print correctly with \textit{forthcoming} in the \bibfield{year}
+field, as previous versions of the style required.
+
+\begin{bibonly}
+\nocite{faraday,huang2015,jubb2015,lucki1980}
+\end{bibonly}
\item[series] See comments on \bibfield{seriesaddon} in section
\ref{datafields}.
@@ -1027,17 +1113,17 @@ dissertation. For the latter, \bibtype{type} should have the value
field is needed for the \bibtype{mathesis} and \bibtype{phdthesis}
entry types.
-In rare cases, \bibfield{type} is necessary for the \bibtype{article}
-and \bibtype{review} entry types when a work's bibliographic
-information doesn't allow Windy City to distinguish a journal article
-from a magazine or newspaper article. This happens when a magazine or
-newspaper article has an issue number. Normally, Windy City would
-respond by printing the issue number before the date and enclosing the
-date in parentheses. But the issue number needs to go first, and the
-date shouldn't be in parentheses. The workaround is to include a
-\bibfield{type} field with the value \textit{newsmag}. For an example,
-see \textit{CMOS} \ref{14.204} and compare it with the citation of
-Beattie in \ref{14.171}.
+In rare cases, \bibfield{type} is necessary for \bibtype{article} and
+\bibtype{review} entry types (and their aliases) when a work's
+bibliographic information doesn't allow Windy City to distinguish a
+journal article from a magazine or newspaper article. This happens
+when a magazine or newspaper article has an issue number. Normally,
+Windy City would respond by printing the issue number before the date
+and enclosing the date in parentheses. But the issue number needs to
+go first, and the date shouldn't be in parentheses. The workaround is
+to include a \bibfield{type} field with the value \textit{newsmag}.
+For an example, see \textit{CMOS} \ref{14.204} and compare it with the
+citation of Beattie in \ref{14.171}.
\end{marglist}
@@ -2020,7 +2106,7 @@ On short citations and the \opt{short} and \opt{ibid} preamble
options, see sections \ref{short} and \ref{preamble}.
\begin{citeonly}
-\AtNextCitekey{\toggletrue{short}\toggletrue{firstshort}}
+\AtNextCitekey{\toggletrue{short}\toggletrue{shortfirst}}
\item \cite[3]{morrison2004a}
\AtNextCitekey{\toggletrue{short}}
\item \cite[18]{morrison2004a}
@@ -2028,11 +2114,11 @@ options, see sections \ref{short} and \ref{preamble}.
\item \cite[18]{morrison2004a}
\AtNextCitekey{\toggletrue{short}}
\item \cite[24--26]{morrison2004a}
-\AtNextCitekey{\toggletrue{short}\toggletrue{firstshort}}
+\AtNextCitekey{\toggletrue{short}\toggletrue{shortfirst}}
\item \cite[401-2]{morrison2004b}
\AtNextCitekey{\toggletrue{short}}
\item \cite[433]{morrison2004b}
-\AtNextCitekey{\toggletrue{short}\toggletrue{firstshort}}
+\AtNextCitekey{\toggletrue{short}\toggletrue{shortfirst}}
\item \cite[37--38]{diaz2008}
\AtNextCitekey{\toggletrue{short}}
\item \cite[403]{morrison2004b}
@@ -2048,7 +2134,7 @@ options, see sections \ref{short} and \ref{preamble}.
\noindent With options \opt{short} and \opt{ibid}:
\begin{citeonly}
-\AtNextCitekey{\toggletrue{short}\toggletrue{firstshort}\toggletrue{ibid}}
+\AtNextCitekey{\toggletrue{short}\toggletrue{shortfirst}\toggletrue{ibid}}
\item \cite[3]{morrison2004a}
\AtNextCitekey{\toggletrue{short}\toggletrue{ibid}}
\item \cite[18]{morrison2004a}
@@ -2056,11 +2142,11 @@ options, see sections \ref{short} and \ref{preamble}.
\item \cite[18]{morrison2004a}
\AtNextCitekey{\toggletrue{short}\toggletrue{ibid}}
\item \cite[24--26]{morrison2004a}
-\AtNextCitekey{\toggletrue{short}\toggletrue{firstshort}\toggletrue{ibid}}
+\AtNextCitekey{\toggletrue{short}\toggletrue{shortfirst}\toggletrue{ibid}}
\item \cite[401-2]{morrison2004b}
\AtNextCitekey{\toggletrue{short}\toggletrue{ibid}}
\item \cite[433]{morrison2004b}
-\AtNextCitekey{\toggletrue{short}\toggletrue{firstshort}\toggletrue{ibid}}
+\AtNextCitekey{\toggletrue{short}\toggletrue{shortfirst}\toggletrue{ibid}}
\item \cite[37--38]{diaz2008}
\AtNextCitekey{\toggletrue{short}\toggletrue{ibid}}
\item \cite[403]{morrison2004b}
@@ -2068,7 +2154,7 @@ options, see sections \ref{short} and \ref{preamble}.
\item \cite[152]{diaz2008}
\AtNextCitekey{\toggletrue{short}\toggletrue{ibid}}
\item \cite[201-2]{diaz2008}
-\AtNextMultiCite{\toggletrue{short}\toggletrue{firstshort}}
+\AtNextMultiCite{\toggletrue{short}\toggletrue{shortfirst}}
\item \cites[240]{morrison2004b}[32]{morrison2004a}
\AtNextCitekey{\toggletrue{short}\toggletrue{ibid}}
\item \cite[33]{morrison2004a}
@@ -2673,9 +2759,11 @@ field for the second example below contains \textit{vol. 6}.
% 14.132 No place of publication
\begin{citeonly}
-\item \cite{windsor1910}
-\item \cite{vliet1890}
+%\begin{itemize}[before=\small,itemindent=0ex]
+\item[] \cite{windsor1910}
+\item[] \cite{vliet1890}
\end{citeonly}
+%\end{itemize}
\setcounter{subsubsection}{136}
\subsubsection{Self-published or privately published books}
@@ -2740,6 +2828,7 @@ field for the second example below contains \textit{vol. 6}.
\subsubsection{Forthcoming publications}
% 14.146 Forthcoming publications
+\label{14.146}
\begin{citebib}
\item \cite{author}
@@ -2832,12 +2921,21 @@ print \textit{Autumn 2013}.
\subsubsection{Forthcoming journal articles}
% 14.172 Forthcoming journal articles
+\label{14.172}
\begin{citebib}
\item \cite{authora}
+\item \cite{jubb2015}
+\end{citebib}
+
+\subsubsection{Journal article preprints}
+% 14.173 Journal article preprints
+\label{14.173}
+
+\begin{citebib}
+\item \cite{huang2015}
\end{citebib}
-\setcounter{subsubsection}{173}
\subsubsection{Journal page references}
% 14.174 Journal page references
@@ -3069,9 +3167,11 @@ correct.
\subsubsection{Working papers and the like}
% 14.218 Working papers and the like
+\label{14.218}
\begin{citebib}
\item \cite{lucki1980}
+\item \cite{bronfenbrenner2011}
\end{citebib}
\setcounter{subsubsection}{219}
@@ -3342,6 +3442,7 @@ after \textit{ISO 4}. Compare it with the nearly identical example in
\begin{citeref}
\item \parencite{austen2003}
+\item \parencite{darwin1964}
\item \parencite{maitland1998}
\end{citeref}
@@ -3376,6 +3477,7 @@ after \textit{ISO 4}. Compare it with the nearly identical example in
\subsubsection{``Forthcoming'' in author-date references}
% 15.45 ``Forthcoming'' in author-date references
+\label{15.45}
\begin{citeref}
\item \parencite{faraday}
diff --git a/macros/latex/contrib/biblatex-contrib/windycity/windycity.bbx b/macros/latex/contrib/biblatex-contrib/windycity/windycity.bbx
index 9bf9170ab8..f52a3160f4 100644
--- a/macros/latex/contrib/biblatex-contrib/windycity/windycity.bbx
+++ b/macros/latex/contrib/biblatex-contrib/windycity/windycity.bbx
@@ -1,4 +1,4 @@
-% Last modified: Tue 10 Nov 2020 05:24:28 PM CST
+% Last modified: Sat 30 Jan 2021 06:17:53 PM CST
% Permission is granted to copy, distribute and/or modify this
% software under the terms of the LaTeX Project Public License (LPPL),
@@ -11,7 +11,7 @@
% implied warranties of merchantability and fitness for a particular
% purpose.
-\ProvidesFile{windycity.bbx}[2020/11/10 Windy City bibliography style
+\ProvidesFile{windycity.bbx}[2021/01/30 Windy City bibliography style
for biblatex]
\@ifpackagelater{biblatex}{2019/08/17}
{}
@@ -37,9 +37,13 @@
\AtBeginBibliography{\blx@key@bibcheck{collsonly}}}
{}}
-\providetoggle{firstshort}
-\DeclareBiblatexOption{global}[boolean]{firstshort}[true]{%
- \settoggle{firstshort}{#1}}%
+\providetoggle{doi}
+\DeclareBiblatexOption{entry,global}[boolean]{doi}[true]{%
+ \settoggle{doi}{#1}}
+
+\providetoggle{eprint}
+\DeclareBiblatexOption{entry,global}[boolean]{eprint}[true]{%
+ \settoggle{eprint}{#1}}
\providetoggle{ibid}
\DeclareBiblatexOption{global}[boolean]{ibid}[true]{%
@@ -68,6 +72,10 @@
\DeclareBiblatexOption{entry}[boolean]{noauth}[true]{%
\settoggle{noauth}{#1}}%
+\providetoggle{noreprint}
+\DeclareBiblatexOption{entry}[boolean]{noreprint}[true]{%
+ \settoggle{noreprint}{#1}}%
+
\DeclareBiblatexOption{global}[boolean]{nolos}[true]{%
\ifstrequal{#1}{true}
{\AtBeginBibliography{\blx@key@bibcheck{nolos}}}
@@ -95,9 +103,17 @@
\DeclareBiblatexOption{global}[boolean]{short}[true]{%
\ifstrequal{#1}{true}
{\toggletrue{short}%
- \toggletrue{firstshort}}%
+ \toggletrue{shortfirst}}%
{\togglefalse{short}}}
+\providetoggle{shortfirst}
+\DeclareBiblatexOption{global}[boolean]{shortfirst}[true]{%
+ \settoggle{shortfirst}{#1}}%
+
+\providetoggle{shortlinks}
+\DeclareBiblatexOption{global}[boolean]{shortlinks}[true]{%
+ \settoggle{shortlinks}{#1}}%
+
\providetoggle{skipdate}
\DeclareBiblatexOption{entry}[boolean]{skipdate}[true]{%
\settoggle{skipdate}{#1}}%
@@ -106,6 +122,10 @@
\DeclareBiblatexOption{entry}[boolean]{swapauth}[true]{%
\settoggle{swapauth}{#1}}%
+\providetoggle{newauth}
+\DeclareBiblatexOption{entry}[boolean]{newauth}[true]{%
+ \settoggle{newauth}{#1}}%
+
\providetoggle{swaptrans}
\DeclareBiblatexOption{entry}[boolean]{swaptrans}[true]{%
\settoggle{swaptrans}{#1}}%
@@ -114,6 +134,10 @@
\DeclareBiblatexOption{entry,global}[boolean]{swapvol}[true]{%
\settoggle{swapvol}{#1}}%
+\providetoggle{url}
+\DeclareBiblatexOption{entry,global}[boolean]{url}[true]{%
+ \settoggle{url}{#1}}
+
% For setting 'minbibnames' and such, see CMOS, 17th ed., 14.76 and
% 15.29.
@@ -126,6 +150,8 @@
date=long,
dateabbrev=false,
dateusetime=true,
+ doi=true,
+ eprint=true,
ibidtracker=constrict,
idemtracker=false,
indexing=true,
@@ -148,6 +174,7 @@
timezones=true,
uniquelist=minyear,
uniquename=minfull,
+ url=true,
urldate=long,
useeditor=true,
useprefix=false,
@@ -208,9 +235,13 @@
\field{sortyear}
\field{year}
\field{labelyear}}
+ \sort{\field{month}}
+ \sort{\field{day}}
+ \sort{\field{hour}}
+ \sort{\field{minute}}
\sort{%
- \field[padside=left,padwidth=4,padchar=0]{volume}
- \literal{0000}}}
+ \field{volume}
+ \literal{0}}}
\DeclareSortingTemplate{nyt}{%
\sort{\field{presort}}
\sort[final]{\field{sortkey}}
@@ -232,6 +263,10 @@
\field{origyear}
\field{labelyear}
\field{year}}
+ \sort{\field{month}}
+ \sort{\field{day}}
+ \sort{\field{hour}}
+ \sort{\field{minute}}
\sort{%
\field{sorttitle}
\field{title}
@@ -240,8 +275,89 @@
\field{blogtitle}
\field{journaltitle}}
\sort{%
- \field[padside=left,padwidth=4,padchar=0]{volume}
- \literal{0000}}}
+ \field{volume}
+ \literal{0}}}
+
+% Mapping for when 'journal', 'journaltitle', 'organization', or
+% 'blogtitle' goes in the author's position.
+
+\DeclareSourcemap{
+ \maps[datatype=bibtex]{
+ \map[overwrite]{
+ \pertype{article}
+ \pertype{review}
+ \step[notfield=author, final]
+ \step[notfield=editor, final]
+ \step[notfield=translator, final]
+ \step[fieldsource=journal]
+ \step[fieldsource=journaltitle]
+ \step[fieldset=author, origfieldval]
+ \step[fieldsource=author,
+ match=\regexp{(.+)},
+ replace=\regexp{\\mkbibemph{{$1}}}]
+ \step[fieldset=options, fieldvalue={,newauth}, append]
+ \step[fieldset=verba, fieldvalue=journaltitle]
+ \step[fieldsource=shortjournal]
+ \step[fieldset=shortauthor, origfieldval]
+ \step[fieldsource=shortauthor,
+ match=\regexp{(.+)},
+ replace=\regexp{\\mkbibemph{{$1}}}]
+ \step[fieldsource=journaltitleaddon, final]
+ \step[fieldset=nameaddon, origfieldval]
+ \step[fieldsource=nameaddon,
+ match=\regexp{(.+)},
+ replace=\regexp{\\mkbibbrackets{$1}}]
+ }
+ }
+}
+\DeclareSourcemap{
+ \maps[datatype=bibtex]{
+ \map[overwrite]{
+ \pertype{online}
+ \step[notfield=author, final]
+ \step[notfield=editor, final]
+ \step[notfield=translator, final]
+ \step[fieldsource=blogtitle]
+ \step[fieldset=author, origfieldval]
+ \step[fieldsource=author,
+ match=\regexp{(.+)},
+ replace=\regexp{\\mkbibemph{{$1}}}]
+ \step[fieldset=options, fieldvalue={,newauth}, append]
+ \step[fieldset=verba, fieldvalue=blogtitle]
+ \step[fieldsource=shortblog]
+ \step[fieldset=shortauthor, origfieldval]
+ \step[fieldsource=shortauthor,
+ match=\regexp{(.+)},
+ replace=\regexp{\\mkbibemph{{$1}}}]
+ \step[fieldsource=blogtitleaddon, final]
+ \step[fieldset=nameaddon, origfieldval]
+ \step[fieldsource=nameaddon,
+ match=\regexp{(.+)},
+ replace=\regexp{\\mkbibparens{$1}}]
+ }
+ }
+}
+\DeclareSourcemap{
+ \maps[datatype=bibtex]{
+ \map[overwrite=false]{
+ \pertype{inreference}
+ \pertype{reference}
+ \step[notfield=author, final]
+ \step[fieldsource=organization]
+ \step[fieldset=author, origfieldval]
+ \step[fieldsource=author,
+ match=\regexp{(.+)},
+ replace=\regexp{{$1}}]
+ \step[fieldset=options, fieldvalue={,newauth}, append]
+ \step[fieldset=verba, fieldvalue=organization]
+ \step[fieldsource=shortorganization]
+ \step[fieldset=shortauthor, origfieldval]
+ \step[fieldsource=shortauthor,
+ match=\regexp{(.+)},
+ replace=\regexp{{$1}}]
+ }
+ }
+}
\defbibcheck{collsonly}{%
\ifentrytype{inbook}
@@ -296,8 +412,6 @@
\DeclareDataInheritance{collection}{collection,inbook}{%
\inherit{year}{bookyear}
\inherit{endyear}{endbookyear}}
-\DeclareDataInheritance{reference}{reference}{%
- \inherit{author}{bookauthor}}
\DeclareDataInheritance{*}{*}{%
\noinherit{crossref}
\noinherit{entryset}
@@ -336,7 +450,6 @@
\providetoggle{authposition}
\providetoggle{bibliography}
\providetoggle{ibid:loccit}
-\providetoggle{journalfirst}
\providetoggle{multicite}
\providetoggle{cbx:collection}
@@ -492,6 +605,7 @@
\usebibmacro{index:field}{#1}{\thefield{indexsorttitle}}{#2}}%
\DeclareFieldFormat{blogtitleaddon}{\mkbibparens{#1}}
+\DeclareFieldFormat{journaltitleaddon}{\mkbibbrackets{#1}}
\DeclareFieldFormat{titleaddon}{\mkbibbrackets{#1}}
\DeclareFieldFormat[article,incollection,online,reference,review]
@@ -553,6 +667,7 @@
\DeclareFieldFormat{part}{\bibstring{part}\space#1}
\DeclareFieldFormat{postnote}{#1}
\DeclareListFormat{publisher}{#1}
+\DeclareFieldFormat{pubstate}{\ifcapital{\MakeCapital{#1}}{#1}}%
\DeclareFieldFormat{season}{\MakeCapital{#1}}% always capitalize
% A shorthand should be italicized if the title that it abbreviates is
@@ -626,10 +741,9 @@
{\usebibmacro{edtrans:authpos}%
\ifnameundef{\cbx@namelist}
{\toggletrue{noauth}%
- \usebibmacro{authpos+deflabel}%
- \usebibmacro{journalfirst}}%
+ \usebibmacro{authpos+deflabel}}%
{\usebibmacro{addplus:authpos}%
- \usebibmacro{namehash+etc}}}%
+ \usebibmacro{namehash+etc}}}
{\usebibmacro{namehash+etc}}}}
\newbibmacro*{authpos+deflabel}{%
@@ -652,6 +766,7 @@
\newbibmacro*{author+namelist}{%
\ifboolexpr{ test {\ifnameundef{shortauthor}}
+ or togl {cbx:first}
or togl {bibliography}}
{\renewcommand*{\cbx@namelist}{author}}%
{\renewcommand*{\cbx@namelist}{shortauthor}}%
@@ -664,8 +779,6 @@
{\renewcommand*{\cbx@namelist}{shortbookauthor}}%
\usebibmacro{author+bookauthor+type}}%
-% See notes for 'handle' and 'nameaddon'.
-
\newbibmacro*{author+bookauthor+type}{%
\iffieldundef{\cbx@namelist type}
{}
@@ -680,43 +793,6 @@
{\renewcommand*{\anonb}{\space\mkbibbrackets{\bibstring{pseudo}}}}
{}}}}}
-% When 'journaltitle' goes in the author's position.
-
-\newbibmacro*{journalfirst}{%
- \ifboolexpr{ ( test {\ifentrytype{article}}
- or test {\ifentrytype{review}} )
- and togl {bibliography}}
- {\toggletrue{journalfirst}%
- \usebibmacro{bibjournaldash}%
- \setunit{\space}%
- \usebibmacro{journallocation}%
- \clearlist{location}%
- \usebibmacro{labeldate+extradate}%
- \newunit}%
- {\usebibmacro{blogtitlefirst}}}
-
-% When 'blogtitle' goes in the author's position.
-
-\newbibmacro*{blogtitlefirst}{%
- \ifboolexpr{ test {\ifentrytype{online}}
- and togl {bibliography}}
- {\toggletrue{journalfirst}%
- \usebibmacro{bibblogdash}%
- \setunit{\space}%
- \usebibmacro{labeldate+extradate}%
- \newunit}%
- {\usebibmacro{orgfirst}}}
-
-% When 'organization' goes in the author's position.
-
-\newbibmacro*{orgfirst}{%
- \ifboolexpr{ test {\ifentrytype{reference}}
- and not test {\iflistundef{organization}}}
- {\printlist{organization}%
- \setunit{\space}%
- \newunit}%
- {}}
-
\newbibmacro*{namehash+etc}{%
\usebibmacro{printnames+etc}%
\ifboolexpr{ togl {authposition}% false in 'crossref' macro
@@ -1186,6 +1262,7 @@
%% Names and Dashes %%
%%%%%%%%%%%%%%%%%%%%%%%%
+% HERE
\newbibmacro*{printnames+etc}{%
\ifboolexpr{ togl {authposition}
and togl {bibliography}}
@@ -1193,6 +1270,7 @@
{\usebibmacro{printnames}}%
\usebibmacro{handle}%
\usebibmacro{nameaddon}%
+ \usebibmacro{newauth+journallocation}%
\usebibmacro{a:labeldate+extradate}%
\usebibmacro{clearnames+empty}}%
@@ -1234,8 +1312,20 @@
or togl {cbx:short}}
{}
{\space
- \printfield[brackets]{nameaddon}%
- \clearfield{nameaddon}}}
+ \iftoggle{newauth}
+ {\printfield[noformat]{nameaddon}%
+ \clearfield{nameaddon}}%
+ {\printfield[brackets]{nameaddon}%
+ \clearfield{nameaddon}}}}
+
+\newbibmacro*{newauth+journallocation}{%
+ \iftoggle{newauth}
+ {\ifboolexpr{ test {\ifentrytype{article}}
+ and togl {bibliography}}
+ {\usebibmacro{journallocation}%
+ \newunit}%
+ {}}
+ {}}
\newbibmacro*{clearnames+empty}{%
\clearname{\cbx@namelist}%
@@ -1245,33 +1335,6 @@
\let\pluga\empty
\let\plugb\empty}%
-% When a dash replaces 'journaltitle' in the author's position.
-
-\newbibmacro*{bibjournaldash}{%
- \ifboolexpr{ test {\iffieldequals{journaltitle}{\bbx@lasthash}}
- and not test \iffirstonpage}
- {\bibnamedash
- \clearfield{journaltitle}%
- \clearlist{location}%
- \newunit}%
- {\savefield{journaltitle}{\bbx@lasthash}%
- \renewcommand*{\xtitle}{journal}%
- \usebibmacro{longtitle+titleaddon}%
- \let\xtitle\empty}}%
-
-% When a dash replaces 'blogtitle' in the author's position.
-
-\newbibmacro*{bibblogdash}{%
- \ifboolexpr{ test {\iffieldequals{blogtitle}{\bbx@lasthash}}
- and not test \iffirstonpage}
- {\bibnamedash
- \clearfield{blogtitle}%
- \newunit}%
- {\savefield{blogtitle}{\bbx@lasthash}%
- \renewcommand*{\xtitle}{blog}%
- \usebibmacro{longtitle+titleaddon}%
- \let\xtitle\empty}}%
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Titles and Subtitles %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -1281,10 +1344,13 @@
\newbibmacro*{longtitle+titleaddon}{%
\iffieldundef{\xtitle title}
{}
- {\usebibmacro{longtitle}%
+ {\iftoggle{shortlinks}
+ {\togglefalse{shortlinks}%
+ \printtext[bibhyperref]{\usebibmacro{longtitle}}}
+ {\usebibmacro{longtitle}}%
\usebibmacro{titleaddon}%
\usebibmacro{test:titledupes}%
- \clearfield{\xtitle title}}}
+ \clearfield{\xtitle title}}}% test
\newbibmacro*{longtitle}{%
\printtext[\xtitle title]{%
@@ -1300,8 +1366,8 @@
{\ifboolexpr{ test {\iffieldundef{subtitle}}
or test {\iffieldsequal{subtitle}{booksubtitle}}}
{\clearfield{booktitle}}%
- {}}
- {}}
+ {}}% test
+ {}}% test
\newbibmacro*{titleaddon}{%
\iffieldundef{\xtitle titleaddon}
@@ -1314,8 +1380,10 @@
{\usebibmacro{longtitle+titleaddon}%
\usebibmacro{b:labeldate+extradate}}%
{\ifboolexpr{ test \ifciteseen
- or togl {firstshort}}
- {\usebibmacro{shorttitle}}%
+ or togl {shortfirst}}
+ {\iftoggle{shortlinks}
+ {\printtext[bibhyperref]{\usebibmacro{shorttitle}}}
+ {\usebibmacro{shorttitle}}}
{\usebibmacro{longtitle+titleaddon}}}}
\newbibmacro*{shorttitle}{%
@@ -1390,7 +1458,8 @@
\printtext[parens]{%
\usebibmacro{origlocation}%
\usebibmacro{origpublisher}%
- \iftoggle{reflist}
+ \ifboolexpr{ togl {bibliography}
+ and togl {reflist}}
{}
{\usebibmacro{origyear+origendyear}}}}}
@@ -1495,10 +1564,10 @@
\newbibmacro*{issue+month+etc}[1]{%
\iffieldundef{year}
- {\iffieldundef{month}
- {}
- {\setunit{\space}%
- \printtext[parens]{\printdate}}}
+ {\setunit{\space}%
+ \iffieldundef{month}
+ {\usebibmacro{pubstate}{parens}}%
+ {\printtext[parens]{\printdate}}}
{\ifboolexpr{ test {\iffieldundef{volume}}
and test {\iffieldundef{number}}}
{\iffieldundef{journal}
@@ -1509,16 +1578,45 @@
{\usebibmacro{reflist+year+day}%
\printdate}}%
{\iffieldundef{month}
- {\setunit{\space}%
- \usebibmacro{reflist+issue+season}}%
+ {\usebibmacro{reflist+issue+season}}%
{\ifstrequal{#1}{noparens}
{\usebibmacro{reflist+year+day}%
\newunit
- \printdate}%
+ \usebibmacro{pubstate}{date}}%
{\usebibmacro{reflist+year+day}%
\setunit{\space}%
\printtext[parens]{\printdate}}}}}}
+\newbibmacro*{pubstate}[1]{%
+ \iftoggle{authposition}
+ {\iffieldequalstr{pubstate}{forthcoming}
+ {\printfield{pubstate}%
+ \clearfield{pubstate}}%
+ {\usebibmacro{labeldate+date}{#1}}}
+ {\iffieldundef{pubstate}
+ {\usebibmacro{labeldate+date}{#1}}%
+ {\iffieldequalstr{pubstate}{preprint}
+ {\bibstring{preprint}}%
+ {\iffieldequalstr{pubstate}{prepub}
+ {\newunit% necessary if no 'date'
+ \bibstring{prepub}%
+ \setunit{\addcomma\space}%
+ \printdate}%
+ {\iffieldequalstr{pubstate}{working}
+ {\bibstring{working}%
+ \setunit{\addcomma\space}}%
+ {\ifstrequal{#1}{parens}
+ {\printtext[parens]{\printfield{pubstate}}}
+ {\printfield{pubstate}}}}}% needs '%'
+ \clearfield{pubstate}}}}
+
+\newbibmacro*{labeldate+date}[1]{%
+ \ifstrequal{#1}{label}
+ {\printlabeldate}%
+ {\ifstrequal{#1}{date}
+ {\printdate}%
+ {}}}
+
\newbibmacro*{reflist+year+day}{%
\ifboolexpr{ togl {bibliography}
and togl {reflist}
@@ -1541,8 +1639,8 @@
{}
{\setunit{\space}%
\iffieldundef{issue}
- {\printtext[parens]{\printfield{season}}}
- {\printtext[parens]{\printfield{issue}}}}}
+ {\printtext[parens]{\printfield{season}}}
+ {\printtext[parens]{\printfield{issue}}}}}
{\setunit{\space}%
\printtext[parens]{\usebibmacro{issue+season+year}}}}
@@ -1573,7 +1671,7 @@
\usebibmacro{endbookyear}}}
{\ifboolexpr{ test {\iffieldundef{year}}
and test {\iffieldundef{bookyear}}}
- {\bibstring{nodate}}%
+ {\usebibmacro{pubstate}{label}}%
{\iffieldundef{bookyear}
{\printfield{year}%
\usebibmacro{endyear}}%
@@ -1617,8 +1715,7 @@
{\usebibmacro{labeldate+extradate}}}
\newbibmacro*{b:labeldate+extradate}{%
- \ifboolexpr{ togl {noauth}
- and not togl {journalfirst}}
+ \iftoggle{noauth}
{\usebibmacro{labeldate+extradate}}%
{}}
@@ -1654,10 +1751,10 @@
\newbibmacro*{labeldate+endyear}{%
\iffieldequalstr{labeldatesource}{bookyear}
{\iffieldundef{year}
- {\printlabeldate}%
- {\printfield{year}%
+ {\usebibmacro{pubstate}{label}}%
+ {\usebibmacro{pubstate}{date}%
\usebibmacro{endyear}}}
- {\printlabeldate}}%
+ {\usebibmacro{pubstate}{label}}}
%%%%%%%%%%%%%%%%%
%% Locations %%
@@ -1709,6 +1806,7 @@
\DeclareBibliographyDriver{article}{%
\usebibmacro{bibindex}%
+ \usebibmacro{newauth}%
\usebibmacro{author+title+etc}%
\usebibmacro{articles}%
\usebibmacro{colon+pages+etc}%
@@ -1735,6 +1833,7 @@
\DeclareBibliographyDriver{online}{%
\usebibmacro{bibindex}%
+ \usebibmacro{newauth}%
\usebibmacro{author+title+etc}%
\newunit
\usebibmacro{websites}%
@@ -1752,6 +1851,7 @@
\DeclareBibliographyDriver{review}{%
\usebibmacro{bibindex}%
+ \usebibmacro{newauth}%
\usebibmacro{reviews}%
\usebibmacro{articles}%
\usebibmacro{colon+pages+etc}%
@@ -1775,6 +1875,13 @@
\usebibmacro{annotation}%
\finentry}%
+\newbibmacro*{newauth}{%
+ \iftoggle{newauth}
+ {\iftoggle{bibliography}
+ {\clearfield{\thefield{verba}}}
+ {\toggletrue{noauth}}}
+ {}}
+
\newbibmacro*{author+title+etc}{%
\usebibmacro{author+bookauthor+etc}%
\usebibmacro{title+labelyear}%
@@ -1787,18 +1894,19 @@
\usebibmacro{issuetitle}%
\renewcommand*{\xtitle}{journal}%
\usebibmacro{longtitle+titleaddon}%
- \usebibmacro{journalseries}%
- \setunit{\space}%
\usebibmacro{journallocation}%
- \printfield[noformat]{volume}%
- \iftoggle{journalfirst}
+ \usebibmacro{journalseries}%
+ \usebibmacro{volume}%
+ \iftoggle{newauth}
{\newunit}%
{\setunit{\addcomma\space}}%
\iffieldequalstr{type}{newsmag}
{\usebibmacro{issue+month+etc}{noparens}%
\usebibmacro{periodical:number}}%
{\usebibmacro{periodical:number}%
- \usebibmacro{issue+month+etc}{}}%
+ \iffieldequalstr{pubstate}{prepub}
+ {\usebibmacro{issue+month+etc}{noparens}}%
+ {\usebibmacro{issue+month+etc}{}}}% needs '%'
\toggletrue{edshift}%
\usebibmacro{edition}{noformat}}%
@@ -1809,7 +1917,8 @@
\ifboolexpr{ test {\iffieldundef{pages}}
or not test {\iffieldundef{eid}}}
{}
- {\iftoggle{reflist}
+ {\ifboolexpr{ togl {bibliography}
+ and togl {reflist}}
{\ifboolexpr{test {\iffieldundef{number}}
and test {\iffieldundef{month}}
and test {\iffieldundef{issue}}
@@ -1917,21 +2026,27 @@
\usebibmacro{note}%
\usebibmacro{review+title}%
\setunit{\addcomma\space}%
- \iftoggle{firstshort}
+ \iftoggle{shortfirst}
{}
{\toggletrue{edshift}%
\usebibmacro{edtrans}}}
\newbibmacro*{inst+loc+date}{%
\usebibmacro{thesis+type}%
- \setunit{\addcomma\space}%
- \iflistundef{institution}
- {\printfield{venue}}%
- {\printlist{institution}}%
- \setunit{\addcomma\space}%
- \printlist{location}%
- \setunit{\addcomma\space}%
- \usebibmacro{reflist+year+day}%
+ \ifboolexpr{ test {\iflistundef{institution}}
+ and test {\iflistundef{venue}}}
+ {}
+ {\iflistundef{institution}
+ {\printfield{venue}}%
+ {\printlist{institution}}%
+ \setunit{\addcomma\space}}%
+ \iflistundef{location}
+ {}
+ {\printlist{location}%
+ \setunit{\addcomma\space}}%
+ \iffieldundef{month}
+ {\usebibmacro{reflist+year+day}}%
+ {}
\printdate}%
%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -1962,24 +2077,35 @@
\setunit{\addcomma\space}%
\clearfield{part}}}
+\newbibmacro*{journallocation}{%
+ \iflistundef{location}
+ {}
+ {\nopunct\setunit{\space}%
+ \printtext[parens]{%
+ \printlist{location}}}%
+ \clearlist{location}}%
+
\newbibmacro*{journalseries}{%
\iffieldundef{series}
{}
- {\iflistundef{location}
- {\setunit{\addcomma\space}%
+ {\iftoggle{newauth}
+ {\newunit
\printfield{series}}%
- {\setunit{\space}%
+ {\setunit{\addcomma\space}%
\printfield{series}}%
\isdot\addcomma
\usebibmacro{seriesaddon}%
\usebibmacro{editortypes}{series}%
\newunit}}%
-\newbibmacro*{journallocation}{%
- \iflistundef{location}
+\newbibmacro*{volume}{%
+ \iffieldundef{volume}
{}
- {\nopunct\printtext[parens]{%
- \printlist{location}}\space}}%
+ {\ifboolexpr{ togl {bibliography}
+ and togl {newauth}}
+ {\printfield[noformat]{volume}}%
+ {\setunit{\space}%
+ \printfield[noformat]{volume}}}}
% On how to format the issue number of periodicals, see CMOS, 17th
% ed., 14.171 and 15.47.
@@ -2019,20 +2145,21 @@
\ifboolexpr{ test {\iffieldundef{howpublished}}
and test {\iffieldundef{url}}
and test {\iffieldundef{doi}}
+ and test {\iffieldundef{eprint}}
and test {\iffieldundef{addendum}}
- or ( togl {firstshort} and not togl {bibliography} )}
+ or ( togl {shortfirst} and not togl {bibliography} )}
{}
{\usebibmacro{eid}%
\newunit
\printfield{howpublished}%
\newunit
- \printurldate
- \newunit
\printfield[noformat]{version}%
\newunit
- \printfield{url}%
+ \usebibmacro{urldate+url}%
+ \newunit
+ \usebibmacro{doi}%
\newunit
- \printfield{doi}%
+ \usebibmacro{eprint+etc}%
\newunit
\printfield{addendum}}}
@@ -2202,7 +2329,8 @@
\renewcommand*{\cbx@deflabel}{labelname}%
\global\toggletrue{cbx:short}%
\entrydata{\thefield{crossref}}{%
- \iftoggle{reflist}
+ \ifboolexpr{ togl {bibliography}
+ and togl {reflist}}
{\usebibmacro{parencite:new}}%
{\usebibmacro{author+bookauthor+etc}%
\usebibmacro{shorttitle+crossref}}%
@@ -2219,13 +2347,13 @@
{}}}
\newbibmacro*{review+title}{%
- \iftoggle{noauth}
+ \iftoggle{newauth}
{\bibcpstring{reviewnoauth}}%
{\bibstring{review}}%
\space
\renewcommand*{\xtitle}{book}%
\usebibmacro{title+labelyear}%
- \iftoggle{firstshort}
+ \iftoggle{shortfirst}
{\clearfield{booktitle}}%
{\setunit{\addcomma\space}%
\ifdefempty{\reviewee}
@@ -2237,14 +2365,17 @@
\newbibmacro*{thesis+type}{%
\ifentrytype{mathesis}
- {\bibstring{mathesis}}%
+ {\bibstring{mathesis}%
+ \setunit{\addcomma\space}}%
{\ifentrytype{phdthesis}
- {\bibstring{phdthesis}}%
+ {\bibstring{phdthesis}%
+ \setunit{\addcomma\space}}%
{\iffieldundef{type}
- {}
+ {\usebibmacro{pubstate}{}}%
{\iffieldbibstring{type}
{\bibstring{\thefield{type}}}
- {\printfield{type}}}}}}
+ {\printfield{type}}%
+ \setunit{\addcomma\space}}}}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Fourth and Higher Tier Macros %%
@@ -2258,6 +2389,29 @@
{\newunit}%
\printfield{eid}}}
+\newbibmacro*{urldate+url}{%
+ \iffieldundef{url}
+ {}
+ {\iftoggle{url}
+ {\printurldate
+ \newunit
+ \printfield{url}}%
+ {}}}
+
+\newbibmacro*{doi}{%
+ \iffieldundef{doi}
+ {}
+ {\iftoggle{doi}
+ {\printfield{doi}}%
+ {}}}
+
+\newbibmacro*{eprint+etc}{%
+ \iffieldundef{eprint}
+ {}
+ {\iftoggle{eprint}
+ {\usebibmacro{eprint}}%
+ {}}}
+
\newbibmacro*{volumes}{%
\iffieldundef{volumes}
{}
@@ -2326,7 +2480,8 @@
\newbibmacro*{orig+etc}{%
\usebibmacro{origlocation}%
\usebibmacro{origpublisher}%
- \iftoggle{reflist}
+ \ifboolexpr{ togl {bibliography}
+ and togl {reflist}}
{}
{\usebibmacro{origyear+origendyear}}%
\usebibmacro{reprint}%
@@ -2340,7 +2495,8 @@
\newbibmacro*{reprint}{%
\ifboolexpr{ test {\iffieldundef{origyear}}
- and test {\iflistundef{origpublisher}}}
+ and test {\iflistundef{origpublisher}}
+ or togl {noreprint}}
{}
{\iftoggle{bibliography}
{\newunit}%
diff --git a/macros/latex/contrib/biblatex-contrib/windycity/windycity.cbx b/macros/latex/contrib/biblatex-contrib/windycity/windycity.cbx
index b98193313a..bb0ca85e87 100644
--- a/macros/latex/contrib/biblatex-contrib/windycity/windycity.cbx
+++ b/macros/latex/contrib/biblatex-contrib/windycity/windycity.cbx
@@ -1,4 +1,4 @@
-% Last modified: Tue 10 Nov 2020 05:24:14 PM CST
+% Last modified: Sat 30 Jan 2021 06:17:55 PM CST
% Permission is granted to copy, distribute and/or modify this
% software under the terms of the LaTeX Project Public License (LPPL),
@@ -11,7 +11,7 @@
% implied warranties of merchantability and fitness for a particular
% purpose.
-\ProvidesFile{windycity.cbx}[2020/11/10 Windy City citation style for
+\ProvidesFile{windycity.cbx}[2021/01/30 Windy City citation style for
biblatex]
\@ifpackagelater{biblatex}{2019/08/17}
{}
@@ -39,10 +39,10 @@
\InitializeCitationStyle{\let\crossreflist\empty}%
\renewcommand{\bibfootnotewrapper}[1]{%
-% \clearfield{postpunct}%
+ \clearfield{postpunct}%
\bibsentence#1}%
\renewcommand{\bibendnotewrapper}[1]{%
-% \clearfield{postpunct}%
+ \clearfield{postpunct}%
\bibsentence#1}%
% Protect commas against abbreviation dots and terminal punctuation.
@@ -182,19 +182,21 @@
\iffieldundef{postnote}
{\printtext[bibhyperref]{%
\usebibmacro{parencite:date}%
- \usebibmacro{cite:volume}}}
+ \usebibmacro{cite:volume}}}% needs '%'
{}}
{\usebibmacro{test:collection}%
\usebibmacro{parencite:crossref}%
\usebibmacro{parencite:multicite}}}
\newbibmacro*{parencite:date}{%
- \iffieldundef{labelyear}
- {}
+ \ifboolexpr{ test {\ifentrytype{online}}
+ and test {\iffieldundef{year}}}
+ {\newunit
+ \usebibmacro{pubstate}{}}%
{\usebibmacro{parencite:origyear}%
\iffieldnums{labelyear}
{}% needs '%'
- {\addcomma}%
+ {\newunit}%
\usebibmacro{labeldate+endyear}%
\printfield{extradate}}}
@@ -221,10 +223,10 @@
{}% needs '%'
\printtext[bibhyperref]{%
\usebibmacro{parencite:date}%
- \usebibmacro{cite:volume}}}
+ \usebibmacro{cite:volume}}}% needs '%'
{\printtext[bibhyperref]{%
\usebibmacro{parencite:new}%
- \usebibmacro{cite:volume}}}}
+ \usebibmacro{cite:volume}}}}% needs '%'
\newbibmacro*{parencite:new}{%
\iffieldundef{shorthand}
@@ -238,9 +240,7 @@
{}
{\ifboolexpr{ test {\ifnameundef{labelname}}
or test {\iffieldundef{labelyear}}}
- {\iffieldundef{label}
- {\usebibmacro{parencite:journal}}%
- {\printfield{label}}}
+ {\printfield[citetitle]{labeltitle}}%
{\global\toggletrue{cbx:short}%
\renewcommand*{\cbx@deflabel}{labelname}%
\clearfield{handle}%
@@ -252,14 +252,6 @@
{\usebibmacro{author+bookauthor+etc}}%
{\usebibmacro{supplement}}}}}
-\newbibmacro*{parencite:journal}{%
- {\ifentrytype{article}
- {\iffieldundef{shortjournal}
- {\renewcommand*{\xtitle}{journal}%
- \usebibmacro{longtitle}}%
- {\printfield[journal]{shortjournal}}}
- {\printfield[citetitle]{labeltitle}}}}
-
%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Citations in Notes %%
%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -268,8 +260,12 @@
\ifciteseen
{\usebibmacro{test:collection}%
\renewcommand*{\cbx@deflabel}{labelname}%
- \printtext[bibhyperref]{\usebibmacro{cite:seen}}}
- {\printtext[bibhyperref]{\usebibmacro{cite:new}}}% needs '%'
+ \iftoggle{shortlinks}
+ {\usebibmacro{cite:seen}}%
+ {\printtext[bibhyperref]{\usebibmacro{cite:seen}}}}
+ {\iftoggle{shortlinks}
+ {\usebibmacro{cite:new}}%
+ {\printtext[bibhyperref]{\usebibmacro{cite:new}}}}% needs '%'
\usebibmacro{savefields}}%
\newbibmacro*{cite:seen}{%
@@ -279,23 +275,32 @@
and not test \iffirstonpage}
{\usebibmacro{cite:ibid}}%
{\usebibmacro{cite:short}}}
- {\printfield{shorthand}%
- \usebibmacro{cite:volume}}}
+ {\iftoggle{shortlinks}
+ {\printtext[bibhyperref]{%
+ \printfield{shorthand}%
+ \usebibmacro{cite:volume}}}
+ {\printfield{shorthand}%
+ \usebibmacro{cite:volume}}}}
\newbibmacro*{cite:ibid}{%
\iftoggle{ibid}
- {\bibcpstring{ibidem}%
- \ifloccit
- {\global\toggletrue{ibid:loccit}}%
- {\usebibmacro{cite:volume}}}
+ {\iftoggle{shortlinks}
+ {\printtext[bibhyperref]{%
+ \usebibmacro{cite:ibid+loccit}}}
+ {\usebibmacro{cite:ibid+loccit}}}
{\global\toggletrue{cbx:short}%
\ifentrytype{review}
{\usebibmacro{ibid:review}}%
- {\usebibmacro{author+bookauthor+etc}%
- \iftoggle{noauth}
- {\usebibmacro{title+labelyear}}%
- {}% needs '%'
- \usebibmacro{cite:volume}}}}
+ {\iftoggle{shortlinks}
+ {\printtext[bibhyperref]{%
+ \usebibmacro{cite:author+title+etc}}}
+ {\usebibmacro{cite:author+title+etc}}}}}
+
+\newbibmacro*{cite:ibid+loccit}{%
+ \bibcpstring{ibidem}%
+ \ifloccit
+ {\global\toggletrue{ibid:loccit}}%
+ {\usebibmacro{cite:volume}}}
\newbibmacro*{ibid:review}{%
\ifnameundef{author}
@@ -305,6 +310,13 @@
{\usebibmacro{author+bookauthor+etc}}%
\usebibmacro{cite:volume}}%
+\newbibmacro*{cite:author+title+etc}{%
+ \usebibmacro{author+bookauthor+etc}%
+ \iftoggle{noauth}
+ {\usebibmacro{title+labelyear}}%
+ {}% needs '%'
+ \usebibmacro{cite:volume}}%
+
\newbibmacro*{cite:short}{%
\global\toggletrue{cbx:short}%
\usebibmacro{short:multicite}%
@@ -359,7 +371,7 @@
\newbibmacro*{cite:new}{%
\global\toggletrue{cbx:first}%
\usebibmacro{idem+short+multicite}%
- \iftoggle{firstshort}
+ \iftoggle{shortfirst}
{\usebibmacro{cite:short}}%
{\printtext{%
\usedriver
@@ -373,7 +385,7 @@
\newbibmacro*{idem+short+multicite}{%
\ifboolexpr{ test {\ifciteidem}
or togl {cbx:idem}
- or togl {firstshort}}
+ or togl {shortfirst}}
{\renewcommand*{\cbx@deflabel}{labelname}}%
{\ifboolexpr{ test {\iffieldequals{namehash}{\bbx@lasthash}}
and togl {multicite}}
@@ -417,13 +429,15 @@
{\setunit{\addcolon\space}}}}}
\newbibmacro*{reference:authpos}{%
- \iflistundef{organization}
- {\ifnameundef{bookauthor}
- {\renewcommand*{\cbx@namelist}{author}}%
- {\renewcommand*{\cbx@namelist}{bookauthor}}%
- \usebibmacro{printnames+etc}}%
- {\printlist{organization}%
- \clearlist{organization}}}
+ \iftoggle{newauth}
+ {\usebibmacro{author+bookauthor+etc}%
+ \togglefalse{newauth}%
+ \clearlist{organization}%
+ \clearname{author}}%
+ {\iflistundef{organization}
+ {\usebibmacro{author+bookauthor+etc}}%
+ {\printlist{organization}%
+ \clearlist{organization}}}}
\newbibmacro*{reference:howpublished+etc}{%
\ifboolexpr{ test {\iffieldundef{howpublished}}
@@ -483,14 +497,18 @@
{\ifboolexpr{ test {\ifentrytype{article}}
or test {\ifentrytype{review}}}
{\iffieldundef{postnote}
- {\printtext[bibhyperref]{\printfield{pages}}}
+ {\iftoggle{shortlinks}
+ {\printfield{pages}}%
+ {\printtext[bibhyperref]{\printfield{pages}}}}
{}}
{}}}
\renewbibmacro*{postnote}{%
\iffieldundef{postnote}
{}
- {\printtext[bibhyperref]{\printfield{postnote}}}}
+ {\iftoggle{shortlinks}
+ {\printfield{postnote}}%
+ {\printtext[bibhyperref]{\printfield{postnote}}}}}
\newbibmacro*{shorthand+intro}{%
\iffieldundef{shorthand}
@@ -515,6 +533,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\DeclareBibliographyDriver{cite:article}{%
+ \usebibmacro{newauth}%
\usebibmacro{author+title+etc}%
\usebibmacro{articles}%
\usebibmacro{colon+comma+etc}}%
@@ -549,6 +568,7 @@
\newunit}%
\DeclareBibliographyDriver{cite:online}{%
+ \usebibmacro{newauth}%
\usebibmacro{author+title+etc}%
\setunit*{\newunitpunct}% needs '*'
\usebibmacro{websites}%
@@ -573,6 +593,7 @@
\usebibmacro{reference:authpos}}%
\DeclareBibliographyDriver{cite:review}{%
+ \usebibmacro{newauth}%
\usebibmacro{reviews}%
\usebibmacro{articles}%
\usebibmacro{colon+comma+etc}}%
diff --git a/macros/latex/contrib/biblatex-contrib/windycity/windycity.dbx b/macros/latex/contrib/biblatex-contrib/windycity/windycity.dbx
index ea87948409..51a83057e7 100644
--- a/macros/latex/contrib/biblatex-contrib/windycity/windycity.dbx
+++ b/macros/latex/contrib/biblatex-contrib/windycity/windycity.dbx
@@ -1,4 +1,4 @@
-\ProvidesFile{windycity.dbx}[2020/11/10 Windy City data model file for
+\ProvidesFile{windycity.dbx}[2021/01/30 Windy City data model file for
biblatex]
\DeclareDatamodelFields[type=field,datatype=literal]{%
blogsubtitle,
@@ -13,8 +13,10 @@
endbookyear,
handle,
seriesaddon,
+ shortblog,
shortbooktitle,
shortmaintitle,
+ shortorganization,
translatoratype,
translatortype}
\DeclareDatamodelFields[type=list,datatype=name]{%
diff --git a/macros/latex/contrib/easybook/doc/easybook-demo.pdf b/macros/latex/contrib/easybook/doc/easybook-demo.pdf
index 18c3384f52..bbed292f08 100644
--- a/macros/latex/contrib/easybook/doc/easybook-demo.pdf
+++ b/macros/latex/contrib/easybook/doc/easybook-demo.pdf
Binary files differ
diff --git a/macros/latex/contrib/easybook/doc/easybook-demo.tex b/macros/latex/contrib/easybook/doc/easybook-demo.tex
index e96e315e25..38f111ac34 100644
--- a/macros/latex/contrib/easybook/doc/easybook-demo.tex
+++ b/macros/latex/contrib/easybook/doc/easybook-demo.tex
@@ -95,7 +95,7 @@
\edge~\url{https://latexstudio.net} \\
\url{https://ctan.org/pkg/easybook}
}
- \date{2021/01/19\hskip\ccwd\relax v1.21h}
+ \date{2021/01/31\hskip\ccwd\relax v1.21k}
}
\begin{document}
diff --git a/macros/latex/contrib/easybook/doc/easybook.pdf b/macros/latex/contrib/easybook/doc/easybook.pdf
index f3f39b11b1..0e88a82d68 100644
--- a/macros/latex/contrib/easybook/doc/easybook.pdf
+++ b/macros/latex/contrib/easybook/doc/easybook.pdf
Binary files differ
diff --git a/macros/latex/contrib/easybook/doc/easybook.tex b/macros/latex/contrib/easybook/doc/easybook.tex
index 3f465f79df..013a7555e7 100644
--- a/macros/latex/contrib/easybook/doc/easybook.tex
+++ b/macros/latex/contrib/easybook/doc/easybook.tex
@@ -8,7 +8,7 @@
\title{\sffamily easybook书籍文档类}
\author{瞿毅}
-\date{2021/01/19\hskip\ccwd\relax v1.21h\thanks{\url{https://gitee.com/texl3/easybook}}}
+\date{2021/01/31\hskip\ccwd\relax v1.21k\thanks{\url{https://gitee.com/texl3/easybook}}}
\begin{document}
\maketitle
@@ -22,7 +22,7 @@
\section{编译方式}
模板含有一个使用示例文件,编译前建议满足以下的条件
\begin{itemize}
- \item 使用 \hologo{XeLaTeX}(推荐)或 \hologo{LuaLaTeX} 两种编译方式,
+ \item 使用 \hologo{XeLaTeX}(推荐)或 \hologo{LuaLaTeX} 两种编译方式。
\item 参考文献支持用 \hologo{BibTeX}(默认)或 \hologo{biber} 后端处理。
\item 由于用到了一些较新的宏包,建议安装最新的\TeX 发行版并将宏包升级为最新。
\end{itemize}
@@ -544,4 +544,4 @@
\IndexLayout
\PrintChanges
\PrintIndex
-\end{document} \ No newline at end of file
+\end{document} \ No newline at end of file
diff --git a/macros/latex/contrib/easybook/easybook.cls b/macros/latex/contrib/easybook/easybook.cls
index 934e5dc1df..85a5dda53a 100644
--- a/macros/latex/contrib/easybook/easybook.cls
+++ b/macros/latex/contrib/easybook/easybook.cls
@@ -9,7 +9,7 @@
%% https://creativecommons.org/licenses/by/4.0/legalcode
\NeedsTeXFormat{LaTeX2e}
\RequirePackage{l3keys2e}
-\ProvidesExplClass{easybook}{2021/01/19}{1.21h}{}
+\ProvidesExplClass{easybook}{2021/01/31}{1.21k}{}
\cs_generate_variant:Nn \keys_define:nn {nx}
\cs_generate_variant:Nn \int_to_arabic:n {v}
@@ -142,15 +142,15 @@
\RequirePackage[noto,upint]{newtxmath}
\RequirePackage{chemformula}
\RequirePackage{chemfig}
-\RequirePackage{siunitx,physics,bm}
+\RequirePackage{siunitx,bm}
\RequirePackage[normalem]{ulem}
\RequirePackage[protrusion = false]{microtype}
\RequirePackage{rotfloat}
-\RequirePackage{geometry,marginnote,changepage}
+\RequirePackage{geometry,marginnote}
\RequirePackage{nccfoots,tablefootnote}
-\RequirePackage{fancyhdr,fancybox,titletoc}
+\RequirePackage{fancyhdr,titletoc}
\RequirePackage{caption,bicaption,subcaption}
-\RequirePackage{graphicx,wrapfig}
+\RequirePackage{graphicx}
\RequirePackage{zhlipsum,fontawesome,pifont}
\RequirePackage{tabularx,multirow,makecell,booktabs}
\RequirePackage{paralist,tasks}
diff --git a/macros/latex/contrib/fontsize/README b/macros/latex/contrib/fontsize/README
index 44a32291f1..4627a65140 100644
--- a/macros/latex/contrib/fontsize/README
+++ b/macros/latex/contrib/fontsize/README
@@ -1,7 +1,7 @@
-----------------------------------------------------------------------
The 'fontsize' package for LaTeX
Author: Ivan Valbusa
- ivan dot valbusa at univr dot it
+ ivan dot valbusa at gmail dot com
This work has the LPPL maintenance status "author-maintained".
This work may be distributed and/or modified under the
diff --git a/macros/latex/contrib/fontsize/fontsize.dtx b/macros/latex/contrib/fontsize/fontsize.dtx
index 6bebf8241b..3d3d31f92f 100644
--- a/macros/latex/contrib/fontsize/fontsize.dtx
+++ b/macros/latex/contrib/fontsize/fontsize.dtx
@@ -56,7 +56,7 @@ This work has the LPPL maintenance status "author-maintained".
%<package>\NeedsTeXFormat{LaTeX2e}[2005/12/01]
%<package>\ProvidesPackage{fontsize}
%<*package>
- [2021/01/25 v0.4 'fontsize' package. Set main font sizes (Ivan Valbusa)]
+ [2021/01/31 v0.5 'fontsize' package. Set main font sizes (Ivan Valbusa)]
%</package>
%<*driver>
\documentclass[12pt]{ltxdoc}
@@ -64,6 +64,7 @@ This work has the LPPL maintenance status "author-maintained".
\usepackage[utf8]{inputenc}
\usepackage[fontsize=12pt]{fontsize}
\usepackage{array,booktabs,siunitx}
+\usepackage{multicol}
%--------------------------------------------------------
% GRAPHICS
%--------------------------------------------------------
@@ -95,6 +96,7 @@ This work has the LPPL maintenance status "author-maintained".
\usepackage[cochineal,bigdelims,cmintegrals,vvarbb]{newtxmath}
\usepackage[cal=boondoxo]{mathalfa}
\usepackage{manfnt}
+\usepackage{lettrine}
%--------------------------------------------------------
% LAYOUT
%--------------------------------------------------------
@@ -130,6 +132,14 @@ This work has the LPPL maintenance status "author-maintained".
\DeclareRobustCommand*{\arm}[1]{\ar{\meta{\argstyle#1}}}
\DeclareRobustCommand*{\oarm}[1]{\oar{\meta{\argstyle#1}}}
\newcommand*{\OR}{${}\mid{}$}
+\makeatletter
+\newlength\CLett
+\newcommand*\alert{
+ \par\noindent
+ \setbox\z@\hbox{\textdbend}\CLett=\wd\z@%
+ \raisebox{-1.05\baselineskip}[0pt][0pt]{%
+ \llap{\box\z@\kern6pt}}}
+\makeatother
%
% New environments
%
@@ -138,11 +148,9 @@ This work has the LPPL maintenance status "author-maintained".
\newenvironment{latexcode}{\begin{mdframed}}{\end{mdframed}}
\makeatletter
% Customizing option and value list:
-\patchcmd{\optionlist}{\marglistwidth}{0pt}{}{}
-\patchcmd{\optionlist}{\hss}{\phantom{\rule{1pt}{20pt}}\hss}{}{}
-\patchcmd{\ltd@option@i}{\linewidth}{\linewidth-\marglistwidth}{}{}
\patchcmd{\ltxsyntax}{\marglistwidth}{0pt}{}{}
\patchcmd{\ltd@option@i}{=}{\ = }{}{}
+\patchcmd{\ltd@option@ii}{=}{\ = }{}{}
% New color for items
\renewcommand*{\optionlistfont}{%
\color{philA}\sffamily\displayverbfont}
@@ -191,7 +199,7 @@ This work has the LPPL maintenance status "author-maintained".
%</driver>
% \fi
%
-% \CheckSum{1731}
+% \CheckSum{2372}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -210,6 +218,7 @@ This work has the LPPL maintenance status "author-maintained".
% Right brace \} Tilde \~}
%
%
+% \changes{v0.5}{2021/01/31}{New font sizing commands \cmd{\meta{cmdname}r}, \cmd{\meta{cmdname}rr}, \cmd{\meta{cmdname}rrr}. New command \cmd{printsamples}. Updated documentation.}
% \changes{v0.4}{2021/01/25}{Maintenance release. Updated documentation.}
% \changes{v0.3}{2020/12/19}{Added definitions of some lengths omitted from KOMA-script files: \cmd{smallskiamount}, \cmd{medskiamount}, \cmd{bigskiamount}. Redefined \cmd{parindent} and \cmd{headheight}.}
% \changes{v0.2}{2020/05/24}{Updated documentation and code comments.}
@@ -325,7 +334,7 @@ This work has the LPPL maintenance status "author-maintained".
%^^A---------------------------------------------------------------------
% \section{Usage}
%^^A---------------------------------------------------------------------
-% \enlargethispage{\baselineskip}
+% \enlargethispage{\baselineskip}
%
% The package can be loaded, as usual, with:
% \begin{ttquote}
@@ -339,7 +348,7 @@ This work has the LPPL maintenance status "author-maintained".
% \subsection{Options}
%^^A---------------------------------------------------------------------
%
-% \begin{optionlist}
+% \begin{optionlist*}
%
% \optitem[10pt]{fontsize}{\meta{fontsize}}
%
@@ -353,11 +362,11 @@ This work has the LPPL maintenance status "author-maintained".
% command (see below).
%
% \optitem[custom]{cloname}{\meta{name}}
-%
+%
% Sets to \meta{name} the name prefix of the \file{.clo} file generated
-% by the \cmd{generateclofile} command (see below).
+% by \cmd{generateclofile} (see below).
%
-% \end{optionlist}
+% \end{optionlist*}
%
%^^A---------------------------------------------------------------------
% \subsection{Commands}
@@ -373,7 +382,12 @@ This work has the LPPL maintenance status "author-maintained".
% If the first optional argument is omitted the command has the same effect
% of the \opt{fontsize} option. You can use any unit recognized by \TeX\ and
% you can omit the unit as well (in which case it defaults to \texttt{pt}).
-% For example: \verb|\changefontsize[13.5pt]{11.5pt}|.
+% For example:
+%\begin{latexcode}
+%\begin{verbatim}
+%\changefontsize[13.5pt]{11.5pt}
+%\end{verbatim}
+%\end{latexcode}
%
% \cmditem{generateclofile}{name}[baselineskip]{fontsize} \hfill iff \meta{baselineskip} $\geq$\meta{fontsize}
%
@@ -385,39 +399,54 @@ This work has the LPPL maintenance status "author-maintained".
% by \TeX\ and you can omit the unit as well (in which case it defaults
% to \texttt{pt}).
% If \opt{cloname=\meta{name}} \textit{and} \opt{fontsize=\meta{fontsize}}
-% the generated file will be automatically used to setup the main font sizes.
+% the generated file will be automatically used to setup the main sizes.
%
-% \begin{tabular}{@{}m{0.05\textwidth}@{}m{0.95\textwidth}@{}}
-% \raisebox{1.475\height}{\dbend} &
-% \emph{In fact the \file{.clo} file is only needed if you intend to modify it.
+% \alert \emph{In fact the \file{.clo} file is only needed if you intend to modify it.
% In this case remember to comment the command, otherwise the edited
% file will be overwrittern}
-% \end{tabular}
%
-% \begin{ttquote}\small
-% \cmd{usepackage}|[fontsize=11.5pt]{fontsize}| |% loads custom11.5pt.clo|\\
-% \cmd{generateclofile}|{custom}[13.5pt]{11.5pt}| |% generates custom11.5pt.clo|
-%
-% \cmd{usepackage}|[fontsize=11.5pt,cloname=fs]{fontsize}| |% loads fs11.5pt.clo| \\
-% \cmd{generateclofile}|{fs}[13.5pt]{11.5pt}| |% generates fs11.5pt.clo|
-% \end{ttquote}
+%\begin{latexcode}
+%\begin{verbatim}
+%\usepackage[cloname=fs,fontsize=11.5pt]{fontsize} % loads fs11.5pt.clo
+% \generateclofile{fs}[13.5pt]{11.5pt} % creates fs11.5pt.clo
+%\end{verbatim}
+%\end{latexcode}
%
-% \cmditem{printfontsize}[baselineskip]{fontsize} \hfill iff \meta{baselineskip} $\geq$\meta{fontsize}
+% \cmditem{printsamples}{baselineskip}{fontsize}[sizes] \hfill iff \meta{baselineskip} $\geq$\meta{fontsize}
%
% A command thought to test the \sty{fontsize} settings.
-% It prints a text sample for every sizing commands, showing the
-% value of the normal size and line spacing.
-% The section \ref{sec:example} below is generated by this command.
+% It prints a text sample for every size given in the third optional argument.
+% If this argument is omitted it prints a sample for each available size.
+%
+%\begin{latexcode}
+%\begin{verbatim}
+%\printsamples{13pt}{11pt}[normalsizer,normalsizerr,normalsizerrr]
+%\printsamples{13.5pt}{12pt}
+%\end{verbatim}
+%\end{latexcode}
%
% \end{ltxsyntax}
+%^^A---------------------------------------------------------------------
+% \section{New sizing commands}\label{sec:sizingcmd}
+%^^A--------------------------------------------------------------------
+% The packages provides three variants for each size bigger then \cmd{normalsize}:
%
+%\newcolumntype{L}{>{\color{sufred}}l}
+%\begin{tabular}{@{}LLLLLL}
+% \cmd{normalsizer} & \cmd{larger} & \cmd{Larger} & \cmd{LARGEr}& \cmd{huger}& \cmd{Huger}\\
+% \cmd{normalsizerr} & \cmd{largerr} & \cmd{Largerr} & \cmd{LARGErr}& \cmd{hugerr}& \cmd{Hugerr}\\
+% \cmd{normalsizerrr} & \cmd{largerrr} & \cmd{Largerr} & \cmd{LARGErrr}& \cmd{hugerrr}& \cmd{Hugerrr}\\
+%\end{tabular}
%^^A---------------------------------------------------------------------
-% \section{An example of font settings}\label{sec:example}
+% \section{Some text samples}\label{sec:example}
+%
%^^A--------------------------------------------------------------------
%
-% This section shows the values of the standard font sizing commands corresponding to \cmd{changefontsize}\texttt{[13]\{11\}}, which sets the normal size and line spacing, respectively, to 11\,pt and 13\,pt. The other sizes are scaled proportionally.
-%
-% \printfontsize[13]{11}
+% Below you can see some text samples scaled proportionally
+% to match the different values of the selected normal size and line spacing.
+%
+% \printsamples{13pt}{11pt}[normalsizer,normalsizerr,normalsizerrr]
+% \printsamples{13.5pt}{12pt}[large,larger]
%
% \nocite{xkeyval,etoolbox}
%
@@ -431,8 +460,9 @@ This work has the LPPL maintenance status "author-maintained".
%^^A---------------------------------------------------------------------
% \section{The Code}
%^^A---------------------------------------------------------------------
-%\textcolor{DarkBlue}{The parts added to the basic structure of \file{scrextend} and \file{scrfontsizes} are highlighted in blue.}
-% All the options of the package are defined via \sty{xkeyval}, while \sty{etoolbox}
+%\alert \textcolor{DarkBlue}{The parts added to the basic structure of \file{scrextend} and \file{scrfontsizes} are highlighted in blue.}
+%
+%\noindent All the options of the package are defined via \sty{xkeyval}, while \sty{etoolbox}
% is required to execute \cmd{AtEndOfPackage}. It is probably not necessary but for the moment I prefer to take advantage of it.
%
% \baddition
@@ -475,6 +505,7 @@ This work has the LPPL maintenance status "author-maintained".
\noexpand\changefontsize{#1}%
}%
}%
+ \noexpand\catcode`\noexpand\@=\the\catcode`\@
}%
\expandafter\AtEndOfPackage\expandafter{\@tempa}%
}
@@ -621,6 +652,141 @@ This work has the LPPL maintenance status "author-maintained".
\noexpand\@setfontsize\noexpand\Huge
{\the\@tempdima}{\the\@tempdimb}%
}%
+% \end{macrocode}
+% Here we define some new font sizing commands. There are three variants
+% for each standard command starting from \cmd{normalsize} to \cmd{Huge}:
+% \cmd{\meta{cmd}r} > \cmd{\meta{cmd}rr} > \cmd{\meta{cmd}rrr}.
+% Every level is scaled proportionally in order to preserve the default
+% value of the corresponding standard command.
+% \baddition
+% \paragraph{\color{black}Definition of \cmd{normalsizer}, \cmd{normalsizerr}, \cmd{normalsizerrr}. Scale factor: 0.05.}
+% \begin{macrocode}
+ \setlength{\@tempdima}{1.05\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\normalsizer{%
+ \noexpand\@setfontsize\noexpand\normalsizer
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{1.1\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\normalsizerr{%
+ \noexpand\@setfontsize\noexpand\normalsizerr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{1.15\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\normalsizerrr{%
+ \noexpand\@setfontsize\noexpand\normalsizerrr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+% \end{macrocode}
+% \paragraph{\color{black}Definition of \cmd{larger}, \cmd{largerr}, \cmd{largerrr}. Scale factor: 0,06.}
+% \begin{macrocode}
+ \setlength{\@tempdima}{1.26\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\larger{%
+ \noexpand\@setfontsize\noexpand\larger
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{1.32\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\largerr{%
+ \noexpand\@setfontsize\noexpand\largerr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{1.38\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\largerrr{%
+ \noexpand\@setfontsize\noexpand\largerrr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+% \end{macrocode}
+% \paragraph{\color{black}Definition of \cmd{Larger}, \cmd{Largerr}, \cmd{Largerrr}. Scale factor: 0,072.}
+% \begin{macrocode}
+ \setlength{\@tempdima}{1.512\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\Larger{%
+ \noexpand\@setfontsize\noexpand\Larger
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{1.584\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\Largerr{%
+ \noexpand\@setfontsize\noexpand\Largerr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{1.656\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\Largerrr{%
+ \noexpand\@setfontsize\noexpand\Largerrr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+% \end{macrocode}
+% \paragraph{\color{black}Definition of \cmd{LARGEr}, \cmd{LARGErr}, \cmd{LARGErrr}. Scale factor: 0,0865.}
+% \begin{macrocode}
+ \setlength{\@tempdima}{1.8145\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\LARGEr{%
+ \noexpand\@setfontsize\noexpand\LARGEr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{1.901\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\LARGErr{%
+ \noexpand\@setfontsize\noexpand\LARGErr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{1.9875\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\LARGErrr{%
+ \noexpand\@setfontsize\noexpand\LARGErrr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+% \end{macrocode}
+% \paragraph{\color{black}Definition of \cmd{huger}, \cmd{hugerr}, \cmd{hugerrr}. Scale factor: 0,1035.}
+% \begin{macrocode}
+ \setlength{\@tempdima}{2.1775\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\huger{%
+ \noexpand\@setfontsize\noexpand\huger
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{2.281\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\hugerr{%
+ \noexpand\@setfontsize\noexpand\hugerr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{2.3845\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\hugerrr{%
+ \noexpand\@setfontsize\noexpand\hugerrr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+% \end{macrocode}
+% \paragraph{\color{black}Definition of \cmd{Huger}, \cmd{Hugerr}, \cmd{Hugerrr}. Scale factor: 0.123.}
+% \begin{macrocode}
+ \setlength{\@tempdima}{2.611\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\Huger{%
+ \noexpand\@setfontsize\noexpand\Huger
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{2.734\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\Hugerr{%
+ \noexpand\@setfontsize\noexpand\Hugerr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{2.857\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\Hugerrr{%
+ \noexpand\@setfontsize\noexpand\Hugerrr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+% \end{macrocode}
+% \eaddition
+% \begin{macrocode}
\normalsize%
% \end{macrocode}
% The KOMA files do not define \cmd{parindent} and other lengths related to the page dimensions (\cmd{textheight}, \cmd{headheight}, \cmd{headsep}, etc.) Anyway I think that some of these lengths are strictly linked to the font rather than to the page and text dimensions. Particularly \cmd{headheight}, whose value may cause a well known warning if \sty{fancyhdr} is loaded. So we definte the following new
@@ -932,6 +1098,143 @@ This work has the LPPL maintenance status "author-maintained".
}\@percentchar%
}%
\endgroup
+% \end{macrocode}
+% The new sizing commands previously defined are recalled here and
+% written in the .clo file if the \cmd{generateclofile} command is used.
+% \baddition
+% \begin{macrocode}
+ \begingroup\normalsizer
+ \immediate\write\@fontfile{%
+ \string\def\string\normalsizer{%
+ \string\@setfontsize\string\normalsizer{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\normalsizerr
+ \immediate\write\@fontfile{%
+ \string\def\string\normalsizerr{%
+ \string\@setfontsize\string\normalsizerr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\normalsizerrr
+ \immediate\write\@fontfile{%
+ \string\def\string\normalsizerrr{%
+ \string\@setfontsize\string\normalsizerrr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\larger
+ \immediate\write\@fontfile{%
+ \string\def\string\larger{%
+ \string\@setfontsize\string\larger{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\largerr
+ \immediate\write\@fontfile{%
+ \string\def\string\largerr{%
+ \string\@setfontsize\string\largerr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\largerrr
+ \immediate\write\@fontfile{%
+ \string\def\string\largerrr{%
+ \string\@setfontsize\string\largerrr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\Large
+ \immediate\write\@fontfile{%
+ \string\def\string\Large{%
+ \string\@setfontsize\string\Large{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\Larger
+ \immediate\write\@fontfile{%
+ \string\def\string\Larger{%
+ \string\@setfontsize\string\Larger{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\Largerr
+ \immediate\write\@fontfile{%
+ \string\def\string\Largerr{%
+ \string\@setfontsize\string\Largerr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\Largerrr
+ \immediate\write\@fontfile{%
+ \string\def\string\Largerrr{%
+ \string\@setfontsize\string\Largerrr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \begingroup\LARGEr
+ \immediate\write\@fontfile{%
+ \string\def\string\LARGEr{%
+ \string\@setfontsize\string\LARGEr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\LARGErr
+ \immediate\write\@fontfile{%
+ \string\def\string\LARGErr{%
+ \string\@setfontsize\string\LARGErr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\LARGErrr
+ \immediate\write\@fontfile{%
+ \string\def\string\LARGErrr{%
+ \string\@setfontsize\string\LARGErrr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \begingroup\huger
+ \immediate\write\@fontfile{%
+ \string\def\string\huger{%
+ \string\@setfontsize\string\huger{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\hugerr
+ \immediate\write\@fontfile{%
+ \string\def\string\hugerr{%
+ \string\@setfontsize\string\hugerr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\hugerrr
+ \immediate\write\@fontfile{%
+ \string\def\string\hugerrr{%
+ \string\@setfontsize\string\hugerrr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \begingroup\Huger
+ \immediate\write\@fontfile{%
+ \string\def\string\Huger{%
+ \string\@setfontsize\string\Huger{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\Hugerr
+ \immediate\write\@fontfile{%
+ \string\def\string\Hugerr{%
+ \string\@setfontsize\string\Hugerr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\Hugerrr
+ \immediate\write\@fontfile{%
+ \string\def\string\Hugerrr{%
+ \string\@setfontsize\string\Hugerrr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+% \end{macrocode}
+% \eaddition
+% \begin{macrocode}
\immediate\write\@fontfile{\string\normalsize}%
% \end{macrocode}
% The new lengths previously defined are recalled here and written in the .clo file
@@ -1091,27 +1394,43 @@ This work has the LPPL maintenance status "author-maintained".
% We will now define some internal commands to test the package functions.
% \baddition
% \begin{macrocode}
+\ExplSyntaxOn
+
+\NewExpandableDocumentCommand{\getlength}{O{5}m}
+{
+ \fp_eval:n { round(#2,#1) }
+}
+
+\ExplSyntaxOff
\def\fontsize@lipsum{As any dedicated reader can clearly see, the Ideal of
practical reason is a representation of, as far as I know, the
things in themselves; as I have shown elsewhere, the phenomena
should only be used as a canon for our understanding. The paralogisms
of practical reason are what first give rise to the architectonic of
practical reason. As will be shown, reason would
- thereby be made to contradict.}
+ be made to contradict.}
\chardef\fsbslash=`\\
% Thanks to @Werner (https://tex.stackexchange.com/a/87423/231952)
\newcommand{\sizesamples}[1]{%
\def\nextitem{\par}% Separator
\renewcommand*{\do}[1]{\nextitem\bgroup\csname##1\endcsname
- \noindent\textbf{\csname ##1\endcsname \texttt{\fsbslash ##1}:
- \f@size pt on \the\baselineskip} \fontsize@lipsum\par\egroup
+ \noindent{\csname ##1\endcsname \texttt{\fsbslash ##1}:
+ \getlength[2]{\f@size}\,pt on \getlength[2]{\the\baselineskip}\,pt.} \fontsize@lipsum\par\egroup
}% How to process each item
\docsvlist{#1}% Process list
}
-\newcommand{\printfontsize}[2][]{%
- \changefontsize[#1]{#2}
- \sizesamples{tiny,scriptsize,footnotesize,small,
- normalsize,large,Large,LARGE,huge,Huge}}
+\NewDocumentCommand \printsamples { m m O{
+ normalsize,normalsizer,normalsizerr,normalsizerrr,
+ large,larger,largerr,largerrr,
+ Large,Larger,Largerr,Largerrr,
+ LARGE,LARGEr,LARGErr,LARGErrr,
+ huge,huger,hugerr,hugerrr,
+ Huge,Huger,Hugerr,Hugerrr} }
+{
+ \changefontsize[#1]{#2}
+ \subsubsection*{Text samples for #2 on #1}
+ \sizesamples{#3}
+}
% \end{macrocode}
% \eaddition
% \iffalse
diff --git a/macros/latex/contrib/fontsize/fontsize.pdf b/macros/latex/contrib/fontsize/fontsize.pdf
index b5fe2ea30a..742ff73fe3 100644
--- a/macros/latex/contrib/fontsize/fontsize.pdf
+++ b/macros/latex/contrib/fontsize/fontsize.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/xsim.history b/macros/latex/contrib/xsim/HISTORY
index f1b0f860f7..0d3f7d417a 100644
--- a/macros/latex/contrib/xsim/doc/xsim.history
+++ b/macros/latex/contrib/xsim/HISTORY
@@ -155,4 +155,24 @@ HISTORY:
- new load-time option `debug' - only for development
v0.19a 2020/03/19 - fix missing-variant-bug introduced with the last update
v0.19b 2020/04/04 - fix bug in new attribute mechanism which was a problem
- when `no-files` has been used
+ when `no-files` has been used
+ v0.20 2021/01/31 - switch to one sty file per package
+ - use LaTeX's new hooks
+ - declare undeclared variables
+ - new exercise setup mechanism which clearly determines the
+ difference between definition, usage, and printing of an
+ exercise; this also solves the problem with added goals
+ in the exercise body in a collection
+ - re-write collection mechanism:
+ * changes the behaviour of \collectexercises but doesn't
+ require external files any more and more importantly
+ doesn't require inputting files several times for
+ multiple collections
+ * drop \collectexercisestype
+ * new \(de)activatecollection
+ * new options `collect' and `<type>/collect'
+ - small improvements in performance
+ - new parameters `within' and `the-counter'
+ - make `no-files' the default
+ - new examples
+ - various small fixes
diff --git a/macros/latex/contrib/xsim/README b/macros/latex/contrib/xsim/README
index 5923c8045b..3407220a29 100644
--- a/macros/latex/contrib/xsim/README
+++ b/macros/latex/contrib/xsim/README
@@ -1,6 +1,6 @@
--------------------------------------------------------------------------
-XSIM 2020/04/04 v0.19b
-XSIMVERB 2019/12/29 v0.1a
+XSIM 2021/01/31 v0.20
+XSIMVERB 2021/01/31 v0.3
eXercise Sheets IMproved
@@ -9,15 +9,15 @@ Clemens Niederberger
Web: https://github.com/cgnieder/xsim
E-Mail: contact@mychemistry.eu
--------------------------------------------------------------------------
-Copyright 2017--2020 Clemens Niederberger
+Copyright 2017--2021 Clemens Niederberger
This work may be distributed and/or modified under the
-conditions of the LaTeX Project Public License, either version 1.3
+conditions of the LaTeX Project Public License, either version 1.3c
of this license or (at your option) any later version.
The latest version of this license is in
http://www.latex-project.org/lppl.txt
-and version 1.3 or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+and version 1.3c or later is part of all distributions of LaTeX
+version 2008/05/04 or later.
This work has the LPPL maintenance status `maintained'.
@@ -26,30 +26,10 @@ The Current Maintainer of this work is Clemens Niederberger.
The xsim package consists of the code files:
xsim.sty
xsimverb.sty
- xsim.auxfile.code.tex
- xsim.base.code.tex
- xsim.blanks.code.tex
- xsim.collections.code.tex
- xsim.definitions.code.tex
- xsim.environments.code.tex
- xsim.exercises.code.tex
- xsim.goals.code.tex
- xsim.grades.code.tex
- xsim.interface.code.tex
- xsim.modules.code.tex
- xsim.properties.code.tex
- xsim.random.code.tex
- xsim.solutions.code.tex
- xsim.style.layouts.code.tex
- xsim.tags.code.tex
- xsim.templates.code.tex
- xsim.translations.code.tex
- xsim.verbwrite.code.tex
--------------------------------------------------------------------------
The xsim package consists of the documentation files:
- README
- xsim.history, xsim.ideas
- xsim_manual.tex, xsim_manual.pdf
+ README HISTORY
+ xsim-manual.tex, xsim-manual.pdf
xsim-manual.cls
--------------------------------------------------------------------------
The xsim package consists of the example files:
@@ -84,12 +64,16 @@ The xsim package consists of the example files:
xsim.texsx-370642.tex, xsim.texsx-370642.pdf
xsim.texsx-391530.tex, xsim.texsx-391530.pdf
xsim.texsx-395273.tex, xsim.texsx-395273.pdf
- xsim.texsx-498299.tex, xsim.texsx-498299.pdf,
+ xsim.texsx-466584.tex, xsim.texsx-466584.pdf
+ xsim.texsx-498299.tex, xsim.texsx-498299.pdf
+ xsim.texsx-576998.tex, xsim.texsx-576998.pdf
+ xsim.texsx-580636.tex, xsim.texsx-580636.pdf
xsim.texwelt-6698.tex, xsim.texwelt-6698.pdf
xsim.texwelt-15093.tex, xsim.texwelt-15093.pdf
xsim.texwelt-23968.tex, xsim.texwelt-23968.pdf
- xsim.golatex-16824.tex, xsim.golatex-16824.pdf
- xsim.golatex-18844.tex, xsim.golatex-18844.pdf
+ xsim.golatex-80640.tex, xsim.golatex-80640.pdf
+ xsim.golatex-91339.tex, xsim.golatex-91339.pdf
+ xsim.issues-49.tex, xsim.issues-49.pdf
--------------------------------------------------------------------------
If you have any ideas, questions, suggestions or bugs to report, please
feel free to contact me.
diff --git a/macros/latex/contrib/xsim/code/xsim.auxfile.code.tex b/macros/latex/contrib/xsim/code/xsim.auxfile.code.tex
deleted file mode 100644
index 2f31f2009f..0000000000
--- a/macros/latex/contrib/xsim/code/xsim.auxfile.code.tex
+++ /dev/null
@@ -1,221 +0,0 @@
-% ----------------------------------------------------------------------------
-% the XSIM package - auxfile module
-%
-% eXercise Sheets IMproved
-%
-% ----------------------------------------------------------------------------
-% Clemens Niederberger
-% Web: https://github.com/cgnieder/xsim
-% E-Mail: contact@mychemistry.eu
-% ----------------------------------------------------------------------------
-% Copyright 2017--2020 Clemens Niederberger
-%
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% ----------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% ----------------------------------------------------------------------------
-\XSIMmodule{auxfile}{writing stuff to an auxiliary file}
-
-\prg_new_conditional:Npnn \xsim_if_use_aux: {p,T,F,TF}
- {
- \bool_if:NTF \g_xsim_use_aux_bool
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-\cs_new_protected:Npn \xsim_write_to_aux:n #1
- {
- \legacy_if:nT {@filesw}
- {
- \xsim_if_use_aux:TF
- { \iow_now:Nn \@auxout {#1} }
- { \iow_now:Nn \l__xsim_aux_file_iow {#1} }
- }
- }
-\cs_generate_variant:Nn \xsim_write_to_aux:n {x}
-
-% --------------------------------------------------------------------------
-
-\cs_new_protected:Npn \XSIM #1 { \use:c {XSIMaux#1} }
-
-\cs_new_protected:Npn \xsim_new_aux_property:cpn #1
- { \cs_new_protected:cpn {XSIMaux#1} }
-
-\cs_new_protected:Npn \xsim_add_property_to_aux:nn #1#2
- {
- \xsim_verbose:n { Writing~ command~ \XSIM {#1}~ to~ aux~ file }
- \xsim_write_to_aux:x { \token_to_str:N \XSIM {#1} #2 }
- }
-
-\xsim_at_begin_document:n
- {
- \iow_now:Nx \@auxout
- { \token_to_str:N \providecommand \token_to_str:N \XSIM [1] {} }
- }
-
-% ----------------------------------------------------------------------------
-
-\xsim_if_use_aux:F
- {
- \iow_new:N \l__xsim_aux_file_iow
- \xsim_at_begin_document:n
- { \iow_open:Nn \l__xsim_aux_file_iow { \c_sys_jobname_str .xsim } }
- }
-
-\cs_new_protected:Npn \xsim_close_aux:
- {
- \xsim_if_use_aux:F
- {
- \iow_close:N \l__xsim_aux_file_iow
- \legacy_if:nT {@filesw}
- { \iow_now:Nx \@auxout { \token_to_str:N \XSIM {readaux} } }
- }
- }
-
-\xsim_new_aux_property:cpn {readaux}
- {
- \file_if_exist:nT { \c_sys_jobname_str .xsim }
- { \file_input:n { \c_sys_jobname_str .xsim } }
- }
-
-% ----------------------------------------------------------------------------
-% list for recording values that need to be written to the aux file and
-% updated at begin document
-
-\str_new:N \l__xsim_split_aux_lists_str
-\keys_define:nn {xsim}
- {
- split-aux-lists .code:n = \str_set:Nn \l__xsim_split_aux_lists_str {#1} ,
- split-aux-lists .initial:n = ||
- }
-
-% define list:
-% #1: name
-\cs_new_protected:Npn \xsim_new_list:n #1
- {
- \xsim_verbose:n { Defining~ new~ auxfile~ list~ `#1'. }
- \seq_new:c {g__xsim_list_#1_seq}
- \seq_new:c {g__xsim_list_recorded_#1_seq}
- \xsim_new_aux_property:cpn {#1} ##1
- {
- \tl_if_blank:nF {##1}
- {
- \seq_gset_split:cVx {g__xsim_list_#1_seq}
- \l__xsim_split_aux_lists_str
- { \tl_to_str:n {##1} }
- \seq_map_inline:cn {g__xsim_list_#1_seq}
- { \xsim_attribute_set:nnn {#1} {####1} {} }
- }
- }
- \xsim_at_begin_document:n
- {
- \seq_gclear:c {g__xsim_list_recorded_#1_seq}
- \seq_set_eq:Nc \l__xsim_tmpa_seq {g__xsim_list_#1_seq}
- \seq_map_inline:Nn \l__xsim_tmpa_seq
- {
- \str_set:Nn \l__xsim_tmpa_str {##1}
- \seq_gput_right:cV {g__xsim_list_recorded_#1_seq} \l__xsim_tmpa_str
- }
- \seq_gremove_duplicates:c {g__xsim_list_recorded_#1_seq}
- }
- }
-
-% add to or remove from list:
-% #1: name
-% #2: entry
-\cs_new_protected:Npn \xsim_add_to_list:nn #1#2
- {
- \xsim_verbose:n { Adding~ `#2'~ to~ list~ `#1'. }
- \str_set:Nn \l__xsim_tmpa_str {#2}
- \xsim_attribute_set:nnn {#1} {#2} {}
- \seq_if_in:cVT {g__xsim_list_#1_seq} \l__xsim_tmpa_str
- { \seq_gremove_all:cV {g__xsim_list_#1_seq} \l__xsim_tmpa_str }
- \seq_gput_right:cV {g__xsim_list_#1_seq} \l__xsim_tmpa_str
- }
-\cs_generate_variant:Nn \xsim_add_to_list:nn {nx}
-
-% #1: name
-% #2: entry
-\cs_new_protected:Npn \xsim_remove_from_list:nn #1#2
- {
- \xsim_verbose:n { Removing~ `#2'~ to~ list~ `#1'. }
- \str_set:Nn \l__xsim_tmpa_str {#2}
- \xsim_attribute_if_set:nnT {#1} {#2}
- { \xsim_attribute_unset:nn {#1} {#2} }
- \seq_if_in:cVT {g__xsim_list_#1_seq} \l__xsim_tmpa_str
- { \seq_gremove_all:cV {g__xsim_list_#1_seq} \l__xsim_tmpa_str }
- \seq_if_in:cVT {g__xsim_list_recorded#1_seq} \l__xsim_tmpa_str
- { \seq_gremove_all:cV {g__xsim_list_recorded_#1_seq} \l__xsim_tmpa_str }
- }
-\cs_generate_variant:Nn \xsim_remove_from_list:nn {nx}
-
-% check if in list:
-% #1: name
-% #2: entry
-\prg_new_conditional:Npnn \xsim_if_in_list:nn #1#2 {p,T,F,TF}
- {
- \xsim_attribute_if_set:nnTF {#1} {#2}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-\cs_generate_variant:Nn \xsim_if_in_list:nnTF {nx}
-\cs_generate_variant:Nn \xsim_if_in_list:nnT {nx}
-
-\bool_new:N \l__xsim_empty_lists_bool
-\cs_new_protected:Npn \xsim_empty_lists:
- { \bool_set_true:N \l__xsim_empty_lists_bool }
-
-% update list (should be used inside \xsim_at_end_document:n):
-% #1: name
-\cs_new_protected:Npn \xsim_update_list:n #1
- {
- \xsim_verbose:n { Updating~ list~ `#1'. }
- \seq_remove_duplicates:c {g__xsim_list_#1_seq}
- \seq_remove_duplicates:c {g__xsim_list_recorded_#1_seq}
- \str_set:Nx \l__xsim_tmpa_str
- { \seq_use:cn {g__xsim_list_#1_seq} {} }
- \str_set:Nx \l__xsim_tmpb_str
- { \seq_use:cn {g__xsim_list_recorded_#1_seq} {} }
- \str_if_eq:NNF \l__xsim_tmpa_str \l__xsim_tmpb_str
- { \xsim_rerun: }
- \bool_if:NF \l__xsim_empty_lists_bool
- {
- \xsim_add_property_to_aux:nn {#1}
- { { \seq_use:cV {g__xsim_list_#1_seq} \l__xsim_split_aux_lists_str } }
- }
- }
-
-% loop over list:
-% #1: name
-% #2: code
-\cs_new_protected:Npn \xsim_foreach_list_entry:nn #1#2
- { \seq_map_inline:cn {g__xsim_list_recorded_#1_seq} {#2} }
-
-\cs_new_protected:Npn \xsim_foreach_new_list_entry:nn #1#2
- { \seq_map_inline:cn {g__xsim_list_#1_seq} {#2} }
-
-% length of a list:
-% #1: name
-\cs_new:Npn \xsim_list_count:n #1
- { \seq_count:c {g__xsim_list_recorded_#1_seq} }
-
-% item of a list:
-% #1: name
-% #2: integer
-\cs_new:Npn \xsim_list_item:nn #1#2
- { \seq_item:cn {g__xsim_list_recorded_#1_seq} {#2} }
-
-% ----------------------------------------------------------------------------
-\file_input_stop:
-2020/03/16 - performance optimizations
diff --git a/macros/latex/contrib/xsim/code/xsim.base.code.tex b/macros/latex/contrib/xsim/code/xsim.base.code.tex
deleted file mode 100644
index fd478455f6..0000000000
--- a/macros/latex/contrib/xsim/code/xsim.base.code.tex
+++ /dev/null
@@ -1,287 +0,0 @@
-% ----------------------------------------------------------------------------
-% the XSIM package - base module
-%
-% eXercise Sheets IMproved
-%
-% ----------------------------------------------------------------------------
-% Clemens Niederberger
-% Web: https://github.com/cgnieder/xsim
-% E-Mail: contact@mychemistry.eu
-% ----------------------------------------------------------------------------
-% Copyright 2017--2020 Clemens Niederberger
-%
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% ----------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% ----------------------------------------------------------------------------
-\XSIMmodule{base}{basic functionality of the package}
-
-\tl_new:N \g_xsim_end_document_hook_tl
-\tl_new:N \g_xsim_begin_document_hook_tl
-
-\AtBeginDocument { \tl_use:N \g_xsim_begin_document_hook_tl }
-\AtEndDocument { \tl_use:N \g_xsim_end_document_hook_tl }
-
-\cs_new_protected:Npn \xsim_at_begin_document:n #1
- { \tl_gput_right:Nn \g_xsim_begin_document_hook_tl {#1} }
-
-\cs_new_protected:Npn \xsim_at_end_document:n #1
- { \tl_gput_right:Nn \g_xsim_end_document_hook_tl {#1} }
-
-% ----------------------------------------------------------------------------
-
-\xsim_load_modules:n {auxfile}
-
-% ----------------------------------------------------------------------------
-% variants of kernel functions:
-\cs_generate_variant:Nn \seq_set_split:Nnn {Nnx,NV}
-\cs_generate_variant:Nn \seq_gset_split:Nnn {c,cVx,cnx}
-\cs_generate_variant:Nn \seq_use:Nn {cV}
-\cs_generate_variant:Nn \seq_count:N {c}
-\cs_generate_variant:Nn \seq_if_empty:NT {c}
-\cs_generate_variant:Nn \seq_if_in:NnT {cV}
-\cs_generate_variant:Nn \seq_gremove_all:Nn {cV}
-\cs_generate_variant:Nn \seq_gput_right:Nn {cV}
-\cs_generate_variant:Nn \prop_put:Nnn {Nnx,cxx}
-\cs_generate_variant:Nn \prop_gput:Nnn {Nx,Nnx,cxx}
-\cs_generate_variant:Nn \prop_item:Nn {c}
-\cs_generate_variant:Nn \prop_if_in:NnTF {Nx}
-\cs_generate_variant:Nn \use:nn {nx}
-\cs_generate_variant:Nn \file_input:n {V,x}
-\cs_generate_variant:Nn \file_if_exist:nT {V,x}
-\cs_generate_variant:Nn \file_if_exist:nTF {V}
-\cs_generate_variant:Nn \msg_error:nnnnn {nnnxx}
-\cs_generate_variant:Nn \keys_define:nn {nx}
-\cs_generate_variant:Nn \keys_set:nn {xn}
-\cs_generate_variant:Nn \tl_mixed_case:n {x,f}
-\cs_generate_variant:Nn \tl_if_eq:nnTF {ff,V}
-\cs_generate_variant:Nn \tl_if_eq:nnT {x}
-\cs_generate_variant:Nn \tl_if_blank:nTF {f}
-\cs_generate_variant:Nn \tl_set_rescan:Nnn {Nnx}
-\cs_generate_variant:Nn \iow_now:Nn {NV}
-\cs_generate_variant:Nn \str_if_eq:nnT {x}
-\cs_generate_variant:Nn \str_if_eq:nnF {xx}
-\cs_generate_variant:Nn \str_if_eq_p:nn {e}
-\cs_generate_variant:Nn \prg_new_protected_conditional:Npnn {c}
-
-% ----------------------------------------------------------------------------
-% temporary variables:
-\tl_new:N \l__xsim_tmpa_tl
-\tl_new:N \l__xsim_tmpb_tl
-\tl_new:N \l__xsim_tmpc_tl
-\tl_new:N \l__xsim_tmpd_tl
-
-\str_new:N \l__xsim_tmpa_str
-\str_new:N \l__xsim_tmpb_str
-\str_new:N \l__xsim_tmpc_str
-
-\bool_new:N \l__xsim_tmpa_bool
-\bool_new:N \l__xsim_tmpb_bool
-\bool_new:N \l__xsim_tmpc_bool
-
-\dim_new:N \l__xsim_tmpa_dim
-\dim_new:N \l__xsim_tmpb_dim
-\dim_new:N \l__xsim_tmpc_dim
-
-\seq_new:N \l__xsim_tmpa_seq
-\seq_new:N \l__xsim_tmpb_seq
-\seq_new:N \l__xsim_tmpc_seq
-
-\int_new:N \l__xsim_tmpa_int
-\int_new:N \l__xsim_tmpb_int
-\int_new:N \l__xsim_tmpc_int
-
-\box_new:N \l__xsim_tmpa_box
-\box_new:N \l__xsim_tmpb_box
-\box_new:N \l__xsim_tmpc_box
-
-\clist_new:N \l__xsim_tmpa_clist
-\clist_new:N \l__xsim_tmpb_clist
-\clist_new:N \l__xsim_tmpc_clist
-
-% ----------------------------------------------------------------------------
-
-\prg_new_conditional:Npnn \xsim_if_komascript: {T,F,TF}
- {
- \cs_if_exist:cTF {KOMAClassName}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-% ----------------------------------------------------------------------------
-
-\prg_new_conditional:Npnn \xsim_if_final: {p,T,F,TF}
- {
- \bool_if:NTF \g__xsim_final_bool
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-\prg_new_conditional:Npnn \xsim_if_verbose: {p,T,F,TF}
- {
- \bool_if:NTF \g__xsim_verbose_bool
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-\prg_new_conditional:Npnn \xsim_if_debug: {p,T,F,TF}
- {
- \bool_if:NTF \g__xsim_debug_bool
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-\prg_new_conditional:Npnn \xsim_if_package_blank: {p,T,F,TF}
- {
- \bool_if:NTF \g__xsim_blank_bool
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-\prg_new_conditional:Npnn \xsim_if_rerun: {p,T,F,TF}
- {
- \bool_if:NTF \g__xsim_rerun_bool
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-\prg_new_conditional:Npnn \xsim_if_write_to_files: {p,T,F,TF}
- {
- \bool_if:NTF \g__xsim_write_to_file_bool
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-\prg_new_conditional:Npnn \xsim_if_clear_aux: {p,T,F,TF}
- {
- \xsim_if_final:TF
- { \prg_return_false: }
- {
- \bool_if:NTF \g_xsim_clear_aux_bool
- { \prg_return_true: }
- { \prg_return_false: }
- }
- }
-
-\cs_new_protected:Npn \xsim_verbose:n #1
- { \xsim_if_verbose:T { \msg_info:nnn {xsim} {verbose} {#1} } }
-\cs_generate_variant:Nn \xsim_verbose:n {x}
-
-\cs_new_protected:Npn \xsim_rerun:
- { \bool_gset_true:N \g__xsim_rerun_bool }
-
-\prg_new_conditional:Npnn \xsim_if_chapter: {p,T,F,TF}
- {
- \bool_lazy_and:nnTF
- { \cs_if_exist_p:N \chapter }
- { \cs_if_exist_p:N \c@chapter }
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-% ----------------------------------------------------------------------------
-
-% #1: macro name
-% #2: 0 to 9 times `n' (= number of arguments of internal item)
-% #3: code; may contain a suiting \__xsim_loop_item:<nnn>
-\cs_new_protected:Npn \xsim_define_loop_macro:Nnn #1#2#3
- {
- \xsim_verbose:n { Defining~ loop~ macro~ #1 }
- \cs_new_protected:Npn #1 ##1##2
- { \cs_set:cn {__xsim_loop_item:#2} {##2} #3 }
- }
-
-% ----------------------------------------------------------------------------
-
-\msg_new:nnn {xsim} {attribute-not-set}
- { The~ attribute~ `#1'~ is~ not~ set~ \msg_line_context: }
-
-% #1: attribute
-% #2: item
-\cs_new_protected:Npn \xsim_attribute_new:nn #1#2
- { \cs_new:cpn {____xsim_attribute_ \tl_to_str:n {#1::#2} :} {} }
-
-% #1: attribute
-% #2: item
-% #3: value
-\cs_new_protected:Npn \xsim_attribute_set:nnn #1#2#3
- {
- \cs_gset:cpx
- {____xsim_attribute_ \tl_to_str:n {#1::#2} :}
- { \exp_not:n { \exp_not:n {#3} } }
- }
-\cs_generate_variant:Nn \xsim_attribute_set:nnn {nnx}
-
-% #1: attribute
-% #2: item
-\cs_new_protected:Npn \xsim_attribute_unset:nn #1#2
- { \cs_undefine:c {____xsim_attribute_ \tl_to_str:n {#1::#2} :} }
-
-% #1: attribute
-% #2: item
-\cs_new:Npn \xsim_attribute_get:nn #1#2
- {
- \cs_if_exist:cTF {____xsim_attribute_ \tl_to_str:n {#1::#2} :}
- { \use:c {____xsim_attribute_ \tl_to_str:n {#1::#2} :} }
- {
- \xsim_if_debug:T
- { \msg_expandable_error:nnn {xsim} {attribute-not-set} {#1::#2} }
- }
- }
-
-% #1: attribute
-% #2: item
-\prg_new_conditional:Npnn \xsim_attribute_if_set:nn #1#2 {p,T,F,TF}
- {
- \cs_if_exist:cTF {____xsim_attribute_ \tl_to_str:n {#1::#2} :}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-% #1: attribute
-% #2: item
-\prg_new_conditional:Npnn \__xsim_if_attribute_eq:nnn #1#2#3 {p,T,F,TF}
- {
- \tl_if_eq:enTF
- { \use:c {____xsim_attribute_ \tl_to_str:n {#1::#2} :} }
- {#3}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-% #1: attribute
-% #2: item
-\cs_new_protected:Npn \xsim_attribute_show:nn #1#2
- {
- \iow_term:n {}
- \iow_term:x
- {
- \c_space_tl \c_space_tl
- \tl_to_str:n {#1::#2}
- \c_space_tl \c_space_tl == \c_space_tl \c_space_tl
- {\use:c {____xsim_attribute_ \tl_to_str:n {#1::#2} :}}
- }
- \iow_term:n {}
- }
-
-% ----------------------------------------------------------------------------
-
-\cs_new_protected:Npn \xsim_setup:n #1
- { \keys_set:nn {xsim} {#1} }
-
-% ----------------------------------------------------------------------------
-\file_input_stop:
-2020/03/15 - alternative to property lists for performance optimizations
-2020/03/22 - fix bug in new attribute mechanism which was a problem when
- `no-files` has been used
diff --git a/macros/latex/contrib/xsim/code/xsim.blanks.code.tex b/macros/latex/contrib/xsim/code/xsim.blanks.code.tex
deleted file mode 100644
index 6cb2f3b252..0000000000
--- a/macros/latex/contrib/xsim/code/xsim.blanks.code.tex
+++ /dev/null
@@ -1,162 +0,0 @@
-% ----------------------------------------------------------------------------
-% the XSIM package - blanks module
-%
-% eXercise Sheets IMproved
-%
-% ----------------------------------------------------------------------------
-% Clemens Niederberger
-% Web: https://github.com/cgnieder/xsim
-% E-Mail: contact@mychemistry.eu
-% ----------------------------------------------------------------------------
-% Copyright 2017--2020 Clemens Niederberger
-%
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% ----------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% ----------------------------------------------------------------------------
-\XSIMmodule{blanks}{add blanks, cloze}
-
-\bool_new:N \l__xsim_blank_width_bool
-\bool_new:N \l__xsim_blank_linespread_bool
-\bool_new:N \l__xsim_fill_blank_bool
-\tl_new:N \l__xsim_blank_linespread_tl
-\tl_new:N \l__xsim_blank_scale_tl
-\dim_new:N \l__xsim_blank_dim
-\dim_new:N \l__xsim_blank_line_increment_dim
-\dim_new:N \l__xsim_blank_line_minimum_length_dim
-\box_new:N \l__xsim_blank_box
-
-\cs_new_protected:Npn \xsim_write_cloze_blank:n #1 {#1}
-\cs_new_protected:Npn \xsim_write_cloze_filled:n #1 {#1}
-
-\keys_define:nn {xsim/blank}
- {
- blank-style .code:n =
- \cs_set_protected:Npn \xsim_write_cloze_blank:n ##1 {#1} ,
- blank-style .initial:n = \underline {#1} ,
- filled-style .code:n =
- \cs_set_protected:Npn \xsim_write_cloze_filled:n ##1 {#1} ,
- filled-style .initial:n = \underline {#1} ,
- style .meta:n =
- {
- blank-style = #1 ,
- filled-style = #1
- } ,
- fill .bool_set:N = \l__xsim_fill_blank_bool ,
- fill .initial:n = false ,
- scale .tl_set:N = \l__xsim_blank_scale_tl ,
- scale .initial:n = 1 ,
- width .code:n =
- {
- \bool_set_true:N \l__xsim_blank_width_bool
- \dim_set:Nn \l__xsim_blank_dim {#1}
- } ,
- linespread .code:n =
- \bool_set_true:N \l__xsim_blank_linespread_bool
- \tl_set:Nn \l__xsim_blank_linespread_tl {#1} ,
- linespread .initial:n = 1 ,
- line-increment .dim_set:N = \l__xsim_blank_line_increment_dim ,
- line-increment .initial:n = 0.001\linewidth ,
- line-minimum-length .dim_set:N = \l__xsim_blank_line_minimum_length_dim ,
- line-minimum-length .initial:n = 2em
- }
-
-\cs_new_protected:Npn \xsim_blank:n #1
- {
- \box_clear:N \l__xsim_blank_box
- \mode_if_math:TF
- { \hbox_set:Nn \l__xsim_blank_box { $ \m@th \mathpalette{}{#1} $ } }
- { \hbox_set:Nn \l__xsim_blank_box {#1} }
- \bool_lazy_or:nnTF
- { \xsim_if_inside_solution_p: }
- { \l__xsim_fill_blank_bool }
- { \xsim_write_cloze_filled:n {#1} }
- {
- \bool_if:NTF \l__xsim_blank_width_bool
- { \__xsim_blank_skip:V \l__xsim_blank_dim }
- { \__xsim_blank_skip:n { \box_wd:N \l__xsim_blank_box } }
- }
- }
-
-\cs_new_protected:Npn \__xsim_blank_skip:n #1
- {
- \bool_if:NTF \l__xsim_blank_width_bool
- { \dim_set:Nn \l__xsim_tmpa_dim {#1} }
- {
- \fp_set:Nn \l__xsim_tmpa_fp
- { \dim_to_fp:n {#1} * \l__xsim_blank_scale_tl }
- \dim_set:Nn \l__xsim_tmpa_dim { \fp_to_dim:N \l__xsim_tmpa_fp }
- }
- \dim_compare:nTF
- { \l__xsim_tmpa_dim > \l__xsim_blank_line_minimum_length_dim }
- {
- \mode_if_math:TF
- { \xsim_write_cloze_blank:n { \skip_horizontal:N \l__xsim_tmpa_dim } }
- {
- \dim_do_while:nn { \l__xsim_tmpa_dim > \c_zero_dim }
- {
- % I wonder what the correct l3 way would be -- if there is
- % one, yet:
- % \tex_hfil:D
- \tex_penalty:D \hyphenpenalty
- % \tex_hfilneg:D
- \dim_compare:nTF
- { \l__xsim_tmpa_dim < \l__xsim_blank_line_increment_dim }
- { \xsim_write_cloze_blank:n { \skip_horizontal:N \l__xsim_tmpa_dim } }
- {
- \xsim_write_cloze_blank:n
- { \skip_horizontal:N \l__xsim_blank_line_increment_dim }
- }
- \dim_sub:Nn \l__xsim_tmpa_dim { \l__xsim_blank_line_increment_dim }
- }
- }
- }
- {
- \xsim_write_cloze_blank:n
- { \skip_horizontal:N \l__xsim_blank_line_minimum_length_dim }
- }
- }
-\cs_generate_variant:Nn \__xsim_blank_skip:n {V}
-
-% ----------------------------------------------------------------------------
-\file_input_stop:
-
-the following code from Heiko Oberdieck in d.c.t.t served as inspiration
-and basis for the \blank command:
-https://groups.google.com/d/msg/de.comp.text.tex/fZLwraH04jE/o1RSdFXjGuIJ
-
-\makeatletter
-\newcommand*{\luecke}{%
- \begingroup
- \setlength{\dimen@}{6cm}%
- \ifdim\dimen@>2em %
- \underline{\hspace{1em}}%
- \advance\dimen@ by -2em\relax
- \@whiledim\dimen@>0pt\do{%
- \penalty\hyphenpenalty
- \ifdim\dimen@<1pt %
- \underline{\hspace{\dimen@}}%
- \else
- \underline{\hspace{1pt}}%
- \fi
- \advance\dimen@ by -1pt %
- }%
- \underline{\hspace{1em}}%
- \else
- \underline{\hspace{\dimen@}}%
- \fi
- \endgroup
- \xspace
-}
-\makeatother
diff --git a/macros/latex/contrib/xsim/code/xsim.collections.code.tex b/macros/latex/contrib/xsim/code/xsim.collections.code.tex
deleted file mode 100644
index 5aeb6e2d77..0000000000
--- a/macros/latex/contrib/xsim/code/xsim.collections.code.tex
+++ /dev/null
@@ -1,397 +0,0 @@
-% ----------------------------------------------------------------------------
-% the XSIM package - collections module
-%
-% eXercise Sheets IMproved
-%
-% ----------------------------------------------------------------------------
-% Clemens Niederberger
-% Web: https://github.com/cgnieder/xsim
-% E-Mail: contact@mychemistry.eu
-% ----------------------------------------------------------------------------
-% Copyright 2017--2020 Clemens Niederberger
-%
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% ----------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% ----------------------------------------------------------------------------
-\XSIMmodule{collections}{collect exercises and print collected exercises}
-
-\xsim_load_modules:n {base}
-
-\seq_new:N \g__xsim_collections_seq
-\bool_new:N \l____xsim_active_bool
-
-\msg_new:nnn {xsim} {collection-exists}
- {
- The~ collection~ `#1'~ you're~ trying~ to~ define~ \msg_line_context:
- \c_space_tl already~ exists.
- }
-
-\msg_new:nnn {xsim} {collection-active}
- {
- You~ can't~ print~ collection~ `#1'~ while~ it~ is~ still~ active~
- \msg_line_context:
- }
-
-\msg_new:nnn {xsim} {unknown-collection}
- {
- You're~ trying~ to~ use~ the~ collection~ `#1'~ \msg_line_context:
- \c_space_tl but~ no~ collection~ with~ that~ name~ exists.~ You~ need~ to~
- define~ it~ first!
- }
-
-\msg_new:nnn {xsim} {print-collection-choice}
- {
- The~ choice~ `#1'~ for~ the~ option~ `print-collection/print'~ does~ not~
- exist.~ I'm~ using~ `exercises'~ instead~ \msg_line_context:
- }
-
-% ----------------------------------------------------------------------------
-
-% #1: collection name
-\cs_new_protected:Npn \xsim_new_collection:n #1
- {
- \xsim_if_collection_exist:nTF {#1}
- { \msg_error:nnn {xsim} {collection-exists} {#1} }
- {
- \xsim_verbose:n { Declaring~ new~ collection~ `#1'. }
- \xsim_attribute_set:nnn {collection} {#1} { \c_false_bool }
- \seq_gput_right:Nn \g__xsim_collections_seq {#1}
- \xsim_new_list:n {collection:#1}
- \seq_new:c {g__xsim_collection_#1_seq}
- }
- }
-
-% #1: collection name
-\prg_new_conditional:Npnn \xsim_if_collection_exist:n #1 {T,F,TF}
- {
- \seq_if_in:NnTF \g__xsim_collections_seq {#1}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-\xsim_new_collection:n {all~ exercises}
-
-\cs_new_protected:Npn \xsim_foreach_collection:n #1
- { \seq_map_inline:Nn \g__xsim_collections_seq {#1} }
-
-\cs_new:Npn \xsim_collection_map_break: { \seq_map_break: }
-
-% ----------------------------------------------------------------------------
-
-% #1: collection name
-% #2: type
-\cs_new_protected:Npn \xsim_activate_collection:nn #1#2
- {
- \xsim_if_collection_active:nTF {#1}
- { % TODO: error
- }
- {
- \xsim_verbose:n { Activating~ collection~ `#1'. }
- \xsim_attribute_set:nnn {collection} {#1} { \c_true_bool }
- \tl_if_blank:nF {#2}
- { \seq_gput_right:cn {g__xsim_collection_#1_seq} {#2} }
- }
- }
-
-\cs_new_protected:Npn \xsim_activate_collection:n #1
- { \xsim_activate_collection:nn {#1} {} }
-
-% #1: collection name
-\cs_new_protected:Npn \xsim_deactivate_collection:n #1
- {
- \xsim_if_collection_active:nTF {#1}
- {
- \xsim_verbose:n { Deactivating~ collection~ `#1'. }
- \xsim_attribute_set:nnn {collection} {#1} { \c_false_bool }
- % \seq_gclear:c {g__xsim_collection_#1_seq}
- }
- { % TODO: warning
- }
- }
-
-% start collection for an exercise type:
-% #1: collection name
-% #2: type
-\cs_new_protected:Npn \xsim_start_collection:nn #1#2
- {
- \group_begin:
- \xsim_if_collection_exist:nF {#1}
- { \msg_error:nnn {xsim} {unknown-collection} {#1} }
- \xsim_activate_collection:nn {#1} {#2}
- \xsim_setup:x { \xsim_get_parameter:nn {#2} {exercise-env} /print = false }
- }
-\cs_generate_variant:Nn \xsim_setup:n {x}
-
-% start collection for all exercise types:
-% #1: collection name
-\cs_new_protected:Npn \xsim_start_collection:n #1
- {
- \group_begin:
- \xsim_if_collection_exist:nF {#1}
- { \msg_error:nnn {xsim} {unknown-collection} {#1} }
- \xsim_activate_collection:n {#1}
- \xsim_foreach_exercise_type:n
- { \xsim_setup:x { \xsim_get_parameter:nn {##1} {exercise-env} /print = false } }
- }
-
-% stop collection:
-% #1: collection name
-\cs_new_protected:Npn \xsim_stop_collection:n #1
- {
- \xsim_deactivate_collection:n {#1}
- \group_end:
- }
-
-% ----------------------------------------------------------------------------
-
-% #1: collection name
-% #2: type
-% #3: id
-\cs_new_protected:Npn \xsim_add_to_collection:nnn #1#2#3
- {
- \seq_if_empty:cTF {g__xsim_collection_#1_seq}
- { \__xsim_add_to_collection:nnn {#1} {#2} {#3} }
- {
- \seq_if_in:cnF {g__xsim_collection_#1_seq} {#2}
- { \__xsim_add_to_collection:nnn {#1} {#2} {#3} }
- }
- }
-
-% #1: collection name
-% #2: type
-% #3: id
-\cs_new_protected:Npn \__xsim_add_to_collection:nnn #1#2#3
- {
- \xsim_verbose:n
- { Adding~ exercise~ type~ `#2'~ id~ `#3'~ to~ collection~ `#1'. }
- \xsim_add_to_list:nn {collection:#1} {#2-#3}
- }
-
-\cs_new:Npn \xsim_collection_count:n #1
- { \xsim_list_count:n {collection:#1} }
-
-% #1: type
-% #2: id
-\cs_new_protected:Npn \xsim_update_collections:nn #1#2
- {
- \xsim_if_insert_mode:F
- {
- \xsim_exercise_if_use:nnT {#1} {#2}
- { \xsim_add_to_collection:nnn {all~ exercises} {#1} {#2} }
- \xsim_foreach_collection:n
- {
- \xsim_exercise_if_use:nnTF {#1} {#2}
- {
- \xsim_if_collection_active:nT {##1}
- { \xsim_add_to_collection:nnn {##1} {#1} {#2} }
- }
- { \xsim_remove_from_list:nn {collection:##1} {#1-#2} }
- }
- }
- }
-\cs_generate_variant:Nn \xsim_update_collections:nn {nV}
-
-% #1: collection name
-\cs_new_protected:Npn \xsim_get_collections:
- {
- \xsim_foreach_collection:n
- {
- \xsim_foreach_list_entry:nn {collection:##1}
- { \__xsim_list_to_collection:nww {##1} ####1 \q_stop }
- }
- }
-
-\cs_new_protected:Npn \__xsim_list_to_collection:nww #1#2-#3 \q_stop
- { \xsim_add_to_collection:nnn {#1} {#2} {#3} }
-
-% ----------------------------------------------------------------------------
-
-% #1: collection name
-% #2: type
-% #3: id
-\prg_new_conditional:Npnn \xsim_if_in_collection:nnn #1#2#3 {T,F,TF}
- {
- \xsim_if_in_list:nnTF {collection:#1} {#2-#3}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-\cs_generate_variant:Nn \xsim_if_in_collection:nnnTF {V}
-\cs_generate_variant:Nn \xsim_if_in_collection:nnnT {x,nV}
-
-% ----------------------------------------------------------------------------
-
-\bool_new:N \l__xsim_printcollection_headings_bool
-\tl_new:N \l__xsim_printcollection_headings_template_tl
-\tl_new:N \l__xsim_print_collection_choice_tl
-
-\keys_define:nn {xsim/print-collection}
- {
- headings .bool_set:N = \l__xsim_printcollection_headings_bool ,
- headings .initial:n = false ,
- headings-template .tl_set:N = \l__xsim_printcollection_headings_template_tl ,
- headings-template .initial:n = collection ,
- print .choice: ,
- print/exercises .code:n =
- \tl_set:Nn \l__xsim_print_collection_choice_tl {exercise} ,
- print/solutions .code:n =
- \tl_set:Nn \l__xsim_print_collection_choice_tl {solution} ,
- print/both .code:n =
- \tl_set:Nn \l__xsim_print_collection_choice_tl {both} ,
- print/unknown .code:n =
- \msg_warning:nnn {xsim} {print-collection-choice} {#1}
- \tl_set:Nn \l__xsim_print_collection_choice_tl {exercise} ,
- print .initial:n = exercises
- }
-
-% #1: options
-% #2: collection name
-\cs_new_protected:Npn \xsim_print_collection:nn #1#2
- {
- \xsim_if_collection_active:nTF {#2}
- { \msg_error:nnn {xsim} {collection-active} {#2} }
- {
- \xsim_verbose:x
- {
- Printing~
- \l__xsim_print_collection_choice_tl \c_space_tl
- \str_if_eq:onT { \l__xsim_print_collection_choice_tl } {both}
- { exercises~ and~ solutions~ }
- of~ collection~ `#2'
- }
- \group_begin:
- \keys_set:nn {xsim/print-collection} {#1}
- \tl_set:Nn \ExerciseCollection {#2}
- \xsim_foreach_exercise_type:n
- {
- \tl_set:Nn \ExerciseType {##1}
- \bool_if:NT \l__xsim_printcollection_headings_bool
- {
- \bool_set_false:N \l__xsim_tmpa_bool
- \xsim_foreach_exercise_id:n
- {
- \xsim_if_in_collection:nnnT {#2} {##1} {####1}
- {
- \tl_if_eq:VnTF
- \l__xsim_print_collection_choice_tl
- {both}
- {
- \xsim_if_exercise_exist:nnT {##1} {####1}
- { \bool_set_true:N \l__xsim_tmpa_bool }
- }
- {
- \use:c
- {
- xsim_if_
- \l__xsim_print_collection_choice_tl
- _exist:nnT
- }
- {##1}
- {####1}
- { \bool_set_true:N \l__xsim_tmpa_bool }
- }
- }
- }
- \bool_if:NT \l__xsim_tmpa_bool
- {
- \xsim_use_template:nV
- {heading}
- \l__xsim_printcollection_headings_template_tl
- }
- }
- \xsim_foreach_exercise_id:n
- {
- \xsim_if_in_collection:nnnT {#2} {##1} {####1}
- {
- \tl_if_eq:VnTF
- \l__xsim_print_collection_choice_tl
- {both}
- {
- \xsim_if_exercise_exist:nnT {##1} {####1}
- { \xsim_insert:nnnn {##1} {####1} {} {exercise} }
- \xsim_if_solution_exist:nnT {##1} {####1}
- { \xsim_insert:nnnn {##1} {####1} {} {solution} }
- }
- {
- \use:c
- {
- xsim_if_
- \l__xsim_print_collection_choice_tl
- _exist:nnT
- }
- {##1}
- {####1}
- {
- \xsim_insert:nnnV
- {##1}
- {####1}
- {}
- \l__xsim_print_collection_choice_tl
- }
- }
- }
- }
- }
- \group_end:
- }
- }
-
-% ----------------------------------------------------------------------------
-
-% #1: collection name
-\prg_new_conditional:Npnn \xsim_if_collection_active:n #1 {T,F,TF}
- {
- \xsim_attribute_if_set:nnTF {collection} {#1}
- {
- \bool_lazy_and:nnTF
- { !\str_if_eq_p:en {#1} {all~ exercises} }
- { \xsim_attribute_get:nn {collection} {#1} }
- { \prg_return_true: }
- { \prg_return_false: }
- }
- { \prg_return_false: }
- }
-
-\prg_new_protected_conditional:Npnn \xsim_if_collections_active: {T,F,TF}
- {
- \bool_set_false:N \l____xsim_active_bool
- \xsim_foreach_collection:n
- {
- \xsim_if_collection_active:nT {##1}
- {
- \bool_set_true:N \l____xsim_active_bool
- \xsim_collection_map_break:
- }
- }
- \bool_if:NTF \l____xsim_active_bool
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-% ----------------------------------------------------------------------------
-
-\xsim_at_begin_document:n
- {
- \xsim_get_collections:
- \xsim_activate_collection:n {all~ exercises}
- }
-
-\xsim_at_end_document:n
- {
- \xsim_deactivate_collection:n {all~ exercises}
- \xsim_foreach_collection:n { \xsim_update_list:n {collection:#1} }
- }
-
-% ----------------------------------------------------------------------------
-\file_input_stop:
diff --git a/macros/latex/contrib/xsim/code/xsim.definitions.code.tex b/macros/latex/contrib/xsim/code/xsim.definitions.code.tex
deleted file mode 100644
index 5b87fb0f4f..0000000000
--- a/macros/latex/contrib/xsim/code/xsim.definitions.code.tex
+++ /dev/null
@@ -1,482 +0,0 @@
-% ----------------------------------------------------------------------------
-% the XSIM package - definitions module
-%
-% eXercise Sheets IMproved
-%
-% ----------------------------------------------------------------------------
-% Clemens Niederberger
-% Web: https://github.com/cgnieder/xsim
-% E-Mail: contact@mychemistry.eu
-% ----------------------------------------------------------------------------
-% Copyright 2017--2020 Clemens Niederberger
-%
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% ----------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% ----------------------------------------------------------------------------
-\XSIMmodule{definitions}{definition of user commands}
-
-\xsim_load_modules:n {base,exercises,blanks,translations,interface,grades,random}
-
-% not exactly a user choice: the `exercises' environments rely on them:
-\DeclareExerciseParameter*!{exercise-env}
-\DeclareExerciseParameter*!{solution-env}
-\DeclareExerciseParameter !{exercise-name}
-\DeclareExerciseParameter !{solution-name}
-\DeclareExerciseParameter {exercises-name}
-\DeclareExerciseParameter {solutions-name}
-\DeclareExerciseParameter !{exercise-template}
-\DeclareExerciseParameter !{solution-template}
-\DeclareExerciseParameter* {counter}
-\DeclareExerciseParameter* {solution-counter}
-\DeclareExerciseParameter* {number}
-
-% these are additional - but are used in the `default' environment
-% template:
-\DeclareExerciseParameter {exercise-heading}
-\DeclareExerciseParameter {solution-heading}
-
-% ----------------------------------------------------------------------------
-
-% not exactly a user choice, must be present at various places:
-\DeclareExerciseProperty! {id}
-\DeclareExerciseProperty! {ID}
-\DeclareExerciseProperty {counter}
-\DeclareExerciseProperty {counter-value}
-\DeclareExerciseProperty * {print}
-\DeclareExerciseProperty *-{print!}
-\DeclareExerciseProperty * {use}
-\DeclareExerciseProperty * {used}
-\DeclareExerciseProperty *-{use!}
-\DeclareExerciseProperty * {solution}
-\XSIMifchapterT{
- \DeclareExerciseProperty {chapter-value}
- \DeclareExerciseProperty {chapter}
-}
-\DeclareExerciseProperty {section-value}
-\DeclareExerciseProperty {section}
-\DeclareExerciseProperty {sectioning}
-
-% those are additional and wouldn't *need* to be present except for
-% pre-defined templates which make use of them (the page and page-value
-% property actually needs to be defined for xsim to be able to save the
-% corresponding values):
-\DeclareExerciseProperty {subtitle}
-\DeclareExerciseProperty {points}
-\DeclareExerciseProperty {bonus-points}
-\DeclareExerciseProperty {page-value}
-\DeclareExerciseProperty {page}
-
-\DeclareExercisePropertyAlias {ID} {id}
-
-% ----------------------------------------------------------------------------
-
-\DeclareExerciseTagging {tags}
-\DeclareExerciseTagging {topics}
-
-\xsimsetup{tags/ignore-untagged=false}
-
-% ----------------------------------------------------------------------------
-
-\DeclareExerciseGoal {points}
-\DeclareExerciseGoal {bonus-points}
-
-\NewDocumentCommand \printgoal {m}
- { \ExerciseGoalValuePrint {#1} {} {} }
-
-\NewDocumentCommand \points {m}
- {
- \ExerciseGoalValuePrint {#1}
- { \, \XSIMtranslate {point} }
- { \, \XSIMtranslate {points} }
- }
-
-\NewDocumentCommand \addpoints {sm}
- {
- \AddtoExerciseGoal {points} {#2}
- \IfBooleanF {#1} { \points {#2} }
- }
-
-\NewDocumentCommand \printpoints {m}
- {
- \TotalExerciseTypeGoal {#1} {points}
- { \, \XSIMtranslate {point} }
- { \, \XSIMtranslate {points} }
- }
-
-\NewDocumentCommand \printtotalpoints {}
- {
- \TotalExerciseGoal {points}
- { \, \XSIMtranslate {point} }
- { \, \XSIMtranslate {points} }
- }
-
-\NewDocumentCommand \addbonus {sm}
- {
- \AddtoExerciseGoal {bonus-points} {#2}
- \IfBooleanF {#1} { \points {#2} }
- }
-
-\NewDocumentCommand \printbonus {m}
- {
- \TotalExerciseTypeGoal {#1} {bonus-points}
- { \, \XSIMtranslate {point} }
- { \, \XSIMtranslate {points} }
- }
-
-\NewDocumentCommand \printtotalbonus {}
- {
- \TotalExerciseGoal {bonus-points}
- { \, \XSIMtranslate {point} }
- { \, \XSIMtranslate {points} }
- }
-
-% ----------------------------------------------------------------------------
-\NewDocumentCommand \pointsforgrade {m}
- {
- \GetGradeRequirementForGoal {#1} {points}
- { \, \XSIMtranslate {point} }
- { \, \XSIMtranslate {points} }
- }
-
-\NewDocumentCommand \goalsforgrade {mm}
- {
- \GetGradeRequirementForGoals {#2} {#1}
- { \, \XSIMtranslate {point} }
- { \, \XSIMtranslate {points} }
- }
-
-\NewDocumentCommand \totalgoalforgrade {m}
- {
- \GetGradeRequirement {#1}
- { \, \XSIMtranslate {point} }
- { \, \XSIMtranslate {points} }
- }
-
-% ----------------------------------------------------------------------------
-
-\xsim_if_package_blank:F
- {
- \DeclareExerciseType {exercise} {
- exercise-env = exercise ,
- solution-env = solution ,
- exercise-name = \XSIMtranslate {exercise} ,
- exercises-name = \XSIMtranslate {exercises} ,
- solution-name = \XSIMtranslate {solution} ,
- solutions-name = \XSIMtranslate {solutions} ,
- exercise-template = default ,
- solution-template = default ,
- exercise-heading = \subsection* ,
- solution-heading = \subsection*
- }
- }
-
-% ----------------------------------------------------------------------------
-
-\DeclareExerciseEnvironmentTemplate {default}
- {
- \GetExerciseHeadingF { \subsection* }
- {
- \XSIMmixedcase { \GetExerciseName } \nobreakspace
- \GetExerciseProperty {counter}
- \IfInsideSolutionF
- {
- \IfExercisePropertySetT {subtitle}
- { ~ { \normalfont \itshape \GetExerciseProperty {subtitle} } }
- }
- }
- \GetExercisePropertyT {points}
- {
- \marginpar
- {
- \IfInsideSolutionF { \rule {1.2cm} {1pt} \slash }
- \printgoal {\PropertyValue}
- \GetExercisePropertyT {bonus-points}
- { \nobreakspace ( + \printgoal {\PropertyValue} ) }
- \nobreakspace\XSIMtranslate {point-abbr}
- }
- }
- }
- { \par }
-
-% ----------------------------------------------------------------------------
-
-\DeclareExerciseHeadingTemplate {none} {}
-
-\DeclareExerciseHeadingTemplate {default}
- { \section* { \XSIMtranslate {default-heading} } }
-
-\DeclareExerciseHeadingTemplate {collection}
- { \section* { \XSIMtranslate {collection-heading} } }
-
-\DeclareExerciseHeadingTemplate {per-section}
- { \section* { \XSIMtranslate {per-section-heading} } }
-
-\DeclareExerciseHeadingTemplate {per-chapter}
- { \section* { \XSIMtranslate {per-chapter-heading} } }
-
-% ----------------------------------------------------------------------------
-
-\RequirePackage{array,booktabs}
-
-\DeclareExerciseTableTemplate {default*}
- {
- \XSIMputright \ExerciseTableCode
- {
- \toprule
- \XSIMifblankTF {\ExerciseType}
- {}
- { \XSIMmixedcase { \GetExerciseParameter {exercise-name} } }
- &
- }
- \ForEachUsedExerciseByType
- {
- \XSIMifeqTF {#1} { \ExerciseTableType {#1} }
- {
- \XSIMifblankTF { \ExerciseType }
- {
- \XSIMputright \ExerciseTableCode
- {
- \XSIMmixedcase
- { \ExerciseParameterGet {#1} {exercise-name} ~ }
- }
- }
- {}
- \XSIMputright \ExerciseTableCode { #3 & }
- }
- {}
- }
- \XSIMputright \ExerciseTableCode
- {
- \XSIMtranslate {total} \\
- \midrule \XSIMmixedcase { \XSIMtranslate {points} } &
- }
- \ForEachUsedExerciseByType
- {
- \XSIMifeqTF {#1} { \ExerciseTableType {#1} }
- {
- \XSIMputright \ExerciseTableCode
- { \XSIMifblankTF {#5} {\printgoal{0}} {\printgoal{#5}} & }
- }
- {}
- }
- \XSIMputright \ExerciseTableCode
- {
- \XSIMifblankTF {\ExerciseType}
- { \TotalExerciseGoal {points} {} {} }
- { \TotalExerciseTypeGoal {\ExerciseType} {points} {} {} }
- \\ \midrule
- \XSIMtranslate {reached} &
- }
- \ForEachUsedExerciseByType
- {
- \XSIMifeqTF {#1} { \ExerciseTableType {#1} }
- { \XSIMputright \ExerciseTableCode {&} }
- {}
- }
- \XSIMputright \ExerciseTableCode { \\ \bottomrule }
- \def\numberofcolumns{
- \XSIMifblankTF {\ExerciseType}
- {\numberofusedexercises}
- {\csname numberof \ExerciseType s\endcsname}
- }
- \XSIMifeqF{\numberofcolumns}{0}
- {
- \begin {tabular} {l*{\numberofcolumns}{c}c}
- \ExerciseTableCode
- \end {tabular}
- }
- }
-
-\DeclareExerciseTableTemplate {default}
- {
- \XSIMputright \ExerciseTableCode
- {
- \toprule
- \XSIMifblankTF {\ExerciseType}
- {}
- { \XSIMmixedcase { \GetExerciseParameter {exercise-name} } }
- &
- \XSIMmixedcase { \XSIMtranslate {points} } &
- \XSIMtranslate {reached} \\
- \midrule
- }
- \ForEachUsedExerciseByType
- {
- \XSIMifeqTF {#1} { \ExerciseTableType {#1} }
- {
- \XSIMifblankTF { \ExerciseType }
- {
- \XSIMputright \ExerciseTableCode
- {
- \XSIMmixedcase
- { \ExerciseParameterGet {#1} {exercise-name} ~ }
- }
- }
- {}
- \XSIMputright \ExerciseTableCode
- { #3 & \XSIMifblankTF {#5} {\printgoal{0}} {\printgoal{#5}} & \\ }
- }
- {}
- }
- \XSIMputright \ExerciseTableCode
- {
- \midrule
- \XSIMtranslate {total} &
- \XSIMifblankTF {\ExerciseType}
- { \TotalExerciseGoal {points} {} {} }
- { \TotalExerciseTypeGoal {\ExerciseType} {points} {} {} } &
- \\ \bottomrule
- }
- \XSIMexpandcode
- {
- \noexpand \begin {tabular} {\XSIMifblankTF{\ExerciseType}{l}{c}cc}
- \noexpand \ExerciseTableCode
- \noexpand \end {tabular}
- }
- }
-
-% ----------------------------------------------------------------------------
-
-\DeclareExerciseTranslations {exercise} {
- Fallback = exercise ,
- English = exercise ,
- French = exercice ,
- German = \"Ubung
-}
-
-\DeclareExerciseTranslations {exercises} {
- Fallback = exercises ,
- English = exercises ,
- French = exercices ,
- German = \"Ubungen
-}
-
-\DeclareExerciseTranslations {question} {
- Fallback = question ,
- English = question ,
- French = question ,
- German = Aufgabe
-}
-
-\DeclareExerciseTranslations {questions} {
- Fallback = questions ,
- English = questions ,
- French = questions ,
- German = Aufgaben
-}
-
-\DeclareExerciseTranslations {solution} {
- Fallback = solution ,
- English = solution ,
- French = solution ,
- German = L\"osung
-}
-
-\DeclareExerciseTranslations {solutions} {
- Fallback = solutions ,
- English = solutions ,
- French = solutions ,
- German = L\"osungen
-}
-
-\DeclareExerciseTranslations {point-abbr} {
- Fallback = p. ,
- English = p. ,
- French = p. ,
- German = P.
-}
-
-\DeclareExerciseTranslations {point} {
- Fallback = point ,
- English = point ,
- French = point ,
- German = Punkt
-}
-
-\DeclareExerciseTranslations {points} {
- Fallback = points ,
- English = points ,
- French = points ,
- German = Punkte
-}
-
-\DeclareExerciseTranslations {reached} {
- Fallback = reached ,
- English = reached ,
- French = obtenus ,
- German = erreicht
-}
-
-\DeclareExerciseTranslations {total} {
- Fallback = total ,
- English = total ,
- French = total ,
- German = insgesamt
-}
-
-\DeclareExerciseTranslations {default-heading} {
- Fallback = \XSIMmixedcase { \GetExerciseParameter {solutions-name} }~
- to~ the~ \XSIMmixedcase { \GetExerciseParameter {exercises-name} } ,
- English = \XSIMmixedcase { \GetExerciseParameter {solutions-name} }~
- to~ the~ \XSIMmixedcase { \GetExerciseParameter {exercises-name} } ,
- French = \XSIMmixedcase { \GetExerciseParameter {solutions-name} ~
- des~ \GetExerciseParameter {exercises-name} } ,
- German = \XSIMmixedcase { \GetExerciseParameter {solutions-name} }~
- zu~ den~ \XSIMmixedcase { \GetExerciseParameter {exercises-name} }
-}
-
-\DeclareExerciseTranslations {collection-heading} {
- Fallback = \XSIMmixedcase { \GetExerciseParameter {exercises-name} } ,
- English = \XSIMmixedcase { \GetExerciseParameter {exercises-name} } ,
- French = \XSIMmixedcase { \GetExerciseParameter {exercises-name} } ,
- German = \XSIMmixedcase { \GetExerciseParameter {exercises-name} }
-}
-
-\DeclareExerciseTranslations {per-section-heading} {
- Fallback = \XSIMmixedcase { \GetExerciseParameter {solutions-name} } ~
- to~ the~ \XSIMmixedcase { \GetExerciseParameter {exercises-name} } ~
- of~ Section \nobreakspace \ExerciseSection ,
- English = \XSIMmixedcase { \GetExerciseParameter {solutions-name} } ~
- to~ the~ \XSIMmixedcase { \GetExerciseParameter {exercises-name} } ~
- of~ Section \nobreakspace \ExerciseSection ,
- French = \XSIMmixedcase { \GetExerciseParameter {solutions-name} ~
- des~ \GetExerciseParameter {exercises-name} ~ de~ la~
- section \nobreakspace \ExerciseSection } ,
- German = \XSIMmixedcase { \GetExerciseParameter {solutions-name} } ~
- zu~ den~ \XSIMmixedcase { \GetExerciseParameter {exercises-name} }~
- in~ Abschnitt \nobreakspace \ExerciseSection
-}
-
-\DeclareExerciseTranslations {per-chapter-heading} {
- Fallback = \XSIMmixedcase { \GetExerciseParameter {solutions-name} } ~
- to~ the~ \XSIMmixedcase { \GetExerciseParameter {exercises-name} } ~
- of~ Chapter \nobreakspace \ExerciseChapter ,
- English = \XSIMmixedcase { \GetExerciseParameter {solutions-name} } ~
- to~ the~ \XSIMmixedcase { \GetExerciseParameter {exercises-name} } ~
- of~ Chapter \nobreakspace \ExerciseChapter ,
- French = \XSIMmixedcase { \GetExerciseParameter {solutions-name} ~
- des~ \GetExerciseParameter {exercises-name} ~
- du~ chapitre \nobreakspace \ExerciseChapter } ,
- German = \XSIMmixedcase { \GetExerciseParameter {solutions-name} } ~
- zu~ den~ \XSIMmixedcase { \GetExerciseParameter {exercises-name} } ~
- in~ Kapitel \nobreakspace \ExerciseChapter
-}
-
-% ----------------------------------------------------------------------------
-\file_input_stop:
-
-2019/02/17 - fix issue #39 (error in German translations)
-2020/02/19 - implement issue #33 (solution property)
-2020/02/20 - implement issue #31 (blank package option)
diff --git a/macros/latex/contrib/xsim/code/xsim.environments.code.tex b/macros/latex/contrib/xsim/code/xsim.environments.code.tex
deleted file mode 100644
index ca5f76f80a..0000000000
--- a/macros/latex/contrib/xsim/code/xsim.environments.code.tex
+++ /dev/null
@@ -1,529 +0,0 @@
-% ----------------------------------------------------------------------------
-% the XSIM package - environments module
-%
-% eXercise Sheets IMproved
-%
-% ----------------------------------------------------------------------------
-% Clemens Niederberger
-% Web: https://github.com/cgnieder/xsim
-% E-Mail: contact@mychemistry.eu
-% ----------------------------------------------------------------------------
-% Copyright 2017--2020 Clemens Niederberger
-%
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% ----------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% ----------------------------------------------------------------------------
-\XSIMmodule{environments}{generic code for exercise and solution environments}
-
-\xsim_load_modules:n {templates,verbwrite}
-
-\xsim_if_write_to_files:F
- {
- \xsim_declare_property:nnnn
- { \c_false_bool }
- { \c_false_bool }
- { \c_false_bool }
- {solution-body}
- \xsim_declare_property:nnnn
- { \c_false_bool }
- { \c_false_bool }
- { \c_false_bool }
- {exercise-body}
- }
-
-\tl_new:N \l__xsim_file_name_signature_tl
-\tl_new:N \l__xsim_file_path_tl
-\tl_new:N \l__xsim_file_path_and_name_tl
-\tl_new:N \l__xsim_file_name_tl
-\tl_new:N \l__xsim_file_extension_tl
-\tl_new:N \l__xsim_solution_tl
-\bool_new:N \l__xsim_options_given_bool
-\bool_new:N \l__xsim_insert_mode_bool
-
-\tl_new:N \ExerciseText
-\tl_set:Nn \ExerciseText { \msg_error:nn {xsim} {only-in-solution} }
-
-% ----------------------------------------------------------------------------
-
-\msg_new:nnn {xsim} {only-in-solution}
- {
- You~ can't~ use~ \token_to_str:N \ExerciseText \c_space_tl inside~ an~
- exercise.~ It~ is~ only~ allowed~ inside~ solution~ environments!
- }
-
-% ----------------------------------------------------------------------------
-
-\keys_define:nn {xsim}
- {
- path .tl_set:N = \l__xsim_file_path_tl ,
- file-extension .tl_set:N = \l__xsim_file_extension_tl ,
- file-extension .initial:n = tex
- }
-
-% ----------------------------------------------------------------------------
-
-\tl_const:Nn \c__xsim_comment_line_tl { \c__xsim_percent_char_tl }
-\tl_const:Nn \c__xsim_comment_line_fill_tl { \prg_replicate:nn {72} {-} }
-\tl_const:Nn \c__xsim_comment_line_indent_tl { \c_space_tl \c_space_tl }
-
-\cs_new:Npn \__xsim_comment_line_and_feed:n #1
- { \__xsim_comment_line:n {#1} ^^J }
-
-\cs_new:Npn \__xsim_comment_line:n #1
- {
- \c__xsim_comment_line_tl
- \tl_if_blank:nF {#1} { \c_space_tl }
- #1
- }
-
-\cs_new:Npn \__xsim_two_digits:n #1
- { \int_compare:nT { #1 < 10 } {0} \int_eval:n {#1} }
-
-% #1: type
-% #2: id
-% #3: exercise|solution
-\cs_new_protected:Npn \__xsim_set_file_signature:nnn #1#2#3
- { \tl_set:Nn \l__xsim_file_name_signature_tl {#1-#2-#3} }
-\cs_generate_variant:Nn \__xsim_set_file_signature:nnn {nx,nV}
-
-\tl_set:Nn \l__xsim_file_name_tl
- { \c_sys_jobname_str - \l__xsim_file_name_signature_tl -body . \l__xsim_file_extension_tl }
-
-\tl_set:Nn \l__xsim_file_path_and_name_tl
- {
- \tl_if_blank:VF \l__xsim_file_path_tl
- { \l__xsim_file_path_tl / }
- \l__xsim_file_name_tl
- }
-
-% #1: type
-% #2: id
-% #3: exercise|solution
-% #4: file name
-% #5: path
-\cs_new_protected:Npn \__xsim_file_info:nnnnn #1#2#3#4#5
- {
- \tl_set:Nn \l_xsim_file_begin_tl
- {
- \__xsim_comment_line_and_feed:n { \c__xsim_comment_line_fill_tl }
- \__xsim_comment_line_and_feed:n {file~ `#4'}
- \tl_if_blank:nF {#5}
- {
- \__xsim_comment_line_and_feed:n
- { \c__xsim_comment_line_indent_tl in~ folder~ `#5/'}
- }
- \__xsim_comment_line_and_feed:n {}
- \__xsim_comment_line_and_feed:n
- {
- \c__xsim_comment_line_indent_tl
- \c__xsim_comment_line_indent_tl
- #3~ of~ type~ `#1'~ with~ id~ `#2'
- }
- \__xsim_comment_line_and_feed:n {}
- \__xsim_comment_line_and_feed:n
- {generated~ by~ the~ `\@currenvir'~ environment~ of~ the}
- \__xsim_comment_line_and_feed:n
- {
- \c__xsim_comment_line_indent_tl
- `xsim'~ package~ v \c_xsim_version_tl
- \c_space_tl (\c_xsim_date_tl)
- }
- \__xsim_comment_line_and_feed:n
- {
- from~ source~ `\c_sys_jobname_str'~ on~
- \int_use:N \c_sys_year_int /
- \__xsim_two_digits:n { \c_sys_month_int } /
- \__xsim_two_digits:n { \c_sys_day_int } ~
- \msg_line_context:
- }
- \__xsim_comment_line:n { \c__xsim_comment_line_fill_tl }
- }
- }
-\cs_generate_variant:Nn \__xsim_file_info:nnnnn {nnnVV}
-
-% ----------------------------------------------------------------------------
-% #1: type
-% #2: id
-% #3: exercise|solution
-% #4: potential environment body
-\cs_new_protected:Npn \xsim_save_environment_body:nnnn #1#2#3#4
- {
- \xsim_if_write_to_files:TF
- { \__xsim_write_environment_body:nnn {#1} {#2} {#3} }
- { \__xsim_save_environment_body:nnnn {#1} {#2} {#3} {#4} }
- }
-
-\cs_new_protected:Npn \xsim_save_environment_body_end:
- {
- \xsim_if_write_to_files:TF
- { \__xsim_write_environment_body_end: }
- { \__xsim_save_environment_body_end: }
- }
-
-% writing to files:
-% #1: type
-% #2: id
-% #3: exercise|solution
-\cs_new_protected:Npn \__xsim_write_environment_body:nnn #1#2#3
- {
- \xsim_verbose:n
- { Starting~ to~ write~ #3~ environment~ type~ `#1'~ id~ `#2' }
- \__xsim_set_file_signature:nnn {#1} {#2} {#3}
- \__xsim_file_info:nnnVV {#1} {#2} {#3}
- \l__xsim_file_name_tl
- \l__xsim_file_path_tl
- \int_zero:N \l_xsim_line_gobble_int
- \xsim_file_write_start:nV
- { \l__xsim_options_given_bool }
- \l__xsim_file_path_and_name_tl
- }
-
-\cs_new_protected:Npn \__xsim_write_environment_body_end:
- { \xsim_file_write_stop: }
-
-% saving to property lists:
-% #1: type
-% #2: id
-% #3: exercise|solution
-% #4: environment body
-\cs_new_protected:Npn \__xsim_save_environment_body:nnnn #1#2#3#4
- {
- \xsim_verbose:n { Saving~ #3~ environment~ type~ `#1'~ id~ `#2' }
- \xsim_set_property:nnnn {#1} {#2} {#3-body} {#4}
- }
-
-\cs_new:Npn \__xsim_save_environment_body_end: { }
-
-% ----------------------------------------------------------------------------
-% #1: type
-% #2: exercise|solution
-% #3: hook
-\cs_new_protected:Npn \xsim_new_hook:nnn #1#2#3
- {
- \xsim_verbose:n { Defining~ new~ #1~ (#2)~ hook~ `#3' }
- \tl_new:c {l__xsim_#1_#2_#3_hook_tl}
- \keys_define:nx {xsim}
- {
- \xsim_get_parameter:nn {#1} {#2-env}/#3-hook .tl_set:N =
- \exp_not:c {l__xsim_#1_#2_#3_hook_tl}
- }
- }
-
-% #1: type
-% #2: exercise|solution
-% #3: hook
-\cs_new:Npn \xsim_use_hook:nnn #1#2#3
- { \exp_not:v {l__xsim_#1_#2_#3_hook_tl} }
-
-% #1: type
-% #2: exercise|solution
-% #3: hook
-% #4: code
-\cs_new_protected:Npn \xsim_set_hook:nnnn #1#2#3#4
- {
- \xsim_verbose:n { Setting~ #1~ (#2)~ hook~ `#3' }
- \tl_set:cn {l__xsim_#1_#2_#3_hook_tl} {#4}
- }
-
-% #1: type
-% #2: exercise|solution
-% #3: hook
-% #4: code
-\cs_new_protected:Npn \xsim_addto_hook:nnnn #1#2#3#4
- {
- \xsim_verbose:n { Adding~ to~ #1~ (#2)~ hook~ `#3' }
- \tl_put_right:cn {l__xsim_#1_#2_#3_hook_tl} {#4}
- }
-
-% ----------------------------------------------------------------------------
-
-% #1: type
-% #2: id
-% #3: exercise|solution
-% #4: potential enironment body
-\cs_new_protected:Npn \xsim_start_environment:nnnn #1#2#3#4
- { \xsim_save_environment_body:nnnn {#1} {#2} {#3} {#4} }
-\cs_generate_variant:Nn \xsim_start_environment:nnnn {nV}
-
-% #1: type
-% #2: id
-% #3: exercise|solution
-\cs_new_protected:Npn \xsim_stop_environment:nnn #1#2#3
- {
- \xsim_save_environment_body_end:
- \xsim_if_print:nnnTF {#1} {#2} {#3}
- { \xsim_typeset_environment:nnn {#1} {#2} {#3} }
- { \xsim_use_hook:nnn {#1} {#3} {print-false} }
- }
-\cs_generate_variant:Nn \xsim_stop_environment:nnn {nV}
-
-% #1: type
-% #2: id
-% #3: exercise|solution
-\cs_new_protected:Npn \xsim_typeset_environment:nnn #1#2#3
- {
- \tl_set:Nn \ExerciseType {#1}
- \tl_set:Nn \ExerciseID {#2}
- \xsim_if_exchange:nnnT {#1} {#2} {#3}
- { \__xsim_set_file_signature:nnn {#1} {#2} {exercise} }
- \xsim_verbose:n
- { Typesetting~ #3~ environment~ type~ `#1'~ id~ `#2' }
- \xsim_use_hook:nnn {#1} {#3} {pre}
- \xsim_use_template:nx
- {begin}
- { \xsim_get_parameter:nn {#1} {#3-template} }
- \xsim_use_hook:nnn {#1} {#3} {begin}
- \xsim_if_write_to_files:TF
- {
- \file_if_exist:nTF { \exp_not:V \l__xsim_file_path_and_name_tl }
- { \file_input:n { \exp_not:V \l__xsim_file_path_and_name_tl } }
- {
- \xsim_verbose:n
- { File~ `\l__xsim_file_path_and_name_tl'~ doesn't~ exist. }
- }
- }
- {
- \xsim_if_exchange:nnnTF {#1} {#2} {#3}
- { \xsim_get_property:nnn {#1} {#2} {exercise-body} }
- { \xsim_get_property:nnn {#1} {#2} {#3-body} }
- }
- \xsim_synchronize_goals:nn {#1} {#2}
- \str_if_eq:nnT {#3} {exercise}
- { \xsim_update_goals:nn {#1} {#2} }
- \xsim_use_hook:nnn {#1} {#3} {end}
- \xsim_use_template:nx
- {end}
- { \xsim_get_parameter:nn {#1} {#3-template} }
- \xsim_use_hook:nnn {#1} {#3} {post}
- }
-
-% #1: type
-% #2: id
-% #3: exercise|solution
-\prg_new_conditional:Npnn \xsim_if_exchange:nnn #1#2#3 {T,F,TF}
- {
- \str_if_eq:nnTF {#3} {solution}
- {
- \xsim_if_boolean_property:nnnTF {#1} {#2} {solution}
- { \prg_return_true: }
- { \prg_return_false: }
- }
- { \prg_return_false: }
- }
-
-% #1: type
-% #2: id
-% #3: exercise|solution
-\prg_new_protected_conditional:Npnn \xsim_if_exist:nnn #1#2#3 {T,F,TF}
- {
- \xsim_if_write_to_files:TF
- {
- \__xsim_set_file_signature:nnn {#1} {#2} {#3}
- \file_if_exist:VTF \l__xsim_file_path_and_name_tl
- { \prg_return_true: }
- { \prg_return_false: }
- }
- {
- \xsim_if_property_exist:nTF {#3-body}
- {
- \xsim_if_property_set:nnnTF {#1} {#2} {#3-body}
- { \prg_return_true: }
- { \prg_return_false: }
- }
- { \prg_return_false: }
- }
- }
-
-% #1: type
-% #2: id
-% #3: options
-% #4: exercise|solution
-\cs_new_protected:Npn \xsim_insert:nnnn #1#2#3#4
- {
- \xsim_if_exchange:nnnTF {#1} {#2} {#4}
- { \xsim_if_exist:nnnTF {#1} {#2} {exercise} }
- { \xsim_if_exist:nnnTF {#1} {#2} {#4} }
- {
- \xsim_verbose:n
- { Inserting~ #4~ type~ `#1'~ id~ `#2'. }
- \group_begin:
- \xsim_insert_mode:
- \use:c {xsim_start_#4:nn} {#1} {#3}
- \tl_set:Nn \ExerciseType {#1}
- \tl_set:Nn \ExerciseID {#2}
- \str_if_eq:nnT {#4} {exercise}
- {
- \xsim_if_boolean_property:nnnF {#1} {#2} {used}
- {
- \xsim_step_exercise_counter:nn {#1} {#2}
- \xsim_set_properties:nnx {#1} {#2}
- {
- page-value = \the\value{page} ,
- page = \thepage ,
- section-value = \the\value{section} ,
- section = \thesection
- }
- \xsim_synchronize_goals:nn {#1} {#2}
- \xsim_update_goals:nn {#1} {#2}
- }
- \xsim_if_property_exist:nT {chapter}
- {
- \xsim_set_properties:nnx {#1} {#2}
- {
- chapter-value = \the\value{chapter} ,
- chapter = \thechapter
- }
- }
- \xsim_set_properties:nnn {#1} {#2}
- { print=true , used=true }
- }
- \str_if_eq:nnT {#4} {solution}
- {
- \xsim_if_write_to_files:TF
- {
- \__xsim_set_file_signature:nnn {#1} {#2} {exercise}
- \file_get:nnN {\l__xsim_file_path_and_name_tl} {} \ExerciseText
- \tl_trim_spaces:N \ExerciseText
- }
- {
- \tl_set:Nx \ExerciseText
- { \xsim_get_property:nnn {#1} {#2} {exercise-body} }
- }
- }
- \use:x
- {
- \xsim_use_hook:nnn {#1} {#4} {pre}
- \xsim_use_template:nn
- {begin}
- { \xsim_get_parameter:nn {#1} {#4-template} }
- \xsim_use_hook:nnn {#1} {#4} {begin}
- \xsim_input:nnn {#1} {#2} {#4}
- \xsim_use_hook:nnn {#1} {#4} {end}
- \xsim_use_template:nn
- {end}
- { \xsim_get_parameter:nn {#1} {#4-template} }
- \xsim_use_hook:nnn {#1} {#4} {post}
- }
- \group_end:
- }
- {
- \xsim_if_write_to_files:T
- {
- \xsim_verbose:x
- { File~ `\l__xsim_file_path_and_name_tl'~ doesn't~ exist. }
- }
- }
- }
-\cs_generate_variant:Nn \xsim_insert:nnnn {nV,VV,nnnV,xx,ne}
-
-% #1: type
-% #2: id
-% #3: exercise|solution
-\cs_new_protected:Npn \xsim_input:nnn #1#2#3
- {
- \group_begin:
- \xsim_if_write_to_files:TF
- {
- \xsim_if_exchange:nnnTF {#1} {#2} {#3}
- { \__xsim_set_file_signature:nnn {#1} {#2} {exercise} }
- { \__xsim_set_file_signature:nnn {#1} {#2} {#3} }
- \file_input:n { \l__xsim_file_path_and_name_tl }
- }
- {
- \xsim_if_exchange:nnnTF {#1} {#2} {#3}
- { \xsim_get_property:nnn {#1} {#2} {exercise-body} }
- { \xsim_get_property:nnn {#1} {#2} {#3-body} }
- }
- \group_end:
- }
-\cs_generate_variant:Nn \xsim_input:nnn {oo}
-
-\prg_new_conditional:Npnn \xsim_if_insert_mode: {T,F,TF}
- {
- \bool_if:NTF \l__xsim_insert_mode_bool
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-\cs_new_protected:Npn \xsim_insert_mode:
- { \bool_set_true:N \l__xsim_insert_mode_bool }
-
-% ----------------------------------------------------------------------------
-
-% #1: type
-% #2: exercise|solution
-\cs_new_protected:Npn \xsim_new_environment:nn #1#2
- {
- \xsim_verbose:n { Defining~ #2~ environment~ type~ `#1'. }
- \xsim_new_hook:nnn {#1} {#2} {pre}
- \xsim_new_hook:nnn {#1} {#2} {begin}
- \xsim_new_hook:nnn {#1} {#2} {end}
- \xsim_new_hook:nnn {#1} {#2} {post}
- \xsim_new_hook:nnn {#1} {#2} {print-false}
- \xsim_if_write_to_files:TF
- {
- \NewDocumentEnvironment
- { \xsim_get_parameter:nn {#1} {#2-env} } {!o}
- {
- \IfNoValueTF {##1}
- {
- \bool_set_false:N \l__xsim_options_given_bool
- \use:c {xsim_start_#2:nn} {#1} {}
- }
- {
- \bool_set_true:N \l__xsim_options_given_bool
- \use:c {xsim_start_#2:nn} {#1} {##1}
- }
- \xsim_start_environment:nVnn {#1} \g_xsim_exercise_id_tl {#2} { }
- }
- {
- \xsim_stop_environment:nVn {#1} \g_xsim_exercise_id_tl {#2}
- \use:c {xsim_stop_#2:n} {#1}
- }
- }
- {
- \NewDocumentEnvironment
- { \xsim_get_parameter:nn {#1} {#2-env} } {o+b}
- {
- \IfNoValueTF {##1}
- {
- \bool_set_false:N \l__xsim_options_given_bool
- \use:c {xsim_start_#2:nn} {#1} {}
- }
- {
- \bool_set_true:N \l__xsim_options_given_bool
- \use:c {xsim_start_#2:nn} {#1} {##1}
- }
- \xsim_start_environment:nVnn {#1} \g_xsim_exercise_id_tl {#2} {##2}
- }
- {
- \xsim_stop_environment:nVn {#1} \g_xsim_exercise_id_tl {#2}
- \use:c {xsim_stop_#2:n} {#1}
- }
- }
- }
-
-% ----------------------------------------------------------------------------
-\file_input_stop:
-
-2019/02/17 - fix issue #43
-2019/10/03 - add possibility to save environment bodies to property list
-2020/02/15 - remove spurious \par at the beginning and end of typeset
- exercises and solutions
-2020/02/19 - implement issue #33 (solution property)
-2020/02/20 - fix issue #27
- - implement issue #2
-2020/03/08 - correctly re-set \ExerciseType and \ExerciseID for typesetting
- (they're no longer local)
diff --git a/macros/latex/contrib/xsim/code/xsim.exercises.code.tex b/macros/latex/contrib/xsim/code/xsim.exercises.code.tex
deleted file mode 100644
index 5314369ffa..0000000000
--- a/macros/latex/contrib/xsim/code/xsim.exercises.code.tex
+++ /dev/null
@@ -1,637 +0,0 @@
-% ----------------------------------------------------------------------------
-% the XSIM package - exercises module
-%
-% eXercise Sheets IMproved
-%
-% ----------------------------------------------------------------------------
-% Clemens Niederberger
-% Web: https://github.com/cgnieder/xsim
-% E-Mail: contact@mychemistry.eu
-% ----------------------------------------------------------------------------
-% Copyright 2017--2020 Clemens Niederberger
-%
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% ----------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% ----------------------------------------------------------------------------
-\XSIMmodule{exercises}{main exercises definitions}
-
-\xsim_load_modules:n
- {
- base, properties, environments, templates, solutions, tags, goals,
- collections
- }
-
-\seq_new:N \l__xsim_exercise_types_seq
-\seq_new:N \l__xsim_parameters_seq
-\seq_new:N \l__xsim_fixed_parameters_seq
-\seq_new:N \l__xsim_mandatory_parameters_seq
-\int_gzero_new:N \g_xsim_id_int
-\int_gzero_new:N \g_xsim_max_id_int
-\tl_new:N \l_xsim_current_id_tl
-\tl_new:N \g_xsim_exercise_id_tl
-\tl_new:N \g_xsim_exercise_type_tl
-\tl_new:N \ExerciseID
-\tl_new:N \ExerciseType
-\bool_new:N \l____xsim_print_bool
-
-% ----------------------------------------------------------------------------
-
-\msg_new:nnn {xsim} {parameter-fixed}
- {
- You~ tried~ to~ set~ parameter~ `#2'~ for~ type~ `#1'~ \msg_line_context:
- . ~ However,~ parameter~ `#2'~ is~ a~ fixed~ parameter~ that~ already~
- has~ been~ set~ for~ type~ `#1'.~ Its~ value~ can't~ be~ changed!
- }
-
-\msg_new:nnn {xsim} {type-exists}
- {
- You~ try~ to~ define~ exercise~ type~ `#1'~ \msg_line_context: .~
- However,~ the~ exercise~ type~ `#1'~ already~ exists.
- }
-
-\msg_new:nnn {xsim} {mandatory-parameter}
- {
- You~ forget~ to~ set~ the~ mandatory~ parameter~ `#1'~ when~ defining~
- exercise~ type~ `#2'.
- }
-
-\msg_new:nnn {xsim} {unknown-parameter}
- {
- You~ tried~ to~ retrieve~ the~ parameter~ `#1'~ \msg_line_context: . \\
- This~ parameter~ does~ not~ exist.~ Check~ for~ a~ typo~ or~ \\
- define~ the~ parameter~ yourself.
- }
-
-% ----------------------------------------------------------------------------
-% #1: type
-% #2: parameter
-% #3: value
-\cs_new_protected:Npn \__xsim_set_parameter_type:nnn #1#2#3
- { \xsim_attribute_set:nnn {#1} {#2} {#3} }
-
-% #1: type
-% #2: parameter
-\cs_new:Npn \xsim_get_parameter:nn #1#2
- { \xsim_attribute_get:nn {#1} {#2} }
-\cs_generate_variant:Nn \xsim_get_parameter:nn {o}
-
-% #1: type
-% #2: parameter
-\prg_new_conditional:Npnn \xsim_if_parameter_set:nn #1#2 {p,T,F,TF}
- {
- \xsim_attribute_if_set:nnTF {#1} {#2}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-% ----------------------------------------------------------------------------
-
-\xsim_new_list:n {types}
-
-% #1: true|false (fixed parameter)
-% #2: true|false (mandatory parameter)
-% #3: parameter name
-\cs_new_protected:Npn \xsim_declare_parameter:nnn #1#2#3
- {
- \xsim_verbose:n { Declaring~ parameter~ `#3'. }
- \xsim_if_parameter_exist:nF {#3}
- {
- \seq_put_right:Nn \l__xsim_parameters_seq {#3}
- \bool_if:cT {c_#1_bool}
- { \seq_put_right:Nn \l__xsim_fixed_parameters_seq {#3} }
- \bool_if:cT {c_#2_bool}
- { \seq_put_right:Nn \l__xsim_mandatory_parameters_seq {#3} }
- }
- }
-
-\cs_new_protected:Npn \xsim_remove_parameter:n #1
- {
- \xsim_verbose:n { Removing~ parameter~ `#1'. }
- \xsim_if_parameter_exist:nT {#1}
- { \seq_remove_all:Nn \l__xsim_parameters_seq {#1} }
- }
-
-\prg_new_conditional:Npnn \xsim_if_parameter_exist:n #1 {p,T,F,TF}
- {
- \seq_if_in:NnTF \l__xsim_parameters_seq {#1}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-\cs_generate_variant:Nn \xsim_if_parameter_exist:nT {x}
-
-\prg_new_conditional:Npnn \xsim_if_parameter_fixed:n #1 {p,T,F,TF}
- {
- \seq_if_in:NnTF \l__xsim_fixed_parameters_seq {#1}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-% #1: type
-% #2: csv list of parameters
-\cs_new_protected:Npn \xsim_set_parameters:nn #1#2
- {
- \clist_map_inline:nn {#2}
- {
- \seq_set_split:Nnx \l__xsim_tmpa_seq {=} { \tl_trim_spaces:n {##1} }
- \xsim_set_parameter:nxx {#1}
- { \seq_item:Nn \l__xsim_tmpa_seq {1} }
- { \seq_item:Nn \l__xsim_tmpa_seq {2} }
- }
- }
-\cs_generate_variant:Nn \xsim_set_parameters:nn {nx}
-
-% #1: type
-\cs_new_protected:Npn \xsim_check_mandatory_parameters:n #1
- {
- \seq_map_inline:Nn \l__xsim_mandatory_parameters_seq
- {
- \xsim_if_parameter_set:nnF {#1} {##1}
- { \msg_error:nnnn {xsim} {mandatory-parameter} {##1} {#1} }
- }
- }
-
-% #1: type
-\prg_new_conditional:Npnn \xsim_if_type:n #1 {p,T,F,TF}
- {
- \seq_if_in:NnTF \l__xsim_exercise_types_seq {#1}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-% #1: type
-% #2: parameter
-% #3: value
-\cs_new_protected:Npn \xsim_set_parameter:nnn #1#2#3
- {
- \xsim_if_parameter_exist:nT {#2}
- {
- \xsim_if_parameter_fixed:nTF {#1}
- {
- \xsim_if_parameter_set:nnTF {#1} {#2}
- {
- \msg_warning:nnnn {xsim} {parameter-fixed} {#1} {#2}
- \xsim_verbose:n
- {
- Not~ setting~ already~ set~ and~ fixed~ parameter~ `#2'~
- for~ type~ `#1'.
- }
- }
- {
- \xsim_verbose:n
- { Setting~ parameter~ `#2'~ for~ type~ `#1'~ to~ `#3'. }
- \__xsim_set_parameter_type:nnn {#1} {#2} {#3}
- }
- }
- {
- \xsim_verbose:n
- { Setting~ parameter~ `#2'~ for~ type~ `#1'~ to~ `#3'. }
- \__xsim_set_parameter_type:nnn {#1} {#2} {#3}
- }
- }
- }
-\cs_generate_variant:Nn \xsim_set_parameter:nnn {nnx,nxx}
-
-\cs_new:Npn \__xsim_get_parameter_tmp:n #1 {}
-\cs_generate_variant:Nn \__xsim_get_parameter_tmp:n {V}
-
-% #1: type
-% #2: parameter
-\cs_new_protected:Npn \xsim_get_parameter_if_set:nnTF #1#2#3#4
- {
- \group_begin:
- \xsim_if_parameter_exist:nTF {#2}
- {
- \xsim_if_parameter_set:nnTF {#1} {#2}
- {
- \tl_set:Nx \ParameterValue
- { \xsim_get_parameter:nn {#1} {#2} }
- \cs_set:Npn \__xsim_get_parameter_tmp:n ##1 {#3}
- \__xsim_get_parameter_tmp:V \ParameterValue
- }
- {#4}
- }
- { \msg_error:nnn {xsim} {unknown-parameter} {#2} }
- \group_end:
- }
-\cs_new_protected:Npn \xsim_get_parameter_if_set:nnT #1#2#3
- { \xsim_get_parameter_if_set:nnTF {#1} {#2} {#3} {} }
-\cs_new_protected:Npn \xsim_get_parameter_if_set:nnF #1#2#3
- { \xsim_get_parameter_if_set:nnTF {#1} {#2} {} {#3} }
-\cs_generate_variant:Nn \xsim_get_parameter_if_set:nnTF {o}
-
-% ----------------------------------------------------------------------------
-% inside the argument `#1' refers to the type
-\cs_new_protected:Npn \xsim_foreach_exercise_type:n #1
- { \xsim_foreach_new_list_entry:nn {types} {#1} }
-
-\cs_new_protected:Npn \xsim_foreach_exercise_id:n #1
- { \int_step_inline:nnnn {1} {1} { \g_xsim_max_id_int } {#1} }
-
-\cs_new:Npn \__xsim_loop_item:nnnnnn #1#2#3#4#5#6 {}
-\cs_generate_variant:Nn \__xsim_loop_item:nnnnnn {VVxxxx}
-
-% #1: type
-% #2: id
-% #3: boolean property
-\cs_new:Npn \__xsim_deliver_exercise_details:nnn #1#2#3
- {
- \xsim_if_in_list:nnT {#3} {#1-#2=={true}}
- {
- \tl_set_rescan:Nnx \l__xsim_tmpa_tl {} {#1}
- \tl_set_rescan:Nnx \l__xsim_tmpb_tl {} {#2}
- \__xsim_loop_item:VVxxxx
- \l__xsim_tmpa_tl % #1
- \l__xsim_tmpb_tl % #2
- { \xsim_get_property:nnn {#1} {#2} {counter} } % #3
- { \xsim_get_property:nnn {#1} {#2} {subtitle} } % #4
- { \xsim_get_property:nnn {#1} {#2} {points} } % #5
- { \xsim_get_property:nnn {#1} {#2} {bonus-points} } % #6
- }
- }
-
-% #1: boolean property
-% #2: loop code
-\xsim_define_loop_macro:Nnn \xsim_foreach_exercise_type_id:nn
- {nnnnnn}
- {
- \xsim_foreach_exercise_type:n
- {
- \xsim_foreach_exercise_id:n
- { \__xsim_deliver_exercise_details:nnn {##1} {####1} {#1} }
- }
- }
-
-\xsim_define_loop_macro:Nnn \xsim_foreach_exercise_id_type:nn
- {nnnnnn}
- {
- \xsim_foreach_exercise_id:n
- {
- \xsim_foreach_exercise_type:n
- { \__xsim_deliver_exercise_details:nnn {####1} {##1} {#1} }
- }
- }
-
-\cs_new_protected:Npn \xsim_define_exercise_type_variables:n #1
- {
- \seq_put_right:Nn \l__xsim_exercise_types_seq {#1}
- \bool_new:c {l__xsim_#1_solution_print_bool}
- \bool_new:c {l__xsim_#1_exercise_print_bool}
- \bool_new:c {l__xsim_#1_exercise_use_bool}
- }
-
-\cs_new_protected:Npn \xsim_define_counters:n #1
- {
- \xsim_verbose:n { Defining~ counters~ for~ new~ exercise~ type~ `#1' }
- \cs_if_exist:cF { c@ \xsim_get_parameter:nn {#1} {counter} }
- { \newcounter { \xsim_get_parameter:nn {#1} {counter} } }
- \cs_if_exist:cF { c@ \xsim_get_parameter:nn {#1} {solution-counter} }
- { \newcounter { \xsim_get_parameter:nn {#1} {solution-counter} } }
- \cs_if_exist:cF { c@ number of \xsim_get_parameter:nn {#1} {exercise-env} s }
- { \newcounter { number of \xsim_get_parameter:nn {#1} {exercise-env} s } }
- }
-
-% #1: type
-% #2: id
-\cs_new_protected:Npn \xsim_step_exercise_counter:nn #1#2
- {
- \refstepcounter { \xsim_get_parameter:nn {#1} {counter} }
- \xsim_set_properties:nnx {#1} {#2}
- {
- counter = \use:c { the \xsim_get_parameter:nn {#1} {counter} } ,
- counter-value = \arabic { \xsim_get_parameter:nn {#1} {counter} }
- }
- }
-\cs_generate_variant:Nn \xsim_step_exercise_counter:nn {nV}
-
-% #1: type
-\cs_new_protected:Npn \xsim_declare_exercise_type:nn #1#2
- {
- \xsim_if_type:nTF {#1}
- { \msg_error:nnn {xsim} {type-exists} {#1} }
- {
- \xsim_verbose:n { Declaring~ new~ exercise~ type~ `#1'. }
- \xsim_define_exercise_type_variables:n {#1}
- \xsim_add_to_list:nn {types} {#1}
- \xsim_set_parameters:nn {#1} {#2}
- \xsim_set_parameter:nnx {#1} {number}
- { number of \xsim_get_parameter:nn {#1} {exercise-env} s }
- \xsim_check_mandatory_parameters:n {#1}
- \xsim_if_parameter_set:nnF {#1} {exercises-name}
- {
- \xsim_set_parameters:nn {#1}
- { exercises-name = \xsim_get_parameter:nn {#1} {exercise-name} s }
- }
- \xsim_if_parameter_set:nnF {#1} {solutions-name}
- {
- \xsim_set_parameters:nn {#1}
- { solutions-name = \xsim_get_parameter:nn {#1} {solution-name} s }
- }
- \xsim_if_parameter_set:nnF {#1} {counter}
- {
- \xsim_set_parameters:nx {#1}
- { counter = \xsim_get_parameter:nn {#1} {exercise-env} }
- }
- \xsim_if_parameter_set:nnF {#1} {solution-counter}
- {
- \xsim_set_parameters:nx {#1}
- { solution-counter = \xsim_get_parameter:nn {#1} {solution-env} }
- }
- \xsim_define_counters:n {#1}
- \xsim_verbose:n { Defining~ options~ for~ new~ exercise~ type~ `#1' }
- \keys_define:nx {xsim}
- {
- \xsim_get_parameter:nn {#1} {solution-env} / print
- .bool_set:N = \exp_not:c {l__xsim_#1_solution_print_bool} ,
- \xsim_get_parameter:nn {#1} {solution-env} / print
- .initial:n = false ,
- \xsim_get_parameter:nn {#1} {exercise-env} / print
- .bool_set:N = \exp_not:c {l__xsim_#1_exercise_print_bool} ,
- \xsim_get_parameter:nn {#1} {exercise-env} / print
- .initial:n = true ,
- \xsim_get_parameter:nn {#1} {exercise-env} / use
- .bool_set:N = \exp_not:c {l__xsim_#1_exercise_use_bool} ,
- \xsim_get_parameter:nn {#1} {exercise-env} / use
- .initial:n = true ,
- \xsim_get_parameter:nn {#1} {exercise-env} / within .code:n =
- \exp_not:N \@addtoreset { \xsim_get_parameter:nn {#1} {counter} } {####1},
- \xsim_get_parameter:nn {#1} {exercise-env} / the-counter .code:n =
- \cs_set:cpn {the \xsim_get_parameter:nn {#1} {counter} } {####1} ,
- \xsim_get_parameter:nn {#1} {exercise-env} / template
- .code:n = \xsim_set_parameter:nnn {#1} {exercise-template} {####1} ,
- \xsim_get_parameter:nn {#1} {solution-env} / template
- .code:n = \xsim_set_parameter:nnn {#1} {solution-template} {####1} ,
- \xsim_get_parameter:nn {#1} {exercise-env} / name
- .code:n = \xsim_set_parameter:nnn {#1} {exercise-name} {####1} ,
- \xsim_get_parameter:nn {#1} {exercise-env} s / name
- .code:n = \xsim_set_parameter:nnn {#1} {exercises-name} {####1} ,
- \xsim_get_parameter:nn {#1} {solution-env} / name
- .code:n = \xsim_set_parameter:nnn {#1} {solution-name} {####1} ,
- \xsim_get_parameter:nn {#1} {solution-env} s / name
- .code:n = \xsim_set_parameter:nnn {#1} {solutions-name} {####1} ,
- \xsim_get_parameter:nn {#1} {exercise-env} / heading
- .code:n = \xsim_set_parameter:nnn {#1} {exercise-heading} {####1} ,
- \xsim_get_parameter:nn {#1} {solution-env} / heading
- .code:n = \xsim_set_parameter:nnn {#1} {solution-heading} {####1}
- }
- \xsim_new_environment:nn {#1} {exercise}
- \xsim_new_environment:nn {#1} {solution}
- }
- }
-
-% #1: type
-% #2: id
-\prg_new_conditional:Npnn \xsim_if_exercise_exist:nn #1#2 {T,F,TF}
- {
- \xsim_if_exist:nnnTF {#1} {#2} {exercise}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-\cs_generate_variant:Nn \xsim_if_exercise_exist:nnT {VV}
-
-% #1: type
-% #2: options
-\cs_new_protected:Npn \xsim_start_exercise:nn #1#2
- {
- \xsim_if_insert_mode:F
- {
- \int_gincr:N \g_xsim_id_int
- \int_compare:nF { \g_xsim_max_id_int > \g_xsim_id_int }
- { \int_gset_eq:NN \g_xsim_max_id_int \g_xsim_id_int }
- \tl_gset:Nx \g_xsim_exercise_id_tl { \int_use:N \g_xsim_id_int }
- \tl_gset:Nn \g_xsim_exercise_type_tl {#1}
- % save the goal values from the auxiliary files:
- \xsim_foreach_goal:n
- {
- \xsim_temporary_goal_new:nVn {#1} \g_xsim_exercise_id_tl {##1}
- \xsim_if_property_set:nVnT {#1} \g_xsim_exercise_id_tl {##1}
- {
- \xsim_temporary_goal_set:nVnn
- {#1}
- \g_xsim_exercise_id_tl
- {##1}
- { \xsim_get_property:nVn {#1} \g_xsim_exercise_id_tl {##1} }
- }
- }
- \xsim_set_properties:nVx {#1} \g_xsim_exercise_id_tl
- {
- % preset options so the user doesn't has to:
- print = true ,
- use = true ,
- % options set by the user:
- \exp_not:n {#2} ,
- % options which need to have certain values:
- id = \g_xsim_exercise_id_tl ,
- section-value = \arabic{section} ,
- section = \thesection ,
- page-value = \arabic{page} ,
- sectioning =
- { \cs_if_exist:NTF \thechapter { \arabic {chapter} } {0} }
- { \arabic {section} }
- { \arabic {subsection} }
- { \arabic {subsubsection} }
- { \arabic {paragraph} } ,
- page = \thepage ,
- % this cannot yet be set (see below):
- used = false
- }
- % temporary goal now: either 0 or equal the complete property
- % property: equal to the given value
- \xsim_foreach_goal:n
- {
- \fp_set:Nn \l__xsim_tmpa_fp
- { \xsim_temporary_goal_get:nVn {#1} \g_xsim_exercise_id_tl {##1} }
- % set temporary goal to given property:
- \xsim_if_property_given:nTF {##1}
- {
- \xsim_temporary_goal_set:nVnn
- {#1}
- \g_xsim_exercise_id_tl
- {##1}
- { \xsim_get_property:nVn {#1} \g_xsim_exercise_id_tl {##1} }
- }
- {
- \xsim_temporary_goal_set:nVnn
- {#1}
- \g_xsim_exercise_id_tl
- {##1}
- {0}
- }
- % update to property to complete value:
- \xsim_if_property_set:nVnT {#1} \g_xsim_exercise_id_tl {##1}
- {
- \xsim_set_property:nVnx {#1} \g_xsim_exercise_id_tl {##1}
- { \fp_to_decimal:N \l__xsim_tmpa_fp }
- }
- }
- \xsim_if_property_exist:nT {chapter}
- {
- \xsim_set_properties:nVx {#1} \g_xsim_exercise_id_tl
- {
- chapter-value = \arabic{chapter} ,
- chapter = \thechapter
- }
- }
- \tl_set_eq:NN \ExerciseID \g_xsim_exercise_id_tl
- \tl_set:Nn \ExerciseType {#1}
- \xsim_verbose:x
- {
- Starting~ exercise~ type~ `#1' with~ id~
- ` \g_xsim_exercise_id_tl '.
- }
- \xsim_exercise_if_use:nVTF {#1} \g_xsim_exercise_id_tl
- {
- \stepcounter { \xsim_get_parameter:nn {#1} {number} }
- % don't step if in active collection:
- \xsim_if_collections_active:TF
- {
- \xsim_set_property:nVnn {#1} \g_xsim_exercise_id_tl
- {print}
- {false}
- }
- {
- \xsim_step_exercise_counter:nV {#1} \g_xsim_exercise_id_tl
- \xsim_set_property:nVnn {#1} \g_xsim_exercise_id_tl
- {used}
- {true}
- }
- \xsim_set_property:nVnn {#1} \g_xsim_exercise_id_tl
- {use}
- {true}
- }
- {
- \xsim_set_properties:nVn {#1} \g_xsim_exercise_id_tl
- { use = false , print = false }
- }
- \xsim_update_collections:nV {#1} \g_xsim_exercise_id_tl
- }
- }
-
-\cs_new_protected:Npn \xsim_stop_exercise:n #1
- {
- \xsim_if_insert_mode:F
- { \tl_gset_eq:NN \g_xsim_exercise_id_tl \ExerciseID }
- }
-
-% ----------------------------------------------------------------------------
-% #1: type
-% #2: id
-\prg_new_protected_conditional:Npnn \xsim_exercise_if_print:nn #1#2 {T,F,TF}
- {
- \xsim_if_boolean_property:nnnTF {#1} {#2} {print!}
- { \prg_return_true: }
- {
- \bool_set_true:N \l____xsim_print_bool
- \bool_if:cF {l__xsim_#1_exercise_print_bool}
- { \bool_set_false:N \l____xsim_print_bool }
- \xsim_if_tagged:nnF {#1} {#2}
- { \bool_set_false:N \l____xsim_print_bool }
- \xsim_if_boolean_property:nnnF {#1} {#2} {print}
- { \bool_set_false:N \l____xsim_print_bool }
- \bool_if:NTF \l____xsim_print_bool
- { \prg_return_true: }
- { \prg_return_false: }
- }
- }
-\cs_generate_variant:Nn \xsim_exercise_if_print:nnT {nV}
-\cs_generate_variant:Nn \xsim_exercise_if_print:nnTF {nV}
-
-% #1: type
-% #2: id
-\prg_new_protected_conditional:Npnn \xsim_exercise_if_use:nn #1#2 {T,F,TF}
- {
- \xsim_if_boolean_property:nnnTF {#1} {#2} {use!}
- { \prg_return_true: }
- {
- \xsim_exercise_if_print:nnTF {#1} {#2}
- { \prg_return_true: }
- {
- \bool_if:cTF {l__xsim_#1_exercise_use_bool}
- {
- \xsim_if_boolean_property:nnnTF {#1} {#2} {use}
- {
- \xsim_if_tagged:nnTF {#1} {#2}
- { \prg_return_true: }
- { \prg_return_false: }
- }
- { \prg_return_false: }
- }
- { \prg_return_false: }
- }
-
- }
- }
-\cs_generate_variant:Nn \xsim_exercise_if_use:nnT {nV}
-\cs_generate_variant:Nn \xsim_exercise_if_use:nnTF {nV}
-
-% #1: type
-% #2: id
-% #3: exercise|solution
-\prg_new_protected_conditional:Npnn \xsim_if_print:nnn #1#2#3 {T,F,TF}
- {
- \use:c {xsim_#3_if_print:nnTF} {#1} {#2}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-% ----------------------------------------------------------------------------
-
-\xsim_new_aux_property:cpn {total-number} #1
- { \int_gset:Nn \g_xsim_max_id_int {#1} }
-
-\RequirePackage {etoolbox}
-
-\AtEndPreamble
- {
- \xsim_foreach_exercise_type:n
- {
- \tl_new:c { number of #1 s }
- \tl_set:cn { number of #1 s } {0}
- \xsim_new_aux_property:cpn {#1} ##1
- { \tl_gset:cn { number of #1 s } {##1} }
- }
- }
-
-\xsim_at_begin_document:n
- {
- \xsim_foreach_exercise_type:n
- {
- \xsim_write_to_aux:x
- { \token_to_str:N \providecommand \token_to_str:N \numberof #1 s {} }
- }
- }
-
-\xsim_at_end_document:n
- {
- \xsim_if_clear_aux:T
- {
- \int_compare:nNnF { \g_xsim_max_id_int } = { \g_xsim_id_int }
- { \xsim_empty_lists: }
- }
- \xsim_add_property_to_aux:nn {total-number} { { \int_use:N \g_xsim_id_int } }
- \xsim_foreach_exercise_type:n
- {
- \xsim_add_property_to_aux:nn {#1}
- { { \arabic { \xsim_get_parameter:nn {#1} {number} } } }
- }
- \xsim_update_list:n {types}
- }
-
-% ----------------------------------------------------------------------------
-\file_input_stop:
-
-2020/02/21 - implement issue #2
-2020/03/01 - add options `<ex-env>s/name` and `<sol-env>/name`
-2020/03/07 - set \ExerciseID and \ExerciseType only locally
-2020/03/14 - performance optimizations
diff --git a/macros/latex/contrib/xsim/code/xsim.goals.code.tex b/macros/latex/contrib/xsim/code/xsim.goals.code.tex
deleted file mode 100644
index 67019eb6f3..0000000000
--- a/macros/latex/contrib/xsim/code/xsim.goals.code.tex
+++ /dev/null
@@ -1,385 +0,0 @@
-% ----------------------------------------------------------------------------
-% the XSIM package - goals module
-%
-% eXercise Sheets IMproved
-%
-% ----------------------------------------------------------------------------
-% Clemens Niederberger
-% Web: https://github.com/cgnieder/xsim
-% E-Mail: contact@mychemistry.eu
-% ----------------------------------------------------------------------------
-% Copyright 2017--2020 Clemens Niederberger
-%
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% ----------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% ----------------------------------------------------------------------------
-\XSIMmodule{goals}{counting of points and bonus points}
-
-\xsim_load_modules:n {properties,exercises}
-
-\msg_new:nnn {xsim} {goal-unknown}
- { The~ goal~ `#1'~ has~ never~ been~ declared~ \msg_line_context: }
-
-\seq_new:N \l__xsim_goals_seq
-\tl_new:N \l_xism_grading_table_template_tl
-\tl_new:N \l_xism_grading_table_exercise_type_tl
-
-% #1: name
-\cs_new_protected:Npn \xsim_declare_exercise_goal:n #1
- {
- \xsim_if_goal_exist:nF {#1}
- {
- \xsim_verbose:n { Declaring~ new~ goal~ `#1'. }
- \xsim_declare_property:nnnn
- { \c_false_bool }
- { \c_false_bool }
- { \c_false_bool }
- {#1}
- \seq_put_right:Nn \l__xsim_goals_seq {#1}
- \fp_gzero_new:c {g__xsim_goal_#1_fp}
- \bool_new:c {l__xsim_goal_#1_given_bool}
- \fp_gzero_new:c {l__xsim_current_goal_#1_fp}
- \fp_if_exist:cF {g__xsim_total_goal_#1_fp}
- { \fp_new:c {g__xsim_total_goal_#1_fp} }
- \fp_if_exist:cF {g__xsim_total_goal_recorded_#1_fp}
- { \fp_new:c {g__xsim_total_goal_recorded_#1_fp} }
- \xsim_at_begin_document:n
- {
- \xsim_foreach_exercise_type:n
- {
- \fp_gzero_new:c {g__xsim_##1_goal_#1_fp}
- \fp_if_exist:cF {g__xsim_total_##1_goal_#1_fp}
- { \fp_new:c {g__xsim_total_##1_goal_#1_fp} }
- }
- }
- }
- }
-
-\prg_new_conditional:Npnn \xsim_if_goal_exist:n #1 {p,T,F,TF}
- {
- \seq_if_in:NnTF \l__xsim_goals_seq {#1}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-\prg_new_conditional:Npnn \xsim_if_goal_given:n #1 {p,T,F,TF}
- {
- \bool_if:cTF {l__xsim_goal_#1_given_bool}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-\cs_new_protected:Npn \xsim_goal_given:n #1
- { \bool_set_true:c {l__xsim_goal_#1_given_bool} }
-
-% #1: exercise type
-% #2: id
-% #3: goal
-\cs_new_protected:Npn \xsim_update_goal:nnn #1#2#3
- {
- \xsim_if_goal_exist:nT {#3}
- {
- \fp_gadd:cn {g__xsim_goal_#3_fp}
- { \xsim_get_property:nnn {#1} {#2} {#3} + 0 }
- \fp_gadd:cn {g__xsim_#1_goal_#3_fp}
- { \xsim_get_property:nnn {#1} {#2} {#3} + 0 }
- }
- }
-
-% #1: exercise type
-% #2: id
-\cs_new_protected:Npn \xsim_update_goals:nn #1#2
- {
- \xsim_foreach_goal:n
- { \xsim_update_goal:nnn {#1} {#2} {##1} }
- }
-\cs_generate_variant:Nn \xsim_update_goals:nn {nV}
-
-\cs_new_protected:Npn \xsim_foreach_goal:n #1
- { \seq_map_inline:Nn \l__xsim_goals_seq {#1} }
-
-% #1: type
-% #2: id
-\cs_new_protected:Npn \xsim_synchronize_goals:nn #1#2
- {
- \xsim_foreach_goal:n
- {
- \xsim_if_property_set:nnnTF {#1} {#2} {##1}
- {
- \xsim_set_property:nnnx {#1} {#2} {##1}
- { \xsim_temporary_goal_get:nnn {#1} {#2} {##1} }
- }
- {
- \fp_compare:nNnT
- { \xsim_temporary_goal_get:nnn {#1} {#2} {##1} } > {0}
- {
- \xsim_set_property:nnnx {#1} {#2} {##1}
- { \xsim_temporary_goal_get:nnn {#1} {#2} {##1} }
- }
- }
- }
- }
-
-% #1: exercise type
-% #2: id
-% #3: goal
-% #4: value
-\cs_new_protected:Npn \xsim_addto_goal:nnnn #1#2#3#4
- {
- \xsim_if_goal_exist:nT {#3}
- {
- \xsim_verbose:n { Adding~ `#4'~ to~ `#3'~ goal~ of~ #1~ #2 }
- % \fp_gadd:cn {g__xsim_goal_#3_fp} {#4}
- % \fp_gadd:cn {g__xsim_#1_goal_#3_fp} {#4}
- % \fp_add:cn {l__xsim_current_goal_#3_fp} {#4}
- \xsim_temporary_goal_add:nnnn {#1} {#2} {#3} {#4}
- }
- }
-\cs_generate_variant:Nn \xsim_addto_goal:nnnn {xx,nVnx}
-
-% #1: exercise type
-% #2: id
-% #3: goal
-% #4: relation and value
-\prg_new_conditional:Npnn \xsim_if_goal_value:nnnn #1#2#3#4 {p,T,F,TF}
- {
- \fp_compare:nTF
- { (0 + \xsim_get_property:nnn {#1} {#2} {#3}) #4 }
- { \prg_return_true: }
- { \prg_return_false: }
- }
-\cs_generate_variant:Nn \xsim_if_goal_value:nnnnTF {xx}
-
-% ----------------------------------------------------------------------------
-% we need some kind of temporary variable to be able to set goals both as
-% option to exercises and within the exercise body
-
-% #1: type
-% #2: id
-% #3: goal
-\cs_new_protected:Npn \xsim_temporary_goal_new:nnn #1#2#3
- { \fp_new:c {g__xsim_goal_#3_#1_#2_fp} }
-\cs_generate_variant:Nn \xsim_temporary_goal_new:nnn {nV}
-
-% #1: type
-% #2: id
-% #3: goal
-% #4: value
-\cs_new_protected:Npn \xsim_temporary_goal_set:nnnn #1#2#3#4
- { \fp_gset:cn {g__xsim_goal_#3_#1_#2_fp} {#4} }
-\cs_generate_variant:Nn \xsim_temporary_goal_set:nnnn {nV}
-
-% #1: type
-% #2: id
-% #3: goal
-% #4: value
-\cs_new_protected:Npn \xsim_temporary_goal_add:nnnn #1#2#3#4
- { \fp_gadd:cn {g__xsim_goal_#3_#1_#2_fp} {#4} }
-\cs_generate_variant:Nn \xsim_temporary_goal_add:nnnn {nV}
-
-% #1: type
-% #2: id
-% #3: goal
-\cs_new:Npn \xsim_temporary_goal_get:nnn #1#2#3
- { \fp_to_decimal:c {g__xsim_goal_#3_#1_#2_fp} }
-\cs_generate_variant:Nn \xsim_temporary_goal_get:nnn {nV}
-
-% #1: type
-% #2: id
-% #3: goal
-\cs_new_protected:Npn \__xsim_temporary_goal_show:nnn #1#2#3
- { \fp_show:c {g__xsim_goal_#3_#1_#2_fp} }
-
-% ----------------------------------------------------------------------------
-% a function which can be used to modify how the numbers of a goal are
-% printed:
-\cs_new_protected:Npn \__xsim_print_goal:n #1 {#1}
-\cs_generate_variant:Nn \__xsim_print_goal:n {x}
-
-% #1: value
-% #2: value == 1
-% #3: value != 1
-\cs_new_protected:Npn \xsim_print_goal:nnn #1#2#3
- {
- \__xsim_print_goal:x { \fp_to_decimal:n {#1} }
- \fp_compare:nTF { (#1) = 1 } {#2} {#3}
- }
-
-% #1: exercise type
-% #2: goal
-% #3: sum == 1
-% #4: sum != 1
-\cs_new_protected:Npn \xsim_print_goal_sum:nnnn #1#2#3#4
- { \xsim_print_goal:nnn { \use:c {g__xsim_total_#1_goal_#2_fp} } {#3} {#4} }
-
-% #1: goal
-% #2: sum == 1
-% #3: sum != 1
-\cs_new_protected:Npn \xsim_print_total_goal_sum:nnn #1#2#3
- { \xsim_print_goal:nnn { \use:c {g__xsim_total_goal_#1_fp} } {#2} {#3} }
-
-% ----------------------------------------------------------------------------
-% the same as the last to functions but for a list of goals:
-
-% #1: fp variable to be set
-% #2: list of goals (separated with +)
-% #3: function to be applied to goal names
-\cs_new_protected:Npn \__xsim_exercise_goals_sum_aux:Nnn #1#2#3
- {
- \seq_set_split:Nnn \l__xsim_tmpa_seq {+} {#2}
- \seq_set_map:NNn \l__xsim_tmpb_seq \l__xsim_tmpa_seq {#3}
- \fp_set:Nn #1 { \seq_use:Nn \l__xsim_tmpb_seq {+} }
- }
-
-% #1: fp variable
-% #2: exercise type
-% #3: list of goals (separated with +)
-\cs_new_protected:Npn \__xsim_exercise_goals_sum:Nnn #1#2#3
- {
- \__xsim_exercise_goals_sum_aux:Nnn #1 {#3}
- { \exp_not:c {g__xsim_total_#2_goal_ \tl_trim_spaces:n {##1} _fp} }
- }
-
-% #1: fp variable
-% #2: list of goals (separated with +)
-\cs_new_protected:Npn \__xsim_exercise_goals_sum:Nn #1#2
- {
- \__xsim_exercise_goals_sum_aux:Nnn #1 {#2}
- { \exp_not:c {g__xsim_total_goal_ \tl_trim_spaces:n {##1} _fp} }
- }
-
-% #1: exercise type
-% #2: list of goals (separated with +)
-% #3: sum == 1
-% #4: sum != 1
-\cs_new_protected:Npn \xsim_print_goals_sum:nnnn #1#2#3#4
- {
- \__xsim_exercise_goals_sum:Nnn \l__xsim_tmpa_fp {#1} {#2}
- \xsim_print_goal:nnn { \l__xsim_tmpa_fp } {#3} {#4}
- }
-
-% #1: list of goals (separated with +)
-% #2: sum == 1
-% #3: sum != 1
-\cs_new_protected:Npn \xsim_print_total_goals_sum:nnn #1#2#3
- {
- \__xsim_exercise_goals_sum:Nn \l__xsim_tmpa_fp {#1}
- \xsim_print_goal:nnn { \l__xsim_tmpa_fp } {#2} {#3}
- }
-
-% ----------------------------------------------------------------------------
-% #1: exercise type
-% #2: goal
-% #3: relation and value
-\prg_new_conditional:Npnn \xsim_if_goal_sum:nnn #1#2#3 {p,T,F,TF}
- {
- \fp_compare:nTF
- { ( \use:c {g__xsim_total_#1_goal_#2_fp} ) #3 }
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-% #1: exercise type
-% #2: list of goals (separated with +)
-% #3: relation and value
-\prg_new_protected_conditional:Npnn \xsim_if_goals_sum:nnn #1#2#3 {T,F,TF}
- {
- \__xsim_exercise_goals_sum:Nnn \l__xsim_tmpa_fp {#1} {#2}
- \fp_compare:nTF
- { ( \l__xsim_tmpa_fp ) #3 }
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-% #1: goal
-% #2: relation and value
-\prg_new_conditional:Npnn \xsim_if_total_goal_sum:nn #1#2 {p,T,F,TF}
- {
- \fp_compare:nTF
- { ( \use:c {g__xsim_total_goal_#1_fp} ) #2 }
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-% #1: list of goals (separated with +)
-% #2: relation and value
-\prg_new_protected_conditional:Npnn \xsim_if_total_goals_sum:nn #1#2 {T,F,TF}
- {
- \__xsim_exercise_goals_sum:Nn \l__xsim_tmpa_fp {#1}
- \fp_compare:nTF
- { ( \l__xsim_tmpa_fp ) #2 }
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-% ----------------------------------------------------------------------------
-% #1: exercise type
-% #2: goal
-% #3: value
-\xsim_new_aux_property:cpn {goal} #1#2#3
- { \fp_gset:cn {g__xsim_total_#1_goal_#2_fp} {#3} }
-
-% #1: goal
-% #2: value
-\xsim_new_aux_property:cpn {totalgoal} #1#2
- { \fp_gset:cn {g__xsim_total_goal_#1_fp} {#2} }
-
-\xsim_at_begin_document:n
- {
- \seq_map_inline:Nn \l__xsim_goals_seq
- {
- \fp_gset_eq:cc
- {g__xsim_total_goal_recorded_#1_fp}
- {g__xsim_total_goal_#1_fp}
- }
- }
-
-\xsim_at_end_document:n
- {
- \seq_map_inline:Nn \l__xsim_goals_seq
- {
- \xsim_foreach_exercise_type:n
- {
- \xsim_add_property_to_aux:nn {goal}
- { {##1} {#1} { \fp_to_decimal:c {g__xsim_##1_goal_#1_fp} } }
- }
- \tl_set:Nx \l__xsim_tmpa_tl
- { \fp_to_decimal:c {g__xsim_total_goal_#1_fp} }
- \tl_set:Nx \l__xsim_tmpb_tl
- { \fp_to_decimal:c {g__xsim_total_goal_recorded_#1_fp} }
- \tl_if_eq:NNF \l__xsim_tmpa_tl \l__xsim_tmpb_tl { \xsim_rerun: }
- \xsim_add_property_to_aux:nn {totalgoal}
- { {#1} { \fp_to_decimal:c {g__xsim_goal_#1_fp} } }
- }
- }
-
-% ----------------------------------------------------------------------------
-
-\keys_define:nn {xsim}
- {
- goal-print .code:n =
- \cs_set_protected:Npn \__xsim_print_goal:n ##1 {#1} ,
- grading-table/template .tl_set:N = \l_xism_grading_table_template_tl ,
- grading-table/template .initial:n = default ,
- grading-table/type .tl_set:N = \l_xism_grading_table_exercise_type_tl ,
- grading-table/type .initial:n =
- }
-
-% ----------------------------------------------------------------------------
-\file_input_stop:
-
-2019/01/30 - bug fix (cf. https://texwelt.de/wissen/fragen/24101/)
-2020/02/20 - add temporary variables for the whole subpoint thing
- (cf. issue #2)
diff --git a/macros/latex/contrib/xsim/code/xsim.grades.code.tex b/macros/latex/contrib/xsim/code/xsim.grades.code.tex
deleted file mode 100644
index 678011c610..0000000000
--- a/macros/latex/contrib/xsim/code/xsim.grades.code.tex
+++ /dev/null
@@ -1,153 +0,0 @@
-% ----------------------------------------------------------------------------
-% the XSIM package - grades module
-%
-% eXercise Sheets IMproved
-%
-% ----------------------------------------------------------------------------
-% Clemens Niederberger
-% Web: https://github.com/cgnieder/xsim
-% E-Mail: contact@mychemistry.eu
-% ----------------------------------------------------------------------------
-% Copyright 2017--2020 Clemens Niederberger
-%
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% ----------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% ----------------------------------------------------------------------------
-\XSIMmodule{grades}{distribute goal sums to grades}
-
-\xsim_load_modules:n {goals}
-
-\msg_new:nnn {xsim} {grade-unknown}
- { The~ grade~ `#1'~ has~ never~ been~ declared~ \msg_line_context: }
-
-\bool_new:N \l__xsim_grades_half_bool
-\fp_new:N \l__xsim_grade_round_fp
-\fp_zero:N \l__xsim_grade_round_fp
-\prop_new:N \l__xsim_relative_grades_prop
-\tl_new:N \l__xsim_grade_split_tl
-
-\cs_new:Npn \__xsim_fp_round_to_half:n #1
- { round( 2*(#1),0)/2 }
-
-\cs_new:Npn \__xsim_grades_round:n #1
- { round ( #1 , \l__xsim_grade_round_fp ) }
-
-% #1: factor
-% #2: goal sum
-\cs_new:Npn \__xsim_grade_rounded:nn #1#2
- {
- \bool_if:NTF \l__xsim_grades_half_bool
- { \__xsim_fp_round_to_half:n }
- { \__xsim_grades_round:n }
- { (#1) * (#2) }
- }
-
-\cs_new_protected:Npn \xsim_declare_relative_grades:n #1
- {
- \seq_set_split:NVn \l__xsim_tmpa_seq \l__xsim_grade_split_tl {#1}
- \seq_map_inline:Nn \l__xsim_tmpa_seq
- { \__xsim_declare_relative_grade:w ##1 \q_stop }
- \xsim_verbose:n {Declaring~ relative~ grade~ distribution}
- }
-
-\cs_new_protected:Npn \__xsim_declare_relative_grade:w #1 = #2 \q_stop
- {
- \tl_set:Nx \l__xsim_tmpa_tl { \tl_trim_spaces:n {#1} }
- \tl_set:Nx \l__xsim_tmpb_tl { \tl_trim_spaces:n {#2} }
- \prop_put:NVV \l__xsim_relative_grades_prop
- \l__xsim_tmpa_tl
- \l__xsim_tmpb_tl
- }
-
-% #1: grade
-% #2: sum of points
-% #3: code after grade requirement if == 1
-% #4: code after grade requirement if != 1
-\cs_new_protected:Npn \xsim_get_grade:nnnn #1#2#3#4
- {
- \prop_get:NnNTF \l__xsim_relative_grades_prop {#1} \l__xsim_tmpa_tl
- {
- \xsim_print_goal:nnn
- {
- min(
- \__xsim_grade_rounded:nn
- { \l__xsim_tmpa_tl }
- {#2} ,
- #2
- )
- }
- {#3}
- {#4}
- }
- { \msg_error:nnn {xsim} {grade-unknown} {#1} }
- }
-
-% #1: grade
-% #2: goal
-% #3: code after grade requirement if == 1
-% #4: code after grade requirement if != 1
-\cs_new_protected:Npn \xsim_get_grade_goal:nnnn #1#2#3#4
- {
- \xsim_if_goal_exist:nTF {#2}
- {
- \xsim_get_grade:nnnn
- {#1}
- { \use:c {g__xsim_total_goal_#2_fp} }
- {#3}
- {#4}
- }
- { \msg_error:nnn {xsim} {goal-unknown} {#2} }
- }
-
-% #1: grade
-% #2: goal list (separated with +)
-% #3: code after grade requirement if == 1
-% #4: code after grade requirement if != 1
-\cs_new_protected:Npn \xsim_get_grade_requirement:nnnn #1#2#3#4
- {
- \seq_set_split:Nnn \l__xsim_tmpa_seq {+} {#2}
- \fp_zero:N \l__xsim_tmpa_fp
- \seq_map_inline:Nn \l__xsim_tmpa_seq
- {
- \fp_add:Nn \l__xsim_tmpa_fp
- { \use:c {g__xsim_total_goal_\tl_trim_spaces:n {##1} _fp} }
- }
- \xsim_get_grade:nnnn {#1} { \l__xsim_tmpa_fp } {#3} {#4}
- }
-
-% #1: grade
-% #2: code after grade requirement if == 1
-% #3: code after grade requirement if != 1
-\cs_new_protected:Npn \xsim_get_absolute_grade_requirement:nnn #1#2#3
- {
- \fp_zero:N \l__xsim_tmpa_fp
- \xsim_foreach_goal:n
- {
- \fp_add:Nn \l__xsim_tmpa_fp
- { \use:c {g__xsim_total_goal_##1_fp} }
- }
- \xsim_get_grade:nnnn {#1} { \l__xsim_tmpa_fp } {#2} {#3}
- }
-
-\keys_define:nn {xsim/grades}
- {
- round .fp_set:N = \l__xsim_grade_round_fp ,
- half .bool_set:N = \l__xsim_grades_half_bool ,
- split .tl_set:N = \l__xsim_grade_split_tl ,
- split .initial:n = {,}
- }
-
-% ----------------------------------------------------------------------------
-\file_input_stop:
diff --git a/macros/latex/contrib/xsim/code/xsim.interface.code.tex b/macros/latex/contrib/xsim/code/xsim.interface.code.tex
deleted file mode 100644
index b96e5a47b5..0000000000
--- a/macros/latex/contrib/xsim/code/xsim.interface.code.tex
+++ /dev/null
@@ -1,696 +0,0 @@
-% ----------------------------------------------------------------------------
-% the XSIM package - interface module
-%
-% eXercise Sheets IMproved
-%
-% ----------------------------------------------------------------------------
-% Clemens Niederberger
-% Web: https://github.com/cgnieder/xsim
-% E-Mail: contact@mychemistry.eu
-% ----------------------------------------------------------------------------
-% Copyright 2017--2020 Clemens Niederberger
-%
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% ----------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% ----------------------------------------------------------------------------
-\XSIMmodule{interface}{user interface}
-
-\NewDocumentCommand \DeclareExerciseEnvironmentTemplate {m+m+m}
- { \xsim_declare_environment_template:nnn {#1} {#2} {#3} }
-\@onlypreamble \DeclareExerciseEnvironmentTemplate
-
-\NewDocumentCommand \DeclareExerciseHeadingTemplate {m+m}
- { \xsim_declare_heading_template:nn {#1} {#2} }
-\@onlypreamble \DeclareExerciseHeadingTemplate
-
-\NewDocumentCommand \DeclareExerciseTableTemplate {m+m}
- { \xsim_declare_table_template:nn {#1} {#2} }
-\@onlypreamble \DeclareExerciseTableTemplate
-
-\NewDocumentCommand \UseExerciseTemplate {mm}
- { \xsim_use_template:nn {#1} {#2} }
-
-% ----------------------------------------------------------------------------
-
-\NewDocumentCommand \DeclareExerciseType {mm}
- { \xsim_declare_exercise_type:nn {#1} {#2} }
-\@onlypreamble \DeclareExerciseType
-
-\NewExpandableDocumentCommand \numberofusedexercises {}
- { \int_use:N \g_xsim_max_id_int }
-
-% ----------------------------------------------------------------------------
-
-\ProvideDocumentCommand \IfExistSolutionTF {+m+m}
- { \xsim_if_solution_exist:ooTF {\ExerciseType} {\ExerciseID} {#1} {#2} }
-
-\NewDocumentCommand \IfExistSolutionT {+m}
- { \IfExistSolutionTF {#1} {} }
-
-\NewDocumentCommand \IfExistSolutionF {+m}
- { \IfExistSolutionTF {} {#1} }
-
-\NewExpandableDocumentCommand \IfInsideSolutionTF {+m+m}
- { \xsim_if_inside_solution:TF {#1} {#2} }
-
-\NewExpandableDocumentCommand \IfInsideSolutionT {+m}
- { \IfInsideSolutionTF {#1} {} }
-
-\NewExpandableDocumentCommand \IfInsideSolutionF {+m}
- { \IfInsideSolutionTF {} {#1} }
-
-\NewExpandableDocumentCommand \IfSolutionPrintTF {+m+m}
- { \xsim_if_solution_print:nTF {\ExerciseType} {#1} {#2} }
-
-\NewExpandableDocumentCommand \IfSolutionPrintT {+m}
- { \IfSolutionPrintTF {#1} {} }
-
-\NewExpandableDocumentCommand \IfSolutionPrintF {+m}
- { \IfSolutionPrintTF {} {#1} }
-
-% ----------------------------------------------------------------------------
-
-\NewDocumentCommand \DeclareExerciseProperty {t!st-m}
- {
- \IfBooleanTF {#2}
- {
- \IfBooleanTF {#3}
- {
- \xsim_declare_property:nnnn
- { \c_false_bool }
- { \c_true_bool }
- { \c_true_bool }
- {#4}
- }
- {
- \xsim_declare_property:nnnn
- { \c_false_bool }
- { \c_true_bool }
- { \c_false_bool }
- {#4}
- }
- }
- {
- \IfBooleanTF {#1}
- {
- \IfBooleanTF {#3}
- {
- \xsim_declare_property:nnnn
- { \c_true_bool }
- { \c_false_bool }
- { \c_true_bool }
- {#4}
- }
- {
- \xsim_declare_property:nnnn
- { \c_true_bool }
- { \c_false_bool }
- { \c_false_bool }
- {#4}
- }
- }
- {
- \IfBooleanTF {#3}
- {
- \xsim_declare_property:nnnn
- { \c_false_bool }
- { \c_false_bool }
- { \c_true_bool }
- {#4}
- }
- {
- \xsim_declare_property:nnnn
- { \c_false_bool }
- { \c_false_bool }
- { \c_false_bool }
- {#4}
- }
- }
- }
- }
-\@onlypreamble \DeclareExerciseProperty
-
-\NewDocumentCommand \DeclareExercisePropertyAlias {mm}
- { \xsim_make_property_alias:nn {#1} {#2} }
-\@onlypreamble \DeclareExercisePropertyAlias
-
-\NewDocumentCommand \SetExerciseProperty {m+m}
- { \xsim_set_property:xxnn {\ExerciseType} {\ExerciseID} {#1} {#2} }
-
-\NewDocumentCommand \SetExpandedExerciseProperty {m+m}
- { \xsim_set_property:xxnx {\ExerciseType} {\ExerciseID} {#1} {#2} }
-
-\NewDocumentCommand \ExerciseSetProperty {mmm+m}
- { \xsim_set_property:nnnn {#1} {#2} {#3} {#4} }
-
-\NewDocumentCommand \ExerciseSetExpandedProperty {mmm+m}
- { \xsim_set_property:nnnx {#1} {#2} {#3} {#4} }
-
-\NewExpandableDocumentCommand \IfExercisePropertyExistTF {+m+m+m}
- { \xsim_if_property_exist:nTF {#1} {#2} {#3} }
-
-\NewExpandableDocumentCommand \IfExercisePropertyExistT {+m+m}
- { \IfExercisePropertyExistTF {#1} {#2} {} }
-
-\NewExpandableDocumentCommand \IfExercisePropertyExistF {+m+m}
- { \IfExercisePropertyExistTF {#1} {} {#2} }
-
-\NewDocumentCommand \IfExercisePropertySetTF {m+m+m}
- { \xsim_if_property_set:xxnTF {\ExerciseType} {\ExerciseID} {#1} {#2} {#3} }
-
-\NewDocumentCommand \IfExercisePropertySetT {m+m}
- { \IfExercisePropertySetTF {#1} {#2} {} }
-
-\NewDocumentCommand \IfExercisePropertySetF {m+m}
- { \IfExercisePropertySetTF {#1} {} {#2} }
-
-\NewExpandableDocumentCommand \GetExerciseProperty {m}
- { \xsim_get_property:oon {\ExerciseType} {\ExerciseID} {#1} }
-
-\NewExpandableDocumentCommand \GetExerciseAliasProperty {m}
- {
- \xsim_get_property:oof
- {\ExerciseType}
- {\ExerciseID}
- { \xsim_property_alias:n {#1} }
- }
-
-\NewDocumentCommand \GetExercisePropertyTF {m+m+m}
- {
- \xsim_get_property_if_set:oonTF {\ExerciseType} {\ExerciseID} {#1}
- {#2}
- {#3}
- }
-
-\NewDocumentCommand \GetExercisePropertyT {m+m}
- { \GetExercisePropertyTF {#1} {#2} {} }
-\NewDocumentCommand \GetExercisePropertyF {m+m+m}
- { \GetExercisePropertyTF {#1} {} {#2} }
-
-\NewExpandableDocumentCommand \GetExerciseIdForProperty {mm}
- { \xsim_get_id_for_property:nn {#1} {#2} }
-
-\NewExpandableDocumentCommand \GetExerciseTypeForProperty {mm}
- { \xsim_get_type_for_property:nn {#1} {#2} }
-
-\NewExpandableDocumentCommand \IfExerciseBooleanPropertyTF {+m+m+m}
- {
- \xsim_if_boolean_property:oonTF {\ExerciseType} {\ExerciseID} {#1}
- {#2}
- {#3}
- }
-
-\NewExpandableDocumentCommand \IfExerciseBooleanPropertyT {+m+m}
- { \IfExerciseBooleanPropertyTF {#1} {#2} {} }
-\NewExpandableDocumentCommand \IfExerciseBooleanPropertyF {+m+m}
- { \IfExerciseBooleanPropertyTF {#1} {} {#2} }
-
-\NewDocumentCommand \SaveExerciseProperty {mm}
- { \xsim_save_property:xxnN {\ExerciseType} {\ExerciseID} {#1} #2 }
-
-\NewDocumentCommand \GlobalSaveExerciseProperty {mm}
- { \xsim_gsave_property:xxnN {\ExerciseType} {\ExerciseID} {#1} #2 }
-
-% ----------------------------------------------------------------------------
-
-\NewDocumentCommand \DeclareExerciseParameter {st!m}
- {
- \IfBooleanTF {#1} % fixed
- {
- \IfBooleanTF {#2} % mandatory
- { \xsim_declare_parameter:nnn {true} {true} {#3} }
- { \xsim_declare_parameter:nnn {true} {false} {#3} }
- }
- {
- \IfBooleanTF {#2} % mandatory
- { \xsim_declare_parameter:nnn {false} {true} {#3} }
- { \xsim_declare_parameter:nnn {false} {false} {#3} }
- }
- }
-
-\NewExpandableDocumentCommand \GetExerciseParameter {m}
- { \xsim_get_parameter:on {\ExerciseType} {#1} }
-
-\NewDocumentCommand \SetExerciseParameter {mmm}
- { \xsim_set_parameter:nnn {#1} {#2} {#3} }
-
-\NewDocumentCommand \SetExerciseParameters {mm}
- { \xsim_set_parameters:nn {#1} {#2} }
-
-\NewExpandableDocumentCommand \GetExerciseName {}
- {
- \IfInsideSolutionTF
- { \GetExerciseParameter {solution-name} }
- { \GetExerciseParameter {exercise-name} }
- }
-
-\NewExpandableDocumentCommand \GetExerciseHeadingF {m}
- {
- \IfInsideSolutionTF
- {
- \IfExerciseParameterSetTF {solution-heading}
- { \GetExerciseParameter {solution-heading} }
- {#1}
- }
- {
- \IfExerciseParameterSetTF {exercise-heading}
- { \GetExerciseParameter {exercise-heading} }
- {#1}
- }
- }
-
-\NewDocumentCommand \GetExerciseBody {m}
- { \xsim_input:oon { \ExerciseType } { \ExerciseID } {#1} }
-
-\NewExpandableDocumentCommand \IfExerciseParameterSetTF {+m+m+m}
- { \xsim_if_parameter_set:nnTF {\ExerciseType} {#1} {#2} {#3} }
-
-\NewExpandableDocumentCommand \IfExerciseParameterSetT {+m+m}
- { \IfExerciseParameterSetTF {#1} {#2} {} }
-
-\NewExpandableDocumentCommand \IfExerciseParameterSetF {+m+m}
- { \IfExerciseParameterSetTF {#1} {} {#2} }
-
-\NewExpandableDocumentCommand \ExerciseParameterIfSetTF {+m+m+m+m}
- { \xsim_if_parameter_set:nnTF {#1} {#2} {#3} {#4} }
-
-\NewExpandableDocumentCommand \ExerciseParameterIfSetT {+m+m+m}
- { \ExerciseParameterIfSetTF {#1} {#2} {#3} {} }
-
-\NewExpandableDocumentCommand \ExerciseParameterIfSetF {+m+m+m}
- { \ExerciseParameterIfSetTF {#1} {#2} {} {#3} }
-
-\NewDocumentCommand \GetExerciseParameterTF {m+m+m}
- { \xsim_get_parameter_if_set:onTF {\ExerciseType} {#1} {#2} {#3} }
-
-\NewDocumentCommand \GetExerciseParameterT {m+m}
- { \GetExerciseParameterTF {#1} {#2} {} }
-
-\NewDocumentCommand \GetExerciseParameterF {m+m+m}
- { \GetExerciseParameterTF {#1} {} {#2} }
-
-% ----------------------------------------------------------------------------
-
-\NewDocumentCommand \ExercisePropertyIfSetTF {mmm+m+m}
- { \xsim_if_property_set:nnnTF {#1} {#2} {#3} {#4} {#5} }
-
-\NewDocumentCommand \ExercisePropertyIfSetT {mmm+m}
- { \ExercisePropertyIfSetTF {#1} {#2} {#3} {#4} {} }
-
-\NewDocumentCommand \ExercisePropertyIfSetF {mmm+m}
- { \ExercisePropertyIfSetTF {#1} {#2} {#3} {} {#4} }
-
-\NewExpandableDocumentCommand \ExercisePropertyGet {mmm}
- { \xsim_get_property:nnn {#1} {#2} {#3} }
-
-\NewExpandableDocumentCommand \ExercisePropertyGetAlias {mm}
- { \xsim_get_property:nnf {#1} {#2} { \xsim_property_alias:n {#1} } }
-
-\NewDocumentCommand \ExercisePropertySave {mmmm}
- { \xsim_save_property:nnnN {#1} {#2} {#3} #4 }
-
-\NewDocumentCommand \ExercisePropertyGlobalSave {mmmm}
- { \xsim_gsave_property:nnnN {#1} {#2} {#3} #4 }
-
-\NewExpandableDocumentCommand \ExerciseParameterGet {mm}
- { \xsim_get_parameter:nn {#1} {#2} }
-
-% ----------------------------------------------------------------------------
-
-\NewExpandableDocumentCommand \XSIMtranslate {m}
- { \xsim_translate:n {#1} }
-
-\NewExpandableDocumentCommand \XSIMexpandcode {+m}
- { \use:e {#1} }
-
-\NewExpandableDocumentCommand \XSIMmixedcase {m}
- { \tl_mixed_case:f {#1} }
-
-\NewDocumentCommand \XSIMputright {mm}
- { \tl_put_right:Nn #1 {#2} }
-
-\NewExpandableDocumentCommand \XSIMifeqTF {+m+m+m+m}
- { \tl_if_eq:ffTF {#1} {#2} {#3} {#4} }
-
-\NewExpandableDocumentCommand \XSIMifeqT {+m+m+m}
- { \XSIMifeqTF {#1} {#2} {#3} {} }
-
-\NewExpandableDocumentCommand \XSIMifeqF {+m+m+m}
- { \XSIMifeqTF {#1} {#2} {} {#3} }
-
-\NewExpandableDocumentCommand \XSIMifblankTF {+m+m+m}
- { \tl_if_blank:fTF {#1} {#2} {#3} }
-
-\NewExpandableDocumentCommand \XSIMifblankT {+m+m}
- { \XSIMifblankTF {#1} {#2} {} }
-
-\NewExpandableDocumentCommand \XSIMifblankF {+m+m}
- { \XSIMifblankTF {#1} {} {#2} {} }
-
-% ----------------------------------------------------------------------------
-
-\NewDocumentCommand \DeclareExerciseGoal {m}
- { \xsim_declare_exercise_goal:n {#1} }
-\@onlypreamble \DeclareExerciseGoal
-
-\NewDocumentCommand \IfExerciseGoalTF {mm+m+m}
- {
- \xsim_if_goal_value:xxnnTF
- {\ExerciseType} {\ExerciseID} {#1}
- {#2}
- {#3} {#4}
- }
-
-\NewDocumentCommand \IfExerciseGoalT {mm+m}
- { \IfExerciseGoalTF {#1} {#2} {#3} {} }
-
-\NewDocumentCommand \IfExerciseGoalF {mm+m}
- { \IfExerciseGoalTF {#1} {#2} {} {#3} }
-
-\NewDocumentCommand \IfExerciseGoalSingularTF {mmm}
- { \IfExerciseGoalTF {#1} {=1} {#2} {#3} }
-
-\NewDocumentCommand \IfExerciseGoalSingularT {mm}
- { \IfExerciseGoalT {#1} {=1} {#2} }
-
-\NewDocumentCommand \IfExerciseGoalSingularF {mm}
- { \IfExerciseGoalF {#1} {=1} {#2} }
-
-\NewDocumentCommand \IfExerciseTypeGoalsSumTF {mmm+m+m}
- { \xsim_if_goals_sum:nnnTF {#1} {#2} {#3} {#4} {#5} }
-
-\NewDocumentCommand \IfExerciseTypeGoalsSumT {mmm+m}
- { \IfExerciseTypeGoalsSumTF {#1} {#2} {#3} {#4} {} }
-
-\NewDocumentCommand \IfExerciseTypeGoalsSumF {mmm+m}
- { \IfExerciseTypeGoalsSumTF {#1} {#2} {#3} {} {#4} }
-
-\NewDocumentCommand \IfExerciseGoalsSumTF {mm+m+m}
- { \xsim_if_total_goals_sum:nnTF {#1} {#2} {#3} {#4} }
-
-\NewDocumentCommand \IfExerciseGoalsSumT {mm+m}
- { \IfExerciseGoalsSumTF {#1} {#2} {#3} {} }
-
-\NewDocumentCommand \IfExerciseGoalsSumF {mm+m}
- { \IfExerciseGoalsSumTF {#1} {#2} {} {#3} }
-
-\NewDocumentCommand \TotalExerciseTypeGoal {mmmm}
- { \xsim_print_goal_sum:nnnn {#1} {#2} {#3} {#4} }
-
-\NewDocumentCommand \TotalExerciseTypeGoals {mmmm}
- { \xsim_print_goals_sum:nnnn {#1} {#2} {#3} {#4} }
-
-\NewDocumentCommand \TotalExerciseGoal {mmm}
- { \xsim_print_total_goal_sum:nnn {#1} {#2} {#3} }
-
-\NewDocumentCommand \TotalExerciseGoals {mmm}
- { \xsim_print_total_goals_sum:nnn {#1} {#2} {#3} }
-
-\NewDocumentCommand \AddtoExerciseTypeGoal {mmmm}
- { \xsim_addto_goal:nnnn {#1} {#2} {#3} {#4} }
-
-\NewDocumentCommand \AddtoExerciseGoal {mm}
- { \xsim_addto_goal:xxnn {\ExerciseType} {\ExerciseID} {#1} {#2} }
-
-\NewDocumentCommand \ExerciseGoalValuePrint {mmm}
- { \xsim_print_goal:nnn {#1} {#2} {#3} }
-
-\NewDocumentCommand \AddtoExerciseTypeGoalPrint {mmmmmm}
- {
- \xsim_addto_goal:nnnn {#1} {#2} {#3} {#4}
- \xsim_print_goal:nnn {#4} {#5} {#6}
- }
-
-\NewDocumentCommand \AddtoExerciseGoalPrint {mmmm}
- {
- \xsim_addto_goal:xxnn {\ExerciseType} {\ExerciseID} {#1} {#2}
- \xsim_print_goal:nnn {#2} {#3} {#4}
- }
-
-% ----------------------------------------------------------------------------
-\NewDocumentCommand \DeclareGradeDistribution {m}
- { \xsim_declare_relative_grades:n {#1} }
-
-\NewDocumentCommand \GetGradeRequirementForGoal {mmmm}
- { \xsim_get_grade_goal:nnnn {#1} {#2} {#3} {#4} }
-
-\NewDocumentCommand \GetGradeRequirementForGoals {mmmm}
- { \xsim_get_grade_requirement:nnnn {#1} {#2} {#3} {#4} }
-
-\NewDocumentCommand \GetGradeRequirement {mmm}
- { \xsim_get_absolute_grade_requirement:nnn {#1} {#2} {#3} }
-
-% ----------------------------------------------------------------------------
-
-\NewDocumentCommand \DeclareExerciseTagging {m}
- { \xsim_new_tag_type:n {#1} }
-\@onlypreamble \DeclareExerciseTagging
-
-\NewDocumentCommand \ProvideExerciseTagging {m}
- {
- \xsim_if_tag_type_exist:nTF {#1}
- { \msg_warning:nnn {xsim} {tag-exists} {#1} }
- { \xsim_new_tag_type:n {#1} }
- }
-
-\NewDocumentCommand \ForEachExerciseTag {m+m}
- { \xsim_foreach_exercise_tag:oonn {\ExerciseType} {\ExerciseID} {#1} {#2} }
-
-\NewDocumentCommand \ListExerciseTags {mm}
- { \xsim_exercise_tags_use:oonn {\ExerciseType} {\ExerciseID} {#1} {#2} }
-
-\NewDocumentCommand \UseExerciseTags {mmmm}
- {
- \xsim_exercise_tags_use:oonnnn
- {\ExerciseType}
- {\ExerciseID}
- {#1}
- {#2}
- {#3}
- {#4}
- }
-
-\NewDocumentCommand \IfExerciseTagSetTF {m+m+m}
- { \xsim_if_tags_value:nTF {#1} {#2} {#3} }
-\NewDocumentCommand \IfExerciseTagSetT {m+m}
- { \xsim_if_tags_value:nT {#1} {#2} }
-\NewDocumentCommand \IfExerciseTagSetF {m+m}
- { \xsim_if_tags_value:nF {#1} {#2} }
-
-\NewDocumentCommand \IfExerciseTopicSetTF {m+m+m}
- { \xsim_if_topic_value:nTF {#1} {#2} {#3} }
-\NewDocumentCommand \IfExerciseTopicSetT {m+m}
- { \xsim_if_topic_value:nT {#1} {#2} }
-\NewDocumentCommand \IfExerciseTopicSetF {m+m}
- { \xsim_if_topic_value:nF {#1} {#2} }
-
-% ----------------------------------------------------------------------------
-
-\NewDocumentCommand \XSIMatbegindocument {+m}
- { \xsim_at_begin_document:n {#1} }
-
-\NewDocumentCommand \XSIMatenddocument {+m}
- { \xsim_at_end_document:n {#1} }
-
-% ----------------------------------------------------------------------------
-
-\NewDocumentCommand \ForEachPrintedExerciseByType {+m}
- { \xsim_foreach_exercise_type_id:nn {print} {#1} }
-
-\NewDocumentCommand \ForEachPrintedExerciseByID {+m}
- { \xsim_foreach_exercise_id_type:nn {print} {#1} }
-
-\NewDocumentCommand \ForEachUsedExerciseByType {+m}
- { \xsim_foreach_exercise_type_id:nn {used} {#1} }
-
-\NewDocumentCommand \ForEachUsedExerciseByID {+m}
- { \xsim_foreach_exercise_id_type:nn {used} {#1} }
-
-% ----------------------------------------------------------------------------
-
-\NewDocumentCommand \DeclareExerciseTranslations {mm}
- { \xsim_declare_translations:nn {#1} {#2} }
-\@onlypreamble \DeclareExerciseTranslations
-
-\NewDocumentCommand \DeclareExerciseTranslation {mmm}
- { \xsim_declare_translation:nnn {#1} {#2} {#3} }
-\@onlypreamble \DeclareExerciseTranslation
-
-\NewDocumentCommand \ForEachExerciseTranslation {+m}
- { \xsim_for_all_translations_do:n {#1} }
-
-% ----------------------------------------------------------------------------
-
-\NewDocumentCommand \DeclareExerciseCollection {m}
- { \xsim_new_collection:n {#1} }
-\@onlypreamble \DeclareExerciseCollection
-
-\NewDocumentCommand \collectexercisestype {mm}
- { \xsim_start_collection:nn {#1} {#2} }
-
-\NewDocumentCommand \collectexercises {m}
- { \xsim_start_collection:n {#1} }
-
-\NewDocumentCommand \collectexercisesstop {m}
- { \xsim_stop_collection:n {#1} }
-
-\NewDocumentCommand \printcollection {O{}m}
- { \xsim_print_collection:nn {#1} {#2} }
-
-\NewDocumentCommand \printrandomexercises {O{}m}
- {
- \group_begin:
- \keys_set:nn {xsim/random} {#1}
- \xsim_print_random_list:VnN
- \l_xsim_random_collection_tl
- {#2}
- \l_xsim_random_exclude_list_clist
- \group_end:
- }
-
-% ----------------------------------------------------------------------------
-
-\NewDocumentCommand \blank {som}
- {
- \group_begin:
- \IfNoValueF {#2} { \keys_set:nn {xsim/blank} {#2} }
- \mode_if_vertical:TF
- {
- \IfBooleanTF {#1}
- { \xsim_blank:n {#3} }
- {
- \bool_if:NT \l__xsim_blank_linespread_bool
- { \linespread { \l__xsim_blank_linespread_tl } \selectfont }
- \noindent \null \xsim_blank:n {#3} \par
- }
- }
- { \xsim_blank:n {#3} }
- \group_end:
- }
-
-\NewDocumentCommand \examspace { sm }
- {
- \IfBooleanTF {#1}
- { \xsim_examspace:nn { \c_true_bool } {#2} }
- { \xsim_examspace:nn { \c_false_bool } {#2} }
- }
-
-% ----------------------------------------------------------------------------
-
-\NewDocumentCommand \gradingtable {O{}}
- {
- \group_begin:
- \keys_set:nn {xsim/grading-table} {#1}
- \xsim_setup_template:nVn {table} \l_xism_grading_table_template_tl
- {
- \providecommand* \ExerciseTableCode {}
- \providecommand* \ExerciseTableType [1] {}
- \providecommand* \ExerciseType {}
- \tl_set_eq:NN \ExerciseType \l_xism_grading_table_exercise_type_tl
- \renewcommand* \ExerciseTableCode {}
- \renewcommand* \ExerciseTableType [1]
- { \XSIMifblankTF { \ExerciseType } {##1} { \ExerciseType } }
- }
- \xsim_use_template:nV {table} \l_xism_grading_table_template_tl
- \group_end:
- }
-
-% ----------------------------------------------------------------------------
-
-\NewDocumentCommand \XSIMprint {mO{}mm}
- { \xsim_insert:nenn {#3} { \xsim_normalize_id:n {#4} } {#2} {#1} }
-
-\NewDocumentCommand \XSIMxprint {mO{}mm}
- { \xsim_insert:xxnn {#3} { \xsim_normalize_id:e {#4} } {#2} {#1} }
-
-\NewDocumentCommand \printexercise {O{}mm}
- {
- \clist_map_inline:nn {#3}
- { \xsim_insert:nenn {#2} { \xsim_normalize_id:n {##1} } {#1} {exercise} }
- }
-
-\NewDocumentCommand \xprintexercise {O{}mm}
- {
- \clist_map_inline:nn {#3}
- { \xsim_insert:xxnn {#2} { \xsim_normalize_id:e {##1} } {#1} {exercise} }
- }
-
-\NewDocumentCommand \printsolution {O{}mm}
- {
- \clist_map_inline:nn {#3}
- { \xsim_insert:nenn {#2} { \xsim_normalize_id:n {##1} } {#1} {solution} }
- }
-
-\NewDocumentCommand \xprintsolution {O{}mm}
- {
- \clist_map_inline:nn {#3}
- { \xsim_insert:xxnn {#2} { \xsim_normalize_id:e {##1} } {#1} {solution} }
- }
-
-% ----------------------------------------------------------------------------
-
-\NewDocumentCommand \printsolutionstype {sO{}m}
- {
- \IfBooleanTF {#1}
- { \xsim_print_type_solutions:nnn { \c_true_bool } {#2} {#3} }
- { \xsim_print_type_solutions:nnn { \c_false_bool } {#2} {#3} }
- }
-
-\NewDocumentCommand \printsolutions {sO{}}
- {
- \IfBooleanTF {#1}
- { \xsim_print_all_solutions_per_type:nn { \c_true_bool } {#2} }
- { \xsim_print_all_solutions_per_type:nn { \c_false_bool } {#2} }
- }
-
-\NewDocumentCommand \printallsolutions {sO{}}
- {
- \IfBooleanTF {#1}
- { \xsim_print_all_solutions_per_id:nn { \c_true_bool } {#2} }
- { \xsim_print_all_solutions_per_id:nn { \c_false_bool } {#2} }
- }
-
-% ----------------------------------------------------------------------------
-
-\NewDocumentCommand \printforexercises {sO{}+mO{}}
- {
- \IfBooleanTF {#1}
- {
- \xsim_foreach_exercise_type:n
- { \xsim_print_type_code:nnnnn { \c_true_bool } {#2} {#4} {##1} {#3} }
- }
- {
- \xsim_foreach_exercise_type:n
- { \xsim_print_type_code:nnnnn { \c_false_bool } {#2} {#4} {##1} {#3} }
- }
- }
-
-% ----------------------------------------------------------------------------
-
-\NewDocumentCommand \xsimsetup {+m}
- { \xsim_setup:n {#1} }
-
-% ----------------------------------------------------------------------------
-\NewExpandableDocumentCommand \XSIMifchapterTF {+m+m}
- { \xsim_if_chapter:TF {#1} {#2} }
-
-\NewExpandableDocumentCommand \XSIMifchapterT {+m}
- { \xsim_if_chapter:T {#1} }
-
-\NewExpandableDocumentCommand \XSIMifchapterF {+m}
- { \xsim_if_chapter:F {#1} }
-
-% ----------------------------------------------------------------------------
-\file_input_stop:
diff --git a/macros/latex/contrib/xsim/code/xsim.modules.code.tex b/macros/latex/contrib/xsim/code/xsim.modules.code.tex
deleted file mode 100644
index c487c73036..0000000000
--- a/macros/latex/contrib/xsim/code/xsim.modules.code.tex
+++ /dev/null
@@ -1,220 +0,0 @@
-% ----------------------------------------------------------------------------
-% the XSIM package - modules module
-%
-% eXercise Sheets IMproved
-%
-% ----------------------------------------------------------------------------
-% Clemens Niederberger
-% Web: https://github.com/cgnieder/xsim
-% E-Mail: contact@mychemistry.eu
-% ----------------------------------------------------------------------------
-% Copyright 2017--2020 Clemens Niederberger
-%
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% ----------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% ----------------------------------------------------------------------------
-%
-% this is a pseudo module as it does the actual definitions for the whole
-% module loading stuff; we do this so both packages `xsimverb' and `xsim' can
-% use the `verbwrite' module
-\RequirePackage{scrlfile}
-\ExplSyntaxOn
-
-\msg_new:nnn {xsim} {module-missing}
- {
- You've~ requested~ the~ xsim~ module~ `#1'~ but~ it~ appears~ to~
- be~ missing~ on~ your~ system.~ Maybe~ you've~ misspelled~ the~ name?~
- Loading~ the~ module~ will~ abort~ \msg_line_context:
- }
-
-\msg_new:nnn {xsim} {loading-module}
- { Loading~ module~ `#1'~ ... }
-
-\msg_new:nnn {xsim} {wrong-module-name}
- { The~ module~ file~ name~ is~ `#2'~ but~ it~ provides~ module~ `#1'. }
-
-\msg_new:nnn {xsim} {forbidden-module}
- {
- You've~ requested~ the~ xsim~ module~ `modules'~ \msg_line_context: .~
- This~ module~ is~ a~ pseudo~ module~ which~ may~ not~ be~ loaded~ through~
- the~ module~ loading~ mechansim.
- }
-
-% ----------------------------------------------------------------------------
-
-\cs_generate_variant:Nn \str_if_eq:nnF {xx}
-
-\tl_const:Nn \c__xsim_module_extension_tl {code.tex}
-\tl_const:Nn \c__xsim_module_prefix_tl {xsim}
-
-\seq_new:N \g__xsim_loaded_modules_seq
-\prop_new:N \g__xsim_loaded_modules_prop
-
-\cs_new_protected:Npn \xsim_load_modules:n #1
- { \clist_map_inline:nn {#1} { \xsim_load_module:n {##1} } }
-
-\cs_new_protected:Npn \xsim_load_module:n #1
- {
- \tl_set:Nx \l_tmpa_tl { \tl_trim_spaces:n {#1} }
- \str_if_eq:VnTF \l_tmpa_tl {modules}
- { \msg_error:nn {xsim} {forbidden-module} }
- { \__xsim_load_module:V \l_tmpa_tl }
- }
-
-\cs_new_protected:Npn \__xsim_load_module:n #1
- {
- \xsim_if_module_loaded:nF {#1}
- {
- \xsim_if_module_exist:nTF {#1}
- {
- \__xsim_use_module_hook:nn {#1} {before}
- \msg_info:nnn {xsim} {loading-module} {#1}
- \@onefilewithoptions
- {\c__xsim_module_prefix_tl.#1}[][]
- \c__xsim_module_extension_tl
- \__xsim_use_module_hook:nn {#1} {after}
- }
- { \msg_error:nnn {xsim} {module-missing} {#1} }
- }
- }
-\cs_generate_variant:Nn \__xsim_load_module:n {V}
-
-\prg_new_conditional:Npnn \xsim_if_module_loaded:n #1 {p,T,F,TF}
- {
- \seq_if_in:NnTF \g__xsim_loaded_modules_seq {#1}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-\prg_new_conditional:Npnn \xsim_if_module_exist:n #1 {p,T,F,TF}
- {
- \file_if_exist:nTF
- {\c__xsim_module_prefix_tl.#1.\c__xsim_module_extension_tl}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-% --------------------------------------------------------------------------
-% module hooks:
-% #1: module
-% #2: code
-\cs_new_protected:Npn \xsim_after_module:nn #1#2
- {
- \xsim_if_module_loaded:nTF {#1}
- {#2}
- { \__xsim_add_to_module_hook:nnn {#1} {after} {#2} }
- }
-
-% #1: module
-% #2: code
-\cs_new_protected:Npn \xsim_before_module:nn #1#2
- {
- \xsim_if_module_loaded:nF {#1}
- { \__xsim_add_to_module_hook:nnn {#1} {before} {#2} }
- }
-
-% #1: module
-% #2: hook name
-% #3: code
-\cs_new_protected:Npn \__xsim_add_to_module_hook:nnn #1#2#3
- {
- \xsim_if_module_loaded:nF {#1}
- {
- \tl_if_exist:cF {g__xsim_module_#1_#2_hook_tl}
- { \tl_new:c {g__xsim_module_#1_#2_hook_tl} }
- \tl_gput_right:cn {g__xsim_module_#1_#2_hook_tl} {#3}
- }
- }
-
-% #1: module
-% #2: hook name
-\cs_new_protected:Npn \__xsim_use_module_hook:nn #1#2
- {
- \tl_if_exist:cT {g__xsim_module_#1_#2_hook_tl}
- {
- \tl_use:c {g__xsim_module_#1_#2_hook_tl}
- \tl_gclear:c {g__xsim_module_#1_#2_hook_tl}
- }
- }
-
-% --------------------------------------------------------------------------
-
-\tl_new:N \l__xsim_module_date_tl
-\tl_new:N \l__xsim_module_version_tl
-
-\tl_if_exist:NF \c_xsim_date_tl
- { \tl_set:Nx \l__xsim_module_date_tl {\c_xsimverb_date_tl} }
-\tl_if_exist:NF \c_xsim_version_tl
- { \tl_set:Nx \l__xsim_module_version_tl {\c_xsimverb_version_tl} }
-
-\AfterPackage*{xsim}
- {
- \tl_set:Nx \l__xsim_module_date_tl {\c_xsim_date_tl}
- \tl_set:Nx \l__xsim_module_version_tl {\c_xsim_version_tl}
- }
-
-\cs_new_protected:Npn \__xsim_module:nn #1#2
- {
- \seq_gput_right:Nn \g__xsim_loaded_modules_seq {#1}
- \prop_gput:Nnn \g__xsim_loaded_modules_prop {#1} {#2}
- \str_if_eq:xxF
- {\c__xsim_module_prefix_tl.#1.\c__xsim_module_extension_tl}
- {\@currname.\@currext}
- {
- \msg_error:nnnxx {xsim} {wrong-module-name}
- {#1}
- {\@currname.\@currext}
- }
- \ProvidesFile
- {\c__xsim_module_prefix_tl.#1.\c__xsim_module_extension_tl}
- [
- \l__xsim_module_date_tl
- \c_space_tl
- v \l__xsim_module_version_tl
- \c_space_tl
- xsim~ module~ `#1'~ (#2)
- ]
- }
-\cs_generate_variant:Nn \msg_error:nnnn {nnnx}
-
-% --------------------------------------------------------------------------
-% define a xsim module:
-% #1: name
-% #2: description
-\NewDocumentCommand \XSIMmodule {mm}
- { \__xsim_module:nn {#1} {#2} \ExplSyntaxOn }
-
-% --------------------------------------------------------------------------
-% style files
-\NewDocumentCommand \xsimstyle {smO{}}
- {
- \__xsim_module:nn {style.#2} {#3}
- \IfBooleanT {#1} { \ExplSyntaxOn }
- }
-
-% \cs_new_protected:Npn \xsim_style_options:nn #1#2
-% { \keys_define:nn {xsim/#1} {#2} }
-
-\cs_new_protected:Npn \xsim_load_style:n #1
- { \clist_map_inline:nn {#1} { \xsim_load_module:n {style.##1} } }
-
-\keys_define:nn {xsim}
- { load-style .code:n = \xsim_load_style:n {#1} }
-
-\NewDocumentCommand \loadxsimstyle {m}
- { \xsim_load_style:n {#1} }
-
-% --------------------------------------------------------------------------
-\file_input_stop:
diff --git a/macros/latex/contrib/xsim/code/xsim.properties.code.tex b/macros/latex/contrib/xsim/code/xsim.properties.code.tex
deleted file mode 100644
index 12a6fdf220..0000000000
--- a/macros/latex/contrib/xsim/code/xsim.properties.code.tex
+++ /dev/null
@@ -1,540 +0,0 @@
-% ----------------------------------------------------------------------------
-% the XSIM package - properties module
-%
-% eXercise Sheets IMproved
-%
-% ----------------------------------------------------------------------------
-% Clemens Niederberger
-% Web: https://github.com/cgnieder/xsim
-% E-Mail: contact@mychemistry.eu
-% ----------------------------------------------------------------------------
-% Copyright 2017--2020 Clemens Niederberger
-%
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% ----------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% ----------------------------------------------------------------------------
-\XSIMmodule{properties}{properties of exercises}
-
-\xsim_load_modules:n {base,auxfile}
-
-\msg_new:nnn {xsim} {unknown-property}
- {
- You~ tried~ to~ set~ the~ property~ `#1'~ \msg_line_context: . \\
- This~ property~ does~ not~ exist.~ Check~ for~ a~ typo~ or~ \\
- define~ the~ property~ yourself.
- }
-
-\msg_new:nnn {xsim} {property-unique}
- {
- You~ tried~ to~ set~ the~ property~ `#1'~ \msg_line_context: . \\
- This~ property~ has~ to~ have~ a~ unique~ value~ and~ thus~ \\
- cannot~ be~ set~ to~ `#2'~ since~ this~ value~ is~ already~ talen.
- }
-
-\msg_new:nnn {xsim} {no-boolean-property}
- {
- You~ tried~ to~ check~ the~ boolean~ value~ of~ property~ `#1'~
- \msg_line_context: . \\
- However,~ property~ `#1'~ is~ not~ a~ boolean~ property!
- }
-
-\msg_new:nnn {xsim} {unbalanced-property-list}
- {
- There~ is~ a~ mis-match~ in~ the~ property~ list: \\
- `#1' \\
- \msg_line_context:
- }
-
-\seq_new:N \l__xsim_properties_seq
-\seq_new:N \l__xsim_boolean_properties_seq
-\seq_new:N \l__xsim_unique_properties_seq
-\seq_new:N \l__xsim_noupdate_properties_seq
-\seq_new:N \l__xsim_given_properties_seq
-
-% #1: type
-% #2: id
-% #3: property
-\cs_new_protected:Npn \__xsim_define_property:nnn #1#2#3
- { \xsim_attribute_new:nn {#1!#2} {#3} }
-
-% check if property is set:
-% #1: type
-% #2: id
-% #3: property
-\prg_new_conditional:Npnn \xsim_if_property_set:nnn #1#2#3 {p,T,F,TF}
- {
- \xsim_attribute_if_set:nnTF {#1!#2} {#3}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-\prg_generate_conditional_variant:Nnn \xsim_if_property_set:nnn
- {nx,nnx,xx,nV}
- {T,F,TF}
-
-% new property:
-% #1: boolean if unique
-% #2: boolean if boolean
-% #3: boolean if noupdate
-% #4: property name
-\cs_new_protected:Npn \xsim_declare_property:nnnn #1#2#3#4
- {
- \xsim_if_property_exist:nF {#4}
- {
- \seq_put_right:Nn \l__xsim_properties_seq {#4}
- \bool_if:nTF {#3}
- {
- \seq_if_in:NnF \l__xsim_noupdate_properties_seq {#4}
- { \seq_put_right:Nn \l__xsim_noupdate_properties_seq {#4} }
- }
- { \xsim_new_list:n {#4} }
- \bool_if:nTF {#2}
- {
- \xsim_verbose:n
- { Declaring~ new~ boolean~ exercise~ property~ `#4'. }
- \seq_if_in:NnF \l__xsim_boolean_properties_seq {#4}
- { \seq_put_right:Nn \l__xsim_boolean_properties_seq {#4} }
- }
- {
- \bool_if:nTF {#1}
- {
- \xsim_verbose:n
- { Declaring~ new~ unique~ exercise~ property~ `#4'. }
- \seq_if_in:NnF \l__xsim_unique_properties_seq {#4}
- { \seq_put_right:Nn \l__xsim_unique_properties_seq {#4} }
- \seq_new:c {l__xsim_unique_property_#4_values_seq}
- }
- { \xsim_verbose:n { Declaring~ new~ exercise~ property~ `#4'. } }
- }
- \bool_if:nF {#3}
- {
- \xsim_at_end_document:n { \xsim_update_list:n {#4} }
- \xsim_at_begin_document:n { \__xsim_set_property_from_list:n {#4} }
- }
- }
- }
-
-% check if property exists:
-\prg_new_conditional:Npnn \xsim_if_property_exist:n #1 {p,T,F,TF}
- {
- \seq_if_in:NnTF \l__xsim_properties_seq {#1}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-\cs_generate_variant:Nn \xsim_if_property_exist:nTF {x}
-
-\prg_new_conditional:Npnn \xsim_if_property_noupdate:n #1 {p,T,F,TF}
- {
- \seq_if_in:NnTF \l__xsim_noupdate_properties_seq {#1}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-\cs_generate_variant:Nn \xsim_if_property_noupdate:nF {V}
-
-\prg_new_conditional:Npnn \xsim_if_property_boolean:n #1 {p,T,F,TF}
- {
- \seq_if_in:NnTF \l__xsim_boolean_properties_seq {#1}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-\prg_new_conditional:Npnn \xsim_if_property_unique:n #1 {p,T,F,TF}
- {
- \seq_if_in:NnTF \l__xsim_unique_properties_seq {#1}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-% true if property #1 has been set in the /last/ call of
-% \xsim_set_properties:nnn
-\prg_new_conditional:Npnn \xsim_if_property_given:n #1 {p,T,F,TF}
- {
- \seq_if_in:NnTF \l__xsim_given_properties_seq {#1}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-% #1: property
-% #2: value
-\prg_new_conditional:Npnn \xsim_if_property_unique_value:nn #1#2 {p,T,F,TF}
- {
- \xsim_if_property_unique:nTF {#1}
- {
- \seq_if_in:cnTF {l__xsim_unique_property_#1_values_seq} {#2}
- { \prg_return_true: }
- { \prg_return_false: }
- }
- { \prg_return_false: }
- }
-
-% #1: type
-% #2: id
-% #3: property
-% #4: value
-\cs_new_protected:Npn \xsim_set_property:nnnn #1#2#3#4
- {
- \xsim_if_property_exist:nTF {#3} % _p
- {
- \xsim_if_property_set:nnnTF {#1} {#2} {#3} % _p
- {
- \xsim_if_property_unique_value:nnTF {#3} {#4} %_p
- { \msg_warning:nnnn {xsim} {property-unique} {#3} {#4} }
- {
- \xsim_if_property_boolean:nTF {#3} % _p
- { \__xsim_set_boolean_property:nnnn {#1} {#2} {#3} {#4} }
- {
- \xsim_if_property_unique:nTF {#3} % _p
- { \__xsim_set_unique_property:nnnn {#1} {#2} {#3} {#4} }
- { \__xsim_set_property:nnnn {#1} {#2} {#3} {#4} }
- }
- }
- }
- {
- \xsim_if_property_boolean:nTF {#3} % _p
- { \__xsim_set_boolean_property:nnnn {#1} {#2} {#3} {#4} }
- {
- \xsim_if_property_unique:nTF {#3} % _p
- { \__xsim_set_unique_property:nnnn {#1} {#2} {#3} {#4} }
- { \__xsim_set_property:nnnn {#1} {#2} {#3} {#4} }
- }
- }
- }
- { \msg_error:nnn {xsim} {unknown-property} {#3} }
- }
-\cs_generate_variant:Nn \xsim_set_property:nnnn {nnxx,nnnV,nV,nVnx,nnnx,xx,xxnx,nxnx}
-
-% #1: type
-% #2: id
-% #3: property
-% #4: value
-\cs_new_protected:Npn \__xsim_set_boolean_property:nnnn #1#2#3#4
- {
- \str_case_e:nnTF { \str_lowercase:n {#4} }
- {
- {} {}
- {true} {}
- }
- { \__xsim_set_property:nnnn {#1} {#2} {#3} {true} }
- { \__xsim_set_property:nnnn {#1} {#2} {#3} {false} }
- }
-
-% #1: type
-% #2: id
-% #3: property
-% #4: value
-\cs_new_protected:Npn \__xsim_set_unique_property:nnnn #1#2#3#4
- {
- \__xsim_set_property:nnnn {#1} {#2} {#3} {#4}
- \__xsim_set_property_reverse:nnnn {#1} {#2} {#3} {#4}
- }
-
-% #1: type
-% #2: id
-% #3: property
-\cs_new_protected:Npn \__xsim_unset_property:nnn #1#2#3
- {
- \xsim_verbose:n
- { Un-setting~ property~ `#3'~ of~ exercise~ type~ `#1'~ id~ `#2'. }
- \__xsim_remove_property_from_list:nnn {#1} {#2} {#3}
- \xsim_attribute_unset:nn {#1!#2} {#3}
- }
-
-% #1: type
-% #2: id
-% #3: property
-\cs_new_protected:Npn \xsim_unset_property:nnn #1#2#3
- {
- \xsim_if_property_exist:nTF {#3}
- { \__xsim_unset_property:nnn {#1} {#2} {#3} }
- { \msg_error:nnn {xsim} {unknown-property} {#3} }
- }
-\cs_generate_variant:Nn \xsim_unset_property:nnn {nx,nnx,nV}
-
-% #1: type
-% #2: id
-% #3: property
-% #4: value
-\cs_new_protected:Npn \__xsim_set_property:nnnn #1#2#3#4
- {
- \xsim_verbose:n
- {
- Setting~ property~ `#3'~ of~ exercise~ type~ `#1'~ id~ `#2'~ to~
- value~ `#4'.
- }
- \__xsim_remove_property_from_list:nnn {#1} {#2} {#3}
- % now we can safely add the property to the list:
- \xsim_add_to_list:nn {#3} {#1-#2=={#4}}
- \xsim_attribute_set:nnn {#1!#2} {#3} {#4}
- }
-\cs_generate_variant:Nn \__xsim_set_property:nnnn {VVnV}
-
-% #1: type
-% #2: id
-% #3: property
-% #4: value
-\cs_new_protected:Npn \__xsim_set_property_reverse:nnnn #1#2#3#4
- {
- \xsim_attribute_set:nnn {type:#3} {#4} {#1}
- \xsim_attribute_set:nnn {id:#3} {#4} {#2}
- }
-
-\tl_set:Nx \l__xsim_tmpa_tl { \cs_to_str:N \{ }
-\tl_set:Nx \l__xsim_tmpb_tl { \cs_to_str:N \} }
-\use:x
- {
- \cs_new_protected:Npn
- \exp_not:N \__xsim_extract_property_list_entry:NNNwww
- ##1##2##3##4-##5== \l__xsim_tmpa_tl ##6 \l__xsim_tmpb_tl
- \exp_not:N \q_stop
- }
- {
- \str_set:Nn #1 {#4}
- \str_set:Nn #2 {#5}
- \str_set:Nn #3 {#6}
- }
-
-% #1: type
-% #2: id
-% #3: property
-\cs_new_protected:Npn \__xsim_remove_property_from_list:nnn #1#2#3
- {
- % make sure we change the entry if it has been recorded previously:
- \xsim_foreach_list_entry:nn {#3}
- {
- \__xsim_extract_property_list_entry:NNNwww
- \l__xsim_tmpa_str \l__xsim_tmpb_str \l__xsim_tmpc_str ##1 \q_stop
- \str_if_eq:xnT { \l__xsim_tmpa_str - \l__xsim_tmpb_str } {#1-#2}
- {
- \xsim_remove_from_list:nx {#3}
- { #1-#2 == {\l__xsim_tmpc_str} }
- }
- }
- % make sure we change the entry if it has been set during the current run:
- \xsim_foreach_new_list_entry:nn {#3}
- {
- \__xsim_extract_property_list_entry:NNNwww
- \l__xsim_tmpa_str \l__xsim_tmpb_str \l__xsim_tmpc_str ##1 \q_stop
- \str_if_eq:xnT { \l__xsim_tmpa_str - \l__xsim_tmpb_str } {#1-#2}
- {
- \xsim_remove_from_list:nx {#3}
- { #1-#2 == {\l__xsim_tmpc_str} }
- }
- }
- }
-
-\cs_new_protected:Npn \__xsim_set_property_from_list:n #1
- {
- \xsim_foreach_list_entry:nn {#1}
- {
- \__xsim_extract_property_list_entry:NNNwww
- \l__xsim_tmpa_str \l__xsim_tmpb_str \l__xsim_tmpc_str ##1 \q_stop
- \tl_set_rescan:Nnx \l__xsim_tmpc_tl {} { \l__xsim_tmpc_str }
- \__xsim_set_property:VVnV
- \l__xsim_tmpa_str
- \l__xsim_tmpb_str
- {#1}
- \l__xsim_tmpc_tl
- }
- }
-
-% set properties:
-% #1: type
-% #2: id
-% #3: csv list of properties
-\cs_new_protected:Npn \xsim_set_properties:nnn #1#2#3
- {
- \seq_clear:N \l__xsim_given_properties_seq
- \clist_map_inline:nn {#3}
- {
- \seq_set_split:Nnx \l__xsim_tmpa_seq {=} { \tl_trim_spaces:n {##1} }
- \int_compare:nNnT { \seq_count:N \l__xsim_tmpa_seq } > {2}
- { \msg_error:nnn {xsim} {unbalanced-property-list} {##1} }
- \xsim_set_property:nnxx
- {#1}
- {#2}
- { \seq_item:Nn \l__xsim_tmpa_seq {1} }
- { \seq_item:Nn \l__xsim_tmpa_seq {2} }
- \seq_put_right:Nx \l__xsim_given_properties_seq
- { \seq_item:Nn \l__xsim_tmpa_seq {1} }
- }
- \xsim_property_set_aliases:nn {#1} {#2}
- }
-\cs_generate_variant:Nn \xsim_set_properties:nnn {nnx,nxx,nV,nVx}
-
-% ----------------------------------------------------------------------------
-
-\seq_new:N \g__xsim_property_aliases_seq
-
-% #1: property
-\prg_new_conditional:Npnn \xsim_if_property_alias:n #1 {p,T,F,TF}
- {
- \seq_if_in:NnTF \g__xsim_property_aliases_seq {#1}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-% #1: property
-\cs_new:Npn \xsim_property_alias:n #1
- { \xsim_attribute_get:nn {#1} {alias} }
-
-% #1: property
-% #2: alias of
-\cs_new_protected:Npn \xsim_make_property_alias:nn #1#2
- {
- \xsim_if_property_alias:nF {#1}
- {
- \xsim_verbose:n
- { Making~ property~ `#1'~ an~ alias~ of~ property~ `#2'. }
- \xsim_attribute_set:nnn {#1} {alias} {#2}
- \seq_gput_right:Nn \g__xsim_property_aliases_seq {#1}
- }
- }
-
-% #1: type
-% #2: id
-% #3: property
-\cs_new_protected:Npn \xsim_property_set_alias:nnn #1#2#3
- {
- \xsim_if_property_set:nnnF {#1} {#2} {#3}
- {
- \xsim_if_property_set:nnxT {#1} {#2}
- { \xsim_property_alias:n {#3} }
- {
- \xsim_set_property:nnnx {#1} {#2} {#3}
- {
- \xsim_get_property:nnf {#1} {#2}
- { \xsim_property_alias:n {#3} }
- }
- }
- }
- \xsim_if_property_set:nnxT {#1} {#2}
- { \xsim_property_alias:n {#3} }
- {
- \xsim_attribute_set:nnx {alias:#1!#2} {#3}
- {
- \xsim_get_property:nnf {#1} {#2}
- { \xsim_property_alias:n {#3} }
- }
- }
- }
-\cs_generate_variant:Nn \xsim_property_set_alias:nnn {nV}
-
-% #1: type
-% #2: id
-\cs_new_protected:Npn \xsim_property_set_aliases:nn #1#2
- {
- \seq_map_inline:Nn \g__xsim_property_aliases_seq
- { \xsim_property_set_alias:nnn {#1} {#2} {##1} }
- }
-
-% ----------------------------------------------------------------------------
-
-% retrieve properties:
-% #1: type
-% #2: id
-% #3: property
-\cs_new:Npn \xsim_get_property:nnn #1#2#3
- { \xsim_attribute_get:nn {#1!#2} {#3} }
-\cs_generate_variant:Nn \xsim_get_property:nnn {nx,ne,xx,oo,no,nnf,nf,oof,nV}
-
-% #1: property
-% #2: value
-\cs_new:Npn \xsim_get_id_for_property:nn #1#2
- { \xsim_attribute_get:nn {id:#1} {#2} }
-
-% #1: property
-% #2: value
-\cs_new:Npn \xsim_get_type_for_property:nn #1#2
- { \xsim_attribute_get:nn {type:#1} {#2} }
-\cs_generate_variant:Nn \xsim_get_type_for_property:nn {nV}
-
-% #1: id or ID
-\cs_new:Npn \xsim_normalize_id:n #1
- {
- \tl_if_blank:eTF
- { \xsim_get_id_for_property:nn {ID} {#1} }
- {#1}
- { \xsim_get_id_for_property:nn {ID} {#1} }
- }
-\cs_generate_variant:Nn \xsim_normalize_id:n {e}
-
-\cs_new:Npn \__xsim_get_property_tmp:n #1 {}
-\cs_generate_variant:Nn \__xsim_get_property_tmp:n {V}
-
-% #1: type
-% #2: id
-% #3: property
-\cs_new_protected:Npn \xsim_get_property_if_set:nnnTF #1#2#3#4#5
- {
- \group_begin:
- \xsim_if_property_exist:nTF {#3}
- {
- \xsim_if_property_set:nnnTF {#1} {#2} {#3}
- {
- \tl_set:Nx \PropertyValue
- { \xsim_get_property:nnn {#1} {#2} {#3} }
- \cs_set:Npn \__xsim_get_property_tmp:n ##1 {#4}
- \__xsim_get_property_tmp:V \PropertyValue
- }
- {#5}
- }
- { \msg_error:nnn {xsim} {unknown-property} {#3} }
- \group_end:
- }
-\cs_new_protected:Npn \xsim_get_property_if_set:nnnT #1#2#3#4
- { \xsim_get_property_if_set:nnnTF {#1} {#2} {#3} {#4} {} }
-\cs_new_protected:Npn \xsim_get_property_if_set:nnnF #1#2#3#4
- { \xsim_get_property_if_set:nnnTF {#1} {#2} {#3} {} {#4} }
-\cs_generate_variant:Nn \xsim_get_property_if_set:nnnTF {oo}
-
-% #1: type
-% #2: id
-% #3: property
-\prg_new_conditional:Npnn \xsim_if_boolean_property:nnn #1#2#3 {T,F,TF}
- {
- \xsim_if_property_exist:nTF {#3}
- {
- \xsim_if_property_boolean:nTF {#3}
- {
- \xsim_if_property_set:nnnTF {#1} {#2} {#3}
- {
- \bool_if:cTF
- {c_ \xsim_get_property:nnn {#1} {#2} {#3} _bool}
- { \prg_return_true: }
- { \prg_return_false: }
- }
- { \prg_return_false: }
- }
- { \msg_error:nnn {xsim} {no-boolean-property} {#3} }
- }
- { \msg_error:nnn {xsim} {unknown-property} {#3} }
- }
-\cs_generate_variant:Nn \xsim_if_boolean_property:nnnTF {oo}
-\cs_generate_variant:Nn \xsim_if_boolean_property:nnnF {nV}
-
-\cs_new_protected:Npn \xsim_save_property:nnnN #1#2#3#4
- { \tl_set:No #4 { \cs:w __xsim_property_#2!#1!#3: \cs_end: } }
-\cs_generate_variant:Nn \xsim_save_property:nnnN {nx,xx}
-
-\cs_new_protected:Npn \xsim_gsave_property:nnnN #1#2#3#4
- {
- \xsim_save_property:nnnN {#1} {#2} {#3} #4
- \tl_gset:NV #4 #4
- }
-\cs_generate_variant:Nn \xsim_gsave_property:nnnN {nx,xx,nV}
-
-% ----------------------------------------------------------------------------
-\file_input_stop:
-2020/03/09 - add meaningful error if a comma is missing in the property list
-2020/03/14 - performance optimizations
diff --git a/macros/latex/contrib/xsim/code/xsim.random.code.tex b/macros/latex/contrib/xsim/code/xsim.random.code.tex
deleted file mode 100644
index cdd23e3a20..0000000000
--- a/macros/latex/contrib/xsim/code/xsim.random.code.tex
+++ /dev/null
@@ -1,315 +0,0 @@
-% ----------------------------------------------------------------------------
-% the XSIM package - random module
-%
-% eXercise Sheets IMproved
-%
-% ----------------------------------------------------------------------------
-% Clemens Niederberger
-% Web: https://github.com/cgnieder/xsim
-% E-Mail: contact@mychemistry.eu
-% ----------------------------------------------------------------------------
-% Copyright 2017--2020 Clemens Niederberger
-%
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% ----------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% ----------------------------------------------------------------------------
-\XSIMmodule{random}{randomly select exercises from collections}
-
-\msg_new:nnn {xsim} {random-numbers-unavailable}
- {
- You~ are~ compiling~ your~ document~ using ~XeLaTeX.~ Please~ be~ aware~
- that~ random~ selection~ of~ exercises~ is~ unavailable~ in~ XeLaTeX.~ If~
- you~ use~ this~ feature~ you~ can~ safely~ ignore~ this~ message.
- }
-
-\sys_if_engine_xetex:T
- { \msg_warning:nn {xsim} {random-numbers-unavailable} }
-
-\xsim_load_modules:n {collections}
-
-\tl_new:N \l_xsim_random_collection_tl
-\tl_new:N \l__xsim_print_random_choice_tl
-\tl_const:Nn \c__xsim_print_random_both_tl {both}
-\tl_const:Nn \c__xsim_print_random_exercise_tl {exercise}
-\tl_const:Nn \c__xsim_print_random_solution_tl {solution}
-\seq_new:N \g__xsim_random_list_seq
-\seq_new:N \l__xsim_allowed_exercise_ids_seq
-\int_new:N \g__xsim_random_list_id_int
-\bool_new:N \l__xsim_sort_random_bool
-\clist_new:N \l_xsim_random_exclude_list_clist
-
-% #1: random list id
-% #2: csv list of integers
-\xsim_new_aux_property:cpn {random} #1#2
- {
- \xsim_random_list_if_exist:nF {#1}
- { \xsim_new_random_list:n {#1} }
- \xsim_set_random_list:nn {#1} {#2}
- }
-
-\cs_new_protected:Npn \xsim_new_random_list:n #1
- {
- \xsim_verbose:n {Defining~ new~ random~ list~ `#1'}
- \seq_new:c {g__xsim_random_#1 _seq}
- }
-
-\cs_new_protected:Npn \xsim_set_random_list:nn #1#2
- { \seq_gset_from_clist:cn {g__xsim_random_#1_seq} {#2} }
-
-\cs_new_protected:Npn \xsim_set_random_list_from_seq:nN #1#2
- { \seq_gset_eq:cN {g__xsim_random_#1_seq} #2 }
-
-\cs_new:Npn \xsim_use_random_list:nn #1#2
- { \seq_use:cn {g__xsim_random_#1_seq} {#2} }
-
-\cs_new_protected:Npn \xsim_map_random_list:nn #1#2
- { \seq_map_inline:cn {g__xsim_random_#1_seq} {#2} }
-
-\prg_new_conditional:Npnn \xsim_random_list_if_exist:n #1 {p,T,F,TF}
- {
- \seq_if_exist:cTF {g__xsim_random_#1_seq}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-\prg_new_conditional:Npnn \xsim_random_list_if_empty:n #1 {p,T,F,TF}
- {
- \seq_if_empty:cTF {g__xsim_random_#1_seq}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-% #1: random list id
-% #2: sequence variable to set list from
-\cs_new_protected:Npn \xsim_save_random_list:nN #1#2
- { % TODO: check if #2 is empty
- \xsim_random_list_if_exist:nF {#1}
- { \xsim_new_random_list:n {#1} }
- \xsim_random_list_if_empty:nT {#1}
- { \xsim_set_random_list_from_seq:nN {#1} #2 }
- \xsim_verbose:n {Saving~ random~ list~ `#1'}
- \xsim_add_property_to_aux:nn {random}
- { {#1} { \xsim_use_random_list:nn {#1} {,} } }
- }
-\cs_generate_variant:Nn \xsim_save_random_list:nN {x}
-
-% #1: collection
-% #2: number of items
-% #3: clist variable of excluded ids
-\cs_new_protected:Npn \xsim_print_random_list:nnN #1#2#3
- {
- \xsim_if_collection_exist:nTF {#1}
- {
- \int_gincr:N \g__xsim_random_list_id_int
- \int_compare:nNnTF { \xsim_collection_count:n {#1} } = {0}
- { \xsim_rerun: }
- {
- % generate seq of allowed ids from collection:
- \xsim_foreach_exercise_id:n
- {
- \tl_set:Nx \l__xsim_tmpa_tl
- { \xsim_get_type_for_property:nn {id} {##1} }
- \xsim_if_in_collection:nVnT {#1} \l__xsim_tmpa_tl {##1}
- {
- \clist_if_in:NnF #3 {##1}
- { \seq_put_right:Nn \l__xsim_allowed_exercise_ids_seq {##1} }
- }
- }
- \int_compare:nNnTF
- {#2}
- >
- { \seq_count:N \l__xsim_allowed_exercise_ids_seq }
- {
- \int_set:Nn \l__xsim_tmpa_int
- { \seq_count:N \l__xsim_allowed_exercise_ids_seq }
- }
- { \int_set:Nn \l__xsim_tmpa_int {#2} }
- % generate random list:
- \xsim_generate_random_list:nnnN
- { \int_to_alph:n { \g__xsim_random_list_id_int } }
- { \seq_count:N \l__xsim_allowed_exercise_ids_seq }
- { \l__xsim_tmpa_int }
- \g__xsim_random_list_seq
- }
- \xsim_save_random_list:xN
- { \int_to_alph:n { \g__xsim_random_list_id_int } }
- \g__xsim_random_list_seq
- \xsim_verbose:x
- {
- Printing~ exercises~ of~ random~ list~
- `\int_to_alph:n { \g__xsim_random_list_id_int }'~ of~
- collection~ `#1'
- }
- \xsim_print_random_exercises:Nn
- \l__xsim_allowed_exercise_ids_seq
- { \int_to_alph:n { \g__xsim_random_list_id_int } }
- }
- { \msg_error:nnn {xsim} {unknown-collection} {#1} }
- }
-\cs_generate_variant:Nn \xsim_print_random_list:nnN {V}
-
-% #1: random list id
-% #2: max number to choose from
-% #3: number of items
-% #4: seq variable
-\cs_new_protected:Npn \xsim_generate_random_list:nnnN #1#2#3#4
- {
- \bool_lazy_or:nnT
- { !\xsim_random_list_if_exist_p:n {#1} }
- { \xsim_random_list_if_empty_p:n {#1} }
- {
- \xsim_verbose:n
- {Generating~ random~ list~ `#1'~ with~ #3~ out~ of~ #2~ items}
- \seq_gclear:N #4
- \int_do_until:nNnn { \seq_count:N #4 } = {#3}
- {
- \tl_set:Nx \l__xsim_tmpa_tl
- { \fp_eval:n { randint(#2) } }
- \seq_if_in:NVF #4
- \l__xsim_tmpa_tl
- { \seq_gput_right:NV #4 \l__xsim_tmpa_tl }
- }
- \bool_if:NT \l__xsim_sort_random_bool
- {
- \seq_sort:Nn #4
- {
- \int_compare:nNnTF {##1} > {##2}
- { \sort_return_swapped: }
- { \sort_return_same: }
- }
- }
- }
- }
-
-% #1: seq variable of ids
-% #2: random list id
-\cs_new_protected:Npn \xsim_print_random_exercises:Nn #1#2
- {
- \bool_lazy_and:nnT
- { \xsim_random_list_if_exist_p:n {#2} }
- { !\xsim_random_list_if_empty_p:n {#2} }
- {
- \xsim_verbose:x
- {
- Printing~
- \l__xsim_print_random_choice_tl \c_space_tl
- \str_if_eq:onT { \l__xsim_print_random_choice_tl } {both}
- { exercises~ and~ solutions~ }
- of~ random~ list~ `#2'
- }
- \xsim_map_random_list:nn {#2}
- {
- \tl_set:Nx \l__xsim_tmpa_tl
- { \seq_item:Nn #1 {##1} }
- \tl_set:Nx \l__xsim_tmpb_tl
- { \xsim_get_type_for_property:nV {id} \l__xsim_tmpa_tl }
- \bool_lazy_or:nnT
- {
- \tl_if_eq_p:NN
- \l__xsim_print_random_choice_tl
- \c__xsim_print_random_both_tl
- }
- {
- \tl_if_eq_p:NN
- \l__xsim_print_random_choice_tl
- \c__xsim_print_random_exercise_tl
- }
- {
- \xsim_if_exercise_exist:VVT
- \l__xsim_tmpb_tl
- \l__xsim_tmpa_tl
- {
- \xsim_insert:VVnn
- \l__xsim_tmpb_tl
- \l__xsim_tmpa_tl
- {}
- {exercise}
- }
- }
- \bool_lazy_or:nnT
- {
- \tl_if_eq_p:NN
- \l__xsim_print_random_choice_tl
- \c__xsim_print_random_both_tl
- }
- {
- \tl_if_eq_p:NN
- \l__xsim_print_random_choice_tl
- \c__xsim_print_random_solution_tl
- }
- {
- \xsim_if_solution_exist:VVT
- \l__xsim_tmpb_tl
- \l__xsim_tmpa_tl
- {
- \xsim_insert:VVnn
- \l__xsim_tmpb_tl
- \l__xsim_tmpa_tl
- {}
- {solution}
- }
- }
- }
- }
- }
-
-\keys_define:nn {xsim/random}
- {
- sort .bool_set:N = \l__xsim_sort_random_bool ,
- sort .initial:n = true ,
- collection .tl_set:N = \l_xsim_random_collection_tl ,
- collection .initial:n = all~exercises ,
- exclude .code:n = \__xsim_exclude_ids:n {#1} ,
- print .choice: ,
- print/exercises .code:n =
- \tl_set:Nn \l__xsim_print_random_choice_tl {exercise} ,
- print/solutions .code:n =
- \tl_set:Nn \l__xsim_print_random_choice_tl {solution} ,
- print/both .code:n =
- \tl_set:Nn \l__xsim_print_random_choice_tl {both} ,
- print/unknown .code:n =
- \msg_warning:nnn {xsim} {print-collection-choice} {#1}
- \tl_set:Nn \l__xsim_print_random_choice_tl {exercise} ,
- print .initial:n = exercises
- }
-
-\cs_new_protected:Npn \__xsim_exclude_ids:n #1
- {
- \seq_clear:N \l__xsim_tmpa_seq
- \clist_map_inline:nn {#1}
- {
- \tl_set:Nx \l__xsim_tmpa_tl
- { \xsim_get_id_for_property:nn {ID} {##1} }
- \tl_if_blank:VTF \l__xsim_tmpa_tl
- { \seq_put_right:Nn \l__xsim_tmpa_seq {##1} }
- {
- \seq_put_right:Nx \l__xsim_tmpa_seq
- { \xsim_get_id_for_property:nn {ID} {##1} }
- }
- }
- \seq_remove_duplicates:N \l__xsim_tmpa_seq
- \clist_set_from_seq:NN
- \l_xsim_random_exclude_list_clist
- \l__xsim_tmpa_seq
- }
-
-% use this in the exclude list:
-% \xsim_get_type_for_property:nn {id} {}
-% or a combination of:
-% \xsim_get_type_for_property:nn {ID} {}
-% \xsim_get_id_for_property:nn {ID} {}
-
-% ----------------------------------------------------------------------------
-\file_input_stop:
diff --git a/macros/latex/contrib/xsim/code/xsim.solutions.code.tex b/macros/latex/contrib/xsim/code/xsim.solutions.code.tex
deleted file mode 100644
index 0a69194508..0000000000
--- a/macros/latex/contrib/xsim/code/xsim.solutions.code.tex
+++ /dev/null
@@ -1,414 +0,0 @@
-% ----------------------------------------------------------------------------
-% the XSIM package - solutions module
-%
-% eXercise Sheets IMproved
-%
-% ----------------------------------------------------------------------------
-% Clemens Niederberger
-% Web: https://github.com/cgnieder/xsim
-% E-Mail: contact@mychemistry.eu
-% ----------------------------------------------------------------------------
-% Copyright 2017--2020 Clemens Niederberger
-%
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% ----------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% ----------------------------------------------------------------------------
-\XSIMmodule{solutions}{managing solutions}
-
-\xsim_load_modules:n {tags,properties}
-
-\bool_new:N \l_xsim_inside_solution_bool
-\bool_new:N \l__xsim_include_question_bool
-\bool_new:N \l__xsim_printsolutions_headings_bool
-\bool_new:N \l__xsim_printsolutions_conditions_bool
-\bool_new:N \l____xsim_this_condition_bool
-
-\seq_new:N \l__xsim_printsolutions_conditions_seq
-
-\int_new:N \l_xsim_printsolutions_section_int
-\int_new:N \l_xsim_printsolutions_chapter_int
-
-\tl_new:N \l__xsim_printsolutions_headings_template_tl
-\tl_new:N \ExerciseSection
-\tl_new:N \ExerciseChapter
-\tl_new:N \l__xsim_printsolutions_collection_tl
-
-% ----------------------------------------------------------------------------
-
-\prg_new_conditional:Npnn \xsim_if_inside_solution: {p,T,F,TF}
- {
- \bool_if:NTF \l_xsim_inside_solution_bool
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-\prg_new_conditional:Npnn \xsim_if_solution_print:n #1 {p,T,F,TF}
- {
- \bool_if:cTF {l__xsim_#1_solution_print_bool}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-% #1: type
-% #2: id
-\prg_new_protected_conditional:Npnn \xsim_solution_if_print:nn #1#2 {T,F,TF}
- {
- \bool_set_true:N \l____xsim_print_bool
- \xsim_if_tagged:nnF {#1} {#2}
- { \bool_set_false:N \l____xsim_print_bool }
- \xsim_if_boolean_property:nnnF {#1} {#2} {print}
- { \bool_set_false:N \l____xsim_print_bool }
- \bool_if:cF {l__xsim_#1_solution_print_bool}
- { \bool_set_false:N \l____xsim_print_bool }
- \bool_if:NTF \l____xsim_print_bool
- { \prg_return_true: }
- { \prg_return_false: }
- }
-\cs_generate_variant:Nn \xsim_solution_if_print:nnT {nV,oo}
-
-% #1: type
-% #2: id
-\prg_new_protected_conditional:Npnn \xsim_if_solution_exist:nn #1#2 {T,F,TF}
- {
- \xsim_if_boolean_property:nnnTF {#1} {#2} {solution}
- { \xsim_if_exist:nnnTF {#1} {#2} {exercise} }
- { \xsim_if_exist:nnnTF {#1} {#2} {solution} }
- { \prg_return_true: }
- { \prg_return_false: }
- }
-\cs_generate_variant:Nn \xsim_if_solution_exist:nnT {VV,oo}
-\cs_generate_variant:Nn \xsim_if_solution_exist:nnTF {oo}
-
-% #1: type
-% #2: options
-\cs_new_protected:Npn \xsim_start_solution:nn #1#2
- {
- \keys_set:xn { xsim/\xsim_get_parameter:nn {#1} {solution-env} } {#2}
- \bool_set_true:N \l_xsim_inside_solution_bool
- \refstepcounter { \xsim_get_parameter:nn {#1} {solution-counter} }
- }
-
-\cs_new_protected:Npn \xsim_stop_solution:n #1 {}
-
-% ----------------------------------------------------------------------------
-
-% #1: conditional base function (three n args)
-% #2: name
-% #3: code (refer to type and id with `#1' and `#2'), #3 refers to the boolean
-% properties use/print
-\cs_new_protected:Npn \xsim_new_solutions_condition:Nnn #1#2#3
- {
- \prg_new_protected_conditional:Npnn #1 ##1##2##3 {T,F,TF}
- {
- \xsim_if_in_list:nnTF {##3} {##1-##2=={true}}
- {
- \__xsim_printsolutions_if_condition:nTF {#2}
- { \__xsim_printsolutions_condition_true: #3 }
- { \prg_return_false: }
- }
- { \prg_return_false: }
- }
- }
-
-% per section condition:
-\xsim_new_solutions_condition:Nnn \__xsim_if_solutions_per_section:nnn
- {per-section}
- {
- \xsim_if_in_list:nxTF {section-value}
- { #1-#2 == { \int_use:N \l_xsim_printsolutions_section_int } }
- {
- \tl_set:Nx \ExerciseSection
- { \xsim_get_property:nnn {#1} {#2} {section} }
- \prg_return_true:
- }
- { \prg_return_false: }
- }
-
-% per chapter condition:
-\xsim_new_solutions_condition:Nnn \__xsim_if_solutions_per_chapter:nnn
- {per-chapter}
- {
- \xsim_if_in_list:nxTF {chapter-value}
- { #1-#2 == { \int_use:N \l_xsim_printsolutions_chapter_int } }
- {
- \tl_set:Nx \ExerciseChapter
- { \xsim_get_property:nnn {#1} {#2} {chapter} }
- \prg_return_true:
- }
- { \prg_return_false: }
- }
-
-% per collection condition:
-\xsim_new_solutions_condition:Nnn \__xsim_if_solutions_in_collection:nnn
- {per-collection}
- {
- \tl_if_blank:VTF \l__xsim_printsolutions_collection_tl
- { \prg_return_false: }
- {
- \xsim_if_in_collection:VnnTF
- \l__xsim_printsolutions_collection_tl
- {#1}
- {#2}
- { \prg_return_true: }
- { \prg_return_false: }
- }
- }
-
-% ----------------------------------------------------------------------------
-% conditions mechanism
-\cs_new_protected:Npn \__xsim_printsolutions_condition_false:
- { \bool_set_false:N \l__xsim_printsolutions_conditions_bool }
-
-\cs_new_protected:Npn \__xsim_printsolutions_condition_true:
- { \bool_set_true:N \l__xsim_printsolutions_conditions_bool }
-
-% #1: type
-% #2: id
-% #3: boolean property
-\prg_new_conditional:Npnn
- \__xsim_printsolutions_if_conditions:nnn #1#2#3 {T,F,TF}
- {
- \bool_if:NTF \l__xsim_printsolutions_conditions_bool
- { \prg_return_true: }
- {
- \xsim_if_in_list:nnTF {#3} {#1-#2=={true}}
- { \prg_return_false: }
- { \prg_return_true: }
- }
- }
-
-% #1: name
-% #2: condition
-\cs_new_protected:Npn \xsim_declare_printsolutions_condition:nn #1#2
- {
- \bool_new:c {l__xsim_printsolutions_#1_condition_bool}
- \seq_put_right:Nn \l__xsim_printsolutions_conditions_seq {#1}
- \xsim_attribute_set:nnn {printsolutions} {#1} {#2}
- }
-
-\prg_new_conditional:Npnn \__xsim_printsolutions_if_condition:n #1 {T,F,TF}
- {
- \bool_if:cTF {l__xsim_printsolutions_#1_condition_bool}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-% #1: name
-% #2: true|false
-\cs_new_protected:Npn \__xsim_printsolutions_condition:nn #1#2
- { \bool_set_eq:cc {l__xsim_printsolutions_#1_condition_bool} {c_#2_bool} }
-
-% false if any condition is false for this solution:
-% #1: type
-% #2: id
-% #3: boolean property
-\prg_new_protected_conditional:Npnn
- \__xsim_printsolutions_check_conditions:nnn #1#2#3 {T,F,TF}
- {
- \__xsim_printsolutions_condition_false:
- \bool_set_true:N \l____xsim_this_condition_bool
- \seq_map_inline:Nn \l__xsim_printsolutions_conditions_seq
- {
- \bool_if:cT {l__xsim_printsolutions_##1_condition_bool}
- {
- \xsim_attribute_get:nn {printsolutions} {##1}
- {#1} {#2} {#3}
- { }
- { \bool_set_false:N \l____xsim_this_condition_bool }
- }
- }
- \bool_if:NTF \l____xsim_this_condition_bool
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-
-% #1: type
-% #2: id
-% #3: boolean property
-% #4: code
-\cs_new_protected:Npn \xsim_if_this_solution_do:nnnn #1#2#3#4
- {
- \xsim_if_solution_exist:nnT {#1} {#2}
- { \__xsim_printsolutions_check_conditions:nnnT {#1} {#2} {#3} {#4} }
- }
-
-% #1: type
-% #2: boolean property
-% #3: code
-\cs_new_protected:Npn \xsim_if_solutions_do:nnn #1#2#3
- {
- \xsim_foreach_exercise_type_id:nn {#2}
- { \xsim_if_this_solution_do:nnnn {#1} {##2} {#2} {#3} }
- }
-
-% ----------------------------------------------------------------------------
-% #1: boolean -- if true only the solutions of printed exercises will be
-% output
-% #2: pre
-% #3: post
-% #4: type
-% #5: code (refer to type with #1 and id with #2)
-\cs_new_protected:Npn \xsim_print_type_code:nnnnn #1#2#3#4#5
- {
- \group_begin:
- \cs_set_protected:Npn \__xsim_print_entry:nn ##1##2 {#5}
- #2
- \bool_set_false:N \l__xsim_tmpa_bool
- \bool_if:nTF {#1}
- {
- \xsim_if_solutions_do:nnn {#4} {print}
- { \bool_set_true:N \l__xsim_tmpa_bool }
- }
- {
- \xsim_if_solutions_do:nnn {#4} {used}
- { \bool_set_true:N \l__xsim_tmpa_bool }
- }
- \tl_set:Nn \ExerciseType {#4}
- \bool_if:NT \l__xsim_tmpa_bool
- {
- \bool_if:NT \l__xsim_printsolutions_headings_bool
- {
- \xsim_use_template:nV
- {heading}
- \l__xsim_printsolutions_headings_template_tl
- }
- }
- \bool_if:nTF {#1}
- {
- \xsim_if_solutions_do:nnn {#4} {print}
- { \__xsim_print_entry:nn {#4} {##2} }
- }
- {
- \xsim_if_solutions_do:nnn {#4} {used}
- { \__xsim_print_entry:nn {#4} {##2} }
- }
- #3
- \group_end:
- }
-
-% #1: boolean -- if true only the solutions of printed exercises will be
-% output
-% #2: options
-% #3: type
-\cs_new_protected:Npn \xsim_print_type_solutions:nnn #1#2#3
- {
- \xsim_print_type_code:nnnnn
- {#1}
- {
- \xsim_verbose:n
- { Printing~ solutions~ for~ exercise~ type~ `#3'. }
- \keys_set:nn {xsim/print-solutions} {#2}
- }
- {}
- {#3}
- { \xsim_insert:nnnn {##1} {##2} {} {solution} }
- }
-
-% #1: boolean -- if true only the solutions of printed exercises will be
-% output
-% #2: options
-\cs_new_protected:Npn \xsim_print_all_solutions_per_type:nn #1#2
- {
- \xsim_foreach_exercise_type:n
- { \xsim_print_type_solutions:nnn {#1} {#2} {##1} }
- }
-
-% #1: boolean -- if true only the solutions of printed exercises will be
-% output
-% #2: options
-\cs_new_protected:Npn \xsim_print_all_solutions_per_id:nn #1#2
- {
- \xsim_verbose:n { Printing~ solutions. }
- \group_begin:
- \keys_set:nn {xsim/print-solutions} {#2}
- \bool_set_false:N \l__xsim_tmpa_bool
- \bool_if:nTF {#1}
- {
- \xsim_foreach_exercise_id_type:nn {print}
- {
- \xsim_if_this_solution_do:nnnn {##1} {##2} {print}
- { \xsim_insert:nnnn {##1} {##2} {} {solution} }
- }
- }
- {
- \xsim_foreach_exercise_id_type:nn {used}
- {
- \xsim_if_this_solution_do:nnnn {##1} {##2} {used}
- { \xsim_insert:nnnn {##1} {##2} {} {solution} }
- }
- }
- \group_end:
- }
-
-% ----------------------------------------------------------------------------
-
-\xsim_declare_printsolutions_condition:nn {per-section}
- { \__xsim_if_solutions_per_section:nnnTF }
-\xsim_declare_printsolutions_condition:nn {per-chapter}
- { \__xsim_if_solutions_per_chapter:nnnTF }
-\xsim_declare_printsolutions_condition:nn {per-collection}
- { \__xsim_if_solutions_in_collection:nnnTF }
-
-% ----------------------------------------------------------------------------
-
-\keys_define:nn {xsim/print-solutions}
- {
- headings .bool_set:N = \l__xsim_printsolutions_headings_bool ,
- headings .initial:n = true ,
- headings-template .tl_set:N = \l__xsim_printsolutions_headings_template_tl ,
- headings-template .initial:n = default ,
- include-exercise .bool_set:N = \l__xsim_include_question_bool ,
- include-exercise .initial:n = false ,
- section .choice: ,
- section/true .code:n =
- \__xsim_printsolutions_condition:nn {per-section} {true}
- \int_set:Nn \l_xsim_printsolutions_section_int { \value {section} } ,
- section/false .code:n =
- \__xsim_printsolutions_condition:nn {per-section} {false} ,
- section/unknown .code:n =
- \__xsim_printsolutions_condition:nn {per-section} {true}
- \int_set:Nn \l_xsim_printsolutions_section_int {#1} ,
- section .default:n = true ,
- section .initial:n = false ,
- chapter .choice: ,
- chapter/true .code:n =
- \__xsim_printsolutions_condition:nn {per-chapter} {true}
- \int_set:Nn \l_xsim_printsolutions_chapter_int { \value {chapter} } ,
- chapter/false .code:n =
- \__xsim_printsolutions_condition:nn {per-chapter} {false} ,
- chapter/unknown .code:n =
- \__xsim_printsolutions_condition:nn {per-chapter} {true}
- \int_set:Nn \l_xsim_printsolutions_chapter_int {#1} ,
- chapter .default:n = true ,
- chapter .initial:n = false ,
- collection .choice: ,
- collection/false .code:n =
- \__xsim_printsolutions_condition:nn {per-collection} {false} ,
- collection/unknown .code:n =
- \xsim_if_collection_exist:nT {#1}
- {
- \__xsim_printsolutions_condition:nn {per-collection} {true}
- \tl_set:Nn \l__xsim_printsolutions_collection_tl {#1}
- } ,
- collection .initial:n = false
- }
-
-% ----------------------------------------------------------------------------
-
-\file_input_stop:
-
-2020/02/23 - resolve bug #56
-2020/03/16 - performance optimizations
diff --git a/macros/latex/contrib/xsim/code/xsim.sty b/macros/latex/contrib/xsim/code/xsim.sty
deleted file mode 100644
index cc30ae9052..0000000000
--- a/macros/latex/contrib/xsim/code/xsim.sty
+++ /dev/null
@@ -1,136 +0,0 @@
-% ----------------------------------------------------------------------------
-% the XSIM package
-%
-% eXercise Sheets IMproved
-%
-% ----------------------------------------------------------------------------
-% Clemens Niederberger
-% Web: https://github.com/cgnieder/xsim
-% E-Mail: contact@mychemistry.eu
-% ----------------------------------------------------------------------------
-% Copyright 2017--2020 Clemens Niederberger
-%
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% ----------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% ----------------------------------------------------------------------------
-\RequirePackage {expl3,xparse,l3keys2e}
-
-\ExplSyntaxOn
-
-\tl_const:Nn \c_xsim_date_tl {2020/04/04}
-\tl_const:Nn \c_xsim_version_major_number_tl {0}
-\tl_const:Nn \c_xsim_version_minor_number_tl {19}
-\tl_const:Nn \c_xsim_version_subrelease_tl {b}
-\tl_const:Nx \c_xsim_version_number_tl
- {
- \c_xsim_version_major_number_tl .
- \c_xsim_version_minor_number_tl
- }
-\tl_const:Nx \c_xsim_version_tl
- {
- \c_xsim_version_number_tl
- \c_xsim_version_subrelease_tl
- }
-\tl_const:Nn \c_xsim_info_tl {eXercise ~ Sheets ~ IMproved}
-
-\ProvidesExplPackage
- {xsim}
- {\c_xsim_date_tl}
- {\c_xsim_version_tl}
- {\c_xsim_info_tl}
-
-% --------------------------------------------------------------------------
-
-% options, information
-
-\bool_new:N \g__xsim_final_bool
-\bool_new:N \g__xsim_verbose_bool
-\bool_new:N \g__xsim_debug_bool
-\bool_new:N \g_xsim_clear_aux_bool
-\bool_new:N \g__xsim_write_to_file_bool
-\bool_new:N \g_xsim_use_aux_bool
-\bool_new:N \g__xsim_rerun_bool
-\bool_new:N \g__xsim_blank_bool
-
-\keys_define:nn {xsim/package}
- {
- final .bool_gset:N = \g__xsim_final_bool ,
- verbose .bool_gset:N = \g__xsim_verbose_bool ,
- debug .bool_gset:N = \g__xsim_debug_bool ,
- clear-aux .bool_gset:N = \g_xsim_clear_aux_bool ,
- no-files .bool_gset_inverse:N = \g__xsim_write_to_file_bool ,
- no-files .initial:n = false ,
- use-aux .bool_gset:N = \g_xsim_use_aux_bool ,
- use-aux .initial:n = false ,
- blank .bool_gset:N = \g__xsim_blank_bool ,
- blank .initial:n = false
- }
-
-\ProcessKeysPackageOptions {xsim/package}
-
-\keys_define:nn {xsim/package}
- {
- final .code:n = \msg_error:nnn {xsim} {load-time-option} {final} ,
- verbose .code:n = \msg_error:nnn {xsim} {load-time-option} {verbose} ,
- debug .code:n = \msg_error:nnn {xsim} {load-time-option} {debug} ,
- clear-aux .code:n = \msg_error:nnn {xsim} {load-time-option} {clear-aux} ,
- no-files .code:n = \msg_error:nnn {xsim} {load-time-option} {no-files} ,
- use-aux .code:n = \msg_error:nnn {xsim} {load-time-option} {use-aux} ,
- blank .code:n = \msg_error:nnn {xsim} {load-time-option} {blank}
- }
-
-% --------------------------------------------------------------------------
-
-% messages:
-\msg_new:nnn {xsim} {load-time-option}
- {
- `#1'~ is~ a~ load-time~ option! \\
- You~ cannot~ set~ it~ with~ \token_to_str:N \xsimsetup ! \\
- You~ need~ to~ use~ \token_to_str:N \usepackage [#1] {xsim} .
- }
-
-\msg_new:nnn {xsim} {rerun}
- {
- Exercise~ properties~ may~ have~ changed.~ Rerun~ to~ get~ them~
- synchronized.
- }
-
-\msg_new:nnn {xsim} {verbose} { #1 ~( \msg_line_context: ) }
-
-% --------------------------------------------------------------------------
-
-\cs_new_protected:Npn \xsim_do_rerun:
- { \xsim_if_rerun:T { \msg_warning:nn {xsim} {rerun} } }
-
-% --------------------------------------------------------------------------
-
-% load module mechanism:
-\tl_set:Nn \l_tmpa_tl {code.tex}
-\@onefilewithoptions {xsim.modules} [][] \l_tmpa_tl
-
-% --------------------------------------------------------------------------
-\xsim_load_modules:n {definitions}
-
-\AtEndDocument
- {
- \xsim_do_rerun:
- \xsim_close_aux:
- }
-
-% --------------------------------------------------------------------------
-\file_input_stop:
-
-2020/02/20 - implement issue #31 (blank package option)
-2020/02/21 - don't allow package options to be set with \xsimsetup
diff --git a/macros/latex/contrib/xsim/code/xsim.style.layouts.code.tex b/macros/latex/contrib/xsim/code/xsim.style.layouts.code.tex
deleted file mode 100644
index 31f5810bce..0000000000
--- a/macros/latex/contrib/xsim/code/xsim.style.layouts.code.tex
+++ /dev/null
@@ -1,121 +0,0 @@
-% ----------------------------------------------------------------------------
-% the XSIM package - layouts style
-%
-% eXercise Sheets IMproved
-%
-% ----------------------------------------------------------------------------
-% Clemens Niederberger
-% Web: https://github.com/cgnieder/xsim
-% E-Mail: contact@mychemistry.eu
-% ----------------------------------------------------------------------------
-% Copyright 2017--2020 Clemens Niederberger
-%
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% ----------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% ----------------------------------------------------------------------------
-\xsimstyle{layouts}[2019/10/12]
-
-\RequirePackage{needspace}
-
-\DeclareExerciseEnvironmentTemplate{runin}
- {%
- \par\vspace{\baselineskip}
- \Needspace*{2\baselineskip}
- \noindent
- \textbf{\XSIMmixedcase{\GetExerciseName}~\GetExerciseProperty{counter}}%
- \GetExercisePropertyT{subtitle}{ \textit{#1}} % <<< notice the space
- \IfInsideSolutionF{%
- \GetExercisePropertyT{points}{%
- \marginpar{%
- \printgoal{\PropertyValue}%
- \GetExercisePropertyT{bonus-points}{+\printgoal{\PropertyValue}}%
- \,\IfExerciseGoalSingularTF{points}
- {\XSIMtranslate{point}}
- {\XSIMtranslate{points}}%
- }%
- }%
- }%
- }
- {}
-
-\RequirePackage{array}
-
-\DeclareExerciseEnvironmentTemplate{margin}
- {%
- \trivlist
- \item[\llap{%
- \smash{%
- \tabular[t]{@{}r@{}}
- \textbf{\XSIMmixedcase{\GetExerciseName}~\GetExerciseProperty{counter}}
- \IfExercisePropertySetT{points}{%
- \tabularnewline
- (%
- \printgoal{\GetExerciseProperty{points}}%
- \GetExercisePropertyT{bonus-points}{+\printgoal{#1}}%
- \,\XSIMtranslate{point-abbr}%
- )%
- }%
- \endtabular
- }%
- }]\relax
- }
- {\endtrivlist}
-
-\DeclareExerciseEnvironmentTemplate{inline}
- {%
- \textbf{\GetExerciseProperty{counter}}%
- \IfInsideSolutionF{%
- \GetExercisePropertyT{points}{ % <<< notice the space
- (\printgoal{\PropertyValue}%
- \GetExercisePropertyT{bonus-points}{+\printgoal{\PropertyValue}}%
- \,\IfExerciseGoalSingularTF{points}
- {\XSIMtranslate{point}}
- {\XSIMtranslate{points}})%
- }%
- } % <<< notice the space
- }
- {}
-
-\DeclareExerciseEnvironmentTemplate{minimal}
- {\par\UseExerciseTemplate{begin}{inline}}
- {\UseExerciseTemplate{end}{inline}\par}
-
-\DeclareExerciseEnvironmentTemplate{centered}
- {%
- \par\vspace{\baselineskip}
- \Needspace*{2\baselineskip}
- \noindent
- \hfil\textbf{\XSIMmixedcase{\GetExerciseName}~\GetExerciseProperty{counter}}%
- \GetExercisePropertyT{subtitle}{ \textit{#1}}\hfil
- \par\noindent
- \IfInsideSolutionF{%
- \GetExercisePropertyT{points}{%
- \marginpar{%
- \printgoal{\PropertyValue}%
- \GetExercisePropertyT{bonus-points}{+\printgoal{\PropertyValue}}%
- \,\IfExerciseGoalSingularTF{points}
- {\XSIMtranslate{point}}
- {\XSIMtranslate{points}}%
- }%
- }%
- }%
- }
- {}
-
-% ----------------------------------------------------------------------------
-\endinput
-
-2020/02/23 - added: inline, centered
- - adapt to removed \par from the generic environments
diff --git a/macros/latex/contrib/xsim/code/xsim.tags.code.tex b/macros/latex/contrib/xsim/code/xsim.tags.code.tex
deleted file mode 100644
index f97c1af889..0000000000
--- a/macros/latex/contrib/xsim/code/xsim.tags.code.tex
+++ /dev/null
@@ -1,211 +0,0 @@
-% ----------------------------------------------------------------------------
-% the XSIM package - tags module
-%
-% eXercise Sheets IMproved
-%
-% ----------------------------------------------------------------------------
-% Clemens Niederberger
-% Web: https://github.com/cgnieder/xsim
-% E-Mail: contact@mychemistry.eu
-% ----------------------------------------------------------------------------
-% Copyright 2017--2020 Clemens Niederberger
-%
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% ----------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% ----------------------------------------------------------------------------
-\XSIMmodule{tags}{tagging of exercises}
-
-\xsim_load_modules:n {properties}
-
-\seq_new:N \l__xsim_tag_types_seq
-\bool_new:N \l____xsim_tagged_bool
-
-\cs_new_protected:Npn \xsim_set_seq_from_clist:Nn #1#2
- {
- \seq_clear:N #1
- \clist_map_inline:nn {#2}
- { \tl_if_blank:nF {##1} { \seq_put_right:Nn #1 {##1} } }
- }
-\cs_generate_variant:Nn \xsim_set_seq_from_clist:Nn {c,Nx}
-
-\msg_new:nnn {xsim} {tag-exists}
- { The~ tag~ type~ `#1'~ already~ exists.~ I~ am~ doing~ nothing. }
-
-% #1: name
-\cs_new_protected:Npn \xsim_new_tag_type:n #1
- {
- \xsim_verbose:n { Declaring~ new~ tag~ type~ `#1'. }
- \seq_put_right:Nn \l__xsim_tag_types_seq {#1}
- \seq_remove_duplicates:N \l__xsim_tag_types_seq
- \seq_new:c {l__xsim_chosen_tags_#1_seq}
- \bool_new:c {l__xsim_ignore_untagged_#1_bool}
- \bool_new:c {l____xsim_tagged_#1_bool}
- \keys_define:nn {xsim}
- {
- #1/ignore-untagged .bool_set:c = {l__xsim_ignore_untagged_#1_bool} ,
- #1/ignore-untagged .initial:n = true ,
- #1 .code:n =
- \xsim_set_seq_from_clist:cn {l__xsim_chosen_tags_#1_seq} {##1}
- }
- \prg_new_protected_conditional:cpnn {xsim_if_#1_value:n} ##1 {T,F,TF}
- {
- \seq_if_in:cnTF {l__xsim_chosen_tags_#1_seq} {##1}
- { \prg_return_true: }
- { \prg_return_false: }
- }
- \xsim_declare_property:nnnn
- { \c_false_bool }
- { \c_false_bool }
- { \c_false_bool }
- {#1}
- \xsim_declare_printsolutions_condition:nn {#1}
- { \__xsim_printsolutions_if_tagged:nnnnTF {#1} }
- \keys_define:nn {xsim/print-solutions}
- {
- #1 .choice: ,
- #1/false .code:n =
- \__xsim_printsolutions_condition:nn {#1} {false} ,
- #1/true .code:n =
- \__xsim_printsolutions_condition:nn {#1} {true} ,
- #1/unknown .code:n =
- \keys_set:nn {xsim} { #1 = ##1 }
- \__xsim_printsolutions_condition:nn {#1} {true} ,
- #1 .initial:n = false
- }
- }
-
-% #1: tag type
-\prg_new_protected_conditional:Npnn \xsim_if_tag_type_exist:n #1 {T,F,TF}
- {
- \seq_if_in:NnTF \l__xsim_tag_types_seq {#1}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-% #1: tag type
-% #2: exercise type
-% #3: id
-% #4: print|use
-\prg_new_protected_conditional:Npnn
- \__xsim_printsolutions_if_tagged:nnnn #1#2#3#4 {T,F,TF}
- {
- \xsim_if_in_list:nnTF {#4} {#2-#3=={true}}
- {
- \__xsim_printsolutions_if_condition:nTF {#1}
- {
- \__xsim_printsolutions_condition_true:
- \xsim_if_tagged:nnnTF {#2} {#3} {#1}
- { \prg_return_true: }
- { \prg_return_false: }
- }
- { \prg_return_false: }
- }
- { \prg_return_false: }
- }
-
-% #1: exercise type
-% #2: id
-% #3: tag type
-\prg_new_protected_conditional:Npnn \xsim_if_tagged:nnn #1#2#3 {T,F,TF}
- {
- \bool_set_false:c {l____xsim_tagged_#3_bool}
- \seq_if_empty:cTF {l__xsim_chosen_tags_#3_seq}
- { \bool_set_true:c {l____xsim_tagged_#3_bool} }
- {
- \xsim_set_seq_from_clist:Nx
- \l__xsim_tmpa_seq
- { \xsim_get_property:nnn {#1} {#2} {#3} }
- \seq_if_empty:NTF \l__xsim_tmpa_seq
- {
- \bool_set_eq:cc
- {l____xsim_tagged_#3_bool}
- {l__xsim_ignore_untagged_#3_bool}
- }
- {
- \seq_map_inline:Nn \l__xsim_tmpa_seq
- {
- \seq_if_in:cnT {l__xsim_chosen_tags_#3_seq} {##1}
- {
- \bool_set_true:c {l____xsim_tagged_#3_bool}
- \seq_map_break:
- }
- }
- }
- }
- \bool_if:cTF {l____xsim_tagged_#3_bool}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-% #1: exercise type
-% #2: id
-\prg_new_protected_conditional:Npnn \xsim_if_tagged:nn #1#2 {T,F,TF}
- {
- \bool_set_true:N \l____xsim_tagged_bool
- \seq_map_inline:Nn \l__xsim_tag_types_seq
- {
- \xsim_if_tagged:nnnF {#1} {#2} {##1}
- {
- \bool_set_false:N \l____xsim_tagged_bool
- \seq_map_break:
- }
- }
- \bool_if:NTF \l____xsim_tagged_bool
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-
-% #1: exercise type
-% #2: id
-% #3: tag type
-% #4: code
-\cs_new_protected:Npn \xsim_foreach_exercise_tag:nnnn #1#2#3#4
- {
- \xsim_set_seq_from_clist:Nx \l__xsim_tmpa_seq
- { \xsim_get_property:nnn {#1} {#2} {#3} }
- \seq_map_inline:Nn \l__xsim_tmpa_seq {#4}
- }
-\cs_generate_variant:Nn \xsim_foreach_exercise_tag:nnnn {oo}
-
-% #1: exercise type
-% #2: id
-% #3: tag type
-% #4: sep
-\cs_new_protected:Npn \xsim_exercise_tags_use:nnnn #1#2#3#4
- {
- \xsim_set_seq_from_clist:Nx \l__xsim_tmpa_seq
- { \xsim_get_property:nnn {#1} {#2} {#3} }
- \seq_use:Nn \l__xsim_tmpa_seq {#4}
- }
-\cs_generate_variant:Nn \xsim_exercise_tags_use:nnnn {oo}
-
-% #1: exercise type
-% #2: id
-% #3: tag type
-% #4: sep between two
-% #5: sep between more than two
-% #6: sep between last two
-\cs_new_protected:Npn \xsim_exercise_tags_use:nnnnnn #1#2#3#4#5#6
- {
- \xsim_set_seq_from_clist:Nx \l__xsim_tmpa_seq
- { \xsim_get_property:nnn {#1} {#2} {#3} }
- \seq_use:Nnnn \l__xsim_tmpa_seq {#4} {#5} {#6}
- }
-\cs_generate_variant:Nn \xsim_exercise_tags_use:nnnn {oo}
-\cs_generate_variant:Nn \xsim_exercise_tags_use:nnnnnn {oo}
-
-% ----------------------------------------------------------------------------
-\file_input_stop:
diff --git a/macros/latex/contrib/xsim/code/xsim.templates.code.tex b/macros/latex/contrib/xsim/code/xsim.templates.code.tex
deleted file mode 100644
index f14d7fc87e..0000000000
--- a/macros/latex/contrib/xsim/code/xsim.templates.code.tex
+++ /dev/null
@@ -1,182 +0,0 @@
-% ----------------------------------------------------------------------------
-% the XSIM package - templates module
-%
-% eXercise Sheets IMproved
-%
-% ----------------------------------------------------------------------------
-% Clemens Niederberger
-% Web: https://github.com/cgnieder/xsim
-% E-Mail: contact@mychemistry.eu
-% ----------------------------------------------------------------------------
-% Copyright 2017--2020 Clemens Niederberger
-%
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% ----------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% ----------------------------------------------------------------------------
-\XSIMmodule{templates}{templates for typesetting exercises}
-
-\xsim_load_modules:n {base}
-
-\msg_new:nnn {xsim} {unknown-template}
- {
- You~ are~ trying~ to~ load~ the~ template~ `#2'~ (template~ type~ `#1')~
- \msg_line_context: .~ This~ template~ does~ not~ seem~ to~ be~ defined.~
- I~ am~ using~ the~ template~ `#3'~ (template~ type~ `#1')~ instead.
- }
-
-\msg_new:nnn {xsim} {template-type-exists}
- { The~ template~ type~ `#1'~ already~ exists~ \msg_line_context: }
-
-% ----------------------------------------------------------------------------
-\seq_new:N \l__xsim_template_types_seq
-
-% #1: template type
-\cs_new_protected:Npn \xsim_new_template_type:n #1
- {
- \seq_if_in:NnTF \l__xsim_template_types_seq {#1}
- { \msg_error:nnn {xsim} {template-type-exists} {#1} }
- {
- \xsim_verbose:n { Declaring~ new~ template~ type~ `#1'. }
- \seq_put_right:Nn \l__xsim_template_types_seq {#1}
- }
- }
-
-% #1: template type
-% #2: template name
-% #3: code
-\cs_new_protected:Npn \__xsim_add_template:nnn #1#2#3
- {
- \xsim_verbose:n { Defining~ new~ template~ `#2'~ of~ type~ `#1'. }
- \tl_new:c {l__xsim_template_#1_#2_setup_tl}
- \xsim_attribute_set:nnn {template::#1} {#2} {#3}
- }
-
-\prg_new_conditional:Npnn \xsim_if_template_exist:nn #1#2 {T,F,TF}
- {
- \xsim_attribute_if_set:nnTF {template::#1} {#2}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-% #1: template type
-% #2: template name
-\cs_new_protected:Npn \__xsim_get_template:nn #1#2
- { \xsim_attribute_get:nn {template::#1} {#2} }
-
-% ----------------------------------------------------------------------------
-
-% environment templates (types `begin' and `end'):
-\xsim_new_template_type:n {begin}
-\xsim_new_template_type:n {end}
-
-% #1: template name
-% #2: begin code
-% #3: end code
-\cs_new_protected:Npn \xsim_declare_environment_template:nnn #1#2#3
- {
- \__xsim_add_template:nnn {begin} {#1}
- {
- \__xsim_start_template:nn {begin} {#1}
- \__xsim_start_template:nn {end} {#1}
- #2
- }
- \__xsim_add_template:nnn {end} {#1}
- {
- #3
- \__xsim_stop_template:nn {end} {#1}
- \__xsim_stop_template:nn {begin} {#1}
- }
- }
-
-% ----------------------------------------------------------------------------
-
-% heading templates for the solution list (type `heading'):
-\xsim_new_template_type:n {heading}
-
-% #1: template name
-% #2: code
-\cs_new_protected:Npn \xsim_declare_heading_template:nn #1#2
- {
- \__xsim_add_template:nnn {heading} {#1}
- {
- \__xsim_start_template:nn {heading} {#1}
- #2
- \__xsim_stop_template:nn {heading} {#1}
- }
- }
-
-% ----------------------------------------------------------------------------
-
-% grading table templates (type `table'):
-\xsim_new_template_type:n {table}
-
-% #1: template name
-% #2: code
-\cs_new_protected:Npn \xsim_declare_table_template:nn #1#2
- {
- \__xsim_add_template:nnn {table} {#1}
- {
- \__xsim_start_template:nn {table} {#1}
- #2
- \__xsim_stop_template:nn {table} {#1}
- }
- }
-
-% ----------------------------------------------------------------------------
-
-% using templates:
-% setup up the next usage of `template name':
-% #1: template type
-% #2: template name
-% #3: setup code
-\cs_new_protected:Npn \xsim_setup_template:nnn #1#2#3
- { \tl_set:cn {l__xsim_template_#1_#2_setup_tl} {#3} }
-\cs_generate_variant:Nn \xsim_setup_template:nnn {nnV,nVn}
-
-% #1: template type
-% #2: template name
-\cs_new_protected:Npn \__xsim_setup_template:nn #1#2
- { \tl_use:c {l__xsim_template_#1_#2_setup_tl} }
-
-% #1: template type
-% #2: template name
-\cs_new_protected:Npn \__xsim_clear_template_setup:nn #1#2
- { \tl_clear:c {l__xsim_template_#1_#2_setup_tl} }
-
-% #1: template type
-% #2: template name
-\cs_new_protected:Npn \__xsim_start_template:nn #1#2
- { \group_begin: \__xsim_setup_template:nn {#1} {#2} }
-
-% #1: template type
-% #2: template name
-\cs_new_protected:Npn \__xsim_stop_template:nn #1#2
- { \group_end: \__xsim_clear_template_setup:nn {#1} {#2} }
-
-% #1: template type
-% #2: template name
-\cs_new_protected:Npn \xsim_use_template:nn #1#2
- {
- \xsim_if_template_exist:nnTF {#1} {#2}
- { \__xsim_get_template:nn {#1} {#2} }
- {
- \msg_warning:nnnnn {xsim} {unknown-template} {#1} {#2} {default}
- \__xsim_get_template:nn {#1} {default}
- }
- }
-\cs_generate_variant:Nn \xsim_use_template:nn {nx,nV}
-
-% ----------------------------------------------------------------------------
-\file_input_stop:
diff --git a/macros/latex/contrib/xsim/code/xsim.translations.code.tex b/macros/latex/contrib/xsim/code/xsim.translations.code.tex
deleted file mode 100644
index b9f0712b4b..0000000000
--- a/macros/latex/contrib/xsim/code/xsim.translations.code.tex
+++ /dev/null
@@ -1,147 +0,0 @@
-% ----------------------------------------------------------------------------
-% the XSIM package - translations module
-%
-% eXercise Sheets IMproved
-%
-% ----------------------------------------------------------------------------
-% Clemens Niederberger
-% Web: https://github.com/cgnieder/xsim
-% E-Mail: contact@mychemistry.eu
-% ----------------------------------------------------------------------------
-% Copyright 2017--2020 Clemens Niederberger
-%
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% ----------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% ----------------------------------------------------------------------------
-\XSIMmodule{translations}{language settings for XSIM}
-
-\RequirePackage{translations}
-
-\msg_new:nnn {xsim} {language-not-defined}
- {
- You~ chose~ the~ language~ `#1'~ which~ is~ not~ defined~ by~ xsim.~
- `english'~ is~ used~ instead.~ If~ you~ just~ mistyped~ try~ again!~
- Otherwise~ contact~ the~ author~ and~ he'll~ probably~ add~ your~ language.
- }
-
-% --------------------------------------------------------------------------
-
-\bool_new:N \l__xsim_language_auto_bool
-\bool_set_true:N \l__xsim_language_auto_bool
-% this token list will hold the chosen language for xsim; since the
-% language is either chosen automatically or by option it is only available at
-% begin document
-\tl_new:N \l_xsim_language_tl
-\tl_set:Nn \l_xsim_language_tl {english}
-\tl_new:N \l__xsim_current_language_tl
-
-\tl_const:Nn \c__xsim_keyword_prefix_tl {xsim-keyword-}
-
-% ----------------------------------------------------------------------------
-
-\prop_new:N \g_xsim_translations_prop
-
-% translate the key #1
-\cs_new:Npn \xsim_translate:n #1
- {
- \bool_if:NTF \l__xsim_language_auto_bool
- { \GetTranslation { \c__xsim_keyword_prefix_tl #1 } }
- {
- \GetTranslationFor
- { \l_xsim_language_tl }
- { \c__xsim_keyword_prefix_tl #1 }
- }
- }
-
-\xsim_at_begin_document:n
- {
- \bool_if:NTF \l__xsim_language_auto_bool
- {
- \tl_set:Nx \l_xsim_language_tl
- { \@trnslt@language{\@trnslt@current@language} }
- }
- {
- \tl_set_eq:NN
- \l_xsim_language_tl
- \l__xsim_current_language_tl
- }
- }
-
-% ----------------------------------------------------------------------------
-% #1: keyword
-% #2: language
-% #3: translation
-\cs_new_protected:Npn \__xsim_declare_translation:nw #1#2=#3\q_stop
- {
- \tl_set:Nx \l__xsim_tmpa_tl { \tl_trim_spaces:n {#2} }
- \tl_set:Nx \l__xsim_tmpb_tl { \tl_trim_spaces:n {#3} }
- \xsim_declare_translation:VnV
- \l__xsim_tmpa_tl
- {#1}
- \l__xsim_tmpb_tl
- }
-
-% #1: language
-% #2: keyword
-% #3: translation
-\cs_new_protected:Npn \xsim_declare_translation:nnn #1#2#3
- {
- \xsim_verbose:n
- { Declaring~ `#1'~ tranlation~ of~ `#2':~ `#3'. }
- \declaretranslation
- {#1}
- { \c__xsim_keyword_prefix_tl #2 }
- {#3}
- \prop_gput:Nnn \g_xsim_translations_prop {#2(#1)} {#3}
- }
-\cs_generate_variant:Nn \xsim_declare_translation:nnn {V,VnV}
-
-% #1: key
-% #2: csv list: { <lang1> = <translation1> , <lang2> = <translation2> }
-\cs_new_protected:Npn \xsim_declare_translations:nn #1#2
- {
- \clist_map_inline:nn {#2}
- { \__xsim_declare_translation:nw {#1} ##1 \q_stop }
- }
-
-\cs_new:Npn \__xsim_parse_translate_list_entry:nnn #1#2#3 {}
-
-\cs_new_protected:Npn \__xsim_parse_translate_list_entry:www #1(#2)\q_mark#3\q_stop
- { \__xsim_parse_translate_list_entry:nnn {#1} {#2} {#3} }
-
-\cs_new_protected:Npn \xsim_for_all_translations_do:n #1
- {
- \cs_set:Npn \__xsim_parse_translate_list_entry:nnn ##1##2##3 {#1}
- \prop_map_inline:Nn \g_xsim_translations_prop
- { \__xsim_parse_translate_list_entry:www ##1 \q_mark ##2 \q_stop }
- }
-
-% ----------------------------------------------------------------------------
-
-\keys_define:nn {xsim}
- {
- language .value_required:n = true ,
- language .code:n =
- \tl_if_eq:nnTF {#1} {auto}
- { \bool_set_true:N \l__xsim_language_auto_bool }
- {
- \bool_set_false:N \l__xsim_language_auto_bool
- \tl_set:Nn \l__xsim_current_language_tl {#1}
- } ,
- language .initial:n = auto
- }
-
-% ----------------------------------------------------------------------------
-\file_input_stop:
diff --git a/macros/latex/contrib/xsim/code/xsimverb.sty b/macros/latex/contrib/xsim/code/xsimverb.sty
deleted file mode 100644
index 90373e9021..0000000000
--- a/macros/latex/contrib/xsim/code/xsimverb.sty
+++ /dev/null
@@ -1,97 +0,0 @@
-% ----------------------------------------------------------------------------
-% the XSIMVERB package
-%
-% write environments verbatim to files
-%
-% ----------------------------------------------------------------------------
-% Clemens Niederberger
-% Web: https://github.com/cgnieder/xsim
-% E-Mail: contact@mychemistry.eu
-% ----------------------------------------------------------------------------
-% Copyright 2017--2020 Clemens Niederberger
-%
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% ----------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% ----------------------------------------------------------------------------
-
-\RequirePackage {expl3}
-\ExplSyntaxOn
-
-\tl_const:Nn \c_xsimverb_date_tl {2019/12/29}
-\tl_const:Nn \c_xsimverb_version_major_number_tl {0}
-\tl_const:Nn \c_xsimverb_version_minor_number_tl {1}
-\tl_const:Nn \c_xsimverb_version_subrelease_tl {a}
-\tl_const:Nx \c_xsimverb_version_number_tl
- {
- \c_xsimverb_version_major_number_tl .
- \c_xsimverb_version_minor_number_tl
- }
-\tl_const:Nx \c_xsimverb_version_tl
- {
- \c_xsimverb_version_number_tl
- \c_xsimverb_version_subrelease_tl
- }
-\tl_const:Nn \c_xsimverb_info_tl {write~ environments~ verbatim~ to~ files}
-
-\ProvidesExplPackage
- {xsimverb}
- {\c_xsimverb_date_tl}
- {\c_xsimverb_version_tl}
- {\c_xsimverb_info_tl}
-
-\@ifpackageloaded {xsim} { \file_input_stop: } {}
-\RequirePackage {xparse,l3keys2e}
-
-% options, information
-
-\cs_new_protected:Npn \xsimverb_bool_provide:N #1
- { \bool_if_exist:NF #1 { \bool_new:N #1 } }
-
-\xsimverb_bool_provide:N \g__xsim_final_bool
-\xsimverb_bool_provide:N \g__xsim_verbose_bool
-\xsimverb_bool_provide:N \g_xsim_clear_aux_bool
-\xsimverb_bool_provide:N \g__xsim_write_to_file_bool
-\xsimverb_bool_provide:N \g_xsim_use_aux_bool
-\xsimverb_bool_provide:N \g__xsim_rerun_bool
-
-\keys_define:nn {xsimverb}
- {
- final .bool_gset:N = \g__xsim_final_bool ,
- verbose .bool_gset:N = \g__xsim_verbose_bool ,
- clear-aux .bool_gset:N = \g_xsim_clear_aux_bool ,
- no-files .bool_gset_inverse:N = \g__xsim_write_to_file_bool ,
- no-files .initial:n = false ,
- use-aux .bool_gset:N = \g_xsim_use_aux_bool ,
- use-aux .initial:n = false
- }
-
-\ProcessKeysPackageOptions {xsimverb}
-
-% --------------------------------------------------------------------------
-
-% load module mechanism:
-\tl_set:Nn \l_tmpa_tl {code.tex}
-\@onefilewithoptions {xsim.modules} [][] \l_tmpa_tl
-
-% --------------------------------------------------------------------------
-
-\xsim_load_module:n {verbwrite}
-
-% --------------------------------------------------------------------------
-\file_input_stop:
-
-2018/01/31 - define xsim's options as dummy options to prevent possible errors
- caused by undefined booleans
-2019/12/29 - adapt to update of xsim
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.collections.pdf b/macros/latex/contrib/xsim/doc/examples/xsim.collections.pdf
deleted file mode 100644
index fd785cc057..0000000000
--- a/macros/latex/contrib/xsim/doc/examples/xsim.collections.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.collections.tex b/macros/latex/contrib/xsim/doc/examples/xsim.collections.tex
deleted file mode 100644
index 990391e091..0000000000
--- a/macros/latex/contrib/xsim/doc/examples/xsim.collections.tex
+++ /dev/null
@@ -1,62 +0,0 @@
-\documentclass{article}
-\usepackage{xsim}
-
-\DeclareExerciseCollection{foo-easy}
-\DeclareExerciseCollection{foo-medium}
-\DeclareExerciseTagging{difficulty}
-
-\usepackage{lipsum}
-\begin{filecontents*}{foo.tex}
-\begin{exercise}[difficulty=easy,points=1]
- foo one \lipsum[4]
-\end{exercise}
-\begin{solution}
- foo one \lipsum[4]
-\end{solution}
-\begin{exercise}[difficulty=medium,points=1]
- foo two \lipsum[4]
-\end{exercise}
-\begin{solution}
- foo two \lipsum[4]
-\end{solution}
-\begin{exercise}[difficulty=easy,points=1]
- foo three \lipsum[4]
-\end{exercise}
-\begin{solution}
- foo three \lipsum[4]
-\end{solution}
-\end{filecontents*}
-
-\begin{document}
-
-\begin{exercise}
- outside before
-\end{exercise}
-
-\collectexercises{foo-easy}
-\xsimsetup{difficulty=easy}
-\input{foo.tex}
-\collectexercisesstop{foo-easy}
-% collection `foo-easy' now contains all exercises of file `foo.tex' tagged
-% with `difficulty=easy'
-
-\collectexercises{foo-medium}
-\xsimsetup{difficulty=medium}
-\input{foo.tex}
-\collectexercisesstop{foo-medium}
-% collection `foo-medium' now contains all exercises of file `foo.tex'
-% tagged with `difficulty=medium'
-
-\section{Easy}
-\printcollection{foo-easy}
-
-\section{Medium}
-\printcollection{foo-medium}
-
-\printsolutions[difficulty=medium]
-
-\section{All Exercises and Their Solutions Again, in Order of Appearance}
-
-\printcollection[print=both]{all exercises}
-
-\end{document}
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.difficulties.pdf b/macros/latex/contrib/xsim/doc/examples/xsim.difficulties.pdf
deleted file mode 100644
index 846f19e201..0000000000
--- a/macros/latex/contrib/xsim/doc/examples/xsim.difficulties.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.randomexercises.pdf b/macros/latex/contrib/xsim/doc/examples/xsim.randomexercises.pdf
deleted file mode 100644
index 773d34f495..0000000000
--- a/macros/latex/contrib/xsim/doc/examples/xsim.randomexercises.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-369636.pdf b/macros/latex/contrib/xsim/doc/examples/xsim.texsx-369636.pdf
deleted file mode 100644
index 2bc106f303..0000000000
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-369636.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-391530.pdf b/macros/latex/contrib/xsim/doc/examples/xsim.texsx-391530.pdf
deleted file mode 100644
index 137c858769..0000000000
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-391530.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/xsim.ideas b/macros/latex/contrib/xsim/doc/xsim.ideas
deleted file mode 100644
index b23ebec899..0000000000
--- a/macros/latex/contrib/xsim/doc/xsim.ideas
+++ /dev/null
@@ -1,29 +0,0 @@
---------------------------------------------------------------------------
-
-XSIM -- eXercise Sheets IMproved
-
---------------------------------------------------------------------------
-Clemens Niederberger
-Web: https://github.com/cgnieder/xsim
-E-Mail: contact@mychemistry.eu
---------------------------------------------------------------------------
-Copyright 2017--2020 Clemens Niederberger
-
-This work may be distributed and/or modified under the
-conditions of the LaTeX Project Public License, either version 1.3
-of this license or (at your option) any later version.
-The latest version of this license is in
- http://www.latex-project.org/lppl.txt
-and version 1.3 or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
-
-This work has the LPPL maintenance status `maintained'.
-
-The Current Maintainer of this work is Clemens Niederberger.
---------------------------------------------------------------------------
-
-IDEAS:
-
-- a document class `xsim-exam' for creating exams
-- a mechanism for providing variants of an exam
-
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.blanks.pdf b/macros/latex/contrib/xsim/examples/xsim.blanks.pdf
index dd26d67157..84a8e09b33 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.blanks.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.blanks.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.blanks.tex b/macros/latex/contrib/xsim/examples/xsim.blanks.tex
index b479e961c2..f32b81a129 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.blanks.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.blanks.tex
@@ -1,5 +1,4 @@
\documentclass{article}
-\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{xsim,lipsum,xcolor}
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.boxed-headings.pdf b/macros/latex/contrib/xsim/examples/xsim.boxed-headings.pdf
index 99ba5bbc2a..fb9ff49f98 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.boxed-headings.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.boxed-headings.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.boxed-headings.tex b/macros/latex/contrib/xsim/examples/xsim.boxed-headings.tex
index 9ff47d9d99..9ff47d9d99 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.boxed-headings.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.boxed-headings.tex
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.code-and-output.pdf b/macros/latex/contrib/xsim/examples/xsim.code-and-output.pdf
index 72894ac9a6..4626e8c982 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.code-and-output.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.code-and-output.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.code-and-output.tex b/macros/latex/contrib/xsim/examples/xsim.code-and-output.tex
index 66afaf9b8a..15b1a7dea0 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.code-and-output.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.code-and-output.tex
@@ -46,7 +46,7 @@
\bigskip
-\begin{code}[]
+\begin{code}
blubber \LaTeX
\end{code}
diff --git a/macros/latex/contrib/xsim/examples/xsim.collections.pdf b/macros/latex/contrib/xsim/examples/xsim.collections.pdf
new file mode 100644
index 0000000000..e7ccda79cf
--- /dev/null
+++ b/macros/latex/contrib/xsim/examples/xsim.collections.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/examples/xsim.collections.tex b/macros/latex/contrib/xsim/examples/xsim.collections.tex
new file mode 100644
index 0000000000..5f75082a42
--- /dev/null
+++ b/macros/latex/contrib/xsim/examples/xsim.collections.tex
@@ -0,0 +1,44 @@
+\documentclass{article}
+\usepackage{xsim}
+\usepackage{lipsum}
+
+\DeclareExerciseCollection[difficulty=easy]{easy}
+\DeclareExerciseCollection[difficulty=medium]{medium}
+\DeclareExerciseTagging{difficulty}
+
+\xsimsetup{collect}
+
+\begin{document}
+
+\begin{exercise}[use,print]
+ outside before
+\end{exercise}
+
+\begin{exercise}[difficulty=easy,points=1]
+ foo one \lipsum[4]
+\end{exercise}
+\begin{solution}
+ foo one \lipsum[4]
+\end{solution}
+\begin{exercise}[difficulty=medium,points=1]
+ foo two \lipsum[4]
+\end{exercise}
+\begin{solution}
+ foo two \lipsum[4]
+\end{solution}
+\begin{exercise}[difficulty=easy,points=1]
+ foo three \lipsum[4]
+\end{exercise}
+\begin{solution}
+ foo three \lipsum[4]
+\end{solution}
+
+\section{Easy}
+\printcollection{easy}
+
+\section{Medium}
+\printcollection{medium}
+
+\printsolutions[difficulty=medium]
+
+\end{document}
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.crossref.pdf b/macros/latex/contrib/xsim/examples/xsim.crossref.pdf
index 8151a0cef3..19843c4185 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.crossref.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.crossref.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.crossref.tex b/macros/latex/contrib/xsim/examples/xsim.crossref.tex
index fa2fbbb509..0a6c8f4eab 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.crossref.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.crossref.tex
@@ -2,7 +2,7 @@
\usepackage{xsim,lipsum,hyperref}
\DeclareExerciseHeadingTemplate{custom}
- {\section{\XSIMtranslate{default-heading}}}
+ {\section{\XSIMexpandcode{\XSIMtranslate{default-heading}}}}
\DeclareExerciseEnvironmentTemplate{custom}
{%
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.description-list.pdf b/macros/latex/contrib/xsim/examples/xsim.description-list.pdf
index d506ad960b..b05b3276c9 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.description-list.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.description-list.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.description-list.tex b/macros/latex/contrib/xsim/examples/xsim.description-list.tex
index f3c9ed6d74..f3c9ed6d74 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.description-list.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.description-list.tex
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.different-point-types.pdf b/macros/latex/contrib/xsim/examples/xsim.different-point-types.pdf
index b1de5d6325..781831ddf8 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.different-point-types.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.different-point-types.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.different-point-types.tex b/macros/latex/contrib/xsim/examples/xsim.different-point-types.tex
index 0ac3536776..0ac3536776 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.different-point-types.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.different-point-types.tex
diff --git a/macros/latex/contrib/xsim/examples/xsim.difficulties.pdf b/macros/latex/contrib/xsim/examples/xsim.difficulties.pdf
new file mode 100644
index 0000000000..4963fb4836
--- /dev/null
+++ b/macros/latex/contrib/xsim/examples/xsim.difficulties.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.difficulties.tex b/macros/latex/contrib/xsim/examples/xsim.difficulties.tex
index 02712f15d6..02712f15d6 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.difficulties.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.difficulties.tex
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.floating.pdf b/macros/latex/contrib/xsim/examples/xsim.floating.pdf
index e2e96537ef..c1352837eb 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.floating.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.floating.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.floating.tex b/macros/latex/contrib/xsim/examples/xsim.floating.tex
index 08448df35a..08448df35a 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.floating.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.floating.tex
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.golatex-80640.pdf b/macros/latex/contrib/xsim/examples/xsim.golatex-80640.pdf
index 76cf1617cb..068dc15fef 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.golatex-80640.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.golatex-80640.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.golatex-80640.tex b/macros/latex/contrib/xsim/examples/xsim.golatex-80640.tex
index 5ccdff63a4..7ac1f15800 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.golatex-80640.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.golatex-80640.tex
@@ -1,6 +1,5 @@
% http://golatex.de/viewtopic,p,80640.html
\documentclass[fontsize=12pt,parskip=half]{scrartcl}
-\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.golatex-91339.pdf b/macros/latex/contrib/xsim/examples/xsim.golatex-91339.pdf
index 97cb4659e0..189210a8a3 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.golatex-91339.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.golatex-91339.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.golatex-91339.tex b/macros/latex/contrib/xsim/examples/xsim.golatex-91339.tex
index 8ae03971c5..ae02ca0344 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.golatex-91339.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.golatex-91339.tex
@@ -1,6 +1,5 @@
% http://golatex.de/viewtopic,p,91339.html
-\documentclass[18pt,a4paper]{article}
-\usepackage[utf8]{inputenc}
+\documentclass[a4paper]{article}
\usepackage[ngerman]{babel}
\usepackage{xsim,tcolorbox}
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.grade-distribution.pdf b/macros/latex/contrib/xsim/examples/xsim.grade-distribution.pdf
index 248358c4a1..2de9ff1358 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.grade-distribution.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.grade-distribution.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.grade-distribution.tex b/macros/latex/contrib/xsim/examples/xsim.grade-distribution.tex
index 8e9731de24..8e9731de24 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.grade-distribution.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.grade-distribution.tex
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.hints.pdf b/macros/latex/contrib/xsim/examples/xsim.hints.pdf
index a34fbd8f79..4b13a435d6 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.hints.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.hints.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.hints.tex b/macros/latex/contrib/xsim/examples/xsim.hints.tex
index 10a0bffed9..82d89f6944 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.hints.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.hints.tex
@@ -10,13 +10,8 @@
\newcommand\printhints{%
\begin{description}
\ForEachUsedExerciseByType{%
- \def\ExerciseType{##1}%
- \def\ExerciseID{##2}%
\GetExercisePropertyT{hint}
- {%
- \item[\XSIMmixedcase{\GetExerciseName}~##3]
- ####1%
- }%
+ {\item[\XSIMmixedcase{\GetExerciseName}~##3]####1}%
}%
\end{description}
}
diff --git a/macros/latex/contrib/xsim/examples/xsim.issues-49.pdf b/macros/latex/contrib/xsim/examples/xsim.issues-49.pdf
new file mode 100644
index 0000000000..3ea1c70ace
--- /dev/null
+++ b/macros/latex/contrib/xsim/examples/xsim.issues-49.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/examples/xsim.issues-49.tex b/macros/latex/contrib/xsim/examples/xsim.issues-49.tex
new file mode 100644
index 0000000000..f9baf0a601
--- /dev/null
+++ b/macros/latex/contrib/xsim/examples/xsim.issues-49.tex
@@ -0,0 +1,122 @@
+\documentclass{article}
+\usepackage{xsim}
+
+\xsimsetup{
+ load-style = layouts ,
+ exercise/template = runin ,
+ solution/template = runin
+}
+
+\usepackage{tasks,fontawesome,fmtcount,multicol}
+\NewTasksEnvironment[label=\Alph*),label-width=12pt]{choices}[\choice]
+\newcommand*\correct{\thetask\expanded{\SetExerciseProperty{choice}{\thetask}}}
+
+\NewTasksEnvironment[label=\Roman*,label-width=12pt]{options}[\option]
+
+\DeclareExerciseProperty{choice}
+
+\newcommand*\pkg[1]{\texttt{#1}}
+\newcommand*\cls[1]{\texttt{#1}}
+
+\newcommand\EA[2]{\IfInsideSolutionTF{#2}{#1}}
+\newcommand\answer[1]{\IfInsideSolutionT{#1}}
+
+\begin{document}
+
+\section{List of exercises}
+Solve and answer the following exercises.
+
+\begin{exercise}
+ Factor $x^{2}-2x+1$
+\end{exercise}
+\begin{solution}
+ $\left(x-1\right)^{2}$
+\end{solution}
+\begin{exercise}
+ Factor $3x+3y+3z$
+\end{exercise}
+\begin{solution}
+ $3(x+y+z)$
+\end{solution}
+
+\begin{exercise}[solution]
+ \EA{True or false?}{}
+ \begin{tasks}(2)
+ \task \EA{$\alpha > \delta$}{False}
+ \task \EA{\LaTeX2e\ is cool?}{Very True!}
+ \end{tasks}
+\end{exercise}
+
+\begin{exercise}[subtitle=Talking Linux,solution]
+ \begin{tasks}(2)
+ \task \EA{You use linux?}{Yes}
+ \task \EA{Usually uses the package manager?}{Yes}
+ \end{tasks}
+\end{exercise}
+
+\begin{exercise}[solution]
+ \EA{Rate the following \LaTeX\ packages and classes.}{}
+ \begin{tasks}(\EA{3}{1})
+ \task \EA{\cls{xsim-exam}}{doesn't exist for now}
+ \task \EA{\pkg{xsim}}{very good}
+ \task \EA{\pkg{exsheets}}{obsolete}
+ \end{tasks}
+\end{exercise}
+
+\begin{exercise}
+ \begin{choices}(5)
+ \choice value
+ \choice value
+ \choice value
+ \choice[\correct] correct
+ \choice value
+ \end{choices}
+\end{exercise}
+\begin{solution}
+ \GetExerciseProperty{choice}
+\end{solution}
+
+\begin{exercise}
+ \begin{options}(3)
+ \option $2\alpha+2\delta=90^{\circ}$
+ \option $\alpha=\delta$
+ \option $\angle EDF=45^{\circ}$
+ \end{options}
+ \begin{choices}(4)
+ \choice I only
+ \choice[\correct] II only
+ \choice I and II only
+ \choice I and III only
+ \choice I, II, and III
+ \end{choices}
+\end{exercise}
+\begin{solution}
+ \GetExerciseProperty{choice}
+\end{solution}
+
+\begin{exercise}
+ \begin{tasks}[label=(\arabic*),label-width=13pt](2)
+ \task $2\alpha+2\delta=90^{\circ}$
+ \task $\angle EDF=45^{\circ}$
+ \end{tasks}
+ \begin{choices}(3)
+ \choice Alternative A
+ \choice Alternative B
+ \choice[\correct] Alternative C
+ \choice Alternative D
+ \choice Alternative E
+ \end{choices}
+\end{exercise}
+\begin{solution}
+ \GetExerciseProperty{choice}
+\end{solution}
+
+\clearpage
+
+\section{Solutions}
+\raggedcolumns
+\begin{multicols}{2}
+ \printsolutions[headings=false]
+\end{multicols}
+
+\end{document}
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.listings.pdf b/macros/latex/contrib/xsim/examples/xsim.listings.pdf
index 0d388f2c70..8383fd8b0c 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.listings.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.listings.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.listings.tex b/macros/latex/contrib/xsim/examples/xsim.listings.tex
index 6dd302feb0..a5fe951beb 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.listings.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.listings.tex
@@ -3,7 +3,7 @@
\usepackage{xcolor}
\usepackage{listings}
-\usepackage{xsim}
+\usepackage[use-files]{xsim}
\lstset{
frame=single,
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.listofexercises.pdf b/macros/latex/contrib/xsim/examples/xsim.listofexercises.pdf
index 8050ee8f90..46bf9b89e4 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.listofexercises.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.listofexercises.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.listofexercises.tex b/macros/latex/contrib/xsim/examples/xsim.listofexercises.tex
index c2a9a3fe36..c2a9a3fe36 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.listofexercises.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.listofexercises.tex
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.multiplechoice.pdf b/macros/latex/contrib/xsim/examples/xsim.multiplechoice.pdf
index 02dac6c4df..0e49066a70 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.multiplechoice.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.multiplechoice.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.multiplechoice.tex b/macros/latex/contrib/xsim/examples/xsim.multiplechoice.tex
index e0db3eb0c5..e0db3eb0c5 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.multiplechoice.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.multiplechoice.tex
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.pointsums.pdf b/macros/latex/contrib/xsim/examples/xsim.pointsums.pdf
index aa822a1bd7..225595afe3 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.pointsums.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.pointsums.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.pointsums.tex b/macros/latex/contrib/xsim/examples/xsim.pointsums.tex
index 29d7ac0cdc..29d7ac0cdc 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.pointsums.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.pointsums.tex
diff --git a/macros/latex/contrib/xsim/examples/xsim.randomexercises.pdf b/macros/latex/contrib/xsim/examples/xsim.randomexercises.pdf
new file mode 100644
index 0000000000..670825d54a
--- /dev/null
+++ b/macros/latex/contrib/xsim/examples/xsim.randomexercises.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.randomexercises.tex b/macros/latex/contrib/xsim/examples/xsim.randomexercises.tex
index 60877b1a4a..aafb3ddae1 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.randomexercises.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.randomexercises.tex
@@ -1,10 +1,10 @@
\documentclass{article}
\usepackage{xsim}
-\DeclareExerciseCollection{foo}
+\xsimsetup{collect}
+
+\begin{document}
-\usepackage{filecontents}
-\begin{filecontents*}{random.tex}
\begin{exercise}[ID=A]
exercise A
\end{exercise}
@@ -41,18 +41,10 @@
\begin{solution}
solution F
\end{solution}
-\end{filecontents*}
-
-\begin{document}
-
-\collectexercises{foo}
-\input{random.tex}
-\collectexercisesstop{foo}
\section*{Exercises}
-\printrandomexercises[collection=foo,exclude=D]{3}
+\printrandomexercises[collection=all exercises,exclude=D]{3}
-\section*{Solutions}
-\printsolutions*
+\printsolutions
\end{document}
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-13635.pdf b/macros/latex/contrib/xsim/examples/xsim.texsx-13635.pdf
index af889a6709..ff493e3591 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-13635.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-13635.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-13635.tex b/macros/latex/contrib/xsim/examples/xsim.texsx-13635.tex
index 3b52ce46b2..c0d08a567f 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-13635.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-13635.tex
@@ -27,6 +27,8 @@
\DeclareExerciseCollection{prime numbers}
\DeclareExerciseCollection{Zeta function}
+\xsimsetup{collect}
+
\begin{document}
\collectexercises{prime numbers}
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-155630.pdf b/macros/latex/contrib/xsim/examples/xsim.texsx-155630.pdf
index 6c9fc4482a..40bacabc8e 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-155630.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-155630.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-155630.tex b/macros/latex/contrib/xsim/examples/xsim.texsx-155630.tex
index 2edb7bfdad..015f52db0f 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-155630.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-155630.tex
@@ -3,10 +3,10 @@
\usepackage{xsim}
\DeclareExerciseCollection{foo}
+\xsimsetup{collect}
\begin{document}
-\collectexercises{foo}
\begin{exercise}
foo
\end{exercise}
@@ -16,7 +16,6 @@
\begin{exercise}
baz
\end{exercise}
-\collectexercisesstop{foo}
% shuffle around for a different version:
\printexercise{exercise}{1}
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-199360.pdf b/macros/latex/contrib/xsim/examples/xsim.texsx-199360.pdf
index 9492549598..8c1d7cc9d5 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-199360.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-199360.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-199360.tex b/macros/latex/contrib/xsim/examples/xsim.texsx-199360.tex
index 334275140a..334275140a 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-199360.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-199360.tex
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-299534.pdf b/macros/latex/contrib/xsim/examples/xsim.texsx-299534.pdf
index c006aeb34c..c9500e089f 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-299534.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-299534.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-299534.tex b/macros/latex/contrib/xsim/examples/xsim.texsx-299534.tex
index 1c2be46df3..e330f3d256 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-299534.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-299534.tex
@@ -1,7 +1,7 @@
% http://tex.stackexchange.com/q/299534/
\documentclass{article}
\usepackage{pythontex}
-\usepackage{xsim}
+\usepackage[use-files]{xsim}
\begin{document}
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-305110.pdf b/macros/latex/contrib/xsim/examples/xsim.texsx-305110.pdf
index fb92e875a9..4b9558d90f 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-305110.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-305110.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-305110.tex b/macros/latex/contrib/xsim/examples/xsim.texsx-305110.tex
index c10928da0c..c10928da0c 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-305110.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-305110.tex
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-308883.pdf b/macros/latex/contrib/xsim/examples/xsim.texsx-308883.pdf
index eb27dce140..02039dbc68 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-308883.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-308883.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-308883.tex b/macros/latex/contrib/xsim/examples/xsim.texsx-308883.tex
index 74e762fa08..74e762fa08 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-308883.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-308883.tex
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-338165.pdf b/macros/latex/contrib/xsim/examples/xsim.texsx-338165.pdf
index 4b5a09474d..9e8168af2f 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-338165.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-338165.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-338165.tex b/macros/latex/contrib/xsim/examples/xsim.texsx-338165.tex
index a0b204f914..72ee108668 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-338165.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-338165.tex
@@ -10,26 +10,24 @@
\tcbuselibrary{breakable, skins}
\settasks{ label = \arabic*. }
-\DeclareExerciseEnvironmentTemplate{boxed}
- {%
- \tcolorbox[
- enhanced ,
- attach boxed title to top center = {yshift=-7.5pt} ,
- colback = white , colbacktitle = white ,
- coltitle = black , colframe = black ,
- boxed title style = { colframe = white } ,
- fonttitle=\bfseries,
- sharp corners=all,
- breakable,
- title=
- \XSIMmixedcase{\GetExerciseName}%
- \IfInsideSolutionF{%
- ~\GetExerciseProperty{counter}%
- \IfExercisePropertySetT{subtitle}{: \GetExerciseProperty{subtitle}}%
- }%
- ]
- }
- {\endtcolorbox}
+\DeclareExerciseEnvironmentTemplate{boxed}{%
+ \tcolorbox[
+ enhanced ,
+ attach boxed title to top center = {yshift=-7.5pt} ,
+ colback = white , colbacktitle = white ,
+ coltitle = black , colframe = black ,
+ boxed title style = { colframe = white } ,
+ fonttitle=\bfseries,
+ sharp corners=all,
+ breakable,
+ title=
+ \XSIMmixedcase{\GetExerciseName}%
+ \IfInsideSolutionF{%
+ ~\GetExerciseProperty{counter}%
+ \IfExercisePropertySetT{subtitle}{: \GetExerciseProperty{subtitle}}%
+ }%
+ ]
+}{\endtcolorbox}
\xsimsetup{
exercise/template = boxed ,
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-350028.pdf b/macros/latex/contrib/xsim/examples/xsim.texsx-350028.pdf
index 36645464fc..2f58a0fde7 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-350028.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-350028.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-350028.tex b/macros/latex/contrib/xsim/examples/xsim.texsx-350028.tex
index 8f49a92f60..f0d977a131 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-350028.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-350028.tex
@@ -5,48 +5,44 @@
\usepackage[most]{tcolorbox}
\tcbuselibrary{skins,breakable}
-\DeclareExerciseEnvironmentTemplate{tcolorbox}
- {%
- \tcolorbox[
- enhanced,
- colframe=green!20!black,
- colback=yellow!10!white,
- coltitle=green!40!black,
- fonttitle=\bfseries,
- underlay={%
- \begin{tcbclipinterior}
- \shade[
- inner color=\IfInsideSolutionTF{red!50!yellow}{green!80!yellow},
- outer color=yellow!10!white]
- (interior.north west) circle (2cm);
- \draw[help lines,step=5mm,yellow!80!black,shift={(interior.north west)}]
- (interior.south west) grid (interior.north east);
- \end{tcbclipinterior}%
- },
- attach title to upper=\quad,
- title = \XSIMmixedcase{\GetExerciseName}~\GetExerciseProperty{counter}
- \IfExercisePropertySetT{points}{%
- (\GetExerciseProperty{points}
- \IfExerciseGoalSingularTF{points}
- {\XSIMtranslate{point}}
- {\XSIMtranslate{points}})%
- }]%
- \IfInsideSolutionT{\label{solution:\ExerciseID}}%
- }
- {%
- \endtcolorbox
- \vspace*{\baselineskip}
- \IfInsideSolutionTF
- {%
- \noindent Exercise~\GetExerciseProperty{counter} is on
- page~\GetExerciseProperty{page}.%
- }
- {%
- \noindent The solution of this exercise is on
- page~\pageref{solution:\ExerciseID}.%
- }%
- \vspace{\baselineskip}
- }
+\DeclareExerciseEnvironmentTemplate{tcolorbox}{%
+ \tcolorbox[
+ enhanced,
+ colframe=green!20!black,
+ colback=yellow!10!white,
+ coltitle=green!40!black,
+ fonttitle=\bfseries,
+ underlay={%
+ \begin{tcbclipinterior}
+ \shade[
+ inner color=\IfInsideSolutionTF{red!50!yellow}{green!80!yellow},
+ outer color=yellow!10!white]
+ (interior.north west) circle (2cm);
+ \draw[help lines,step=5mm,yellow!80!black,shift={(interior.north west)}]
+ (interior.south west) grid (interior.north east);
+ \end{tcbclipinterior}%
+ },
+ attach title to upper=\quad,
+ title = \XSIMmixedcase{\GetExerciseName}~\GetExerciseProperty{counter}
+ \IfExercisePropertySetT{points}{%
+ (\GetExerciseProperty{points}
+ \IfExerciseGoalSingularTF{points}
+ {\XSIMtranslate{point}}
+ {\XSIMtranslate{points}})%
+ }]%
+ \IfInsideSolutionT{\label{solution:\ExerciseID}}%
+}{%
+ \endtcolorbox
+ \vspace*{\baselineskip}
+ \IfInsideSolutionTF{%
+ \noindent Exercise~\GetExerciseProperty{counter} is on
+ page~\GetExerciseProperty{page}.%
+ }{%
+ \noindent The solution of this exercise is on
+ page~\pageref{solution:\ExerciseID}.%
+ }%
+ \vspace{\baselineskip}
+}
\xsimsetup{
exercise/template = tcolorbox ,
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-369065.pdf b/macros/latex/contrib/xsim/examples/xsim.texsx-369065.pdf
index 6aa9ab572b..fea54f626b 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-369065.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-369065.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-369065.tex b/macros/latex/contrib/xsim/examples/xsim.texsx-369065.tex
index b62b85127a..f35149c8ea 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-369065.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-369065.tex
@@ -11,28 +11,24 @@
solution/print=true
}
-\DeclareExerciseEnvironmentTemplate{cyan-box}
- {%
- \begin{tcolorbox}[arc=0mm,boxrule=1pt,colback=white,colframe=cyan,leftrule=3mm]
- \textsf{%
- \MakeUppercase{%
- \XSIMmixedcase{\GetExerciseName}~\GetExerciseProperty{counter}%
- }%
+\DeclareExerciseEnvironmentTemplate{cyan-box}{%
+ \begin{tcolorbox}[arc=0mm,boxrule=1pt,colback=white,colframe=cyan,leftrule=3mm]
+ \textsf{%
+ \MakeUppercase{%
+ \XSIMmixedcase{\GetExerciseName}~\GetExerciseProperty{counter}%
}%
- \GetExercisePropertyT{subtitle}{ \textit{#1}}%
- \quad
- }
- {\end{tcolorbox}}
-
-\DeclareExerciseEnvironmentTemplate{red}
- {%
- \par
- \Needspace*{2\baselineskip}
- \noindent
- \textsf{\textcolor{red}{\MakeUppercase{\XSIMmixedcase{\GetExerciseName}}}}%
+ }%
+ \GetExercisePropertyT{subtitle}{ \textit{#1}}%
\quad
- }
- {\par\bigskip}
+}{\end{tcolorbox}}
+
+\DeclareExerciseEnvironmentTemplate{red}{%
+ \par
+ \Needspace*{2\baselineskip}
+ \noindent
+ \textsf{\textcolor{red}{\MakeUppercase{\XSIMmixedcase{\GetExerciseName}}}}%
+ \quad
+}{\par\bigskip}
\begin{document}
diff --git a/macros/latex/contrib/xsim/examples/xsim.texsx-369636.pdf b/macros/latex/contrib/xsim/examples/xsim.texsx-369636.pdf
new file mode 100644
index 0000000000..96bd157b68
--- /dev/null
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-369636.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-369636.tex b/macros/latex/contrib/xsim/examples/xsim.texsx-369636.tex
index e13b8653f4..73ab7868f6 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-369636.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-369636.tex
@@ -5,7 +5,6 @@
\usepackage[T1]{fontenc}
\usepackage{fourier}
\usepackage{tgpagella}
-\usepackage[utf8]{inputenc}
\usepackage{xsim,needspace,adjustbox,scrextend}
@@ -14,20 +13,18 @@
exercise/template = square
}
-\DeclareExerciseEnvironmentTemplate{square}
- {%
- \Needspace*{2\baselineskip}%
- \addmargin[0pt]{.15\textwidth}%
- \par\noindent
- \adjustbox{
- fbox = 1pt 0pt,
- lap = {\textwidth},
- valign = t,
- set vsize = {0pt}{0pt}
- }{\rule{0pt}{20pt}\hspace{20pt}}%
- \textbf{\GetExerciseProperty{counter}} %
- }
- {\endaddmargin\vspace{\baselineskip}}
+\DeclareExerciseEnvironmentTemplate{square}{%
+ \Needspace*{2\baselineskip}%
+ \addmargin[0pt]{.15\textwidth}%
+ \par\noindent
+ \adjustbox{
+ fbox = 1pt 0pt,
+ lap = {\textwidth},
+ valign = t,
+ set vsize = {0pt}{0pt}
+ }{\rule{0pt}{20pt}\hspace{20pt}}%
+ \textbf{\GetExerciseProperty{counter}} %
+}{\endaddmargin\vspace{\baselineskip}}
\usepackage{lipsum}
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-369803.pdf b/macros/latex/contrib/xsim/examples/xsim.texsx-369803.pdf
index 73eab39f10..3e5f8d663b 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-369803.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-369803.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-369803.tex b/macros/latex/contrib/xsim/examples/xsim.texsx-369803.tex
index 58b6800f93..e91e795353 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-369803.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-369803.tex
@@ -1,6 +1,5 @@
% https://tex.stackexchange.com/q/369803
\documentclass[a4paper,parskip=half]{scrartcl}
-\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{amsmath}
@@ -12,19 +11,16 @@
\usepackage{xsim,siunitx}
\DeclareExerciseTagging{difficulty}
-\DeclareExerciseEnvironmentTemplate{custom}
- {%
- \subsection*
- {%
- \XSIMmixedcase{\GetExerciseName}\nobreakspace
- \GetExerciseProperty{counter}%
- \IfInsideSolutionF
- {%
- \IfExercisePropertySetT{subtitle}
- { {\normalfont(\GetExerciseProperty{subtitle})}}%
- }%
- }%
- }{}
+\DeclareExerciseEnvironmentTemplate{custom}{%
+ \subsection*{%
+ \XSIMmixedcase{\GetExerciseName}\nobreakspace
+ \GetExerciseProperty{counter}%
+ \IfInsideSolutionF{%
+ \IfExercisePropertySetT{subtitle}
+ { {\normalfont(\GetExerciseProperty{subtitle})}}%
+ }%
+ }%
+}{}
\xsimsetup{
exercise/name = \XSIMtranslate{question} ,
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-370642.pdf b/macros/latex/contrib/xsim/examples/xsim.texsx-370642.pdf
index 13933e80c3..7d70b52d3a 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-370642.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-370642.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-370642.tex b/macros/latex/contrib/xsim/examples/xsim.texsx-370642.tex
index 99b300c4a0..99b300c4a0 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-370642.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-370642.tex
diff --git a/macros/latex/contrib/xsim/examples/xsim.texsx-391530-exercises.tex b/macros/latex/contrib/xsim/examples/xsim.texsx-391530-exercises.tex
new file mode 100644
index 0000000000..716921adc0
--- /dev/null
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-391530-exercises.tex
@@ -0,0 +1,12 @@
+\begin{question}
+ Who is the Defence Minister?
+\end{question}
+\begin{question}
+ Who is the Home Minister?
+\end{question}
+\begin{question}
+ Who is the Finance Minister?
+\end{question}
+\begin{question}
+ Who is the External Affairs Minister?
+\end{question}
diff --git a/macros/latex/contrib/xsim/examples/xsim.texsx-391530.pdf b/macros/latex/contrib/xsim/examples/xsim.texsx-391530.pdf
new file mode 100644
index 0000000000..1446d0345e
--- /dev/null
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-391530.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-391530.tex b/macros/latex/contrib/xsim/examples/xsim.texsx-391530.tex
index 1deafe5fb0..2d76cae57e 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-391530.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-391530.tex
@@ -14,28 +14,23 @@
\DeclareExerciseProperty{title}
\makeatletter
-\DeclareExerciseEnvironmentTemplate{named}
- {%
- \subsection*{%
- \GetExercisePropertyTF{title}
- {#1}
- {??\@latex@warning{Please give an exercise title}}%
- }%
- }
- {}
+\DeclareExerciseEnvironmentTemplate{named}{%
+ \subsection*{%
+ \GetExercisePropertyTF{title}
+ {#1}
+ {??\@latex@warning{Please give an exercise title}}%
+ }%
+}{}
\makeatother
-\DeclareExerciseEnvironmentTemplate{item}
- {\item}
- {}
-
+\DeclareExerciseEnvironmentTemplate{item}{\item}{}
\DeclareExerciseCollection{exercise-pool}
-\xsimsetup{
- exercise/template = named
-}
+\xsimsetup{ exercise/template = named }
-\begin{filecontents*}{\jobname-exercises.tex}
+\begin{document}
+
+\collectexercises{exercise-pool}
\begin{question}
Who is the Defence Minister?
\end{question}
@@ -48,12 +43,6 @@
\begin{question}
Who is the External Affairs Minister?
\end{question}
-\end{filecontents*}
-
-\begin{document}
-
-\collectexercises{exercise-pool}
-\input{\jobname-exercises.tex}
\collectexercisesstop{exercise-pool}
\begin{exercise}[title=Answer the following in one sentence:]
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-395273.pdf b/macros/latex/contrib/xsim/examples/xsim.texsx-395273.pdf
index c3796c8ee0..056b14e833 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-395273.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-395273.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-395273.tex b/macros/latex/contrib/xsim/examples/xsim.texsx-395273.tex
index fe6152ed96..fe6152ed96 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-395273.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-395273.tex
diff --git a/macros/latex/contrib/xsim/examples/xsim.texsx-466584.pdf b/macros/latex/contrib/xsim/examples/xsim.texsx-466584.pdf
new file mode 100644
index 0000000000..83c20f646b
--- /dev/null
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-466584.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/examples/xsim.texsx-466584.tex b/macros/latex/contrib/xsim/examples/xsim.texsx-466584.tex
new file mode 100644
index 0000000000..1f30d3c1b8
--- /dev/null
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-466584.tex
@@ -0,0 +1,56 @@
+% https://tex.stackexchange.com/q/466584
+\documentclass{article}
+\usepackage{xsim}
+\usepackage{needspace}
+\usepackage{tasks}
+
+\DeclareExerciseEnvironmentTemplate{exandsol}{%
+ \par\vspace{\baselineskip}
+ \Needspace*{2\baselineskip}
+ \noindent\sffamily
+ \textbf{\XSIMmixedcase{\GetExerciseName}~\GetExerciseProperty{counter}}%
+ \GetExercisePropertyT{subtitle}{\hspace{3em}{\small#1}}\par
+ \normalfont
+}{}
+
+\DeclareExerciseEnvironmentTemplate{flushright}{%
+ \begin{flushright}
+ \begin{minipage}{.4\linewidth}
+ \textsf{Solutions:}\par\normalfont
+}{%
+ \end{minipage}%
+ \end{flushright}%
+}
+
+\xsimsetup{
+ exercise/within = section ,
+ exercise/template = exandsol ,
+ solution/template = flushright ,
+ solution/print = true
+}
+
+\renewcommand*\theexercise{\thesection-\arabic{exercise}}
+\newcommand\QA[2]{\IfInsideSolutionTF{#2}{#1}}
+
+\newcommand*\answer[1]{%
+ \begingroup
+ \def\ExerciseType{exercise}%
+ \IfSolutionPrintT{\printsolution{exercise}{#1}}%
+ \endgroup
+}
+
+\begin{document}
+
+\setcounter{section}{1}
+\setcounter{exercise}{30}
+
+\begin{exercise}[ID=one,solution,subtitle=Factorize as much as possible the following expressions.]
+ \begin{tasks}
+ \task \QA{$(2x-3)^2 - (3x-2)^2 =$}{$-(x+5)(5x-1)$}
+ \task \QA{$(x^2-25) - 2(5-x)(x+6) =$}{$(x+5)(3x-17)$}
+ \task \QA{$2x(x+2) + (x+1)^2 + 2 =$}{$3(x+1)^2$}
+ \end{tasks}
+\end{exercise}
+\answer{one}
+
+\end{document}
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-498299.pdf b/macros/latex/contrib/xsim/examples/xsim.texsx-498299.pdf
index 99e8314406..41c97e7254 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-498299.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-498299.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-498299.tex b/macros/latex/contrib/xsim/examples/xsim.texsx-498299.tex
index 6716d52e7e..6b37b4c518 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texsx-498299.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-498299.tex
@@ -1,3 +1,4 @@
+% https://tex.stackexchange.com/q/498299
\documentclass{article}
\usepackage[no-files]{xsim}
\usepackage{tasks}
diff --git a/macros/latex/contrib/xsim/examples/xsim.texsx-576998.pdf b/macros/latex/contrib/xsim/examples/xsim.texsx-576998.pdf
new file mode 100644
index 0000000000..b3aa836926
--- /dev/null
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-576998.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/examples/xsim.texsx-576998.tex b/macros/latex/contrib/xsim/examples/xsim.texsx-576998.tex
new file mode 100644
index 0000000000..ee2947bbb5
--- /dev/null
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-576998.tex
@@ -0,0 +1,135 @@
+% https://tex.stackexchange.com/q/576998
+\documentclass[twocolumn]{book}
+\usepackage{xsim}
+
+\DeclareExerciseEnvironmentTemplate{number-only}{%
+ \par\noindent
+ \textbf{\GetExerciseProperty{counter}}%
+ \GetExercisePropertyT{subtitle}{ \textit{#1}} %
+}{\par}
+
+\newcommand\printsectionexercises{%
+ \ForEachUsedExerciseByType{%
+ \ifnum\ExercisePropertyGet{##1}{##2}{chapter-value}=\value{chapter}
+ \ifnum\ExercisePropertyGet{##1}{##2}{section-value}=\value{section}
+ \XSIMprint{exercise}{##1}{##2}%
+ \fi
+ \fi
+ }%
+}
+
+\renewcommand\printsolutions{%
+ \def\currentchapter{}%
+ \def\currentsection{}%
+ \def\lastchapter{}%
+ \def\lastsection{}%
+ \ForEachUsedExerciseByType{%
+ \let\lastchapter\currentchapter
+ \let\lastsection\currentsection
+ \edef\currentchapter{\ExercisePropertyGet{##1}{##2}{chapter-value}}%
+ \edef\currentsection{\ExercisePropertyGet{##1}{##2}{section-value}}%
+ \ifx\lastchapter\currentchapter\else
+ \section*{Chapter \ExercisePropertyGet{##1}{##2}{chapter}}
+ \fi
+ \ifx\lastsection\currentsection\else
+ \subsection*{Exercises \ExercisePropertyGet{##1}{##2}{section}}
+ \fi
+ \XSIMprint{solution}{##1}{##2}%
+ }%
+}
+
+\xsimsetup{
+ exercise/template = number-only ,
+ solution/template = number-only ,
+ exercise/within = section ,
+ exercise/the-counter = \arabic{exercise}. ,
+ exercise/print = false
+}
+
+\begin{document}
+
+\setcounter{chapter}{13}
+\chapter{}
+\section{Cats as pets}
+Text text text\dots
+\begin{exercise}
+ Draw a cat.
+\end{exercise}
+\begin{solution}
+ Drawing a cat.
+\end{solution}
+
+Text text text\dots
+\begin{exercise}
+ Bathe a cat.
+\end{exercise}
+\begin{solution}
+ Bathing a cat.
+\end{solution}
+
+Text text text\dots
+\begin{exercise}
+ Trace the history of cats through time.
+\end{exercise}
+\begin{solution}
+ Tracing the history of cats through time.
+\end{solution}
+
+\subsection*{Exercises \thesection}
+\printsectionexercises
+
+\section{Frogs as pets}
+Text text text\dots
+\begin{exercise}
+ Lick a frog.
+\end{exercise}
+\begin{solution}
+ Licking a frog.
+\end{solution}
+
+Text text text\dots
+\begin{exercise}
+ Bathe a frog.
+\end{exercise}
+\begin{solution}
+ Bathing a frog.
+\end{solution}
+
+Text text text\dots
+\begin{exercise}
+ Feed a frog.
+\end{exercise}
+\begin{solution}
+ Feeding a frog.
+\end{solution}
+
+\subsection*{Exercises \thesection}
+\printsectionexercises
+
+\setcounter{chapter}{20}
+\chapter{}
+
+\section{The joys of fish}
+Text text text\dots
+\begin{exercise}
+ Catch a fish.
+\end{exercise}
+\begin{solution}
+ Catching a fish.
+\end{solution}
+
+Text text text\dots
+\begin{exercise}
+ Draw a fish.
+\end{exercise}
+\begin{solution}
+ Drawing a fish.
+\end{solution}
+
+\subsection*{Exercises \thesection}
+\printsectionexercises
+
+\chapter*{Solutions to the exercises}
+\printsolutions
+
+\end{document}
diff --git a/macros/latex/contrib/xsim/examples/xsim.texsx-580636.pdf b/macros/latex/contrib/xsim/examples/xsim.texsx-580636.pdf
new file mode 100644
index 0000000000..d51eb48607
--- /dev/null
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-580636.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/examples/xsim.texsx-580636.tex b/macros/latex/contrib/xsim/examples/xsim.texsx-580636.tex
new file mode 100644
index 0000000000..a6f2be6651
--- /dev/null
+++ b/macros/latex/contrib/xsim/examples/xsim.texsx-580636.tex
@@ -0,0 +1,92 @@
+% https://tex.stackexchange.com/q/580636/
+\documentclass{article}
+\usepackage[use-files]{xsim}
+
+\usepackage[colorlinks,allcolors=blue]{hyperref}
+
+\DeclareExerciseProperty{hints}
+\newcounter{hint}
+\renewcommand\theHhint{\ExerciseID.\arabic{hint}}
+\newcounter{hints}
+\newcounter{step}
+
+\NewDocumentEnvironment{hint}{}{%
+ \stepcounter{hint}%
+ \XSIMsetfilebegin{%
+ \par
+ \refstepcounter{hint}\label{hint:\ExerciseID:\arabic{hint}}%
+ \noindent\textbf{Hint~\thehint\ to exercise \GetExerciseProperty{counter}}%
+ \hfill Back to exercise \ref{ex:\ExerciseID}\par
+ \noindent
+ }%
+ \XSIMsetfileend{\par\addvspace{\bigskipamount}}%
+ \XSIMfilewritestart{\jobname-hint-\ExerciseID-\arabic{hint}.tex}%
+}{%
+ \XSIMfilewritestop
+ \stepcounter{hints}%
+ \SetExpandedExerciseProperty{hints}{\arabic{hints}}%
+}
+
+\DeclareExerciseEnvironmentTemplate{hints}{%
+ \setcounter{hint}{0}%
+ \setcounter{hints}{0}%
+ \par\noindent
+ \textbf{\XSIMmixedcase{\GetExerciseName}\GetExerciseProperty{counter}:}\hfill
+ \IfExercisePropertySetT{hints}{%
+ \setcounter{step}{0}%
+ \def\hintcomma{\def\hintcomma{, }}%
+ Hint\ifnum\GetExerciseProperty{hints}=1\else s\fi:
+ \loop\unless\ifnum\value{step}=\GetExerciseProperty{hints}
+ \stepcounter{step}%
+ \hintcomma\ref{hint:\ExerciseID:\arabic{step}}%
+ \repeat
+ \par\noindent
+ }%
+}{\par\addvspace{\bigskipamount}}
+
+\xsimsetup{
+ exercise/within = section ,
+ exercise/begin-hook = \label{ex:\ExerciseID} ,
+ exercise/template = hints
+}
+
+\newcommand\printhints{%
+ \ForEachUsedExerciseByType{%
+ \setcounter{step}{0}%
+ \setcounter{hint}{0}%
+ \loop\unless\ifnum\value{step}=\GetExerciseProperty{hints}
+ \stepcounter{step}%
+ \input{\jobname-hint-\ExerciseID-\arabic{step}.tex}%
+ \repeat
+ }%
+}
+
+\begin{document}
+
+\section{Exercises}
+\begin{exercise}
+ Description of the exercise. Run the following command
+\begin{verbatim}
+print("Hello world")
+Verbatim &^%$&\content
+\end{verbatim}
+\begin{hint}
+ Run the example from the command line with the python command.
+\end{hint}
+\begin{hint}
+ The solution is 42.
+\end{hint}
+\end{exercise}
+
+\begin{exercise}
+ Another exercise
+\begin{hint}
+ The first ten million years were the worst. Some \verb+&$+.
+\end{hint}
+\end{exercise}
+
+
+\section{Hints}
+\printhints
+
+\end{document}
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texwelt-15093.pdf b/macros/latex/contrib/xsim/examples/xsim.texwelt-15093.pdf
index 3dc9fb1649..b58d959599 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texwelt-15093.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.texwelt-15093.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texwelt-15093.tex b/macros/latex/contrib/xsim/examples/xsim.texwelt-15093.tex
index 1f3fcfefcb..d003cc03af 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texwelt-15093.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.texwelt-15093.tex
@@ -1,6 +1,5 @@
% http://texwelt.de/wissen/fragen/15093/
\documentclass[paper=a4]{scrartcl}
-\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{xsim,needspace}
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texwelt-23968.pdf b/macros/latex/contrib/xsim/examples/xsim.texwelt-23968.pdf
index e9816a9793..ac8b2c3d39 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texwelt-23968.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.texwelt-23968.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texwelt-23968.tex b/macros/latex/contrib/xsim/examples/xsim.texwelt-23968.tex
index bf205bb7fb..5203bdee8a 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texwelt-23968.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.texwelt-23968.tex
@@ -18,13 +18,8 @@
\newcommand\printshortsolutions{%
\begin{description}
\ForEachUsedExerciseByType{%
- \def\ExerciseType{##1}%
- \def\ExerciseID{##2}%
\GetExercisePropertyT{shortsolution}
- {%
- \item[Short Solution ##3]
- ####1%
- }%
+ {\item[Short Solution ##3]####1}%
}%
\end{description}
}
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texwelt-6698.pdf b/macros/latex/contrib/xsim/examples/xsim.texwelt-6698.pdf
index 000663bf44..f8b9609328 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texwelt-6698.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.texwelt-6698.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.texwelt-6698.tex b/macros/latex/contrib/xsim/examples/xsim.texwelt-6698.tex
index 9e388b9f69..51523e8bcd 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.texwelt-6698.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.texwelt-6698.tex
@@ -1,6 +1,5 @@
% http://texwelt.de/wissen/fragen/6698/
\documentclass{article}
-\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{needspace}
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.various.pdf b/macros/latex/contrib/xsim/examples/xsim.various.pdf
index d0406e830c..aba5075c38 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.various.pdf
+++ b/macros/latex/contrib/xsim/examples/xsim.various.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/examples/xsim.various.tex b/macros/latex/contrib/xsim/examples/xsim.various.tex
index 1b7b13f98b..5543010324 100644
--- a/macros/latex/contrib/xsim/doc/examples/xsim.various.tex
+++ b/macros/latex/contrib/xsim/examples/xsim.various.tex
@@ -1,5 +1,6 @@
\documentclass{article}
-\usepackage{xsim,lipsum,tcolorbox}
+\usepackage[use-files]{xsim}
+\usepackage{lipsum,tcolorbox}
\DeclareExerciseType{question}{
exercise-env = question ,
diff --git a/macros/latex/contrib/xsim/doc/xsim-manual.cls b/macros/latex/contrib/xsim/xsim-manual.cls
index c1d198ab04..ed32a87fb3 100644
--- a/macros/latex/contrib/xsim/doc/xsim-manual.cls
+++ b/macros/latex/contrib/xsim/xsim-manual.cls
@@ -8,15 +8,15 @@
% Web: https://github.com/cgnieder/xsim
% E-Mail: contact@mychemistry.eu
% ----------------------------------------------------------------------------
-% Copyright 2017--2020 Clemens Niederberger
+% Copyright 2017--2021 Clemens Niederberger
%
% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
+% conditions of the LaTeX Project Public License, either version 1.3c
% of this license or (at your option) any later version.
% The latest version of this license is in
% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008/05/04 or later.
%
% This work has the LPPL maintenance status `maintained'.
%
@@ -29,19 +29,18 @@
% please ignore the contents of this file -- it is not a good example for
% coding...
%
-\ProvidesClass{xsim-manual}[2020/04/04]
+\ProvidesClass{xsim-manual}[2021/01/31]
\LoadClass[load-preamble,add-index]{cnltx-doc}
\RequirePackage{imakeidx}
-\RequirePackage[utf8]{inputenc}
-\RequirePackage{xsim,xsimverb}
+\RequirePackage[use-files]{xsim}
\RequirePackage{geometry}
\geometry{
- left = 3.5cm ,
- right = 3cm ,
- marginparwidth = 3cm ,
- marginparsep = 2mm
+ left = 4cm ,
+ right = 2.5cm ,
+ marginparwidth = 3.3cm ,
+ marginparsep = 5mm
}
\setcnltx{
@@ -56,6 +55,7 @@
quote-format = \small\biolinumLF ,
add-cmds = {
blank ,
+ activatecollection ,
addbonus ,
addpoints ,
AddtoExerciseGoal ,
@@ -66,6 +66,7 @@
collectexercises ,
collectexercisestype ,
collectexercisesstop ,
+ deactivatecollection ,
DeclareExerciseCollection ,
DeclareExerciseEnvironmentTemplate ,
DeclareExerciseGoal ,
@@ -204,11 +205,14 @@
@percentchar ,
bottomrule ,
breite ,
+ captionsetup ,
choice ,
+ correct ,
cs ,
DeclareFloatingEnvironment ,
enddescription ,
endtcolorbox ,
+ ex ,
hint ,
hoehe ,
iflist ,
@@ -221,9 +225,11 @@
Needspace ,
NewDocumentCommand ,
NewDocumentEnvironment ,
+ NewTasksEnvironment ,
newlist ,
numberofcolumns ,
numberofproblems ,
+ option ,
pkg ,
pointsandbonus ,
printA, printC, printE ,
@@ -236,6 +242,7 @@
tcolorbox ,
thechapter ,
thesection ,
+ thetask ,
toprule ,
whileboolexpr ,
xsim
@@ -691,14 +698,13 @@
\RequirePackage{varioref}
\RequirePackage{bookmark}
+\DeclareExerciseCollection{foo}
+\DeclareExerciseCollection{layouts}
\xsimsetup{
% clear-aux ,
path = exercises
}
-\DeclareExerciseCollection{foo}
-\DeclareExerciseCollection{layouts}
-
\newrobustcmd*\TF{%
\colorlet{outside}{.}%
\textcolor{red}{\underline{\textcolor{outside}{TF}}}%
@@ -934,7 +940,10 @@
\xsim@add@example{texsx-370642}{Minimalistic layout}
\xsim@add@example{texsx-391530}{Exercises and sub-exercises}
\xsim@add@example{texsx-395273}{Different aspects of exercises, highlighted solutions}
+\xsim@add@example{texsx-466584}{Flushright Solutions}
\xsim@add@example{texsx-498299}{Multiple choice questions with automated solutions}
+\xsim@add@example{texsx-576998}{Exercises at the end of section and sectionwise solutions}
+\xsim@add@example{texsx-580636}{Multiple hints per exercise with backlinks}
\xsim@add@example{texwelt-6698}{Custom list of exercises}
\xsim@add@example{texwelt-15093}{Indicate difficulty level}
\xsim@add@example{texwelt-23968}{Long and short solutions}
@@ -985,12 +994,13 @@
\xsim@add@version{0.19} {2020-03-16}
\xsim@add@version{0.19a} {2020-03-19}
\xsim@add@version{0.19b} {2020-04-04}
+\xsim@add@version{0.20} {2021-01-31}
% ----------------------------------------------------------------------------
\newrobustcmd*\xsimauxfileinfo{%
\xsim\ writes a lot of stuff to an auxiliary file called
- \cs*{jobname}\code{.xsim} (or the common \cs*{jobname}\code{.aux} if you use
- option \option{use-aux}) for re-using information on subsequent
+ \meta{file name}\code{.xsim} (or the common \meta{file name}\code{.aux} if
+ you use option \option{use-aux}) for re-using information on subsequent
compilations. If you add exercises, change properties \etc\ it might happen
that wrong information is staying in the auxiliary file and is wrongly used
by \xsim. In such cases deleting the auxiliary file and doing a few fresh
diff --git a/macros/latex/contrib/xsim/doc/xsim_manual.pdf b/macros/latex/contrib/xsim/xsim-manual.pdf
index dad403c26a..93245d124d 100644
--- a/macros/latex/contrib/xsim/doc/xsim_manual.pdf
+++ b/macros/latex/contrib/xsim/xsim-manual.pdf
Binary files differ
diff --git a/macros/latex/contrib/xsim/doc/xsim_manual.tex b/macros/latex/contrib/xsim/xsim-manual.tex
index 7b1df9ed5d..329f602acf 100644
--- a/macros/latex/contrib/xsim/doc/xsim_manual.tex
+++ b/macros/latex/contrib/xsim/xsim-manual.tex
@@ -2,7 +2,7 @@
% !arara: biber
% arara: pdflatex: { interaction: nonstopmode }
% arara: pdflatex: { interaction: nonstopmode }
-% arara: pdflatex: { interaction: nonstopmode }
+% !arara: pdflatex: { interaction: nonstopmode }
% ----------------------------------------------------------------------------
% the XSIM package
%
@@ -13,15 +13,15 @@
% Web: https://github.com/cgnieder/xsim
% E-Mail: contact@mychemistry.eu
% ----------------------------------------------------------------------------
-% Copyright 2017--2020 Clemens Niederberger
+% Copyright 2017--2021 Clemens Niederberger
%
% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
+% conditions of the LaTeX Project Public License, either version 1.3c
% of this license or (at your option) any later version.
% The latest version of this license is in
% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008/05/04 or later.
%
% This work has the LPPL maintenance status `maintained'.
%
@@ -33,12 +33,6 @@
\documentclass{xsim-manual}
\begin{filecontents*}[overwrite]{\jobname.bib}
-@online{texsx:romannumeral,
- author = {Bruno Le Floch} ,
- title = {Cunning (La)TeX tricks} ,
- urldate = {2017-03-02} ,
- url = {http://tex.stackexchange.com/a/19769/}
-}
@online{texsx:tagged/exsheets,
title = {Questions tagged `exsheets'} ,
author = {various} ,
@@ -54,33 +48,25 @@
\license
\xsim\ loads the packages \pkg{expl3}~\cite{bnd:l3kernel},
-\pkg{xparse}~\cite{bnd:l3packages}, \pkg{etoolbox}~\cite{pkg:etoolbox},
-\pkg{array}~\cite{pkg:array} \pkg{booktabs}~\cite{pkg:booktabs} and
+\pkg{xparse}~\cite{bnd:l3packages}, \pkg{array}~\cite{pkg:array}
+\pkg{booktabs}~\cite{pkg:booktabs} and
\pkg{translations}~\cite{pkg:translations}. All of these packages are present
on a modern and up to date \TeX\ distribution such as \TeX~Live or MiK\TeX\ so
no further action should be needed. When you are using \xsim\ you should be
using an up to date \TeX\ distribution, anyway.
\begin{bewareofthedog}
+ Please be aware that \xsim\ is in an experimental state and actively
+ developed. Many aspects may change from one update to another until a
+ stable version~1 will be reached. However, I will try my best to keep the
+ interface stable.
+
Newer versions of \xsim\ may depend on newer versions of the support
packages. Remember: it is always dangerous to update single packages.
Always update your \TeX\ distribution if you want an up to date version of a
package. Be careful: if you're in the middle of an important project it
might be better to wait with the update until you've finished the project.
Every update might be breaking some things.
-
- Please also be aware that \xsim\ is actively developed and many things may
- still change. However, I will try my best to keep the interface stable.
-\end{bewareofthedog}
-
-I'm currently thinking to make the option \option{no-files} the default
-behavior of \xsim. There is a poll and discussion regarding this question on
-\xsim's github page if you like to give your opinion on this.
-
-\begin{bewareofthedog}
- The whole collection mechanism is likely to change completely in the
- not-so-far future (let's say sometime in the six months from April~2020 or
- so).
\end{bewareofthedog}
\section{Motivation, Background}
@@ -88,7 +74,7 @@ behavior of \xsim. There is a poll and discussion regarding this question on
It has been quite a while since I first published
\pkg{exsheets}~\cite{pkg:exsheets} in June 2012. Since then it has gained a
user base and a little bit of popularity as the number of questions on tex.sx
-shows (143~at the time of writing)~\cite{texsx:tagged/exsheets}. User
+shows (151~at the time of writing)~\cite{texsx:tagged/exsheets}. User
questions, bug reports and feature requests improved it over the time. It
still has a version number starting with a zero, though, which in my
versioning system means I still consider it experimental.
@@ -140,12 +126,13 @@ meaning in this manual.
probability of possibly faulty exercises after changes to the document.}
The \option{final} option automatically disables this option. See also
sections~\vref{sec:how-exerc-envir} and~\vref{sec:resolve-getting}.
- \opt{no-files}
+ \opt{no-files}\Default{true}
\sinceversion{0.13}This option prevents \xsim\ from writing the exercises
and solutions to external files. This will keep your working folder
``clean'' but will also prevent using verbatim material in exercises and
- solutions and will possibly slow processing further down. \emph{This
- option is considered experimental. Feedback is very welcome.}
+ solutions.
+ \opt{use-files}\Default{false}
+ \sinceversion{0.20}This is the opposite of the option \option{no-files}.
\opt{use-aux}
\sinceversion{0.15}With this option enabled \xsim\ will use the regular
auxiliary file \cs*{jobname}\code{.aux} instead of its own auxiliary file
@@ -158,7 +145,7 @@ meaning in this manual.
Those options are load-time options and are used the usual way as package
options:
\begin{sourcecode}
- \usepackage[verbose]{xsim}
+ \usepackage[use-files]{xsim}
\end{sourcecode}
\begin{bewareofthedog}
Although those options technically belong to the \module{package} module
@@ -271,19 +258,31 @@ More details on those two environments can be found in
section~\vref{sec:using-printing}.
\section{How the Exercise Environments Work}\label{sec:how-exerc-envir}
-Both the exercise and the solution environments write the contents of their
-bodies verbatim to external files following a certain naming structure:
+\sinceversion{0.13}Depending on the options
+\option{no-files}/\option{use-files} the bodies of exercises and solutions is
+either just another property (see section~\vref{sec:exercise-properties}) --
+this is the default behavior -- or is written to an external file.
+
+If the option \keyis{no-files}{true} is set the exercise and solution bodies
+are saved as properties \property{exercise-body} and
+\property{solution-body}. This is the default behavior of \xsim\ since
+version~0.20 and should work fine in most cases. One obvious downsise is that
+verbatim material cannot be used in exercises and solutions.
+
+If the option \keyis{use-files}{true} is set both the exercise and the
+solution environments write the contents of their bodies verbatim to external
+files following a certain naming structure:
\begin{itemize}
\item
- \code{\meta{jobname}-\meta{type}-\meta{id}-exercise|solution-body.tex}
+ \code{\meta{jobname}-\meta{type}-\meta{id}-exercise|solution-body.tex}
\end{itemize}
The name starts with the name of the job (which is the name of the document
itself) followed by type and id of the corresponding exercise and then
followed by the environment type. For example both environments from the first
example have been written to files named
\begin{itemize}
- \item \verbcode+xsim_manual-exercise-1-exercise-body.tex+ and
- \item \verbcode+xsim_manual-exercise-1-solution-body.tex+, respectively.
+ \item \verbcode+xsim-manual-exercise-1-exercise-body.tex+ and
+ \item \verbcode+xsim-manual-exercise-1-solution-body.tex+, respectively.
\end{itemize}
These external files are input when the respective exercise or solution is
printed. An advantage of using external files is that \emph{verbatim material
@@ -298,7 +297,7 @@ it was generated\footnote{In this example the sourcecode line number is
external file where the \env{exercise} environment indeed \emph{was} on
line~1.}:
-\inputsourcecode{exercises/xsim_manual-exercise-1-exercise-body.tex}
+\inputsourcecode{exercises/xsim-manual-exercise-1-exercise-body.tex}
Arguably one downside of the approach using external files for each exercise
and its solution is that your project folder will be cluttered with files. In
@@ -326,19 +325,6 @@ order to deal with this somehow \xsim\ offers the following option:
\end{exercise}
\end{sourcecode}
-If\sinceversion{0.13} you don't like all the external files and the problems
-which come with them \emph{and} if you don't need any verbatim or similar
-material inside the exercises and solutions then you can use the following
-package option:
-\begin{options}
- \opt{no-files}
- This package option prevents \xsim\ from writing the exercises and
- solutions to external files. This will keep your working folder ``clean''
- but will also prevent using verbatim material in exercises and solutions
- and will possibly slow processing further down. \emph{This option is
- considered experimental. Feedback is very welcome.}
-\end{options}
-
\begin{bewareofthedog}
\xsimauxfileinfo
\end{bewareofthedog}
@@ -436,6 +422,12 @@ must) be set. Here is the complete list:
types of exercises sharing a common counter. \emph{This parameter can't
be changed afterwards.} If the explicit or implicit counter does not
exist, yet, it will be defined.
+ \paraval{within}{counter name}
+ \sinceversion{0.20}Adds \parameter{counter} to the reset list of
+ \meta{counter name} by applying \cs*{counterwithin}.
+ \paraval{the-counter}{code}
+ \sinceversion{0.20}Redefines the corresponding representation command
+ \cs*{the...} of \parameter{counter} to \meta{code}.
\paraval{solution-counter}{counter name}
The counter used for the solutions of type \meta{type}. If not explicitly
set the counter with the same name as \parameter{solution-env} is used.
@@ -809,25 +801,32 @@ an exercise:\label{property:print!}
\subsection{What the Environments do}
When an exercise is started with \environ{exercise} (or other environments
-defined through \cs{DeclareExerciseType}) then different things happen
-depending on different settings:
-\begin{itemize}
- \item If the \emph{insert mode} is active nothing happens, see
- section~\vref{sec:collecting-exercises} for details on this.
- \item Else the id integer is incremented.
- \item If the exercise is \emph{used} the corresponding counter is stepped
- and the exercise is added to the \enquote{use list}. The properties
- \property{counter} and \property{use} are updated accordingly.
- \item If an exercise is \emph{printed} then it is also \emph{used}. An
- exercise that isn't used cannot be printed. Being printed means two
- things: being added to the \enquote{print list} and being typeset at the
- position where the exercise is placed in the source file. If an exercise
- is \emph{not printed but used} it means that the counter will be stepped.
- This can be useful for creating an exercise sheet only containing the
- solutions for some exercises.
- \item If an exercise is printed certain hooks and template code is inserted
- around the environment body.
-\end{itemize}
+defined through \cs{DeclareExerciseType}) then three things happen depending
+on the setup:
+\begin{enumerate}
+ \item where the environment is placed in the document the \textbf{base
+ setup} happens: this sets the \property{id} of the exercise and sets the
+ properties chosen in the optional argument.
+ \item in the default setting also the \textbf{usage setup} happens: this
+ increments the counter and sets the counter related properties like
+ \property{counter}. Also the properties related to section numbers and the
+ \property{page} are set.
+ \item in the default setting also the \textbf{print setup} happens: this
+ mostly does nothing. It initiates recording goals that are set inside of
+ the exercise body.
+\end{enumerate}
+
+Depending on wether the option \module{exercise}\code{/}\option{use} has been
+set to \code{false} or wether the property \property{use} has been set to
+\code{false} the \emph{usage setup} can be delayed. The usage the happens
+when the exercise is \emph{inserted} the first time elsewhere in the document,
+for example as part of a collection, see
+section~\vref{sec:collecting-exercises}.
+
+Depending on wether the option \module{exercise}\code{/}\option{print} has
+been set to \code{false} or if the property \property{print} has been set to
+\code{false} the \emph{print setup} can be suppressed. It happens each time
+an exercise is inserted.
\begin{example}
\begin{exercise}[print=false,ID=invisible]
@@ -867,10 +866,14 @@ the environments' names are the module names for the options (here using the
Determines if exercises of type \enquote{exercise} are printed.
\keybool{use}\Module{exercise}\Default{true}
Determines if exercises of type \enquote{exercise} are used.
+ \keybool{collect}\Module{exercise}\Default{false}
+ \sinceversion{0.20}Sets both \option{print} and \option{use} to
+ \code{false} when \keyis{collect}{true} is set and vice versa.
\keyval{within}{counter}\Module{exercise}\Default
- Adds the exercise counter to the reset list of the counter
- \meta{counter}. \emph{Beware that if the counter is a shared counter
- this will affect \emph{all objects} using this counter!}
+ \changedversion{0.20}Adds the exercise counter to the reset list of the
+ counter \meta{counter} using \cs*{counterwithin}. \emph{Beware that if
+ the counter is a shared counter this will affect \emph{all objects}
+ using this counter!}
\keyval{the-counter}{code}\Module{exercise}
An interface for redefining the counter representation command
\cs*{the\meta{counter}}.
@@ -940,55 +943,82 @@ existing exercise, \ie, every exercise whose external file exists.
\section{Collecting Exercises}\label{sec:collecting-exercises}
\begin{bewareofthedog}
- The whole collection mechanism is likely to change completely in the
- not-so-far future (let's say sometime in the six months from April~2020 or
- so).
+ The whole collection mechanism has been changed completely with
+ version~0.20. Please check this section carefully and update and adapt your
+ collections.
\end{bewareofthedog}
\subsection{Background}
-\xsim\ knows the concept of \enquote{exercise collections}. A collection of
-exercises can be useful when you want to print a certain group of exercises
-several times. Each collection must have a unique name with which you can
-refer to the corresponding collection. A collection is realized by declaring
-the collection and by surrounding the exercises belonging to the collection
-with a certain pair of commands (this is explained in the next section).
-
-Let's say you have several files of math exercises where one only contains
-geometry exercises and another only calculus exercises and so on. Surrounding
-the \cs*{input} of each file with said pair of commands for a certain
-collection all exercises of the corresponding file now are a collection which
-then can be printed at once whereever you want the collection of exercises to
-be printed. By choosing certain tags (see section~\vref{sec:tags}) inside
-each collection you could even cherry-pick exercises from the external file.
+\xsim\ knows the concept of \emph{exercise collections}. A collection of
+exercises can be used in two cases, basically:
+\begin{enumerate}
+ \item When you want to print a certain group of exercises several times. In
+ this case you add the exercise to a collection while also using it in the
+ running text. Somewhere later (or earlier actually) in the document you
+ can the reprint the collection\footnote{There is another way to do that,
+ but\dots}.
+ \item If you only want to print exercises which have certain tags. Maybe
+ you have some kind of exercise library in an external which you include
+ into you document and want to print only those exercises which fit
+ certain conditions.
+\end{enumerate}
+Each collection must have a unique name with which you can refer to the
+corresponding collection. A collection is realized by declaring the
+collection in the preamble and by activating the collection.
\subsection{Usage}
+\subsubsection{Declaring collections}
\emph{A collection must be declared in the preamble.} Using a pair of
commands explained below exercises between those commands are added to the
corresponding collection but not printed. After a collection is completed the
collection can be printed as often as needed.
\begin{commands}
- \command{DeclareExerciseCollection}[\marg{collection name}]
+ \command{DeclareExerciseCollection}[\oarg{tag values}\marg{collection name}]
Define a new collection \meta{collection name} in the document preamble.
- \command{collectexercisestype}[\marg{collection name}\marg{exercise type}]
- Opens the collection \meta{collection name} which now collects all
- exercises of type \meta{exercise type} until the collection is closed with
- \cs{collectexercisesstop}. Collections of other types are not
- collected\footnote{This command starts a group with
- \cs*{begingroup}!}.
+ An example could look like this:
+ \cs{DeclareExerciseCollection}\Oarg{topics=algebra,level=1}\Marg{easy-algebra}.
+ Choosing tags automatically activates the collection which means that all
+ exercises which fit the tags are automatically added to the new
+ collection.
+\end{commands}
+
+\subsubsection{Activating collections}
+If a collection is not activated per default in can be activated (or
+deactivated in the opposite case) with these commands:
+\begin{commands}
+ \command{activatecollection}[\marg{collection name}]
+ \sinceversion{0.20}Activates the collection \meta{collection name} which
+ now collects all exercises until the collection is
+ deactivated. \meta{collection name} can be a csv list of collection
+ names.
+ \command{deactivatecollection}[\marg{collection name}]
+ \sinceversion{0.20}Deactivates the collection \meta{collection name}.
+ \meta{collection name} can be a csv list of collection names.
+\end{commands}
+These commands do not influence exercises in other ways other than adding them
+to collections.
+\begin{commands}
\command{collectexercises}[\marg{collection name}]
- Opens the collection \meta{collection name} which now collects all
- exercises until the collection is closed with
- \cs{collectexercisesstop}\footnote{This command starts a group with
- \cs*{begingroup}!}.
+ Activates the collection \meta{collection name} which now collects all
+ exercises until the collection is deactivated, starts a group with
+ \cs*{begingroup} and sets the option \option{collect}, see below.
\command{collectexercisesstop}[\marg{collection name}]
- Closes the collection \meta{collection name}\footnote{This command ends
- a group with \cs*{endgroup}!}.
+ Deactivates the collection \meta{collection name} and ends a group with
+ \cs*{endgroup}.
+\end{commands}
+\begin{options}
+ \keybool{collect}\Default{false}
+ A shortcut option which sets the options
+ \module{\meta{type}}\code{/}\module{collect} for each exercise type.
+\end{options}
+
+\subsubsection{Printing collections}
+\begin{commands}
\command{printcollection}[\oarg{options}\marg{collection name}]
Prints the collection \meta{collection name}, \ie, all exercises collected
earlier. This command cannot be used before the corresponding collection
has been closed correctly.
\end{commands}
-
Valid options are the following:
\begin{options}
\keybool{headings}\Module{print-collection}\Default{false}
@@ -1042,11 +1072,11 @@ You can open several collections at the same time:
\begin{sourcecode}
\collectexercises{foo}
...
- \collectexercisestype{bar}{exercises}
+ \activatecollection{bar}
...
- \collectexercisesstop{bar}
+ \deactivatecollection{foo}
...
- \collectexercisesstop{foo}
+ \collectexercisesstop{bar}
\end{sourcecode}
Exercises will be added to each open collection.
@@ -1589,9 +1619,7 @@ yourself in order to achieve certain layouts\footnote{I plan to incorporate
Returns \meta{true} if both a macro \cs*{chapter} and a counter
\code{chapter} are defined and \meta{false} otherwise.
\command{XSIMmixedcase}[\marg{code}]
- Converts the full expansion\footnote{This is a \cs*{romannumeral}
- expansion~\cite{texsx:romannumeral}.\label{fn:romannumeral}} of
- \meta{code} to mixed case: \\
+ Converts the full expansion of \meta{code} to mixed case: \\
\verbcode+\XSIMmixedcase{this is some text}+ \XSIMmixedcase{this is some
text} \\
\emph{This command expands \meta{code} before converting it}.
@@ -1601,16 +1629,16 @@ yourself in order to achieve certain layouts\footnote{I plan to incorporate
macro \cs*{g@addto@macro}.
\expandable\command{XSIMifeq\TF}[\marg{code 1}\marg{code
2}\marg{true}\marg{false}]
- Checks if the full expansion\footref{fn:romannumeral} of \meta{code 1} and
- \meta{code 2} is the same tokenlist.
+ Checks if the full expansion of \meta{code 1} and \meta{code 2} is the
+ same tokenlist.
\expandable\command{XSIMifblank\TF}[\marg{code}\marg{true}\marg{false}]
- Checks if the full expansion\footref{fn:romannumeral} of \meta{code} is
- blank (\ie, if it is empty or only consists of spaces).
+ Checks if the full expansion of \meta{code} is blank (\ie, if it is empty
+ or only consists of spaces).
\command{XSIMatbegindocument}[\marg{code}]
- \sinceversion{0.15a}Adds \meta{code} to \xsim's begin document hook.
+ \sinceversion{0.16}Adds \meta{code} to \xsim's begin document hook.
Should be used inside style files instead of \cs*{AtBeginDocument}.
\command{XSIMatenddocument}[\marg{code}]
- \sinceversion{0.15a}Adds \meta{code} to \xsim's end document hook.
+ \sinceversion{0.16}Adds \meta{code} to \xsim's end document hook.
Should be used inside style files instead of \cs*{AtEndDocument}.
\end{commands}
@@ -1918,8 +1946,7 @@ vertical layout.
\DeclareExerciseTableTemplate{default}{%
\XSIMputright\ExerciseTableCode{%
\toprule
- \XSIMifblankTF{\ExerciseType}
- {}
+ \XSIMifblankF{\ExerciseType}
{\XSIMmixedcase{\GetExerciseParameter{exercise-name}}}
&
\XSIMmixedcase{\XSIMtranslate{points}} &
@@ -1927,19 +1954,17 @@ vertical layout.
\midrule
}%
\ForEachUsedExerciseByType{%
- \XSIMifeqTF{#1}{\ExerciseTableType{#1}}
+ \XSIMifeqT{#1}{\ExerciseTableType{#1}}
{%
- \XSIMifblankTF{\ExerciseType}
+ \XSIMifblankT{\ExerciseTableType{}}
{%
\XSIMputright\ExerciseTableCode{%
\XSIMmixedcase{\ExerciseParameterGet{#1}{exercise-name} }%
}%
- }
- {}%
+ }%
\XSIMputright\ExerciseTableCode
{#3 & \XSIMifblankTF{#5}{\printgoal{0}}{\printgoal{#5}} & \\ }%
- }
- {}%
+ }%
}
\XSIMputright\ExerciseTableCode{%
\midrule
@@ -1979,24 +2004,21 @@ layout.
\DeclareExerciseTableTemplate{default*}{%
\XSIMputright\ExerciseTableCode{%
\toprule
- \XSIMifblankTF{\ExerciseType}
- {}
+ \XSIMifblankF{\ExerciseType}
{\XSIMmixedcase{\GetExerciseParameter{exercise-name}}}
&%
}%
\ForEachUsedExerciseByType{%
- \XSIMifeqTF {#1} { \ExerciseTableType {#1} }
+ \XSIMifeqT{#1}{\ExerciseTableType{#1}}
{
- \XSIMifblankTF{\ExerciseType}
+ \XSIMifblankT{\ExerciseTableType{}}
{%
\XSIMputright\ExerciseTableCode{%
\XSIMmixedcase{\ExerciseParameterGet{#1}{exercise-name} }%
}%
- }
- {}%
+ }%
\XSIMputright\ExerciseTableCode{#3 &}
- }
- {}%
+ }%
}%
\XSIMputright\ExerciseTableCode{%
\XSIMtranslate{total} \\
@@ -2004,12 +2026,11 @@ layout.
\XSIMmixedcase{\XSIMtranslate{points}} &
}%
\ForEachUsedExerciseByType{%
- \XSIMifeqTF{#1}{\ExerciseTableType{#1}}
+ \XSIMifeqT{#1}{\ExerciseTableType{#1}}
{%
\XSIMputright\ExerciseTableCode{%
\XSIMifblankTF{#5}{\printgoal{0}}{\printgoal{#5}} &}%
- }
- {}%
+ }%
}%
\XSIMputright\ExerciseTableCode{%
\XSIMifblankTF{\ExerciseType}
@@ -2019,12 +2040,11 @@ layout.
\XSIMtranslate{reached} &%
}%
\ForEachUsedExerciseByType{%
- \XSIMifeqTF{#1}{\ExerciseTableType{#1}}
- {\XSIMputright\ExerciseTableCode{&}}
- {}%
+ \XSIMifeqT{#1}{\ExerciseTableType{#1}}
+ {\XSIMputright\ExerciseTableCode{&}}%
}%
\XSIMputright\ExerciseTableCode{ \\ \bottomrule }%
- \def\numberofcolumns{%
+ \edef\numberofcolumns{%
\XSIMifblankTF{\ExerciseType}
{\numberofusedexercises}
{\csname numberof \ExerciseType s\endcsname}%
@@ -2192,14 +2212,11 @@ especially regarding other layouts are also shown in example files added to
this package.
\subsection{\dots Know if \xsim\ Needs Another Compilation?}
-If \xsim\ wants you to recompile your document it writes the following to the
-logfile:
+If \xsim\ wants you to recompile your document it issues a warning and writes
+the following to the logfile:
\begin{sourcecode}
- *************************************************
- * xsim warning: "rerun"
- *
- * Exercise properties may have changed. Rerun to get them synchronized.
- *************************************************
+ Package xsim Warning: Exercise properties may have changed. Rerun to get them
+ (xsim) synchronized.
\end{sourcecode}
So just check the logfile regularly (which you should be doing anyway) and
keep your eyes open.
@@ -2216,14 +2233,15 @@ compilations may resolve your problems.
\subsection{\code{! TeX capacity exceeded, sorry [text input levels=15].}
Why?}
Did you try to use an exercise or solution in a macro of some sort? This
-generally will fail\footnote{The reasons are similar to the ones given here:
+generally will fail if you also use the option \option{use-files}\footnote{The
+ reasons are similar to the ones given here:
\url{https://tex.stackexchange.com/a/295422/}.}. But there should never be
the need to hide the environments inside of a macro, anyway.
\subsection{\code{Runaway argument? !File ended while scanning use of \^{}\^{}M.} Why?}
Did you try to use an exercise or solution in a macro of some sort? This
-generally will fail. But there should never be the need to hide the
-environments inside of a macro, anyway.
+generally will fail if you also use the option \option{use-files}. But there
+should never be the need to hide the environments inside of a macro, anyway.
\subsection{\dots Put a Star (or Another Symbol) in Headings of Exercises That
Are Special?}
diff --git a/macros/latex/contrib/xsim/xsim.sty b/macros/latex/contrib/xsim/xsim.sty
new file mode 100644
index 0000000000..94866005c4
--- /dev/null
+++ b/macros/latex/contrib/xsim/xsim.sty
@@ -0,0 +1,5629 @@
+% ----------------------------------------------------------------------------
+% the XSIM package
+%
+% eXercise Sheets IMproved
+%
+% ----------------------------------------------------------------------------
+% Clemens Niederberger
+% Web: https://github.com/cgnieder/xsim
+% E-Mail: contact@mychemistry.eu
+% ----------------------------------------------------------------------------
+% Copyright 2017--2021 Clemens Niederberger
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008/05/04 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Clemens Niederberger.
+% ----------------------------------------------------------------------------
+% If you have any ideas, questions, suggestions or bugs to report, please
+% feel free to contact me.
+% ----------------------------------------------------------------------------
+\RequirePackage {l3keys2e,xsimverb}
+
+\ExplSyntaxOn
+
+\tl_const:Nn \c_xsim_date_tl {2021/01/31}
+\tl_const:Nn \c_xsim_version_major_number_tl {0}
+\tl_const:Nn \c_xsim_version_minor_number_tl {20}
+\tl_const:Nn \c_xsim_version_subrelease_tl {}
+\tl_const:Nx \c_xsim_version_number_tl
+ {
+ \c_xsim_version_major_number_tl .
+ \c_xsim_version_minor_number_tl
+ }
+\tl_const:Nx \c_xsim_version_tl
+ {
+ \c_xsim_version_number_tl
+ \c_xsim_version_subrelease_tl
+ }
+\tl_const:Nn \c_xsim_info_tl {eXercise ~ Sheets ~ IMproved}
+
+\ProvidesExplPackage
+ {xsim}
+ {\c_xsim_date_tl}
+ {\c_xsim_version_tl}
+ {\c_xsim_info_tl}
+
+% --------------------------------------------------------------------------
+% options, information
+
+\cs_new_protected:Npn \xsim_bool_provide:N #1
+ { \bool_if_exist:NF #1 { \bool_new:N #1 } }
+
+\xsim_bool_provide:N \g__xsim_final_bool
+\xsim_bool_provide:N \g__xsim_verbose_bool
+\xsim_bool_provide:N \g_xsim_clear_aux_bool
+\xsim_bool_provide:N \g__xsim_write_to_file_bool
+\xsim_bool_provide:N \g_xsim_use_aux_bool
+\xsim_bool_provide:N \g__xsim_rerun_bool
+\xsim_bool_provide:N \g__xsim_debug_bool
+\xsim_bool_provide:N \g__xsim_blank_bool
+
+\keys_define:nn {xsim/package}
+ {
+ final .bool_gset:N = \g__xsim_final_bool ,
+ verbose .bool_gset:N = \g__xsim_verbose_bool ,
+ debug .bool_gset:N = \g__xsim_debug_bool ,
+ clear-aux .bool_gset:N = \g_xsim_clear_aux_bool ,
+ use-files .bool_gset:N = \g__xsim_write_to_file_bool ,
+ use-files .initial:n = false ,
+ no-files .choice: ,
+ no-files / true .meta:n = { use-files = false } ,
+ no-files / false .meta:n = { use-files = true } ,
+ no-files .default:n = true ,
+ use-aux .bool_gset:N = \g_xsim_use_aux_bool ,
+ use-aux .initial:n = false ,
+ blank .bool_gset:N = \g__xsim_blank_bool ,
+ blank .initial:n = false
+ }
+
+\ProcessKeysPackageOptions {xsim/package}
+
+\keys_define:nn {xsim/package}
+ {
+ final .code:n = \msg_error:nnn {xsim} {load-time-option} {final} ,
+ verbose .code:n = \msg_error:nnn {xsim} {load-time-option} {verbose} ,
+ debug .code:n = \msg_error:nnn {xsim} {load-time-option} {debug} ,
+ clear-aux .code:n = \msg_error:nnn {xsim} {load-time-option} {clear-aux} ,
+ use-files .code:n = \msg_error:nnn {xsim} {load-time-option} {use-files} ,
+ no-files .code:n = \msg_error:nnn {xsim} {load-time-option} {no-files} ,
+ use-aux .code:n = \msg_error:nnn {xsim} {load-time-option} {use-aux} ,
+ blank .code:n = \msg_error:nnn {xsim} {load-time-option} {blank}
+ }
+
+% --------------------------------------------------------------------------
+
+% messages:
+\msg_new:nnn {xsim} {load-time-option}
+ {
+ `#1'~ is~ a~ load-time~ option! \\
+ You~ cannot~ set~ it~ with~ \token_to_str:N \xsimsetup ! \\
+ You~ need~ to~ use~ \token_to_str:N \usepackage [#1] {xsim} .
+ }
+
+\msg_new:nnn {xsim} {rerun}
+ {
+ Exercise~ properties~ may~ have~ changed.~ Rerun~ to~ get~ them~
+ synchronized.
+ }
+
+\msg_new:nnn {xsim} {verbose} { #1 ~( \msg_line_context: ) }
+
+% --------------------------------------------------------------------------
+
+\cs_new_protected:Npn \xsim_do_rerun:
+ { \xsim_if_rerun:T { \msg_warning:nn {xsim} {rerun} } }
+
+% --------------------------------------------------------------------------
+% MODULE mechanism
+\msg_new:nnn {xsim} {module-missing}
+ {
+ You've~ requested~ the~ xsim~ module~ `#1'~ but~ it~ appears~ to~
+ be~ missing~ on~ your~ system.~ Maybe~ you've~ misspelled~ the~ name?~
+ Loading~ the~ module~ will~ abort~ \msg_line_context:
+ }
+
+\msg_new:nnn {xsim} {loading-module}
+ { Loading~ module~ `#1'~ ... }
+
+\msg_new:nnn {xsim} {wrong-module-name}
+ { The~ module~ file~ name~ is~ `#2'~ but~ it~ provides~ module~ `#1'. }
+
+\msg_new:nnn {xsim} {forbidden-module}
+ {
+ You've~ requested~ the~ xsim~ module~ `modules'~ \msg_line_context: .~
+ This~ module~ is~ a~ pseudo~ module~ which~ may~ not~ be~ loaded~ through~
+ the~ module~ loading~ mechansim.
+ }
+
+% ----------------------------------------------------------------------------
+
+\cs_generate_variant:Nn \str_if_eq:nnF {xx}
+
+\tl_const:Nn \c__xsim_module_extension_tl {code.tex}
+\tl_const:Nn \c__xsim_module_prefix_tl {xsim}
+
+\cs_new_protected:Npn \xsim_load_module:n #1
+ {
+ \tl_set:Nx \l_tmpa_tl { \tl_trim_spaces:n {#1} }
+ \str_if_eq:VnTF \l_tmpa_tl {modules}
+ { \msg_error:nn {xsim} {forbidden-module} }
+ { \__xsim_load_module:V \l_tmpa_tl }
+ }
+
+\cs_new_protected:Npn \__xsim_load_module:n #1
+ {
+ \xsim_if_module_loaded:nF {#1}
+ {
+ \xsim_if_module_exist:nTF {#1}
+ {
+ \__xsim_module_hook_use:nn {#1} {before}
+ \msg_info:nnn {xsim} {loading-module} {#1}
+ \@onefilewithoptions
+ {\c__xsim_module_prefix_tl.#1}[][]
+ \c__xsim_module_extension_tl
+ \__xsim_module_hook_use:nn {#1} {after}
+ }
+ { \msg_error:nnn {xsim} {module-missing} {#1} }
+ }
+ }
+\cs_generate_variant:Nn \__xsim_load_module:n {V}
+
+\tl_new:N \g__xsim_modules_loaded_tl
+
+\prg_new_conditional:Npnn \xsim_if_module_loaded:n #1 {p,T,F,TF}
+ {
+ \tl_if_in:NnTF \g__xsim_modules_loaded_tl {#1}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+\prg_new_conditional:Npnn \xsim_if_module_exist:n #1 {p,T,F,TF}
+ {
+ \file_if_exist:nTF
+ {\c__xsim_module_prefix_tl.#1.\c__xsim_module_extension_tl}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+% --------------------------------------------------------------------------
+% module hooks:
+% #1: module
+% #2: code
+\cs_new_protected:Npn \xsim_module_after:nn #1#2
+ {
+ \xsim_if_module_loaded:nTF {#1}
+ {#2}
+ { \__xsim_add_to_module_hook:nnn {#1} {after} {#2} }
+ }
+
+% #1: module
+% #2: code
+\cs_new_protected:Npn \xsim_module_before:nn #1#2
+ {
+ % TODO: error in T case?
+ \xsim_if_module_loaded:nF {#1}
+ { \__xsim_add_to_module_hook:nnn {#1} {before} {#2} }
+ }
+
+% #1: module
+% #2: hook name
+% #3: code
+\cs_new_protected:Npn \__xsim_add_to_module_hook:nnn #1#2#3
+ {
+ \xsim_if_module_loaded:nF {#1}
+ {
+ \tl_if_exist:cF {g__xsim_module_hook_#1_#2_tl}
+ { \tl_new:c {g__xsim_module_hook_#1_#2_tl} }
+ \tl_gput_right:cn {g__xsim_module_hook_#1_#2_tl} {#3}
+ }
+ }
+
+% #1: module
+% #2: hook name
+\cs_new_protected:Npn \__xsim_module_hook_use:nn #1#2
+ {
+ \tl_if_exist:cT {g__xsim_module_hook_#1_#2_tl}
+ {
+ \tl_use:c {g__xsim_module_hook_#1_#2_tl}
+ \tl_gclear:c {g__xsim_module_hook_#1_#2_tl}
+ }
+ }
+\cs_generate_variant:Nn \__xsim_module_hook_use:nn {V}
+
+% --------------------------------------------------------------------------
+
+\tl_new:N \l__xsim_module_date_tl
+\tl_new:N \l__xsim_module_version_tl
+
+\tl_if_exist:NF \c_xsim_date_tl
+ { \tl_set:Nx \l__xsim_module_date_tl {\c_xsimverb_date_tl} }
+\tl_if_exist:NF \c_xsim_version_tl
+ { \tl_set:Nx \l__xsim_module_version_tl {\c_xsimverb_version_tl} }
+
+\hook_gput_code:nnn {package/after/xsim} {xsim}
+ {
+ \tl_set:NV \l__xsim_module_date_tl \c_xsim_date_tl
+ \tl_set:NV \l__xsim_module_version_tl \c_xsim_version_tl
+ }
+
+\cs_new_protected:Npn \__xsim_module:nn #1#2
+ {
+ \str_if_eq:xxF
+ {\c__xsim_module_prefix_tl.#1.\c__xsim_module_extension_tl}
+ {\@currname.\@currext}
+ {
+ \msg_error:nnnxx {xsim} {wrong-module-name}
+ {#1}
+ {\@currname.\@currext}
+ }
+ \ProvidesFile
+ {\c__xsim_module_prefix_tl.#1.\c__xsim_module_extension_tl}
+ [
+ \l__xsim_module_date_tl
+ \c_space_tl
+ v \l__xsim_module_version_tl
+ \c_space_tl
+ xsim~ module~ `#1'~ (#2)
+ ]
+ }
+\cs_generate_variant:Nn \msg_error:nnnn {nnnx}
+
+% --------------------------------------------------------------------------
+% define a xsim module:
+% #1: if star: expl3 mode
+% #2: name
+% #3: description
+\NewDocumentCommand \xsimstyle {smO{}}
+ {
+ \__xsim_module:nn {style.#2} {#3}
+ \IfBooleanT {#1} { \ExplSyntaxOn }
+ }
+
+% \cs_new_protected:Npn \xsim_style_options:nn #1#2
+% { \keys_define:nn {xsim/#1} {#2} }
+
+\cs_new_protected:Npn \xsim_load_style:n #1
+ { \clist_map_inline:nn {#1} { \xsim_load_module:n {style.##1} } }
+
+\keys_define:nn {xsim}
+ { load-style .code:n = \xsim_load_style:n {#1} }
+
+\NewDocumentCommand \loadxsimstyle {m}
+ { \xsim_load_style:n {#1} }
+
+% --------------------------------------------------------------------------
+% define internal xsim modules:
+\tl_new:N \g_xsim_module_tl
+\tl_new:N \g__xsim_module_stop_tl
+
+\cs_new_protected:Npn \xsim_stop_module:n #1
+ { \tl_gput_right:Nn \g__xsim_module_stop_tl {{#1}} }
+
+% #1: name
+% #2: description
+\cs_set_protected:Npn \XSIMmodule #1#2
+ {
+ \msg_log:nnnn {xsim} {loading-module} {#1} {#2}
+ \tl_gput_right:Nn \g__xsim_modules_loaded_tl {{#1}}
+ \tl_gset:Nn \g_xsim_module_tl {#1}
+ \__xsim_module_hook_use:nn {#1} {before}
+ \tl_map_inline:Nn \g__xsim_module_stop_tl
+ {
+ \str_if_eq:nnT {##1} {#1}
+ { \tl_map_break:n { \__xsim_gobble_module:w } }
+ }
+ }
+
+\cs_set_protected:Npn \XSIMmoduleend
+ { \__xsim_module_hook_use:Vn \g_xsim_module_tl {after} }
+
+\cs_new_protected:Npn \__xsim_gobble_module:w #1 \XSIMmoduleend {}
+
+% --------------------------------------------------------------------------
+\XSIMmodule{base}{basic functionality of the package}
+
+% \tl_new:N \g_xsim_end_document_hook_tl
+% \tl_new:N \g_xsim_begin_document_hook_tl
+
+% \hook_gput_code:nnn {begindocument} {xsim}
+% { \tl_use:N \g_xsim_begin_document_hook_tl }
+% \hook_gput_code:nnn {enddocument} {xsim}
+% { \tl_use:N \g_xsim_end_document_hook_tl }
+
+% \cs_new_protected:Npn \xsim_at_begin_document:n #1
+% { \tl_gput_right:Nn \g_xsim_begin_document_hook_tl {#1} }
+
+% \cs_new_protected:Npn \xsim_at_end_document:n #1
+% { \tl_gput_right:Nn \g_xsim_end_document_hook_tl {#1} }
+
+\cs_new_protected:Npn \xsim_at_begin_document:n #1
+ { \hook_gput_code:nnn {begindocument} {xsim} {#1} }
+
+\cs_new_protected:Npn \xsim_before_begin_document:n #1
+ { \hook_gput_code:nnn {begindocument/before} {xsim} {#1} }
+
+\cs_new_protected:Npn \xsim_at_end_document:n #1
+ { \hook_gput_code:nnn {enddocument} {xsim} {#1} }
+
+\cs_new_protected:Npn \xsim_before_end_document:n #1
+ { \hook_gput_code:nnn {enddocument/before} {xsim} {#1} }
+
+% ----------------------------------------------------------------------------
+
+% variants of kernel functions:
+\cs_generate_variant:Nn \seq_set_split:Nnn {Nnx,NV}
+\cs_generate_variant:Nn \seq_gset_split:Nnn {c,cVx,cnx}
+\cs_generate_variant:Nn \seq_use:Nn {cV}
+\cs_generate_variant:Nn \seq_count:N {c}
+\cs_generate_variant:Nn \seq_if_empty:NT {c}
+\cs_generate_variant:Nn \seq_if_in:NnT {cV}
+\cs_generate_variant:Nn \seq_gremove_all:Nn {cV}
+\cs_generate_variant:Nn \seq_gput_right:Nn {cV}
+\cs_generate_variant:Nn \seq_set_from_clist:Nn {c,Nx}
+\cs_generate_variant:Nn \prop_put:Nnn {Nnx,cxx}
+\cs_generate_variant:Nn \prop_gput:Nnn {Nx,Nnx,cxx}
+\cs_generate_variant:Nn \prop_item:Nn {c}
+\cs_generate_variant:Nn \prop_if_in:NnTF {Nx}
+\cs_generate_variant:Nn \use:nn {nx}
+\cs_generate_variant:Nn \file_input:n {V,x}
+\cs_generate_variant:Nn \file_if_exist:nT {V,x}
+\cs_generate_variant:Nn \file_if_exist:nTF {V}
+\cs_generate_variant:Nn \msg_error:nnnnn {nnnxx}
+\cs_generate_variant:Nn \msg_warning:nnn {nnV}
+\cs_generate_variant:Nn \keys_define:nn {nx}
+\cs_generate_variant:Nn \keys_set:nn {xn,nx}
+\cs_generate_variant:Nn \text_titlecase:n {e}
+\cs_generate_variant:Nn \tl_if_eq:nnTF {ee,ff,V}
+\cs_generate_variant:Nn \tl_if_eq:nnT {x}
+\cs_generate_variant:Nn \tl_if_blank:nTF {f,e}
+\cs_generate_variant:Nn \tl_set_rescan:Nnn {Nnx}
+\cs_generate_variant:Nn \iow_now:Nn {NV}
+\cs_generate_variant:Nn \str_if_eq:nnT {x}
+\cs_generate_variant:Nn \str_if_eq:nnF {xx}
+\cs_generate_variant:Nn \str_if_eq_p:nn {e}
+\cs_generate_variant:Nn \prg_new_protected_conditional:Npnn {c}
+\cs_generate_variant:Nn \clist_map_inline:nn {V}
+
+% ----------------------------------------------------------------------------
+% temporary variables:
+\tl_new:N \l__xsim_tmpa_tl
+\tl_new:N \l__xsim_tmpb_tl
+\tl_new:N \l__xsim_tmpc_tl
+\tl_new:N \l__xsim_tmpd_tl
+
+\str_new:N \l__xsim_tmpa_str
+\str_new:N \l__xsim_tmpb_str
+\str_new:N \l__xsim_tmpc_str
+
+\bool_new:N \l__xsim_tmpa_bool
+\bool_new:N \l__xsim_tmpb_bool
+\bool_new:N \l__xsim_tmpc_bool
+
+\dim_new:N \l__xsim_tmpa_dim
+\dim_new:N \l__xsim_tmpb_dim
+\dim_new:N \l__xsim_tmpc_dim
+
+\seq_new:N \l__xsim_tmpa_seq
+\seq_new:N \l__xsim_tmpb_seq
+\seq_new:N \l__xsim_tmpc_seq
+
+\int_new:N \l__xsim_tmpa_int
+\int_new:N \l__xsim_tmpb_int
+\int_new:N \l__xsim_tmpc_int
+
+\fp_new:N \l__xsim_tmpa_fp
+\fp_new:N \l__xsim_tmpb_fp
+\fp_new:N \l__xsim_tmpc_fp
+
+\box_new:N \l__xsim_tmpa_box
+\box_new:N \l__xsim_tmpb_box
+\box_new:N \l__xsim_tmpc_box
+
+\clist_new:N \l__xsim_tmpa_clist
+\clist_new:N \l__xsim_tmpb_clist
+\clist_new:N \l__xsim_tmpc_clist
+
+% ----------------------------------------------------------------------------
+
+\prg_new_conditional:Npnn \xsim_if_komascript: {T,F,TF}
+ {
+ \cs_if_exist:cTF {KOMAClassName}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+% ----------------------------------------------------------------------------
+
+\cs_if_exist:NF \xsim_if_final:T
+ {
+ \prg_new_conditional:Npnn \xsim_if_final: {p,T,F,TF}
+ {
+ \bool_if:NTF \g__xsim_final_bool
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+ \prg_new_conditional:Npnn \xsim_if_verbose: {p,T,F,TF}
+ {
+ \bool_if:NTF \g__xsim_verbose_bool
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ }
+
+\prg_new_conditional:Npnn \xsim_if_debug: {p,T,F,TF}
+ {
+ \bool_if:NTF \g__xsim_debug_bool
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+\prg_new_conditional:Npnn \xsim_if_package_blank: {p,T,F,TF}
+ {
+ \bool_if:NTF \g__xsim_blank_bool
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+\prg_new_conditional:Npnn \xsim_if_rerun: {p,T,F,TF}
+ {
+ \bool_if:NTF \g__xsim_rerun_bool
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+\prg_new_conditional:Npnn \xsim_if_write_to_files: {p,T,F,TF}
+ {
+ \bool_if:NTF \g__xsim_write_to_file_bool
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+\prg_new_conditional:Npnn \xsim_if_clear_aux: {p,T,F,TF}
+ {
+ \xsim_if_final:TF
+ { \prg_return_false: }
+ {
+ \bool_if:NTF \g_xsim_clear_aux_bool
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ }
+
+\cs_if_exist:NF \xsim_verbose:n
+ {
+ \cs_new_protected:Npn \xsim_verbose:n #1
+ { \xsim_if_verbose:T { \msg_info:nnn {xsim} {verbose} {#1} } }
+ \cs_generate_variant:Nn \xsim_verbose:n {x}
+ }
+
+\cs_new_protected:Npn \xsim_rerun:
+ { \bool_gset_true:N \g__xsim_rerun_bool }
+
+\prg_new_conditional:Npnn \xsim_if_chapter: {p,T,F,TF}
+ {
+ \bool_lazy_and:nnTF
+ { \cs_if_exist_p:N \chapter }
+ { \cs_if_exist_p:N \c@chapter }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+% ----------------------------------------------------------------------------
+
+\msg_new:nnn {xsim} {attribute-not-set}
+ { The~ attribute~ `#1'~ is~ not~ set~ \msg_line_context: }
+
+% #1: attribute
+% #2: item
+\cs_new_protected:Npn \xsim_attribute_new:nn #1#2
+ { \cs_new:cpn {____xsim_attribute_ \tl_to_str:n {#1::#2} :} {} }
+
+% #1: attribute
+% #2: item
+% #3: value
+\cs_new_protected:Npn \xsim_attribute_set:nnn #1#2#3
+ {
+ \cs_gset:cpx
+ {____xsim_attribute_ \tl_to_str:n {#1::#2} :}
+ { \exp_not:n { \exp_not:n {#3} } }
+ }
+\cs_generate_variant:Nn \xsim_attribute_set:nnn {nnx}
+
+% #1: attribute
+% #2: item
+\cs_new_protected:Npn \xsim_attribute_unset:nn #1#2
+ { \cs_undefine:c {____xsim_attribute_ \tl_to_str:n {#1::#2} :} }
+
+% #1: attribute
+% #2: item
+\cs_new:Npn \xsim_attribute_get:nn #1#2
+ {
+ \cs_if_exist:cTF {____xsim_attribute_ \tl_to_str:n {#1::#2} :}
+ { \use:c {____xsim_attribute_ \tl_to_str:n {#1::#2} :} }
+ {
+ \xsim_if_debug:T
+ { \msg_expandable_error:nnn {xsim} {attribute-not-set} {#1::#2} }
+ }
+ }
+
+% #1: attribute
+% #2: item
+\prg_new_conditional:Npnn \xsim_attribute_if_set:nn #1#2 {p,T,F,TF}
+ {
+ \cs_if_exist:cTF {____xsim_attribute_ \tl_to_str:n {#1::#2} :}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+% #1: attribute
+% #2: item
+\prg_new_conditional:Npnn \__xsim_if_attribute_eq:nnn #1#2#3 {p,T,F,TF}
+ {
+ \tl_if_eq:enTF
+ { \use:c {____xsim_attribute_ \tl_to_str:n {#1::#2} :} }
+ {#3}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+% #1: attribute
+% #2: item
+\cs_new_protected:Npn \xsim_attribute_show:nn #1#2
+ {
+ \iow_term:n {}
+ \iow_term:x
+ {
+ \c_space_tl \c_space_tl
+ \tl_to_str:n {#1::#2}
+ \c_space_tl \c_space_tl == \c_space_tl \c_space_tl
+ {\use:c {____xsim_attribute_ \tl_to_str:n {#1::#2} :}}
+ }
+ \iow_term:n {}
+ }
+
+% ----------------------------------------------------------------------------
+
+\cs_new_protected:Npn \xsim_setup:n #1
+ { \keys_set:nn {xsim} {#1} }
+
+\XSIMmoduleend
+\XSIMmodule{auxfile}{writing stuff to an auxiliary file}
+
+\prg_new_conditional:Npnn \xsim_if_use_aux: {p,T,F,TF}
+ {
+ \bool_if:NTF \g_xsim_use_aux_bool
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+\cs_new_protected:Npn \xsim_write_to_aux:n #1
+ {
+ \legacy_if:nT {@filesw}
+ {
+ \xsim_if_use_aux:TF
+ { \iow_now:Nn \@auxout {#1} }
+ { \iow_now:Nn \l__xsim_aux_file_iow {#1} }
+ }
+ }
+\cs_generate_variant:Nn \xsim_write_to_aux:n {x}
+
+% --------------------------------------------------------------------------
+
+\cs_new_protected:Npn \XSIM #1 { \use:c {XSIMaux#1} }
+
+\cs_new_protected:Npn \xsim_new_aux_property:cpn #1
+ { \cs_new_protected:cpn {XSIMaux#1} }
+
+\cs_new_protected:Npn \xsim_add_property_to_aux:nn #1#2
+ {
+ \xsim_verbose:n { Writing~ command~ \XSIM {#1}~ to~ aux~ file }
+ \xsim_write_to_aux:x { \token_to_str:N \XSIM {#1} #2 }
+ }
+
+\xsim_at_begin_document:n
+ {
+ \iow_now:Nx \@auxout
+ { \token_to_str:N \providecommand \token_to_str:N \XSIM [1] {} }
+ }
+
+% ----------------------------------------------------------------------------
+
+\xsim_if_use_aux:F
+ {
+ \iow_new:N \l__xsim_aux_file_iow
+ \hook_gput_code:nnn {begindocument} {xsim}
+ { \iow_open:Nn \l__xsim_aux_file_iow { \c_sys_jobname_str .xsim } }
+ }
+
+\cs_new_protected:Npn \xsim_close_aux:
+ {
+ \xsim_if_use_aux:F
+ {
+ \iow_close:N \l__xsim_aux_file_iow
+ \legacy_if:nT {@filesw}
+ { \iow_now:Nx \@auxout { \token_to_str:N \XSIM {readaux} } }
+ }
+ }
+
+\xsim_new_aux_property:cpn {readaux}
+ {
+ \file_if_exist:nT { \c_sys_jobname_str .xsim }
+ { \file_input:n { \c_sys_jobname_str .xsim } }
+ }
+
+% ----------------------------------------------------------------------------
+% list for recording values that need to be written to the aux file and
+% updated at begin document
+
+\str_new:N \l__xsim_split_aux_lists_str
+\keys_define:nn {xsim}
+ {
+ split-aux-lists .code:n = \str_set:Nn \l__xsim_split_aux_lists_str {#1} ,
+ split-aux-lists .initial:n = ||
+ }
+
+% define list:
+% #1: name
+\cs_new_protected:Npn \xsim_new_list:n #1
+ {
+ \xsim_verbose:n { Defining~ new~ auxfile~ list~ `#1'. }
+ \seq_new:c {g__xsim_list_#1_seq}
+ \seq_new:c {g__xsim_list_recorded_#1_seq}
+ \xsim_new_aux_property:cpn {#1} ##1
+ {
+ \tl_if_blank:nF {##1}
+ {
+ \seq_gset_split:cVx {g__xsim_list_#1_seq}
+ \l__xsim_split_aux_lists_str
+ { \tl_to_str:n {##1} }
+ \seq_map_inline:cn {g__xsim_list_#1_seq}
+ { \xsim_attribute_set:nnn {#1} {####1} {} }
+ }
+ }
+ \xsim_at_begin_document:n { \xsim_set_list:n {#1} }
+ }
+
+% #1: name
+\cs_new_protected:Npn \xsim_set_list:n #1
+ {
+ \seq_gclear:c {g__xsim_list_recorded_#1_seq}
+ \seq_set_eq:Nc \l__xsim_tmpa_seq {g__xsim_list_#1_seq}
+ \seq_map_inline:Nn \l__xsim_tmpa_seq
+ {
+ \str_set:Nn \l__xsim_tmpa_str {##1}
+ \seq_gput_right:cV {g__xsim_list_recorded_#1_seq} \l__xsim_tmpa_str
+ }
+ \seq_gremove_duplicates:c {g__xsim_list_recorded_#1_seq}
+ }
+
+% add to or remove from list:
+% #1: name
+% #2: entry
+\cs_new_protected:Npn \xsim_add_to_list:nn #1#2
+ {
+ \xsim_verbose:n { Adding~ `#2'~ to~ list~ `#1'. }
+ \str_set:Nn \l__xsim_tmpa_str {#2}
+ \xsim_attribute_set:nnn {#1} {#2} {}
+ \seq_if_in:cVT {g__xsim_list_#1_seq} \l__xsim_tmpa_str
+ { \seq_gremove_all:cV {g__xsim_list_#1_seq} \l__xsim_tmpa_str }
+ \seq_gput_right:cV {g__xsim_list_#1_seq} \l__xsim_tmpa_str
+ }
+\cs_generate_variant:Nn \xsim_add_to_list:nn {nx}
+
+% #1: name
+% #2: entry
+\cs_new_protected:Npn \xsim_remove_from_list:nn #1#2
+ {
+ \xsim_verbose:n { Removing~ `#2'~ to~ list~ `#1'. }
+ \str_set:Nn \l__xsim_tmpa_str {#2}
+ \xsim_attribute_if_set:nnT {#1} {#2}
+ { \xsim_attribute_unset:nn {#1} {#2} }
+ \seq_if_in:cVT {g__xsim_list_#1_seq} \l__xsim_tmpa_str
+ { \seq_gremove_all:cV {g__xsim_list_#1_seq} \l__xsim_tmpa_str }
+ \seq_if_in:cVT {g__xsim_list_recorded#1_seq} \l__xsim_tmpa_str
+ { \seq_gremove_all:cV {g__xsim_list_recorded_#1_seq} \l__xsim_tmpa_str }
+ }
+\cs_generate_variant:Nn \xsim_remove_from_list:nn {nx}
+
+% check if in list:
+% #1: name
+% #2: entry
+\prg_new_conditional:Npnn \xsim_if_in_list:nn #1#2 {p,T,F,TF}
+ {
+ \xsim_attribute_if_set:nnTF {#1} {#2}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\prg_generate_conditional_variant:Nnn \xsim_if_in_list:nn {nx} {T,TF}
+
+\bool_new:N \l__xsim_empty_lists_bool
+\cs_new_protected:Npn \xsim_empty_lists:
+ { \bool_set_true:N \l__xsim_empty_lists_bool }
+
+% update list (should be used inside \xsim_at_end_document:n):
+% #1: name
+\cs_new_protected:Npn \xsim_update_list:n #1
+ {
+ \xsim_verbose:n { Updating~ list~ `#1'. }
+ \seq_gremove_duplicates:c {g__xsim_list_#1_seq}
+ \seq_gremove_duplicates:c {g__xsim_list_recorded_#1_seq}
+ \str_set:Nx \l__xsim_tmpa_str
+ { \seq_use:cn {g__xsim_list_#1_seq} {} }
+ \str_set:Nx \l__xsim_tmpb_str
+ { \seq_use:cn {g__xsim_list_recorded_#1_seq} {} }
+ \str_if_eq:NNF \l__xsim_tmpa_str \l__xsim_tmpb_str
+ { \xsim_rerun: }
+ \bool_if:NF \l__xsim_empty_lists_bool
+ {
+ \xsim_add_property_to_aux:nn {#1}
+ { { \seq_use:cV {g__xsim_list_#1_seq} \l__xsim_split_aux_lists_str } }
+ }
+ }
+
+% loop over list:
+% #1: name
+% #2: code
+\cs_new_protected:Npn \xsim_foreach_list_entry:nn #1#2
+ { \seq_map_inline:cn {g__xsim_list_recorded_#1_seq} {#2} }
+
+\cs_new_protected:Npn \xsim_foreach_new_list_entry:nn #1#2
+ { \seq_map_inline:cn {g__xsim_list_#1_seq} {#2} }
+
+% length of a list:
+% #1: name
+\cs_new:Npn \xsim_list_count:n #1
+ { \seq_count:c {g__xsim_list_recorded_#1_seq} }
+
+% item of a list:
+% #1: name
+% #2: integer
+\cs_new:Npn \xsim_list_item:nn #1#2
+ { \seq_item:cn {g__xsim_list_recorded_#1_seq} {#2} }
+
+\XSIMmoduleend
+\XSIMmodule{properties}{properties of exercises}
+
+\msg_new:nnn {xsim} {unknown-property}
+ {
+ You~ tried~ to~ set~ the~ property~ `#1'~ \msg_line_context: . \\
+ This~ property~ does~ not~ exist.~ Check~ for~ a~ typo~ or~ \\
+ define~ the~ property~ yourself.
+ }
+
+\msg_new:nnn {xsim} {property-unique}
+ {
+ You~ tried~ to~ set~ the~ property~ `#1'~ \msg_line_context: . \\
+ This~ property~ has~ to~ have~ a~ unique~ value~ and~ thus~ \\
+ cannot~ be~ set~ to~ `#2'~ since~ this~ value~ is~ already~ taken.
+ }
+
+\msg_new:nnn {xsim} {no-boolean-property}
+ {
+ You~ tried~ to~ check~ the~ boolean~ value~ of~ property~ `#1'~
+ \msg_line_context: . \\
+ However,~ property~ `#1'~ is~ not~ a~ boolean~ property!
+ }
+
+\msg_new:nnn {xsim} {unbalanced-property-list}
+ {
+ There~ is~ a~ mis-match~ in~ the~ property~ list: \\
+ `#1' \\
+ \msg_line_context:
+ }
+
+% ----------------------------------------------------------------------------
+\seq_new:N \l__xsim_properties_seq
+\seq_new:N \l__xsim_boolean_properties_seq
+\seq_new:N \l__xsim_unique_properties_seq
+\seq_new:N \l__xsim_noupdate_properties_seq
+\seq_new:N \l__xsim_given_properties_seq
+
+% #1: type
+% #2: id
+% #3: property
+\cs_new_protected:Npn \__xsim_define_property:nnn #1#2#3
+ { \xsim_attribute_new:nn {#1!#2} {#3} }
+
+% check if property is set:
+% #1: type
+% #2: id
+% #3: property
+\prg_new_conditional:Npnn \xsim_if_property_set:nnn #1#2#3 {p,T,F,TF}
+ {
+ \xsim_attribute_if_set:nnTF {#1!#2} {#3}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\prg_generate_conditional_variant:Nnn \xsim_if_property_set:nnn
+ {ne,nne,ee,nV}
+ {p,T,F,TF}
+
+% new property:
+% #1: boolean if unique
+% #2: boolean if boolean
+% #3: boolean if noupdate
+% #4: property name
+\cs_new_protected:Npn \xsim_declare_property:nnnn #1#2#3#4
+ {
+ \xsim_if_property_exist:nF {#4}
+ {
+ \seq_put_right:Nn \l__xsim_properties_seq {#4}
+ \bool_if:nTF {#3}
+ {
+ \seq_if_in:NnF \l__xsim_noupdate_properties_seq {#4}
+ { \seq_put_right:Nn \l__xsim_noupdate_properties_seq {#4} }
+ }
+ { \xsim_new_list:n {#4} }
+ \bool_if:nTF {#2}
+ {
+ \xsim_verbose:n
+ { Declaring~ new~ boolean~ exercise~ property~ `#4'. }
+ \seq_if_in:NnF \l__xsim_boolean_properties_seq {#4}
+ { \seq_put_right:Nn \l__xsim_boolean_properties_seq {#4} }
+ }
+ {
+ \bool_if:nTF {#1}
+ {
+ \xsim_verbose:n
+ { Declaring~ new~ unique~ exercise~ property~ `#4'. }
+ \seq_if_in:NnF \l__xsim_unique_properties_seq {#4}
+ { \seq_put_right:Nn \l__xsim_unique_properties_seq {#4} }
+ \seq_new:c {l__xsim_unique_property_#4_values_seq}
+ }
+ { \xsim_verbose:n { Declaring~ new~ exercise~ property~ `#4'. } }
+ }
+ \bool_if:nF {#3}
+ {
+ \xsim_at_end_document:n { \xsim_update_list:n {#4} }
+ \xsim_at_begin_document:n { \__xsim_set_property_from_list:n {#4} }
+ }
+ }
+ }
+
+% ----------------------------------------------------------------------------
+% check if property exists:
+\prg_new_conditional:Npnn \xsim_if_property_exist:n #1 {p,T,F,TF}
+ {
+ \seq_if_in:NnTF \l__xsim_properties_seq {#1}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\cs_generate_variant:Nn \xsim_if_property_exist:nTF {x}
+
+\prg_new_conditional:Npnn \xsim_if_property_noupdate:n #1 {p,T,F,TF}
+ {
+ \seq_if_in:NnTF \l__xsim_noupdate_properties_seq {#1}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\cs_generate_variant:Nn \xsim_if_property_noupdate:nF {V}
+
+\prg_new_conditional:Npnn \xsim_if_property_boolean:n #1 {p,T,F,TF}
+ {
+ \seq_if_in:NnTF \l__xsim_boolean_properties_seq {#1}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+\prg_new_conditional:Npnn \xsim_if_property_unique:n #1 {p,T,F,TF}
+ {
+ \seq_if_in:NnTF \l__xsim_unique_properties_seq {#1}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+% true if property #1 has been set in the /last/ call of
+% \xsim_set_properties:nnn
+\prg_new_conditional:Npnn \xsim_if_property_given:n #1 {p,T,F,TF}
+ {
+ \seq_if_in:NnTF \l__xsim_given_properties_seq {#1}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+% #1: property
+% #2: value
+\prg_new_conditional:Npnn \xsim_if_property_unique_value:nn #1#2 {p,T,F,TF}
+ {
+ \xsim_if_property_unique:nTF {#1}
+ {
+ \seq_if_in:cnTF {l__xsim_unique_property_#1_values_seq} {#2}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ { \prg_return_false: }
+ }
+
+% #1: code
+\cs_new_protected:Npn \xsim_foreach_property:n #1
+ { \seq_map_inline:Nn \l__xsim_properties_seq {#1} }
+
+% ----------------------------------------------------------------------------
+% #1: type
+% #2: id
+% #3: property
+% #4: value
+\cs_new_protected:Npn \xsim_set_property:nnnn #1#2#3#4
+ {
+ \xsim_if_property_unique:nTF {#3}
+ {
+ \xsim_if_property_unique_value:nnTF {#3} {#4}
+ { \msg_warning:nnnn {xsim} {property-unique} {#3} {#4} }
+ { \__xsim_set_unique_property:nnnn {#1} {#2} {#3} {#4} }
+ }
+ {
+ \xsim_if_property_boolean:nTF {#3}
+ { \__xsim_set_boolean_property:nnnn {#1} {#2} {#3} {#4} }
+ { \__xsim_set_property:nnnn {#1} {#2} {#3} {#4} }
+ }
+ }
+\cs_generate_variant:Nn \xsim_set_property:nnnn {nnee,nnnV,nV,nVne,nnne,ee,eene,nene}
+
+% #1: type
+% #2: id
+% #3: property
+% #4: value
+\cs_new_protected:Npn \__xsim_set_boolean_property:nnnn #1#2#3#4
+ {
+ \str_case_e:nnTF { \str_lowercase:n {#4} }
+ {
+ {} {}
+ {true} {}
+ }
+ { \__xsim_set_property:nnnn {#1} {#2} {#3} {true} }
+ { \__xsim_set_property:nnnn {#1} {#2} {#3} {false} }
+ }
+
+% #1: type
+% #2: id
+% #3: property
+% #4: value
+\cs_new_protected:Npn \__xsim_set_unique_property:nnnn #1#2#3#4
+ {
+ \__xsim_set_property:nnnn {#1} {#2} {#3} {#4}
+ \__xsim_set_property_reverse:nnnn {#1} {#2} {#3} {#4}
+ }
+
+% #1: type
+% #2: id
+% #3: property
+\cs_new_protected:Npn \__xsim_unset_property:nnn #1#2#3
+ {
+ \xsim_verbose:n
+ { Un-setting~ property~ `#3'~ of~ exercise~ type~ `#1'~ id~ `#2'. }
+ \xsim_if_property_noupdate:nF {#3}
+ { \__xsim_remove_property_from_list:nnn {#1} {#2} {#3} }
+ \xsim_attribute_unset:nn {#1!#2} {#3}
+ }
+
+% #1: type
+% #2: id
+% #3: property
+\cs_new_protected:Npn \xsim_unset_property:nnn #1#2#3
+ {
+ \xsim_if_property_exist:nTF {#3}
+ { \__xsim_unset_property:nnn {#1} {#2} {#3} }
+ { \msg_error:nnn {xsim} {unknown-property} {#3} }
+ }
+\cs_generate_variant:Nn \xsim_unset_property:nnn {nx,nnx,nV}
+
+% #1: type
+% #2: id
+% #3: property
+% #4: value
+\cs_new_protected:Npn \__xsim_set_property:nnnn #1#2#3#4
+ {
+ \xsim_verbose:n
+ {
+ Setting~ property~ `#3'~ of~ exercise~ type~ `#1'~ id~ `#2'~ to~
+ value~ `#4'.
+ }
+ \xsim_if_property_noupdate:nF {#3}
+ {
+ \__xsim_remove_property_from_list:nnn {#1} {#2} {#3}
+ \xsim_add_to_list:nn {#3} {#1-#2=={#4}}
+ }
+ \xsim_attribute_set:nnn {#1!#2} {#3} {#4}
+ }
+\cs_generate_variant:Nn \__xsim_set_property:nnnn {VVnV}
+
+% #1: type
+% #2: id
+% #3: property
+% #4: value
+\cs_new_protected:Npn \__xsim_set_property_reverse:nnnn #1#2#3#4
+ {
+ \xsim_attribute_set:nnn {type:#3} {#4} {#1}
+ \xsim_attribute_set:nnn {id:#3} {#4} {#2}
+ }
+
+\tl_set:Nx \l__xsim_tmpa_tl { \cs_to_str:N \{ }
+\tl_set:Nx \l__xsim_tmpb_tl { \cs_to_str:N \} }
+\use:x
+ {
+ \cs_new_protected:Npn
+ \exp_not:N \__xsim_extract_property_list_entry:NNNwww
+ ##1##2##3##4-##5== \l__xsim_tmpa_tl ##6 \l__xsim_tmpb_tl
+ \exp_not:N \q_stop
+ }
+ {
+ \str_set:Nn #1 {#4}
+ \str_set:Nn #2 {#5}
+ \str_set:Nn #3 {#6}
+ }
+
+% #1: type
+% #2: id
+% #3: property
+\cs_new_protected:Npn \__xsim_remove_property_from_list:nnn #1#2#3
+ {
+ % make sure we change the entry if it has been recorded previously:
+ \xsim_foreach_list_entry:nn {#3}
+ {
+ \__xsim_extract_property_list_entry:NNNwww
+ \l__xsim_tmpa_str \l__xsim_tmpb_str \l__xsim_tmpc_str ##1 \q_stop
+ \str_if_eq:xnT { \l__xsim_tmpa_str - \l__xsim_tmpb_str } {#1-#2}
+ {
+ \xsim_remove_from_list:nx {#3}
+ { #1-#2 == {\l__xsim_tmpc_str} }
+ }
+ }
+ % make sure we change the entry if it has been set during the current run:
+ \xsim_foreach_new_list_entry:nn {#3}
+ {
+ \__xsim_extract_property_list_entry:NNNwww
+ \l__xsim_tmpa_str \l__xsim_tmpb_str \l__xsim_tmpc_str ##1 \q_stop
+ \str_if_eq:xnT { \l__xsim_tmpa_str - \l__xsim_tmpb_str } {#1-#2}
+ {
+ \xsim_remove_from_list:nx {#3}
+ { #1-#2 == {\l__xsim_tmpc_str} }
+ }
+ }
+ }
+
+\seq_new:N \g_xsim_used_order_seq
+\seq_new:N \g_xsim_printed_order_seq
+
+\cs_new_protected:Npn \__xsim_set_property_from_list:n #1
+ {
+ \xsim_foreach_list_entry:nn {#1}
+ {
+ \__xsim_extract_property_list_entry:NNNwww
+ \l__xsim_tmpa_str \l__xsim_tmpb_str \l__xsim_tmpc_str ##1 \q_stop
+ \tl_set_rescan:Nnx \l__xsim_tmpa_tl {} { \l__xsim_tmpa_str }
+ \tl_set_rescan:Nnx \l__xsim_tmpb_tl {} { \l__xsim_tmpb_str }
+ \tl_set_rescan:Nnx \l__xsim_tmpc_tl {} { \l__xsim_tmpc_str }
+ \str_if_eq:nnT {#1} {used}
+ {
+ \str_if_eq:VnT \l__xsim_tmpc_str {true}
+ {
+ \seq_gput_right:Nx \g_xsim_used_order_seq
+ { \l__xsim_tmpa_tl - \l__xsim_tmpb_tl }
+ }
+ }
+ \str_if_eq:nnT {#1} {printed}
+ {
+ \str_if_eq:VnT \l__xsim_tmpc_str {true}
+ {
+ \seq_gput_right:Nx \g_xsim_printed_order_seq
+ { \l__xsim_tmpa_tl - \l__xsim_tmpb_tl }
+ }
+ }
+ \__xsim_set_property:VVnV
+ \l__xsim_tmpa_str
+ \l__xsim_tmpb_str
+ {#1}
+ \l__xsim_tmpc_tl
+ }
+ }
+
+% set properties:
+% #1: type
+% #2: id
+% #3: csv list of properties
+\cs_new_protected:Npn \xsim_set_properties:nnn #1#2#3
+ {
+ \cs_set_protected:Npn \__xsim_tmp:n ##1
+ { \xsim_set_property:nnnn {#1} {#2} {##1} {} }
+ \cs_set_protected:Npn \__xsim_tmp:nn ##1##2
+ { \xsim_set_property:nnnn {#1} {#2} {##1} {##2} }
+ \keyval_parse:NNn
+ \__xsim_tmp:n
+ \__xsim_tmp:nn
+ {#3}
+ \xsim_property_set_aliases:nn {#1} {#2}
+ }
+\cs_generate_variant:Nn \xsim_set_properties:nnn {nne,nee,nV,nVe}
+
+% ----------------------------------------------------------------------------
+
+\seq_new:N \g__xsim_property_aliases_seq
+
+% #1: property
+\prg_new_conditional:Npnn \xsim_if_property_alias:n #1 {p,T,F,TF}
+ {
+ \seq_if_in:NnTF \g__xsim_property_aliases_seq {#1}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+% #1: property
+\cs_new:Npn \xsim_property_alias:n #1
+ { \xsim_attribute_get:nn {#1} {alias} }
+
+% #1: property
+% #2: alias of
+\cs_new_protected:Npn \xsim_make_property_alias:nn #1#2
+ {
+ \xsim_if_property_alias:nF {#1}
+ {
+ \xsim_verbose:n
+ { Making~ property~ `#1'~ an~ alias~ of~ property~ `#2'. }
+ \xsim_attribute_set:nnn {#1} {alias} {#2}
+ \seq_gput_right:Nn \g__xsim_property_aliases_seq {#1}
+ }
+ }
+
+% #1: type
+% #2: id
+% #3: property
+\cs_new_protected:Npn \xsim_property_set_alias:nnn #1#2#3
+ {
+ \xsim_if_property_set:nneT {#1} {#2}
+ { \xsim_property_alias:n {#3} }
+ {
+ \xsim_attribute_set:nnx {alias:#1!#2} {#3}
+ {
+ \xsim_get_property:nnf {#1} {#2}
+ { \xsim_property_alias:n {#3} }
+ }
+ \xsim_if_property_set:nnnF {#1} {#2} {#3}
+ {
+ \xsim_set_property:nnne {#1} {#2} {#3}
+ {
+ \xsim_get_property:nnf {#1} {#2}
+ { \xsim_property_alias:n {#3} }
+ }
+ }
+ }
+ }
+\cs_generate_variant:Nn \xsim_property_set_alias:nnn {nV}
+
+% #1: type
+% #2: id
+\cs_new_protected:Npn \xsim_property_set_aliases:nn #1#2
+ {
+ \seq_map_inline:Nn \g__xsim_property_aliases_seq
+ { \xsim_property_set_alias:nnn {#1} {#2} {##1} }
+ }
+
+% ----------------------------------------------------------------------------
+% retrieve properties:
+% #1: type
+% #2: id
+% #3: property
+\cs_new:Npn \xsim_get_property:nnn #1#2#3
+ { \xsim_attribute_get:nn {#1!#2} {#3} }
+\cs_generate_variant:Nn \xsim_get_property:nnn {nx,ne,xx,oo,no,nnf,nf,oof,nV}
+
+% #1: property
+% #2: value
+\cs_new:Npn \xsim_get_id_for_property:nn #1#2
+ { \xsim_attribute_get:nn {id:#1} {#2} }
+
+% #1: ID
+% #2: variable
+\cs_new_protected:Npn \xsim_get_type_for_id:nN #1#2
+ {
+ \xsim_foreach_list_entry:nn {idtypes}
+ {
+ \__xsim_extract_property_list_entry:NNNwww
+ \l__xsim_tmpa_str \l__xsim_tmpb_str \l__xsim_tmpc_str -##1 \q_stop
+ \str_if_eq:VnT \l__xsim_tmpb_str {#1}
+ {
+ \str_set_eq:NN #2 \l__xsim_tmpc_str
+ \seq_map_break:
+ }
+ }
+ }
+
+% #1: property
+% #2: value
+\cs_new:Npn \xsim_get_type_for_property:nn #1#2
+ { \xsim_attribute_get:nn {type:#1} {#2} }
+\cs_generate_variant:Nn \xsim_get_type_for_property:nn {nV}
+
+% #1: id or ID
+\cs_new:Npn \xsim_normalize_id:n #1
+ {
+ \tl_if_blank:eTF
+ { \xsim_get_id_for_property:nn {ID} {#1} }
+ {#1}
+ { \xsim_get_id_for_property:nn {ID} {#1} }
+ }
+\cs_generate_variant:Nn \xsim_normalize_id:n {e}
+
+\tl_new:N \l_xsim_property_value_tl
+\tl_new:N \PropertyValue
+
+\cs_new:Npn \__xsim_tmp:n #1 {#1}
+\cs_generate_variant:Nn \__xsim_tmp:n {V}
+
+% #1: type
+% #2: id
+% #3: property
+\cs_new_protected:Npn \xsim_get_property_if_set:nnnTF #1#2#3#4#5
+ {
+ \xsim_if_property_exist:nTF {#3}
+ {
+ \xsim_if_property_set:nnnTF {#1} {#2} {#3}
+ {
+ \tl_set:Nx \l_xsim_property_value_tl
+ { \xsim_get_property:nnn {#1} {#2} {#3} }
+ \tl_set_eq:NN \PropertyValue \l_xsim_property_value_tl
+ \cs_set:Npn \__xsim_tmp:n ##1 {#4}
+ \__xsim_tmp:V \l_xsim_property_value_tl
+ }
+ {#5}
+ }
+ { \msg_error:nnn {xsim} {unknown-property} {#3} }
+ }
+\cs_generate_variant:Nn \xsim_get_property_if_set:nnnTF {oo}
+
+\cs_new_protected:Npn \xsim_get_property_if_set:nnnT #1#2#3#4
+ { \xsim_get_property_if_set:nnnTF {#1} {#2} {#3} {#4} {} }
+
+\cs_new_protected:Npn \xsim_get_property_if_set:nnnF #1#2#3#4
+ { \xsim_get_property_if_set:nnnTF {#1} {#2} {#3} {} {#4} }
+
+% #1: type
+% #2: id
+% #3: property
+\prg_new_conditional:Npnn \xsim_if_boolean_property:nnn #1#2#3 {T,F,TF}
+ {
+ \xsim_if_property_exist:nTF {#3}
+ {
+ \xsim_if_property_boolean:nTF {#3}
+ {
+ \xsim_if_property_set:nnnTF {#1} {#2} {#3}
+ {
+ \bool_if:cTF
+ {c_ \xsim_get_property:nnn {#1} {#2} {#3} _bool}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ { \prg_return_false: }
+ }
+ { \msg_error:nnn {xsim} {no-boolean-property} {#3} }
+ }
+ { \msg_error:nnn {xsim} {unknown-property} {#3} }
+ }
+\prg_generate_conditional_variant:Nnn \xsim_if_boolean_property:nnn {oo,nV} {T,F,TF}
+
+\cs_new_protected:Npn \xsim_save_property:nnnN #1#2#3#4
+ { \tl_set:Nx #4 { \xsim_get_property:nnn {#1} {#2} {#3} } }
+\cs_generate_variant:Nn \xsim_save_property:nnnN {nx,xx}
+
+\cs_new_protected:Npn \xsim_gsave_property:nnnN #1#2#3#4
+ {
+ \xsim_save_property:nnnN {#1} {#2} {#3} #4
+ \tl_gset:NV #4 #4
+ }
+\cs_generate_variant:Nn \xsim_gsave_property:nnnN {nx,xx,nV}
+
+\XSIMmoduleend
+\XSIMmodule{environments}{generic code for exercise and solution environments}
+
+\xsim_if_write_to_files:F
+ {
+ \xsim_declare_property:nnnn
+ { \c_false_bool }
+ { \c_false_bool }
+ { \c_false_bool }
+ {solution-body}
+ \xsim_declare_property:nnnn
+ { \c_false_bool }
+ { \c_false_bool }
+ { \c_false_bool }
+ {exercise-body}
+ }
+
+\tl_new:N \l__xsim_file_name_signature_tl
+\tl_new:N \l__xsim_file_path_tl
+\tl_new:N \l__xsim_file_path_and_name_tl
+\tl_new:N \l__xsim_file_name_tl
+\tl_new:N \l__xsim_file_extension_tl
+\tl_new:N \l__xsim_solution_tl
+\bool_new:N \l__xsim_options_given_bool
+\bool_new:N \l__xsim_insert_mode_bool
+
+\tl_new:N \ExerciseText
+\tl_set:Nn \ExerciseText { \msg_error:nn {xsim} {only-in-solution} }
+
+% ----------------------------------------------------------------------------
+
+\msg_new:nnn {xsim} {only-in-solution}
+ {
+ You~ can't~ use~ \token_to_str:N \ExerciseText \c_space_tl inside~ an~
+ exercise.~ It~ is~ only~ allowed~ inside~ solution~ environments!
+ }
+
+% ----------------------------------------------------------------------------
+
+\keys_define:nn {xsim}
+ {
+ path .tl_set:N = \l__xsim_file_path_tl ,
+ file-extension .tl_set:N = \l__xsim_file_extension_tl ,
+ file-extension .initial:n = tex
+ }
+
+% ----------------------------------------------------------------------------
+
+\tl_const:Nn \c__xsim_comment_line_tl { \c__xsim_percent_char_tl }
+\tl_const:Nn \c__xsim_comment_line_fill_tl { \prg_replicate:nn {72} {-} }
+\tl_const:Nn \c__xsim_comment_line_indent_tl { \c_space_tl \c_space_tl }
+
+\cs_new:Npn \__xsim_comment_line_and_feed:n #1
+ { \__xsim_comment_line:n {#1} ^^J }
+
+\cs_new:Npn \__xsim_comment_line:n #1
+ {
+ \c__xsim_comment_line_tl
+ \tl_if_blank:nF {#1} { \c_space_tl }
+ #1
+ }
+
+\cs_new:Npn \__xsim_two_digits:n #1
+ { \int_compare:nT { #1 < 10 } {0} \int_eval:n {#1} }
+
+% #1: type
+% #2: id
+% #3: exercise|solution
+\cs_new_protected:Npn \__xsim_set_file_signature:nnn #1#2#3
+ { \tl_set:Nn \l__xsim_file_name_signature_tl {#1-#2-#3} }
+\cs_generate_variant:Nn \__xsim_set_file_signature:nnn {nx,nV}
+
+\tl_set:Nn \l__xsim_file_name_tl
+ { \c_sys_jobname_str - \l__xsim_file_name_signature_tl -body . \l__xsim_file_extension_tl }
+
+\tl_set:Nn \l__xsim_file_path_and_name_tl
+ {
+ \tl_if_blank:VF \l__xsim_file_path_tl
+ { \l__xsim_file_path_tl / }
+ \l__xsim_file_name_tl
+ }
+
+% #1: type
+% #2: id
+% #3: exercise|solution
+% #4: file name
+% #5: path
+\cs_new_protected:Npn \__xsim_file_info:nnnnn #1#2#3#4#5
+ {
+ \tl_set:Nx \l_xsim_file_begin_tl
+ {
+ \__xsim_comment_line_and_feed:n { \c__xsim_comment_line_fill_tl }
+ \__xsim_comment_line_and_feed:n {file~ `#4'}
+ \tl_if_blank:nF {#5}
+ {
+ \__xsim_comment_line_and_feed:n
+ { \c__xsim_comment_line_indent_tl in~ folder~ `#5/'}
+ }
+ \__xsim_comment_line_and_feed:n {}
+ \__xsim_comment_line_and_feed:n
+ {
+ \c__xsim_comment_line_indent_tl
+ \c__xsim_comment_line_indent_tl
+ #3~ of~ type~ `#1'~ with~ id~ `#2'
+ }
+ \__xsim_comment_line_and_feed:n {}
+ \__xsim_comment_line_and_feed:n
+ {generated~ by~ the~ `\@currenvir'~ environment~ of~ the}
+ \__xsim_comment_line_and_feed:n
+ {
+ \c__xsim_comment_line_indent_tl
+ `xsim'~ package~ v \c_xsim_version_tl
+ \c_space_tl (\c_xsim_date_tl)
+ }
+ \__xsim_comment_line_and_feed:n
+ {
+ from~ source~ `\c_sys_jobname_str'~ on~
+ \int_use:N \c_sys_year_int /
+ \__xsim_two_digits:n { \c_sys_month_int } /
+ \__xsim_two_digits:n { \c_sys_day_int } ~
+ \msg_line_context:
+ }
+ \__xsim_comment_line:n { \c__xsim_comment_line_fill_tl }
+ }
+ }
+\cs_generate_variant:Nn \__xsim_file_info:nnnnn {nnnVV}
+
+% ----------------------------------------------------------------------------
+% #1: type
+% #2: id
+% #3: exercise|solution
+% #4: potential environment body
+\cs_new_protected:Npn \xsim_save_environment_body:nnnn #1#2#3#4
+ {
+ \xsim_if_write_to_files:TF
+ { \__xsim_write_environment_body:nnn {#1} {#2} {#3} }
+ { \__xsim_save_environment_body:nnnn {#1} {#2} {#3} {#4} }
+ }
+
+\cs_new_protected:Npn \xsim_save_environment_body_end:
+ {
+ \xsim_if_write_to_files:TF
+ { \__xsim_write_environment_body_end: }
+ { \__xsim_save_environment_body_end: }
+ }
+
+% writing to files:
+% #1: type
+% #2: id
+% #3: exercise|solution
+\cs_new_protected:Npn \__xsim_write_environment_body:nnn #1#2#3
+ {
+ \xsim_verbose:n
+ { Starting~ to~ write~ #3~ environment~ type~ `#1'~ id~ `#2' }
+ \__xsim_set_file_signature:nnn {#1} {#2} {#3}
+ \__xsim_file_info:nnnVV {#1} {#2} {#3}
+ \l__xsim_file_name_tl
+ \l__xsim_file_path_tl
+ \int_zero:N \l_xsim_line_gobble_int
+ \xsim_file_write_start:nV
+ { \l__xsim_options_given_bool }
+ \l__xsim_file_path_and_name_tl
+ }
+
+\cs_new_protected:Npn \__xsim_write_environment_body_end:
+ { \xsim_file_write_stop: }
+
+% saving to property lists:
+% #1: type
+% #2: id
+% #3: exercise|solution
+% #4: environment body
+\cs_new_protected:Npn \__xsim_save_environment_body:nnnn #1#2#3#4
+ {
+ \xsim_verbose:n { Saving~ #3~ environment~ type~ `#1'~ id~ `#2' }
+ \xsim_set_property:nnnn {#1} {#2} {#3-body} {#4}
+ \xsim_if_exchange:nnnF {#1} {#2} {#3}
+ { \xsim_set_property:nnnn {#1} {#2} {solution-body} {#3} }
+ }
+
+\cs_new:Npn \__xsim_save_environment_body_end: { }
+
+% ----------------------------------------------------------------------------
+% #1: type
+% #2: exercise|solution
+% #3: hook
+\cs_new_protected:Npn \xsim_new_hook:nnn #1#2#3
+ {
+ \xsim_verbose:n { Defining~ new~ #1~ (#2)~ hook~ `#3' }
+ \tl_new:c {l__xsim_#1_#2_#3_hook_tl}
+ \keys_define:nx {xsim}
+ {
+ \xsim_get_parameter:nn {#1} {#2-env}/#3-hook .tl_set:N =
+ \exp_not:c {l__xsim_#1_#2_#3_hook_tl}
+ }
+ }
+
+% #1: type
+% #2: exercise|solution
+% #3: hook
+\cs_new:Npn \xsim_use_hook:nnn #1#2#3
+ { \exp_not:v {l__xsim_#1_#2_#3_hook_tl} }
+
+% #1: type
+% #2: exercise|solution
+% #3: hook
+% #4: code
+\cs_new_protected:Npn \xsim_set_hook:nnnn #1#2#3#4
+ {
+ \xsim_verbose:n { Setting~ #1~ (#2)~ hook~ `#3' }
+ \tl_set:cn {l__xsim_#1_#2_#3_hook_tl} {#4}
+ }
+
+% #1: type
+% #2: exercise|solution
+% #3: hook
+% #4: code
+\cs_new_protected:Npn \xsim_addto_hook:nnnn #1#2#3#4
+ {
+ \xsim_verbose:n { Adding~ to~ #1~ (#2)~ hook~ `#3' }
+ \tl_put_right:cn {l__xsim_#1_#2_#3_hook_tl} {#4}
+ }
+
+% ----------------------------------------------------------------------------
+
+% #1: type
+% #2: id
+% #3: exercise|solution
+% #4: potential enironment body
+\cs_new_protected:Npn \xsim_start_environment:nnnn #1#2#3#4
+ { \xsim_save_environment_body:nnnn {#1} {#2} {#3} {#4} }
+\cs_generate_variant:Nn \xsim_start_environment:nnnn {nV}
+
+% #1: type
+% #2: id
+% #3: exercise|solution
+\cs_new_protected:Npn \xsim_stop_environment:nnn #1#2#3
+ {
+ \xsim_save_environment_body_end:
+ \xsim_if_print:nnnTF {#1} {#2} {#3}
+ { \xsim_typeset_environment:nnn {#1} {#2} {#3} }
+ { \xsim_use_hook:nnn {#1} {#3} {print-false} }
+ }
+\cs_generate_variant:Nn \xsim_stop_environment:nnn {nV}
+
+% #1: type
+% #2: id
+% #3: exercise|solution
+\cs_new_protected:Npn \xsim_typeset_environment:nnn #1#2#3
+ {
+ \tl_set:Nn \ExerciseType {#1}
+ \tl_set:Nn \ExerciseID {#2}
+ \xsim_verbose:n
+ { Typesetting~ #3~ environment~ type~ `#1'~ id~ `#2' }
+ \xsim_use_hook:nnn {#1} {#3} {pre}
+ \xsim_use_template:nx
+ {begin}
+ { \xsim_get_parameter:nn {#1} {#3-template} }
+ \xsim_use_hook:nnn {#1} {#3} {begin}
+ \xsim_input:nnn {#1} {#2} {#3}
+ \xsim_use_hook:nnn {#1} {#3} {end}
+ \xsim_use_template:nx
+ {end}
+ { \xsim_get_parameter:nn {#1} {#3-template} }
+ \xsim_use_hook:nnn {#1} {#3} {post}
+ }
+
+% #1: type
+% #2: id
+% #3: exercise|solution
+\prg_new_conditional:Npnn \xsim_if_exchange:nnn #1#2#3 {T,F,TF}
+ {
+ \str_if_eq:nnTF {#3} {solution}
+ {
+ \xsim_if_boolean_property:nnnTF {#1} {#2} {solution}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ { \prg_return_false: }
+ }
+
+% #1: type
+% #2: id
+% #3: exercise|solution
+\prg_new_protected_conditional:Npnn \xsim_if_exist:nnn #1#2#3 {T,F,TF}
+ {
+ \xsim_if_write_to_files:TF
+ {
+ \__xsim_set_file_signature:nnn {#1} {#2} {#3}
+ \file_if_exist:VTF \l__xsim_file_path_and_name_tl
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ {
+ \xsim_if_property_exist:nTF {#3-body}
+ {
+ \xsim_if_property_set:nnnTF {#1} {#2} {#3-body}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ { \prg_return_false: }
+ }
+ }
+
+% #1: type
+% #2: id
+% #3: options
+% #4: exercise|solution
+\cs_new_protected:Npn \xsim_insert:nnnn #1#2#3#4
+ {
+ \xsim_if_exist:nnnT {#1} {#2} {#4}
+ {
+ \xsim_verbose:n
+ { Inserting~ #4~ type~ `#1'~ id~ `#2'. }
+ \group_begin:
+ \xsim_insert_mode:
+ \tl_gset:Nx \g_xsim_exercise_id_tl {#2}
+ \tl_gset:Nn \g_xsim_exercise_type_tl {#1}
+ \use:c {xsim_start_#4:nn} {#1} {#3}
+ \xsim_typeset_environment:nnn {#1} {#2} {#4}
+ \use:c {xsim_stop_#4:n} {#1} {}
+ \group_end:
+ }
+ }
+\cs_generate_variant:Nn \xsim_insert:nnnn {nV,VV,nnnV,xx,ne}
+
+% #1: type
+% #2: id
+% #3: exercise|solution
+\cs_new_protected:Npn \xsim_input:nnn #1#2#3
+ {
+ \xsim_if_exchange:nnnTF {#1} {#2} {#3}
+ { \__xsim_set_file_signature:nnn {#1} {#2} {exercise} }
+ { \__xsim_set_file_signature:nnn {#1} {#2} {#3} }
+ \xsim_if_write_to_files:TF
+ {
+ \file_if_exist:nTF { \exp_not:V \l__xsim_file_path_and_name_tl }
+ { \file_input:n { \exp_not:V \l__xsim_file_path_and_name_tl } }
+ {
+ \xsim_verbose:n
+ { File~ `\l__xsim_file_path_and_name_tl'~ doesn't~ exist. }
+ }
+ }
+ {
+ \xsim_if_exchange:nnnTF {#1} {#2} {#3}
+ { \xsim_get_property:nnn {#1} {#2} {exercise-body} }
+ { \xsim_get_property:nnn {#1} {#2} {#3-body} }
+ }
+ }
+\cs_generate_variant:Nn \xsim_input:nnn {oo}
+
+\prg_new_conditional:Npnn \xsim_if_insert_mode: {T,F,TF}
+ {
+ \bool_if:NTF \l__xsim_insert_mode_bool
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+\cs_new_protected:Npn \xsim_insert_mode:
+ { \bool_set_true:N \l__xsim_insert_mode_bool }
+
+% ----------------------------------------------------------------------------
+
+% #1: type
+% #2: exercise|solution
+\cs_new_protected:Npn \xsim_new_environment:nn #1#2
+ {
+ \xsim_verbose:n { Defining~ #2~ environment~ type~ `#1'. }
+ \xsim_new_hook:nnn {#1} {#2} {pre}
+ \xsim_new_hook:nnn {#1} {#2} {begin}
+ \xsim_new_hook:nnn {#1} {#2} {end}
+ \xsim_new_hook:nnn {#1} {#2} {post}
+ \xsim_new_hook:nnn {#1} {#2} {print-false}
+ \xsim_if_write_to_files:TF
+ {
+ \NewDocumentEnvironment
+ { \xsim_get_parameter:nn {#1} {#2-env} } {!o}
+ {
+ \IfNoValueTF {##1}
+ {
+ \bool_set_false:N \l__xsim_options_given_bool
+ \use:c {xsim_start_#2:nn} {#1} {}
+ }
+ {
+ \bool_set_true:N \l__xsim_options_given_bool
+ \use:c {xsim_start_#2:nn} {#1} {##1}
+ }
+ \xsim_start_environment:nVnn {#1} \g_xsim_exercise_id_tl {#2} { }
+ }
+ {
+ \xsim_stop_environment:nVn {#1} \g_xsim_exercise_id_tl {#2}
+ \use:c {xsim_stop_#2:n} {#1}
+ }
+ }
+ {
+ \NewDocumentEnvironment
+ { \xsim_get_parameter:nn {#1} {#2-env} } {o+b}
+ {
+ \IfNoValueTF {##1}
+ {
+ \bool_set_false:N \l__xsim_options_given_bool
+ \use:c {xsim_start_#2:nn} {#1} {}
+ }
+ {
+ \bool_set_true:N \l__xsim_options_given_bool
+ \use:c {xsim_start_#2:nn} {#1} {##1}
+ }
+ \xsim_start_environment:nVnn {#1} \g_xsim_exercise_id_tl {#2} {##2}
+ }
+ {
+ \xsim_stop_environment:nVn {#1} \g_xsim_exercise_id_tl {#2}
+ \use:c {xsim_stop_#2:n} {#1}
+ }
+ }
+ }
+
+\XSIMmoduleend
+\XSIMmodule{templates}{templates for typesetting exercises}
+
+\msg_new:nnn {xsim} {unknown-template}
+ {
+ You~ are~ trying~ to~ load~ the~ template~ `#2'~ (template~ type~ `#1')~
+ \msg_line_context: .~ This~ template~ does~ not~ seem~ to~ be~ defined.~
+ I~ am~ using~ the~ template~ `#3'~ (template~ type~ `#1')~ instead.
+ }
+
+\msg_new:nnn {xsim} {template-type-exists}
+ { The~ template~ type~ `#1'~ already~ exists~ \msg_line_context: }
+
+% ----------------------------------------------------------------------------
+\seq_new:N \l__xsim_template_types_seq
+
+% #1: template type
+\cs_new_protected:Npn \xsim_new_template_type:n #1
+ {
+ \seq_if_in:NnTF \l__xsim_template_types_seq {#1}
+ { \msg_error:nnn {xsim} {template-type-exists} {#1} }
+ {
+ \xsim_verbose:n { Declaring~ new~ template~ type~ `#1'. }
+ \seq_put_right:Nn \l__xsim_template_types_seq {#1}
+ }
+ }
+
+% #1: template type
+% #2: template name
+% #3: code
+\cs_new_protected:Npn \__xsim_add_template:nnn #1#2#3
+ {
+ \xsim_verbose:n { Defining~ new~ template~ `#2'~ of~ type~ `#1'. }
+ \tl_new:c {l__xsim_template_#1_#2_setup_tl}
+ \xsim_attribute_set:nnn {template::#1} {#2} {#3}
+ }
+
+\prg_new_conditional:Npnn \xsim_if_template_exist:nn #1#2 {T,F,TF}
+ {
+ \xsim_attribute_if_set:nnTF {template::#1} {#2}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+% #1: template type
+% #2: template name
+\cs_new_protected:Npn \__xsim_get_template:nn #1#2
+ { \xsim_attribute_get:nn {template::#1} {#2} }
+
+% ----------------------------------------------------------------------------
+
+% environment templates (types `begin' and `end'):
+\xsim_new_template_type:n {begin}
+\xsim_new_template_type:n {end}
+
+% #1: template name
+% #2: begin code
+% #3: end code
+\cs_new_protected:Npn \xsim_declare_environment_template:nnn #1#2#3
+ {
+ \__xsim_add_template:nnn {begin} {#1}
+ {
+ \__xsim_start_template:nn {begin} {#1}
+ \__xsim_start_template:nn {end} {#1}
+ #2
+ }
+ \__xsim_add_template:nnn {end} {#1}
+ {
+ #3
+ \__xsim_stop_template:nn {end} {#1}
+ \__xsim_stop_template:nn {begin} {#1}
+ }
+ }
+
+% ----------------------------------------------------------------------------
+
+% heading templates for the solution list (type `heading'):
+\xsim_new_template_type:n {heading}
+
+% #1: template name
+% #2: code
+\cs_new_protected:Npn \xsim_declare_heading_template:nn #1#2
+ {
+ \__xsim_add_template:nnn {heading} {#1}
+ {
+ \__xsim_start_template:nn {heading} {#1}
+ #2
+ \__xsim_stop_template:nn {heading} {#1}
+ }
+ }
+
+% ----------------------------------------------------------------------------
+
+% grading table templates (type `table'):
+\xsim_new_template_type:n {table}
+
+% #1: template name
+% #2: code
+\cs_new_protected:Npn \xsim_declare_table_template:nn #1#2
+ {
+ \__xsim_add_template:nnn {table} {#1}
+ {
+ \__xsim_start_template:nn {table} {#1}
+ #2
+ \__xsim_stop_template:nn {table} {#1}
+ }
+ }
+
+% ----------------------------------------------------------------------------
+
+% using templates:
+% setup up the next usage of `template name':
+% #1: template type
+% #2: template name
+% #3: setup code
+\cs_new_protected:Npn \xsim_setup_template:nnn #1#2#3
+ { \tl_set:cn {l__xsim_template_#1_#2_setup_tl} {#3} }
+\cs_generate_variant:Nn \xsim_setup_template:nnn {nnV,nVn}
+
+% #1: template type
+% #2: template name
+\cs_new_protected:Npn \__xsim_setup_template:nn #1#2
+ { \tl_use:c {l__xsim_template_#1_#2_setup_tl} }
+
+% #1: template type
+% #2: template name
+\cs_new_protected:Npn \__xsim_clear_template_setup:nn #1#2
+ { \tl_clear:c {l__xsim_template_#1_#2_setup_tl} }
+
+% #1: template type
+% #2: template name
+\cs_new_protected:Npn \__xsim_start_template:nn #1#2
+ { \group_begin: \__xsim_setup_template:nn {#1} {#2} }
+
+% #1: template type
+% #2: template name
+\cs_new_protected:Npn \__xsim_stop_template:nn #1#2
+ { \group_end: \__xsim_clear_template_setup:nn {#1} {#2} }
+
+% #1: template type
+% #2: template name
+\cs_new_protected:Npn \xsim_use_template:nn #1#2
+ {
+ \xsim_if_template_exist:nnTF {#1} {#2}
+ { \__xsim_get_template:nn {#1} {#2} }
+ {
+ \msg_warning:nnnnn {xsim} {unknown-template} {#1} {#2} {default}
+ \__xsim_get_template:nn {#1} {default}
+ }
+ }
+\cs_generate_variant:Nn \xsim_use_template:nn {nx,nV}
+
+\XSIMmoduleend
+\XSIMmodule{tags}{tagging of exercises}
+
+\seq_new:N \l__xsim_tag_types_seq
+\bool_new:N \l____xsim_tagged_bool
+
+\msg_new:nnn {xsim} {tag-exists}
+ { The~ tag~ type~ `#1'~ already~ exists.~ I~ am~ doing~ nothing. }
+
+\msg_new:nnn {xsim} {tag-unknown}
+ { The~ tag~ type~ `#1'~ is~ not~ defined.~ Check~ for~ a~ typo. }
+
+% #1: name
+\cs_new_protected:Npn \xsim_new_tag_type:n #1
+ {
+ \xsim_verbose:n { Declaring~ new~ tag~ type~ `#1'. }
+ \seq_put_right:Nn \l__xsim_tag_types_seq {#1}
+ \seq_remove_duplicates:N \l__xsim_tag_types_seq
+ \seq_new:c {l__xsim_chosen_tags_#1_seq}
+ \bool_new:c {l__xsim_ignore_untagged_#1_bool}
+ \bool_new:c {l____xsim_tagged_#1_bool}
+ \keys_define:nn {xsim}
+ {
+ #1/ignore-untagged .bool_set:c = {l__xsim_ignore_untagged_#1_bool} ,
+ #1/ignore-untagged .initial:n = true ,
+ #1 .code:n =
+ \seq_set_from_clist:cn {l__xsim_chosen_tags_#1_seq} {##1}
+ }
+ \prg_new_protected_conditional:cpnn {xsim_if_#1_value:n} ##1 {T,F,TF}
+ {
+ \seq_if_in:cnTF {l__xsim_chosen_tags_#1_seq} {##1}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ \xsim_declare_property:nnnn
+ { \c_false_bool }
+ { \c_false_bool }
+ { \c_false_bool }
+ {#1}
+ \xsim_declare_printsolutions_condition:nn {#1}
+ { \__xsim_printsolutions_if_tagged:nnnnTF {#1} }
+ \keys_define:nn {xsim/print-solutions}
+ {
+ #1 .choice: ,
+ #1/false .code:n =
+ \__xsim_printsolutions_condition:nn {#1} {false} ,
+ #1/true .code:n =
+ \__xsim_printsolutions_condition:nn {#1} {true} ,
+ #1/unknown .code:n =
+ \keys_set:nn {xsim} { #1 = ##1 }
+ \__xsim_printsolutions_condition:nn {#1} {true} ,
+ #1 .initial:n = false
+ }
+ }
+
+% #1: tag type
+\prg_new_protected_conditional:Npnn \xsim_if_tag_type_exist:n #1 {T,F,TF}
+ {
+ \seq_if_in:NnTF \l__xsim_tag_types_seq {#1}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\prg_generate_conditional_variant:Nnn \xsim_if_tag_type_exist:n {V} {TF}
+
+% #1: tag type
+% #2: exercise type
+% #3: id
+% #4: print|use
+\prg_new_protected_conditional:Npnn
+ \__xsim_printsolutions_if_tagged:nnnn #1#2#3#4 {T,F,TF}
+ {
+ \xsim_if_in_list:nnTF {#4} {#2-#3=={true}}
+ {
+ \__xsim_printsolutions_if_condition:nTF {#1}
+ {
+ \__xsim_printsolutions_condition_true:
+ \xsim_if_tagged:nnnTF {#2} {#3} {#1}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ { \prg_return_false: }
+ }
+ { \prg_return_false: }
+ }
+
+% #1: exercise type
+% #2: id
+% #3: tag type
+\prg_new_protected_conditional:Npnn \xsim_if_tagged:nnn #1#2#3 {T,F,TF}
+ {
+ \bool_set_false:c {l____xsim_tagged_#3_bool}
+ \seq_if_empty:cTF {l__xsim_chosen_tags_#3_seq}
+ { \bool_set_true:c {l____xsim_tagged_#3_bool} }
+ {
+ \seq_set_from_clist:Nx
+ \l__xsim_tmpa_seq
+ { \xsim_get_property:nnn {#1} {#2} {#3} }
+ \seq_if_empty:NTF \l__xsim_tmpa_seq
+ {
+ \bool_set_eq:cc
+ {l____xsim_tagged_#3_bool}
+ {l__xsim_ignore_untagged_#3_bool}
+ }
+ {
+ \seq_map_inline:Nn \l__xsim_tmpa_seq
+ {
+ \seq_if_in:cnT {l__xsim_chosen_tags_#3_seq} {##1}
+ {
+ \bool_set_true:c {l____xsim_tagged_#3_bool}
+ \seq_map_break:
+ }
+ }
+ }
+ }
+ \bool_if:cTF {l____xsim_tagged_#3_bool}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+% #1: exercise type
+% #2: id
+% #3: tag type
+% #4: tag values
+\prg_new_protected_conditional:Npnn \xsim_has_tags:nnnn #1#2#3#4 {T,F,TF}
+ {
+ \bool_set_false:c {l____xsim_tagged_#3_bool}
+ \seq_set_from_clist:Nn \l__xsim_tmpa_seq {#4}
+ \seq_if_empty:NTF \l__xsim_tmpa_seq
+ {% no tag values given:
+ \bool_set_true:c {l____xsim_tagged_#3_bool}
+ }
+ {
+ \seq_set_from_clist:Nx
+ \l__xsim_tmpb_seq
+ { \xsim_get_property:nnn {#1} {#2} {#3} }
+ \seq_if_empty:NTF \l__xsim_tmpb_seq
+ {% exercise has no tag values given
+ % \bool_set_eq:cc
+ % {l____xsim_tagged_#3_bool}
+ % {l__xsim_ignore_untagged_#3_bool}
+ \bool_set_false:c {l____xsim_tagged_#3_bool}
+ }
+ {
+ \seq_map_inline:Nn \l__xsim_tmpb_seq
+ {
+ \seq_if_in:NnT \l__xsim_tmpa_seq {##1}
+ {
+ \bool_set_true:c {l____xsim_tagged_#3_bool}
+ \seq_map_break:
+ }
+ }
+ }
+ }
+ \bool_if:cTF {l____xsim_tagged_#3_bool}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\prg_generate_conditional_variant:Nnn \xsim_has_tags:nnnn {nnVV} {T}
+
+% #1: exercise type
+% #2: id
+\prg_new_protected_conditional:Npnn \xsim_if_tagged:nn #1#2 {T,F,TF}
+ {
+ \bool_set_true:N \l____xsim_tagged_bool
+ \seq_map_inline:Nn \l__xsim_tag_types_seq
+ {
+ \xsim_if_tagged:nnnF {#1} {#2} {##1}
+ {
+ \bool_set_false:N \l____xsim_tagged_bool
+ \seq_map_break:
+ }
+ }
+ \bool_if:NTF \l____xsim_tagged_bool
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+
+% #1: exercise type
+% #2: id
+% #3: tag type
+% #4: code
+\cs_new_protected:Npn \xsim_foreach_exercise_tag:nnnn #1#2#3#4
+ {
+ \seq_set_from_clist:Nx \l__xsim_tmpa_seq
+ { \xsim_get_property:nnn {#1} {#2} {#3} }
+ \seq_map_inline:Nn \l__xsim_tmpa_seq {#4}
+ }
+\cs_generate_variant:Nn \xsim_foreach_exercise_tag:nnnn {oo}
+
+% #1: exercise type
+% #2: id
+% #3: tag type
+% #4: sep
+\cs_new_protected:Npn \xsim_exercise_tags_use:nnnn #1#2#3#4
+ {
+ \seq_set_from_clist:Nx \l__xsim_tmpa_seq
+ { \xsim_get_property:nnn {#1} {#2} {#3} }
+ \seq_use:Nn \l__xsim_tmpa_seq {#4}
+ }
+\cs_generate_variant:Nn \xsim_exercise_tags_use:nnnn {oo}
+
+% #1: exercise type
+% #2: id
+% #3: tag type
+% #4: sep between two
+% #5: sep between more than two
+% #6: sep between last two
+\cs_new_protected:Npn \xsim_exercise_tags_use:nnnnnn #1#2#3#4#5#6
+ {
+ \seq_set_from_clist:Nx \l__xsim_tmpa_seq
+ { \xsim_get_property:nnn {#1} {#2} {#3} }
+ \seq_use:Nnnn \l__xsim_tmpa_seq {#4} {#5} {#6}
+ }
+\cs_generate_variant:Nn \xsim_exercise_tags_use:nnnn {oo}
+\cs_generate_variant:Nn \xsim_exercise_tags_use:nnnnnn {oo}
+
+\XSIMmoduleend
+\XSIMmodule{goals}{counting of points and bonus points}
+
+\msg_new:nnn {xsim} {goal-unknown}
+ { The~ goal~ `#1'~ has~ never~ been~ declared~ \msg_line_context: }
+
+\seq_new:N \l__xsim_goals_seq
+\tl_new:N \l_xism_grading_table_template_tl
+\tl_new:N \l_xism_grading_table_exercise_type_tl
+
+% #1: name
+\cs_new_protected:Npn \xsim_declare_exercise_goal:n #1
+ {
+ \xsim_if_goal_exist:nF {#1}
+ {
+ \xsim_verbose:n { Declaring~ new~ goal~ `#1'. }
+ \xsim_declare_property:nnnn
+ { \c_false_bool } { \c_false_bool } { \c_false_bool } {#1}
+ \xsim_declare_property:nnnn
+ { \c_false_bool } { \c_false_bool } { \c_false_bool } {user#1}
+ \xsim_declare_property:nnnn
+ { \c_false_bool } { \c_false_bool } { \c_false_bool } {body#1}
+ \seq_put_right:Nn \l__xsim_goals_seq {#1}
+ \fp_gzero_new:c {g__xsim_goal_#1_fp}
+ \fp_new:c {l__xsim_temporary_#1_fp}
+ \bool_new:c {l__xsim_temporary_#1_bool}
+ \bool_new:c {l__xsim_goal_#1_given_bool}
+ \fp_gzero_new:c {l__xsim_current_goal_#1_fp}
+ \fp_if_exist:cF {g__xsim_total_goal_#1_fp}
+ { \fp_new:c {g__xsim_total_goal_#1_fp} }
+ \fp_if_exist:cF {g__xsim_total_goal_recorded_#1_fp}
+ { \fp_new:c {g__xsim_total_goal_recorded_#1_fp} }
+ \xsim_before_begin_document:n
+ {
+ \xsim_foreach_exercise_type:n
+ { \xsim_goal_init:nn {##1} {#1} }
+ }
+ }
+ }
+
+% #1: type
+% #2: goal
+\cs_new_protected:Npn \xsim_goal_init:nn #1#2
+ {
+ \fp_gzero_new:c {g__xsim_#1_goal_#2_fp}
+ \fp_if_exist:cF {g__xsim_total_#1_goal_#2_fp}
+ { \fp_new:c {g__xsim_total_#1_goal_#2_fp} }
+ }
+
+\prg_new_conditional:Npnn \xsim_if_goal_exist:n #1 {p,T,F,TF}
+ {
+ \seq_if_in:NnTF \l__xsim_goals_seq {#1}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+\prg_new_conditional:Npnn \xsim_if_goal_given:n #1 {p,T,F,TF}
+ {
+ \bool_if:cTF {l__xsim_goal_#1_given_bool}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+\cs_new_protected:Npn \xsim_goal_given:n #1
+ { \bool_set_true:c {l__xsim_goal_#1_given_bool} }
+
+% #1: exercise type
+% #2: id
+% #3: goal
+\cs_new_protected:Npn \xsim_update_goal:nnn #1#2#3
+ {
+ \xsim_if_goal_exist:nT {#3}
+ {
+ \fp_gadd:cn {g__xsim_goal_#3_fp}
+ { \xsim_get_property:nnn {#1} {#2} {#3} + 0 }
+ \fp_gadd:cn {g__xsim_#1_goal_#3_fp}
+ { \xsim_get_property:nnn {#1} {#2} {#3} + 0 }
+ }
+ }
+
+% #1: exercise type
+% #2: id
+\cs_new_protected:Npn \xsim_update_goals:nn #1#2
+ {
+ \xsim_foreach_goal:n
+ { \xsim_update_goal:nnn {#1} {#2} {##1} }
+ }
+\cs_generate_variant:Nn \xsim_update_goals:nn {nV}
+
+\cs_new_protected:Npn \xsim_foreach_goal:n #1
+ { \seq_map_inline:Nn \l__xsim_goals_seq {#1} }
+
+
+% #1: exercise type
+% #2: id
+% #3: goal
+% #4: value
+\cs_new_protected:Npn \xsim_addto_goal:nnnn #1#2#3#4
+ {
+ \xsim_if_goal_exist:nT {#3}
+ {
+ \xsim_verbose:n { Adding~ `#4'~ to~ `#3'~ goal~ of~ #1~ #2 }
+ \fp_set:Nn \l__xsim_tmpa_fp
+ { \xsim_get_property:nnn {#1} {#2} {body#3} + 0 + #4 }
+ \xsim_set_property:nnne {#1} {#2} {body#3}
+ { \fp_to_decimal:N \l__xsim_tmpa_fp }
+ }
+ }
+\cs_generate_variant:Nn \xsim_addto_goal:nnnn {xx,nVnx}
+
+% #1: exercise type
+% #2: id
+% #3: goal
+% #4: relation and value
+\prg_new_conditional:Npnn \xsim_if_goal_value:nnnn #1#2#3#4 {p,T,F,TF}
+ {
+ \fp_compare:nTF
+ { (0 + \xsim_get_property:nnn {#1} {#2} {#3}) #4 }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\cs_generate_variant:Nn \xsim_if_goal_value:nnnnTF {xx}
+
+% ----------------------------------------------------------------------------
+% a function which can be used to modify how the numbers of a goal are
+% printed:
+\cs_new_protected:Npn \__xsim_print_goal:n #1 {#1}
+\cs_generate_variant:Nn \__xsim_print_goal:n {x}
+
+% #1: value
+% #2: value == 1
+% #3: value != 1
+\cs_new_protected:Npn \xsim_print_goal:nnn #1#2#3
+ {
+ \__xsim_print_goal:x { \fp_to_decimal:n {#1} }
+ \fp_compare:nTF { (#1) = 1 } {#2} {#3}
+ }
+
+% #1: exercise type
+% #2: goal
+% #3: sum == 1
+% #4: sum != 1
+\cs_new_protected:Npn \xsim_print_goal_sum:nnnn #1#2#3#4
+ { \xsim_print_goal:nnn { \use:c {g__xsim_total_#1_goal_#2_fp} } {#3} {#4} }
+
+% #1: goal
+% #2: sum == 1
+% #3: sum != 1
+\cs_new_protected:Npn \xsim_print_total_goal_sum:nnn #1#2#3
+ { \xsim_print_goal:nnn { \use:c {g__xsim_total_goal_#1_fp} } {#2} {#3} }
+
+% ----------------------------------------------------------------------------
+% the same as the last to functions but for a list of goals:
+
+% #1: fp variable to be set
+% #2: list of goals (separated with +)
+% #3: function to be applied to goal names
+\cs_new_protected:Npn \__xsim_exercise_goals_sum_aux:Nnn #1#2#3
+ {
+ \seq_set_split:Nnn \l__xsim_tmpa_seq {+} {#2}
+ \seq_set_map:NNn \l__xsim_tmpb_seq \l__xsim_tmpa_seq {#3}
+ \fp_set:Nn #1 { \seq_use:Nn \l__xsim_tmpb_seq {+} }
+ }
+
+% #1: fp variable
+% #2: exercise type
+% #3: list of goals (separated with +)
+\cs_new_protected:Npn \__xsim_exercise_goals_sum:Nnn #1#2#3
+ {
+ \__xsim_exercise_goals_sum_aux:Nnn #1 {#3}
+ { \use:c {g__xsim_total_#2_goal_ \tl_trim_spaces:n {##1} _fp} }
+ }
+
+% #1: fp variable
+% #2: list of goals (separated with +)
+\cs_new_protected:Npn \__xsim_exercise_goals_sum:Nn #1#2
+ {
+ \__xsim_exercise_goals_sum_aux:Nnn #1 {#2}
+ { \use:c {g__xsim_total_goal_ \tl_trim_spaces:n {##1} _fp} }
+ }
+
+% #1: exercise type
+% #2: list of goals (separated with +)
+% #3: sum == 1
+% #4: sum != 1
+\cs_new_protected:Npn \xsim_print_goals_sum:nnnn #1#2#3#4
+ {
+ \__xsim_exercise_goals_sum:Nnn \l__xsim_tmpa_fp {#1} {#2}
+ \xsim_print_goal:nnn { \l__xsim_tmpa_fp } {#3} {#4}
+ }
+
+% #1: list of goals (separated with +)
+% #2: sum == 1
+% #3: sum != 1
+\cs_new_protected:Npn \xsim_print_total_goals_sum:nnn #1#2#3
+ {
+ \__xsim_exercise_goals_sum:Nn \l__xsim_tmpa_fp {#1}
+ \xsim_print_goal:nnn { \l__xsim_tmpa_fp } {#2} {#3}
+ }
+
+% ----------------------------------------------------------------------------
+% #1: exercise type
+% #2: goal
+% #3: relation and value
+\prg_new_conditional:Npnn \xsim_if_goal_sum:nnn #1#2#3 {p,T,F,TF}
+ {
+ \fp_compare:nTF
+ { ( \use:c {g__xsim_total_#1_goal_#2_fp} ) #3 }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+% #1: exercise type
+% #2: list of goals (separated with +)
+% #3: relation and value
+\prg_new_protected_conditional:Npnn \xsim_if_goals_sum:nnn #1#2#3 {T,F,TF}
+ {
+ \__xsim_exercise_goals_sum:Nnn \l__xsim_tmpa_fp {#1} {#2}
+ \fp_compare:nTF
+ { ( \l__xsim_tmpa_fp ) #3 }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+% #1: goal
+% #2: relation and value
+\prg_new_conditional:Npnn \xsim_if_total_goal_sum:nn #1#2 {p,T,F,TF}
+ {
+ \fp_compare:nTF
+ { ( \use:c {g__xsim_total_goal_#1_fp} ) #2 }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+% #1: list of goals (separated with +)
+% #2: relation and value
+\prg_new_protected_conditional:Npnn \xsim_if_total_goals_sum:nn #1#2 {T,F,TF}
+ {
+ \__xsim_exercise_goals_sum:Nn \l__xsim_tmpa_fp {#1}
+ \fp_compare:nTF
+ { ( \l__xsim_tmpa_fp ) #2 }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+% ----------------------------------------------------------------------------
+% #1: exercise type
+% #2: goal
+% #3: value
+\xsim_new_aux_property:cpn {goal} #1#2#3
+ { \fp_gset:cn {g__xsim_total_#1_goal_#2_fp} {#3} }
+
+% #1: goal
+% #2: value
+\xsim_new_aux_property:cpn {totalgoal} #1#2
+ { \fp_gset:cn {g__xsim_total_goal_#1_fp} {#2} }
+
+\xsim_at_begin_document:n
+ { \xsim_foreach_goal:n { \xsim_get_total_goal:n {#1} } }
+
+% #1: goal
+\cs_new_protected:Npn \xsim_get_total_goal:n #1
+ {
+ \fp_gset_eq:cc
+ {g__xsim_total_goal_recorded_#1_fp}
+ {g__xsim_total_goal_#1_fp}
+ }
+
+\xsim_at_end_document:n { \xsim_save_goals: }
+
+\cs_new_protected:Npn \xsim_save_goals:
+ {
+ \xsim_foreach_goal:n
+ {
+ \xsim_foreach_exercise_type:n
+ {
+ \xsim_add_property_to_aux:nn {goal}
+ { {####1} {##1} { \fp_to_decimal:c {g__xsim_####1_goal_##1_fp} } }
+ }
+ \tl_set:Nx \l__xsim_tmpa_tl
+ { \fp_to_decimal:c {g__xsim_total_goal_##1_fp} }
+ \tl_set:Nx \l__xsim_tmpb_tl
+ { \fp_to_decimal:c {g__xsim_total_goal_recorded_##1_fp} }
+ \tl_if_eq:NNF \l__xsim_tmpa_tl \l__xsim_tmpb_tl { \xsim_rerun: }
+ \xsim_add_property_to_aux:nn {totalgoal}
+ { {##1} { \fp_to_decimal:c {g__xsim_goal_##1_fp} } }
+ }
+ }
+
+% ----------------------------------------------------------------------------
+
+\keys_define:nn {xsim}
+ {
+ goal-print .code:n =
+ \cs_set_protected:Npn \__xsim_print_goal:n ##1 {#1} ,
+ grading-table/template .tl_set:N = \l_xism_grading_table_template_tl ,
+ grading-table/template .initial:n = default ,
+ grading-table/type .tl_set:N = \l_xism_grading_table_exercise_type_tl ,
+ grading-table/type .initial:n =
+ }
+
+\XSIMmoduleend
+\XSIMmodule{exercises}{main exercises definitions}
+
+\seq_new:N \l__xsim_exercise_types_seq
+\seq_new:N \l__xsim_parameters_seq
+\seq_new:N \l__xsim_fixed_parameters_seq
+\seq_new:N \l__xsim_mandatory_parameters_seq
+\int_gzero_new:N \g_xsim_id_int
+\int_gzero_new:N \g_xsim_max_id_int
+\tl_new:N \l_xsim_current_id_tl
+\tl_new:N \g_xsim_exercise_id_tl
+\tl_new:N \g_xsim_exercise_type_tl
+\tl_new:N \ExerciseID
+\tl_new:N \ExerciseType
+
+% ----------------------------------------------------------------------------
+
+\msg_new:nnn {xsim} {parameter-fixed}
+ {
+ You~ tried~ to~ set~ parameter~ `#2'~ for~ type~ `#1'~ \msg_line_context:
+ . ~ However,~ parameter~ `#2'~ is~ a~ fixed~ parameter~ that~ already~
+ has~ been~ set~ for~ type~ `#1'.~ Its~ value~ can't~ be~ changed!
+ }
+
+\msg_new:nnn {xsim} {type-exists}
+ {
+ You~ try~ to~ define~ exercise~ type~ `#1'~ \msg_line_context: .~
+ However,~ the~ exercise~ type~ `#1'~ already~ exists.
+ }
+
+\msg_new:nnn {xsim} {mandatory-parameter}
+ {
+ You~ forget~ to~ set~ the~ mandatory~ parameter~ `#1'~ when~ defining~
+ exercise~ type~ `#2'.
+ }
+
+\msg_new:nnn {xsim} {unknown-parameter}
+ {
+ You~ tried~ to~ retrieve~ the~ parameter~ `#1'~ \msg_line_context: . \\
+ This~ parameter~ does~ not~ exist.~ Check~ for~ a~ typo~ or~ \\
+ define~ the~ parameter~ yourself.
+ }
+
+\msg_new:nnn {xsim} {parameter-undefined}
+ {
+ You~ tried~ to~ set~ the~ parameter~ `#2'~ for~ exercise~ type~ `#1'~
+ \msg_line_context: . \\
+ This~ parameter~ does~ not~ exist.~ Check~ for~ a~ typo~ or~ \\
+ define~ the~ parameter~ yourself.
+ }
+
+\msg_new:nnn {xsim} {parameter-value}
+ {
+ A~ parameter~ needs~ to~ be~ set~ to~ a~ (possibly~ empty)~ value! \\
+ Not~ setting~ parameter~ `#2'~ for~ exercise~ type~ `#1'~
+ \msg_line_context: .
+ }
+
+% ----------------------------------------------------------------------------
+% #1: type
+% #2: parameter
+% #3: value
+\cs_new_protected:Npn \__xsim_set_parameter_type:nnn #1#2#3
+ { \xsim_attribute_set:nnn {#1} {#2} {#3} }
+
+% #1: type
+% #2: parameter
+\cs_new:Npn \xsim_get_parameter:nn #1#2
+ { \xsim_attribute_get:nn {#1} {#2} }
+\cs_generate_variant:Nn \xsim_get_parameter:nn {o}
+
+% #1: type
+% #2: parameter
+\prg_new_conditional:Npnn \xsim_if_parameter_set:nn #1#2 {p,T,F,TF}
+ {
+ \xsim_attribute_if_set:nnTF {#1} {#2}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+% ----------------------------------------------------------------------------
+
+\xsim_new_list:n {types}
+\xsim_new_list:n {idtypes}
+
+% #1: true|false (fixed parameter)
+% #2: true|false (mandatory parameter)
+% #3: parameter name
+\cs_new_protected:Npn \xsim_declare_parameter:nnn #1#2#3
+ {
+ \xsim_verbose:n { Declaring~ parameter~ `#3'. }
+ \xsim_if_parameter_exist:nF {#3}
+ {
+ \seq_put_right:Nn \l__xsim_parameters_seq {#3}
+ \bool_if:cT {c_#1_bool}
+ { \seq_put_right:Nn \l__xsim_fixed_parameters_seq {#3} }
+ \bool_if:cT {c_#2_bool}
+ { \seq_put_right:Nn \l__xsim_mandatory_parameters_seq {#3} }
+ }
+ }
+
+\cs_new_protected:Npn \xsim_remove_parameter:n #1
+ {
+ \xsim_verbose:n { Removing~ parameter~ `#1'. }
+ \xsim_if_parameter_exist:nT {#1}
+ { \seq_remove_all:Nn \l__xsim_parameters_seq {#1} }
+ }
+
+\prg_new_conditional:Npnn \xsim_if_parameter_exist:n #1 {p,T,F,TF}
+ {
+ \seq_if_in:NnTF \l__xsim_parameters_seq {#1}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\cs_generate_variant:Nn \xsim_if_parameter_exist:nT {x}
+
+\prg_new_conditional:Npnn \xsim_if_parameter_fixed:n #1 {p,T,F,TF}
+ {
+ \seq_if_in:NnTF \l__xsim_fixed_parameters_seq {#1}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+% #1: type
+% #2: csv list of parameters
+\cs_new_protected:Npn \xsim_set_parameters:nn #1#2
+ {
+ \cs_set_protected:Npn \__xsim_set_parameter:n ##1
+ { \msg_warning:nnnn {xsim} {parameter-value} {#1} {##1} }
+ \cs_set_protected:Npn \__xsim_set_parameter:nn ##1##2
+ { \xsim_set_parameter:nnn {#1} {##1} {##2} }
+ \keyval_parse:NNn
+ \__xsim_set_parameter:n
+ \__xsim_set_parameter:nn
+ {#2}
+ }
+\cs_generate_variant:Nn \xsim_set_parameters:nn {nx}
+
+% #1: type
+\cs_new_protected:Npn \xsim_check_mandatory_parameters:n #1
+ {
+ \seq_map_inline:Nn \l__xsim_mandatory_parameters_seq
+ {
+ \xsim_if_parameter_set:nnF {#1} {##1}
+ { \msg_error:nnnn {xsim} {mandatory-parameter} {##1} {#1} }
+ }
+ }
+
+% #1: type
+\prg_new_conditional:Npnn \xsim_if_type:n #1 {p,T,F,TF}
+ {
+ \seq_if_in:NnTF \l__xsim_exercise_types_seq {#1}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+% #1: type
+% #2: parameter
+% #3: value
+\cs_new_protected:Npn \xsim_set_parameter:nnn #1#2#3
+ {
+ \xsim_if_parameter_exist:nTF {#2}
+ {
+ \xsim_if_parameter_fixed:nTF {#1}
+ {
+ \xsim_if_parameter_set:nnTF {#1} {#2}
+ {
+ \msg_warning:nnnn {xsim} {parameter-fixed} {#1} {#2}
+ \xsim_verbose:n
+ {
+ Not~ setting~ already~ set~ and~ fixed~ parameter~ `#2'~
+ for~ type~ `#1'.
+ }
+ }
+ {
+ \xsim_verbose:n
+ { Setting~ parameter~ `#2'~ for~ type~ `#1'~ to~ `#3'. }
+ \__xsim_set_parameter_type:nnn {#1} {#2} {#3}
+ }
+ }
+ {
+ \xsim_verbose:n
+ { Setting~ parameter~ `#2'~ for~ type~ `#1'~ to~ `#3'. }
+ \__xsim_set_parameter_type:nnn {#1} {#2} {#3}
+ }
+ }
+ { \msg_error:nnnn {xsim} {parameter-undefined} {#1} {#2} }
+ }
+\cs_generate_variant:Nn \xsim_set_parameter:nnn {nnx,nxx}
+
+\cs_new:Npn \__xsim_get_parameter_tmp:n #1 {}
+\cs_generate_variant:Nn \__xsim_get_parameter_tmp:n {V}
+
+% #1: type
+% #2: parameter
+\cs_new_protected:Npn \xsim_get_parameter_if_set:nnTF #1#2#3#4
+ {
+ \group_begin:
+ \xsim_if_parameter_exist:nTF {#2}
+ {
+ \xsim_if_parameter_set:nnTF {#1} {#2}
+ {
+ \tl_set:Nx \ParameterValue
+ { \xsim_get_parameter:nn {#1} {#2} }
+ \cs_set:Npn \__xsim_get_parameter_tmp:n ##1 {#3}
+ \__xsim_get_parameter_tmp:V \ParameterValue
+ }
+ {#4}
+ }
+ { \msg_error:nnn {xsim} {unknown-parameter} {#2} }
+ \group_end:
+ }
+\cs_new_protected:Npn \xsim_get_parameter_if_set:nnT #1#2#3
+ { \xsim_get_parameter_if_set:nnTF {#1} {#2} {#3} {} }
+\cs_new_protected:Npn \xsim_get_parameter_if_set:nnF #1#2#3
+ { \xsim_get_parameter_if_set:nnTF {#1} {#2} {} {#3} }
+\cs_generate_variant:Nn \xsim_get_parameter_if_set:nnTF {o}
+
+% ----------------------------------------------------------------------------
+% inside the argument `#1' refers to the type
+\cs_new_protected:Npn \xsim_foreach_exercise_type:n #1
+ { \xsim_foreach_new_list_entry:nn {types} {#1} }
+
+\cs_new_protected:Npn \xsim_foreach_exercise_id:n #1
+ { \int_step_inline:nnnn {1} {1} { \g_xsim_max_id_int } {#1} }
+
+% #1: macro name
+% #2: 0 to 9 times `n' (= number of arguments of internal item)
+% #3: code; may contain a suiting \__xsim_loop_item:<nnn>
+\cs_new_protected:Npn \xsim_define_loop_macro:Nnn #1#2#3
+ {
+ \xsim_verbose:n { Defining~ loop~ macro~ #1 }
+ \cs_new_protected:Npn #1 ##1##2
+ { \cs_set:cn {__xsim_loop_item:#2} {##2} #3 }
+ }
+
+\cs_new:Npn \__xsim_loop_item:nnnnnn #1#2#3#4#5#6 {}
+\cs_generate_variant:Nn \__xsim_loop_item:nnnnnn {VVxxxx}
+
+% #1: type
+% #2: id
+% #3: boolean property
+\cs_new_protected:Npn \__xsim_deliver_exercise_details:nnn #1#2#3
+ {
+ \tl_if_blank:nTF {#3}
+ { \use:n }
+ { \xsim_if_in_list:nnT {#3} {#1-#2=={true}} }
+ {
+ \tl_set_rescan:Nnx \ExerciseType {} {#1}
+ \tl_set_rescan:Nnx \ExerciseID {} {#2}
+ \__xsim_loop_item:VVxxxx
+ \ExerciseType % #1
+ \ExerciseID % #2
+ { \xsim_get_property:nnn {#1} {#2} {counter} } % #3
+ { \xsim_get_property:nnn {#1} {#2} {subtitle} } % #4
+ { \xsim_get_property:nnn {#1} {#2} {points} } % #5
+ { \xsim_get_property:nnn {#1} {#2} {bonus-points} } % #6
+ }
+ }
+
+% #1: boolean property
+% #2: loop code
+\xsim_define_loop_macro:Nnn \xsim_foreach_exercise_type_id:nn
+ {nnnnnn}
+ {
+ \xsim_foreach_exercise_type:n
+ {
+ \xsim_foreach_exercise_id:n
+ { \__xsim_deliver_exercise_details:nnn {##1} {####1} {#1} }
+ }
+ }
+
+\xsim_define_loop_macro:Nnn \xsim_foreach_exercise_id_type:nn
+ {nnnnnn}
+ {
+ \xsim_foreach_exercise_id:n
+ {
+ \xsim_foreach_exercise_type:n
+ { \__xsim_deliver_exercise_details:nnn {####1} {##1} {#1} }
+ }
+ }
+
+\cs_new:Npn \__xsim_loop_item:nn #1#2 {}
+\cs_generate_variant:Nn \__xsim_loop_item:nn {VV}
+
+\xsim_define_loop_macro:Nnn \xsim_foreach_exercise:nn
+ {nn}
+ {
+ \cs_set:Npn \__xsim_tmpa:w ##1-##2 \q_stop {##1}
+ \cs_set:Npn \__xsim_tmpb:w ##1-##2 \q_stop {##2}
+ \seq_map_inline:cn {g_xsim_#1_order_seq}
+ {
+ \tl_set:Nx \l__xsim_tmpa_tl { \__xsim_tmpa:w ##1 \q_stop }
+ \tl_set:Nx \l__xsim_tmpb_tl { \__xsim_tmpb:w ##1 \q_stop }
+ \__xsim_loop_item:VV \l__xsim_tmpa_tl \l__xsim_tmpb_tl
+ }
+ }
+
+% ----------------------------------------------------------------------------
+\cs_new_protected:Npn \xsim_define_exercise_type_variables:n #1
+ {
+ \seq_put_right:Nn \l__xsim_exercise_types_seq {#1}
+ \bool_new:c {l__xsim_#1_solution_print_bool}
+ \bool_new:c {l__xsim_#1_exercise_print_bool}
+ \bool_new:c {l__xsim_#1_exercise_use_bool}
+ }
+
+\cs_new_protected:Npn \xsim_define_counters:n #1
+ {
+ \xsim_verbose:n { Defining~ counters~ for~ new~ exercise~ type~ `#1' }
+ \cs_if_exist:cF { c@ \xsim_get_parameter:nn {#1} {counter} }
+ { \newcounter { \xsim_get_parameter:nn {#1} {counter} } }
+ \cs_if_exist:cF { c@ \xsim_get_parameter:nn {#1} {solution-counter} }
+ { \newcounter { \xsim_get_parameter:nn {#1} {solution-counter} } }
+ \cs_if_exist:cF { c@ number of \xsim_get_parameter:nn {#1} {exercise-env} s }
+ { \newcounter { number of \xsim_get_parameter:nn {#1} {exercise-env} s } }
+ \xsim_if_parameter_set:nnT {#1} {within}
+ {
+ \counterwithin
+ { \xsim_get_parameter:nn {#1} {counter} }
+ { \xsim_get_parameter:nn {#1} {within} }
+ }
+ \xsim_if_parameter_set:nnT {#1} {the-counter}
+ {
+ \cs_set:cpx { the \xsim_get_parameter:nn {#1} {counter} }
+ { \xsim_get_parameter:nn {#1} {the-counter} }
+ }
+ }
+
+% #1: type
+% #2: id
+\cs_new_protected:Npn \xsim_step_exercise_counter:nn #1#2
+ {
+ \refstepcounter { \xsim_get_parameter:nn {#1} {counter} }
+ \xsim_set_properties:nne {#1} {#2}
+ {
+ counter = \use:c { the \xsim_get_parameter:nn {#1} {counter} } ,
+ counter-value = \arabic { \xsim_get_parameter:nn {#1} {counter} }
+ }
+ }
+\cs_generate_variant:Nn \xsim_step_exercise_counter:nn {nV}
+
+% #1: type
+\cs_new_protected:Npn \xsim_declare_exercise_type:nn #1#2
+ {
+ \xsim_if_type:nTF {#1}
+ { \msg_error:nnn {xsim} {type-exists} {#1} }
+ {
+ \xsim_verbose:n { Declaring~ new~ exercise~ type~ `#1'. }
+ \xsim_define_exercise_type_variables:n {#1}
+ \xsim_add_to_list:nn {types} {#1}
+ \xsim_set_parameters:nn {#1} {#2}
+ \xsim_set_parameter:nnx {#1} {number}
+ { number of \xsim_get_parameter:nn {#1} {exercise-env} s }
+ \xsim_check_mandatory_parameters:n {#1}
+ \xsim_if_parameter_set:nnF {#1} {exercises-name}
+ {
+ \xsim_set_parameters:nn {#1}
+ { exercises-name = \xsim_get_parameter:nn {#1} {exercise-name} s }
+ }
+ \xsim_if_parameter_set:nnF {#1} {solutions-name}
+ {
+ \xsim_set_parameters:nn {#1}
+ { solutions-name = \xsim_get_parameter:nn {#1} {solution-name} s }
+ }
+ \xsim_if_parameter_set:nnF {#1} {counter}
+ {
+ \xsim_set_parameters:nx {#1}
+ { counter = \xsim_get_parameter:nn {#1} {exercise-env} }
+ }
+ \xsim_if_parameter_set:nnF {#1} {solution-counter}
+ {
+ \xsim_set_parameters:nx {#1}
+ { solution-counter = \xsim_get_parameter:nn {#1} {solution-env} }
+ }
+ \xsim_define_counters:n {#1}
+ \xsim_verbose:n { Defining~ options~ for~ new~ exercise~ type~ `#1' }
+ \keys_define:nx {xsim}
+ {
+ \xsim_get_parameter:nn {#1} {solution-env} / print
+ .bool_set:N = \exp_not:c {l__xsim_#1_solution_print_bool} ,
+ \xsim_get_parameter:nn {#1} {solution-env} / print
+ .initial:n = false ,
+ \xsim_get_parameter:nn {#1} {exercise-env} / print
+ .bool_set:N = \exp_not:c {l__xsim_#1_exercise_print_bool} ,
+ \xsim_get_parameter:nn {#1} {exercise-env} / print
+ .initial:n = true ,
+ \xsim_get_parameter:nn {#1} {exercise-env} / use
+ .bool_set:N = \exp_not:c {l__xsim_#1_exercise_use_bool} ,
+ \xsim_get_parameter:nn {#1} {exercise-env} / use
+ .initial:n = true ,
+ \xsim_get_parameter:nn {#1} {exercise-env} / collect .choice: ,
+ \xsim_get_parameter:nn {#1} {exercise-env} / collect / true .code:n =
+ \keys_set:nn
+ { xsim / \xsim_get_parameter:nn {#1} {exercise-env} }
+ { use = false , print = false } ,
+ \xsim_get_parameter:nn {#1} {exercise-env} / collect / false .code:n =
+ \keys_set:nn
+ { xsim / \xsim_get_parameter:nn {#1} {exercise-env} }
+ { use = true , print = true } ,
+ \xsim_get_parameter:nn {#1} {exercise-env} / collect .default:n = true ,
+ \xsim_get_parameter:nn {#1} {exercise-env} / collect .initial:n = false ,
+ \xsim_get_parameter:nn {#1} {exercise-env} / within .code:n =
+ \exp_not:N \counterwithin { \xsim_get_parameter:nn {#1} {counter} } {####1},
+ \xsim_get_parameter:nn {#1} {exercise-env} / the-counter .code:n =
+ \cs_set:cpn {the \xsim_get_parameter:nn {#1} {counter} } {####1} ,
+ \xsim_get_parameter:nn {#1} {exercise-env} / template
+ .code:n = \xsim_set_parameter:nnn {#1} {exercise-template} {####1} ,
+ \xsim_get_parameter:nn {#1} {solution-env} / template
+ .code:n = \xsim_set_parameter:nnn {#1} {solution-template} {####1} ,
+ \xsim_get_parameter:nn {#1} {exercise-env} / name
+ .code:n = \xsim_set_parameter:nnn {#1} {exercise-name} {####1} ,
+ \xsim_get_parameter:nn {#1} {exercise-env} s / name
+ .code:n = \xsim_set_parameter:nnn {#1} {exercises-name} {####1} ,
+ \xsim_get_parameter:nn {#1} {solution-env} / name
+ .code:n = \xsim_set_parameter:nnn {#1} {solution-name} {####1} ,
+ \xsim_get_parameter:nn {#1} {solution-env} s / name
+ .code:n = \xsim_set_parameter:nnn {#1} {solutions-name} {####1} ,
+ \xsim_get_parameter:nn {#1} {exercise-env} / heading
+ .code:n = \xsim_set_parameter:nnn {#1} {exercise-heading} {####1} ,
+ \xsim_get_parameter:nn {#1} {solution-env} / heading
+ .code:n = \xsim_set_parameter:nnn {#1} {solution-heading} {####1}
+ }
+ \xsim_new_environment:nn {#1} {exercise}
+ \xsim_new_environment:nn {#1} {solution}
+ }
+ }
+
+% #1: type
+% #2: id
+\prg_new_conditional:Npnn \xsim_if_exercise_exist:nn #1#2 {T,F,TF}
+ {
+ \xsim_if_exist:nnnTF {#1} {#2} {exercise}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\cs_generate_variant:Nn \xsim_if_exercise_exist:nnT {VV}
+
+% ----------------------------------------------------------------------------
+% define boolean properties <do> and <done> (<done> is a noupdate property)
+% and the conditional:
+% \xsim_if_<do>:nnTF
+%
+% #1: <do>
+% #2: <done>
+\cs_new_protected:Npn \__xsim_new_exercise_mode:nn #1#2
+ {
+ % boolean:
+ \xsim_declare_property:nnnn
+ { \c_false_bool } { \c_true_bool } { \c_false_bool } {#1}
+ % boolean, noupdate:
+ \xsim_declare_property:nnnn
+ { \c_false_bool } { \c_true_bool } { \c_true_bool } {(#2)}
+ % boolean:
+ \xsim_declare_property:nnnn
+ { \c_false_bool } { \c_true_bool } { \c_false_bool } {#2}
+ % ##1: type
+ % ##2: id
+ % ##3: exercise|solution
+ \prg_new_protected_conditional:cpnn {xsim_if_#1:nnn} ##1##2##3 {T,F,TF}
+ {
+ \use:c {xsim_##3_if_#1:nnTF} {##1} {##2}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ }
+\cs_generate_variant:Nn \prg_new_protected_conditional:Npnn {c}
+\cs_generate_variant:Nn \prg_generate_conditional_variant:Nnn {c}
+
+\__xsim_new_exercise_mode:nn {use} {used}
+\__xsim_new_exercise_mode:nn {print} {printed}
+
+% #1: type
+% #2: options
+\cs_new_protected:Npn \xsim_exercise_setup:nn #1#2
+ {
+ \int_gincr:N \g_xsim_id_int
+ \int_compare:nF { \g_xsim_max_id_int > \g_xsim_id_int }
+ { \int_gset_eq:NN \g_xsim_max_id_int \g_xsim_id_int }
+ \tl_gset:Nx \g_xsim_exercise_id_tl { \int_use:N \g_xsim_id_int }
+ \tl_gset:Nn \g_xsim_exercise_type_tl {#1}
+ \xsim_add_to_list:nx {idtypes} { \g_xsim_exercise_id_tl == {#1} }
+ \xsim_foreach_goal:n
+ {
+ \xsim_if_property_set:nVnT {#1} \g_xsim_exercise_id_tl {##1}
+ {
+ \bool_set_true:c {l__xsim_temporary_##1_bool}
+ \fp_set:cn {l__xsim_temporary_##1_fp}
+ { \xsim_get_property:nVn {#1} \g_xsim_exercise_id_tl {##1} }
+ \xsim_unset_property:nVn {#1} \g_xsim_exercise_id_tl {##1}
+ }
+ }
+ \xsim_set_properties:nVe {#1} \g_xsim_exercise_id_tl
+ {
+ % properties set by the user:
+ \exp_not:n {#2} ,
+ % properties which need to have certain values:
+ id = \g_xsim_exercise_id_tl ,
+ printed = false ,
+ used = false
+ }
+ \xsim_foreach_goal:n
+ {
+ \xsim_if_property_set:nVnT {#1} \g_xsim_exercise_id_tl {##1}
+ {
+ \xsim_set_property:nVne {#1} \g_xsim_exercise_id_tl {user##1}
+ { \xsim_get_property:nVn {#1} \g_xsim_exercise_id_tl {##1} }
+ }
+ \bool_if:cT {l__xsim_temporary_##1_bool}
+ {
+ \xsim_set_property:nVne {#1} \g_xsim_exercise_id_tl {##1}
+ { \fp_to_decimal:c {l__xsim_temporary_##1_fp} }
+ }
+ }
+ }
+
+\prg_new_conditional:Npnn \xsim_exercise_if_use:nn #1#2 {T,F,TF}
+ {
+ \xsim_if_boolean_property:nnnTF {#1} {#2} {(used)}
+ { \prg_return_false: }
+ {
+ \xsim_if_insert_mode:TF
+ {
+ \xsim_if_property_set:nnnTF {#1} {#2} {use}
+ {
+ \xsim_if_boolean_property:nnnTF {#1} {#2} {use}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ {
+ \bool_if:cTF {l__xsim_#1_exercise_use_bool}
+ { \prg_return_false: }
+ { \prg_return_true: }
+ }
+ }
+ {
+ \xsim_if_property_set:nnnTF {#1} {#2} {use}
+ {
+ \xsim_if_boolean_property:nnnTF {#1} {#2} {use}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ {
+ \bool_if:cTF {l__xsim_#1_exercise_use_bool}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ }
+ }
+ }
+\prg_generate_conditional_variant:Nnn \xsim_exercise_if_use:nn {nV} {T,TF}
+
+% #1: type
+% #2: ID
+\cs_new_protected:Npn \xsim_exercise_use_setup:nn #1#2
+ {
+ \stepcounter { \xsim_get_parameter:nn {#1} {number} }
+ \xsim_step_exercise_counter:nn {#1} {#2}
+ \xsim_set_properties:nne {#1} {#2}
+ {
+ section-value = \arabic{section} ,
+ section = \thesection ,
+ page-value = \arabic{page} ,
+ sectioning =
+ { \cs_if_exist:NTF \thechapter { \arabic {chapter} } {0} }
+ { \arabic {section} }
+ { \arabic {subsection} }
+ { \arabic {subsubsection} }
+ { \arabic {paragraph} } ,
+ page = \thepage
+ }
+ \xsim_if_property_exist:nT {chapter}
+ {
+ \xsim_set_properties:nne {#1} {#2}
+ {
+ chapter-value = \arabic{chapter} ,
+ chapter = \thechapter
+ }
+ }
+ }
+\cs_generate_variant:Nn \xsim_exercise_use_setup:nn {nV}
+
+\prg_new_conditional:Npnn \xsim_exercise_if_print:nn #1#2 {T,F,TF}
+ {
+ \xsim_if_tagged:nnTF {#1} {#2}
+ {
+ \xsim_if_insert_mode:TF
+ { \prg_return_true: }
+ {
+ \bool_if:cTF {l__xsim_#1_exercise_print_bool}
+ {
+ \xsim_if_property_set:nnnTF {#1} {#2} {print}
+ {
+ \xsim_if_boolean_property:nnnTF {#1} {#2} {print}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ { \prg_return_true: }
+ }
+ {
+ \xsim_if_boolean_property:nnnTF {#1} {#2} {print}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ }
+ }
+ { \prg_return_false: }
+ }
+\prg_generate_conditional_variant:Nnn \xsim_exercise_if_print:nn {nV} {T,TF}
+
+% #1: type
+% #2: ID
+\cs_new_protected:Npn \xsim_exercise_print_setup:nn #1#2
+ {
+ \xsim_foreach_goal:n
+ {
+ \xsim_if_property_set:nnnT {#1} {#2} {body##1}
+ { \xsim_set_property:nnnn {#1} {#2} {body##1} {0} }
+ }
+ }
+\cs_generate_variant:Nn \xsim_exercise_print_setup:nn {nV}
+
+% #1: type
+% #2: options
+\cs_new_protected:Npn \xsim_start_exercise:nn #1#2
+ {
+ \xsim_if_insert_mode:F { \xsim_exercise_setup:nn {#1} {#2} }
+ \xsim_exercise_if_use:nVT {#1} \g_xsim_exercise_id_tl
+ { \xsim_exercise_use_setup:nV {#1} \g_xsim_exercise_id_tl }
+ \xsim_exercise_if_print:nVT {#1} \g_xsim_exercise_id_tl
+ { \xsim_exercise_print_setup:nV {#1} \g_xsim_exercise_id_tl }
+ \tl_set_eq:NN \ExerciseID \g_xsim_exercise_id_tl
+ \tl_set:Nn \ExerciseType {#1}
+ \xsim_verbose:x
+ { Starting~ exercise~ type~ `#1' with~ id~ ` \g_xsim_exercise_id_tl '. }
+ \xsim_if_insert_mode:F { \xsim_collect:nV {#1} \g_xsim_exercise_id_tl }
+ }
+
+% #1: type
+\cs_new_protected:Npn \xsim_stop_exercise:n #1
+ {
+ \tl_set_eq:NN \ExerciseID \g_xsim_exercise_id_tl
+ \tl_set:Nn \ExerciseType {#1}
+ \xsim_if_insert_mode:F
+ {
+ \xsim_foreach_goal:n
+ {
+ \xsim_if_property_set:nVnTF {#1} \g_xsim_exercise_id_tl {##1}
+ {
+ \fp_set:Nn \l__xsim_tmpa_fp
+ { \xsim_get_property:nVn {#1} \g_xsim_exercise_id_tl {body##1} + 0 }
+ \fp_set:Nn \l__xsim_tmpb_fp
+ { \xsim_get_property:nVn {#1} \g_xsim_exercise_id_tl {user##1} + 0 }
+ \fp_set:Nn \l__xsim_tmpa_fp { \l__xsim_tmpa_fp + \l__xsim_tmpb_fp }
+ \xsim_set_property:nVne {#1} \g_xsim_exercise_id_tl {##1}
+ { \fp_to_decimal:N \l__xsim_tmpa_fp }
+ }
+ {
+ \xsim_if_property_set:nVnT {#1} \g_xsim_exercise_id_tl {body##1}
+ { \xsim_set_property:nVnn {#1} \g_xsim_exercise_id_tl {##1} {0} }
+ }
+ }
+ }
+ \xsim_exercise_if_print:nVT {#1} \g_xsim_exercise_id_tl
+ {
+ \xsim_set_property:nVnn {#1} \g_xsim_exercise_id_tl {(printed)} {true}
+ \xsim_set_property:nVnn {#1} \g_xsim_exercise_id_tl {printed} {true}
+ }
+ \xsim_exercise_if_use:nVT {#1} \g_xsim_exercise_id_tl
+ {
+ \xsim_set_property:nVnn {#1} \g_xsim_exercise_id_tl {(used)} {true}
+ \xsim_set_property:nVnn {#1} \g_xsim_exercise_id_tl {used} {true}
+ \xsim_update_goals:nV {#1} \g_xsim_exercise_id_tl
+ }
+ }
+
+% ----------------------------------------------------------------------------
+
+\xsim_new_aux_property:cpn {total-number} #1
+ { \int_gset:Nn \g_xsim_max_id_int {#1} }
+
+\hook_gput_code:nnn {begindocument/before} {xsim}
+ {
+ \xsim_foreach_exercise_type:n
+ {
+ \tl_new:c { number of #1 s }
+ \tl_gset:cn { number of #1 s } {0}
+ \xsim_new_aux_property:cpn {#1} ##1
+ { \tl_gset:cn { number of #1 s } {##1} }
+ }
+ }
+
+\xsim_at_begin_document:n
+ {
+ \xsim_foreach_exercise_type:n
+ {
+ \xsim_write_to_aux:x
+ { \token_to_str:N \providecommand \token_to_str:N \numberof #1 s {} }
+ }
+ }
+
+\xsim_at_end_document:n
+ {
+ \xsim_if_clear_aux:T
+ {
+ \int_compare:nNnF { \g_xsim_max_id_int } = { \g_xsim_id_int }
+ { \xsim_empty_lists: }
+ }
+ \xsim_add_property_to_aux:nn {total-number} { { \int_use:N \g_xsim_id_int } }
+ \xsim_foreach_exercise_type:n
+ {
+ \xsim_add_property_to_aux:nn {#1}
+ { { \arabic { \xsim_get_parameter:nn {#1} {number} } } }
+ }
+ \xsim_update_list:n {types}
+ \xsim_update_list:n {idtypes}
+ }
+
+\XSIMmoduleend
+\XSIMmodule{solutions}{managing solutions}
+
+\bool_new:N \l_xsim_inside_solution_bool
+\bool_new:N \l__xsim_include_question_bool
+\bool_new:N \l__xsim_printsolutions_headings_bool
+\bool_new:N \l__xsim_printsolutions_conditions_bool
+\bool_new:N \l____xsim_this_condition_bool
+
+\seq_new:N \l__xsim_printsolutions_conditions_seq
+
+\int_new:N \l_xsim_printsolutions_section_int
+\int_new:N \l_xsim_printsolutions_chapter_int
+
+\tl_new:N \l__xsim_printsolutions_headings_template_tl
+\tl_new:N \ExerciseSection
+\tl_new:N \ExerciseChapter
+\tl_new:N \l__xsim_printsolutions_collection_tl
+
+% ----------------------------------------------------------------------------
+
+\prg_new_conditional:Npnn \xsim_if_inside_solution: {p,T,F,TF}
+ {
+ \bool_if:NTF \l_xsim_inside_solution_bool
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+\prg_new_conditional:Npnn \xsim_if_solution_print:n #1 {p,T,F,TF}
+ {
+ \bool_if:cTF {l__xsim_#1_solution_print_bool}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+\bool_new:N \l____xsim_print_bool
+
+% #1: type
+% #2: id
+\prg_new_protected_conditional:Npnn \xsim_solution_if_print:nn #1#2 {T,F,TF}
+ {
+ \bool_set_true:N \l____xsim_print_bool
+ \xsim_if_tagged:nnF {#1} {#2}
+ { \bool_set_false:N \l____xsim_print_bool }
+ \xsim_if_boolean_property:nnnF {#1} {#2} {(used)}
+ { \bool_set_false:N \l____xsim_print_bool }
+ \bool_if:cF {l__xsim_#1_solution_print_bool}
+ { \bool_set_false:N \l____xsim_print_bool }
+ \bool_if:NTF \l____xsim_print_bool
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\cs_generate_variant:Nn \xsim_solution_if_print:nnT {nV,oo}
+
+% #1: type
+% #2: id
+\prg_new_protected_conditional:Npnn \xsim_if_solution_exist:nn #1#2 {T,F,TF}
+ {
+ \xsim_if_boolean_property:nnnTF {#1} {#2} {solution}
+ { \xsim_if_exist:nnnTF {#1} {#2} {exercise} }
+ { \xsim_if_exist:nnnTF {#1} {#2} {solution} }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\cs_generate_variant:Nn \xsim_if_solution_exist:nnT {VV,oo}
+\cs_generate_variant:Nn \xsim_if_solution_exist:nnTF {oo}
+
+% #1: type
+% #2: options
+\cs_new_protected:Npn \xsim_start_solution:nn #1#2
+ {
+ \keys_set:xn { xsim/\xsim_get_parameter:nn {#1} {solution-env} } {#2}
+ \bool_set_true:N \l_xsim_inside_solution_bool
+ \refstepcounter { \xsim_get_parameter:nn {#1} {solution-counter} }
+ }
+
+\cs_new_protected:Npn \xsim_stop_solution:n #1 {}
+
+% ----------------------------------------------------------------------------
+
+% #1: conditional base function (three n args)
+% #2: name
+% #3: code (refer to type and id with `#1' and `#2'), #3 refers to the boolean
+% properties use/print
+\cs_new_protected:Npn \xsim_new_solutions_condition:Nnn #1#2#3
+ {
+ \prg_new_protected_conditional:Npnn #1 ##1##2##3 {T,F,TF}
+ {
+ \xsim_if_in_list:nnTF {##3} {##1-##2=={true}}
+ {
+ \__xsim_printsolutions_if_condition:nTF {#2}
+ { \__xsim_printsolutions_condition_true: #3 }
+ { \prg_return_false: }
+ }
+ { \prg_return_false: }
+ }
+ }
+
+% per section condition:
+\xsim_new_solutions_condition:Nnn \__xsim_if_solutions_per_section:nnn
+ {per-section}
+ {
+ \xsim_if_in_list:nxTF {section-value}
+ { #1-#2 == { \int_use:N \l_xsim_printsolutions_section_int } }
+ {
+ \tl_set:Nx \ExerciseSection
+ { \xsim_get_property:nnn {#1} {#2} {section} }
+ \prg_return_true:
+ }
+ { \prg_return_false: }
+ }
+
+% per chapter condition:
+\xsim_new_solutions_condition:Nnn \__xsim_if_solutions_per_chapter:nnn
+ {per-chapter}
+ {
+ \xsim_if_in_list:nxTF {chapter-value}
+ { #1-#2 == { \int_use:N \l_xsim_printsolutions_chapter_int } }
+ {
+ \tl_set:Nx \ExerciseChapter
+ { \xsim_get_property:nnn {#1} {#2} {chapter} }
+ \prg_return_true:
+ }
+ { \prg_return_false: }
+ }
+
+% per collection condition:
+\xsim_new_solutions_condition:Nnn \__xsim_if_solutions_in_collection:nnn
+ {per-collection}
+ {
+ \tl_if_blank:VTF \l__xsim_printsolutions_collection_tl
+ { \prg_return_false: }
+ {
+ \xsim_if_in_collection:VnnTF
+ \l__xsim_printsolutions_collection_tl
+ {#1}
+ {#2}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ }
+
+% ----------------------------------------------------------------------------
+% conditions mechanism
+\cs_new_protected:Npn \__xsim_printsolutions_condition_false:
+ { \bool_set_false:N \l__xsim_printsolutions_conditions_bool }
+
+\cs_new_protected:Npn \__xsim_printsolutions_condition_true:
+ { \bool_set_true:N \l__xsim_printsolutions_conditions_bool }
+
+% #1: type
+% #2: id
+% #3: boolean property
+\prg_new_conditional:Npnn
+ \__xsim_printsolutions_if_conditions:nnn #1#2#3 {T,F,TF}
+ {
+ \bool_if:NTF \l__xsim_printsolutions_conditions_bool
+ { \prg_return_true: }
+ {
+ \xsim_if_in_list:nnTF {#3} {#1-#2=={true}}
+ { \prg_return_false: }
+ { \prg_return_true: }
+ }
+ }
+
+% #1: name
+% #2: condition
+\cs_new_protected:Npn \xsim_declare_printsolutions_condition:nn #1#2
+ {
+ \bool_new:c {l__xsim_printsolutions_#1_condition_bool}
+ \seq_put_right:Nn \l__xsim_printsolutions_conditions_seq {#1}
+ \xsim_attribute_set:nnn {printsolutions} {#1} {#2}
+ }
+
+\prg_new_conditional:Npnn \__xsim_printsolutions_if_condition:n #1 {T,F,TF}
+ {
+ \bool_if:cTF {l__xsim_printsolutions_#1_condition_bool}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+% #1: name
+% #2: true|false
+\cs_new_protected:Npn \__xsim_printsolutions_condition:nn #1#2
+ { \bool_set_eq:cc {l__xsim_printsolutions_#1_condition_bool} {c_#2_bool} }
+
+% false if any condition is false for this solution:
+% #1: type
+% #2: id
+% #3: boolean property
+\prg_new_protected_conditional:Npnn
+ \__xsim_printsolutions_check_conditions:nnn #1#2#3 {T,F,TF}
+ {
+ \__xsim_printsolutions_condition_false:
+ \bool_set_true:N \l____xsim_this_condition_bool
+ \seq_map_inline:Nn \l__xsim_printsolutions_conditions_seq
+ {
+ \bool_if:cT {l__xsim_printsolutions_##1_condition_bool}
+ {
+ \xsim_attribute_get:nn {printsolutions} {##1}
+ {#1} {#2} {#3}
+ { }
+ { \bool_set_false:N \l____xsim_this_condition_bool }
+ }
+ }
+ \bool_if:NTF \l____xsim_this_condition_bool
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+
+% #1: type
+% #2: id
+% #3: boolean property
+% #4: code
+\cs_new_protected:Npn \xsim_if_this_solution_do:nnnn #1#2#3#4
+ {
+ \xsim_if_solution_exist:nnT {#1} {#2}
+ { \__xsim_printsolutions_check_conditions:nnnT {#1} {#2} {#3} {#4} }
+ }
+\cs_generate_variant:Nn \xsim_if_this_solution_do:nnnn {nV}
+
+% #1: type
+% #2: boolean property
+% #3: code
+\cs_new_protected:Npn \xsim_if_solutions_do:nnn #1#2#3
+ {
+ \xsim_foreach_exercise:nn {#2}
+ {
+ \str_if_eq:nnT {#1} {##1}
+ {
+ \xsim_if_this_solution_do:nnnn
+ {#1}
+ {##2}
+ {#2}
+ {#3}
+ }
+ }
+ }
+\cs_generate_variant:Nn \str_if_eq:nnT {nV}
+
+% ----------------------------------------------------------------------------
+% #1: boolean -- if true only the solutions of printed exercises will be
+% output
+% #2: pre
+% #3: post
+% #4: type
+% #5: code (refer to type with #1 and id with #2)
+\cs_new_protected:Npn \xsim_print_type_code:nnnnn #1#2#3#4#5
+ {
+ \group_begin:
+ \cs_set_protected:Npn \__xsim_print_entry:nn ##1##2 {#5}
+ #2
+ \bool_set_false:N \l__xsim_tmpa_bool
+ \bool_if:nTF {#1}
+ {
+ \xsim_if_solutions_do:nnn {#4} {printed}
+ { \bool_set_true:N \l__xsim_tmpa_bool }
+ }
+ {
+ \xsim_if_solutions_do:nnn {#4} {used}
+ { \bool_set_true:N \l__xsim_tmpa_bool }
+ }
+ \tl_set:Nn \ExerciseType {#4}
+ \bool_if:NT \l__xsim_tmpa_bool
+ {
+ \bool_if:NT \l__xsim_printsolutions_headings_bool
+ {
+ \xsim_use_template:nV
+ {heading}
+ \l__xsim_printsolutions_headings_template_tl
+ }
+ }
+ \bool_if:nTF {#1}
+ {
+ \xsim_if_solutions_do:nnn {#4} {printed}
+ { \__xsim_print_entry:nn {#4} {##2} }
+ }
+ {
+ \xsim_if_solutions_do:nnn {#4} {used}
+ { \__xsim_print_entry:nn {#4} {##2} }
+ }
+ #3
+ \group_end:
+ }
+
+% #1: boolean -- if true only the solutions of printed exercises will be
+% output
+% #2: options
+% #3: type
+\cs_new_protected:Npn \xsim_print_type_solutions:nnn #1#2#3
+ {
+ \xsim_print_type_code:nnnnn
+ {#1}
+ {
+ \xsim_verbose:n
+ { Printing~ solutions~ for~ exercise~ type~ `#3'. }
+ \keys_set:nn {xsim/print-solutions} {#2}
+ }
+ {}
+ {#3}
+ { \xsim_insert:nnnn {##1} {##2} {} {solution} }
+ }
+
+% #1: boolean -- if true only the solutions of printed exercises will be
+% output
+% #2: options
+\cs_new_protected:Npn \xsim_print_all_solutions_per_type:nn #1#2
+ {
+ \xsim_foreach_exercise_type:n
+ { \xsim_print_type_solutions:nnn {#1} {#2} {##1} }
+ }
+
+% #1: boolean -- if true only the solutions of printed exercises will be
+% output
+% #2: options
+\cs_new_protected:Npn \xsim_print_all_solutions_per_id:nn #1#2
+ {
+ \xsim_verbose:n { Printing~ solutions. }
+ \group_begin:
+ \keys_set:nn {xsim/print-solutions} {#2}
+ \bool_set_false:N \l__xsim_tmpa_bool
+ \bool_if:nTF {#1}
+ {
+ \xsim_foreach_exercise_id_type:nn {print}
+ {
+ \xsim_if_this_solution_do:nnnn {##1} {##2} {print}
+ { \xsim_insert:nnnn {##1} {##2} {} {solution} }
+ }
+ }
+ {
+ \xsim_foreach_exercise_id_type:nn {used}
+ {
+ \xsim_if_this_solution_do:nnnn {##1} {##2} {used}
+ { \xsim_insert:nnnn {##1} {##2} {} {solution} }
+ }
+ }
+ \group_end:
+ }
+
+% ----------------------------------------------------------------------------
+
+\xsim_declare_printsolutions_condition:nn {per-section}
+ { \__xsim_if_solutions_per_section:nnnTF }
+\xsim_declare_printsolutions_condition:nn {per-chapter}
+ { \__xsim_if_solutions_per_chapter:nnnTF }
+\xsim_declare_printsolutions_condition:nn {per-collection}
+ { \__xsim_if_solutions_in_collection:nnnTF }
+
+% ----------------------------------------------------------------------------
+
+\keys_define:nn {xsim/print-solutions}
+ {
+ headings .bool_set:N = \l__xsim_printsolutions_headings_bool ,
+ headings .initial:n = true ,
+ headings-template .tl_set:N = \l__xsim_printsolutions_headings_template_tl ,
+ headings-template .initial:n = default ,
+ include-exercise .bool_set:N = \l__xsim_include_question_bool ,
+ include-exercise .initial:n = false ,
+ section .choice: ,
+ section/true .code:n =
+ \__xsim_printsolutions_condition:nn {per-section} {true}
+ \int_set:Nn \l_xsim_printsolutions_section_int { \value {section} } ,
+ section/false .code:n =
+ \__xsim_printsolutions_condition:nn {per-section} {false} ,
+ section/unknown .code:n =
+ \__xsim_printsolutions_condition:nn {per-section} {true}
+ \int_set:Nn \l_xsim_printsolutions_section_int {#1} ,
+ section .default:n = true ,
+ section .initial:n = false ,
+ chapter .choice: ,
+ chapter/true .code:n =
+ \__xsim_printsolutions_condition:nn {per-chapter} {true}
+ \int_set:Nn \l_xsim_printsolutions_chapter_int { \value {chapter} } ,
+ chapter/false .code:n =
+ \__xsim_printsolutions_condition:nn {per-chapter} {false} ,
+ chapter/unknown .code:n =
+ \__xsim_printsolutions_condition:nn {per-chapter} {true}
+ \int_set:Nn \l_xsim_printsolutions_chapter_int {#1} ,
+ chapter .default:n = true ,
+ chapter .initial:n = false ,
+ collection .choice: ,
+ collection/false .code:n =
+ \__xsim_printsolutions_condition:nn {per-collection} {false} ,
+ collection/unknown .code:n =
+ \xsim_if_collection_exist:nT {#1}
+ {
+ \__xsim_printsolutions_condition:nn {per-collection} {true}
+ \tl_set:Nn \l__xsim_printsolutions_collection_tl {#1}
+ } ,
+ collection .initial:n = false
+ }
+
+\XSIMmoduleend
+\XSIMmodule{collections}{collect exercises and print collected exercises}
+
+\seq_new:N \g__xsim_collections_seq
+\bool_new:N \l____xsim_active_bool
+
+\msg_new:nnn {xsim} {collection-exists}
+ {
+ The~ collection~ `#1'~ you're~ trying~ to~ define~ \msg_line_context:
+ \c_space_tl already~ exists.
+ }
+
+\msg_new:nnn {xsim} {collection-unknown}
+ {
+ The~ collection~ `#1'~ does~ not~ seem~ to~ exist~ \msg_line_context: .
+ If~ this~ is~ not¨ a~ typo~ define~ it~ first.
+ }
+
+\msg_new:nnn {xsim} {collection-activate}
+ {
+ The~ collection~ `#1'~ is~ already~ active~ \msg_line_context: .~
+ Not~ activating~ it~ now.
+ }
+
+\msg_new:nnn {xsim} {collection-deactivate}
+ {
+ The~ collection~ `#1'~ is~ not~ active~ \msg_line_context: .~
+ Not~ deactivating~ it~ now.
+ }
+
+\msg_new:nnn {xsim} {print-collection-choice}
+ {
+ The~ choice~ `#1'~ neither~ exists~ for~ `print-collection/print'~ nor~
+ for~ `random/print'.~ I'm~ using~ `exercises'~ instead~ \msg_line_context: .
+ }
+
+% ----------------------------------------------------------------------------
+\xsim_declare_property:nnnn
+ { \c_false_bool }
+ { \c_false_bool }
+ { \c_false_bool }
+ {collections}
+
+% #1: collection name
+% #2: conditions: clist of <tag>=<value>
+\cs_new_protected:Npn \xsim_new_collection:nn #1#2
+ {
+ \xsim_if_collection_exist:nTF {#1}
+ { \msg_error:nnn {xsim} {collection-exists} {#1} }
+ {
+ \xsim_verbose:n { Declaring~ new~ collection~ `#1'. }
+ \xsim_attribute_new:nn {collection} {#1}
+ \xsim_attribute_set:nnn {collection} {#1} { \c_false_bool }
+ \xsim_attribute_new:nn {collection:conditions} {#1}
+ \xsim_attribute_set:nnn {collection:conditions} {#1} {#2}
+ \seq_gput_right:Nn \g__xsim_collections_seq {#1}
+ \xsim_new_list:n {collection:#1}
+ \xsim_at_end_document:n
+ { \xsim_update_list:n {collection:#1} }
+ }
+ }
+
+% #1: collection name
+\prg_new_conditional:Npnn \xsim_if_collection_exist:n #1 {T,F,TF}
+ {
+ \seq_if_in:NnTF \g__xsim_collections_seq {#1}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+\cs_new_protected:Npn \xsim_foreach_collection:n #1
+ { \seq_map_inline:Nn \g__xsim_collections_seq {#1} }
+
+\cs_new:Npn \xsim_collection_map_break: { \seq_map_break: }
+
+% ----------------------------------------------------------------------------
+% #1: collection name
+\prg_new_conditional:Npnn \xsim_if_collection_active:n #1 {T,F,TF}
+ {
+ \xsim_attribute_if_set:nnTF {collection} {#1}
+ {
+ \bool_if:nTF
+ { \xsim_attribute_get:nn {collection} {#1} }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ { \prg_return_false: }
+ }
+
+% #1: collection name
+\cs_new_protected:Npn \xsim_activate_collection:n #1
+ {
+ \xsim_if_collection_exist:nTF {#1}
+ {
+ \xsim_if_collection_active:nTF {#1}
+ { \msg_warning:nnn {xsim} {collection-activate} {#1} }
+ {
+ \xsim_verbose:n { Activating~ collection~ `#1'. }
+ \xsim_attribute_set:nnn {collection} {#1} { \c_true_bool }
+ }
+ }
+ { \msg_error:nnn {xsim} {collection-unknown} {#1} }
+ }
+
+% #1: collection name
+\cs_new_protected:Npn \xsim_deactivate_collection:n #1
+ {
+ \xsim_if_collection_exist:nTF {#1}
+ {
+ \xsim_if_collection_active:nTF {#1}
+ {
+ \xsim_verbose:n { Deactivating~ collection~ `#1'. }
+ \xsim_attribute_set:nnn {collection} {#1} { \c_false_bool }
+ }
+ { \msg_warning:nnn {xsim} {collection-deactivate} {#1} }
+ }
+ { \msg_error:nnn {xsim} {collection-unknown} {#1} }
+ }
+
+% #1: csv list of collections
+% #2: type
+\cs_new_protected:Npn \xsim_collect_type_start:nn #1#2
+ {
+ \group_begin:
+ \keys_set:nn {xsim} { #2/collect = true }
+ \clist_map_inline:nn {#1}
+ {
+ \xsim_if_collection_active:nF {##1}
+ { \xsim_activate_collection:n {##1} }
+ }
+ }
+
+% #1: csv list of collections
+\cs_new_protected:Npn \xsim_collect_start:n #1
+ {
+ \group_begin:
+ \xsim_foreach_exercise_type:n
+ {
+ \keys_set:nx {xsim}
+ { \xsim_get_parameter:nn {##1} {exercise-env} / collect = true }
+ }
+ \clist_map_inline:nn {#1}
+ {
+ \xsim_if_collection_active:nF {##1}
+ { \xsim_activate_collection:n {##1} }
+ }
+ }
+
+% #1: csv list of collections
+\cs_new_protected:Npn \xsim_collect_stop:n #1
+ {
+ \clist_map_inline:nn {#1} { \xsim_deactivate_collection:n {##1} }
+ \group_end:
+ }
+
+\keys_define:nn {xsim}
+ {
+ collect .code:n =
+ \xsim_foreach_exercise_type:n
+ {
+ \keys_set:nx {xsim}
+ { \xsim_get_parameter:nn {##1} {exercise-env} / collect = #1 }
+ } ,
+ collect .default:n = true ,
+ collect .initial:n = false
+ }
+
+% ----------------------------------------------------------------------------
+% #1: collection name
+% #2: type
+% #3: ID
+\prg_new_conditional:Npnn \xsim_if_in_collection:nnn #1#2#3 {T,F,TF}
+ {
+ \xsim_if_in_list:nnTF {collection:#1} {#2-#3}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\cs_generate_variant:Nn \xsim_if_in_collection:nnnTF {V}
+\cs_generate_variant:Nn \xsim_if_in_collection:nnnT {x,nV}
+
+\cs_new:Npn \xsim_collection_count:n #1
+ { \xsim_list_count:n {collection:#1} }
+
+\bool_new:N \l____xsim_collection_condition_bool
+
+% #1: collection name
+% #2: type
+% #3: ID
+\prg_new_protected_conditional:Npnn \xsim_collection_conditions_if:nnn #1#2#3 {T,F,TF}
+ {
+ \bool_set_false:N \l____xsim_collection_condition_bool
+ \clist_set:Nx \l__xsim_tmpa_clist
+ { \xsim_attribute_get:nn {collection:conditions} {#1} }
+ \clist_if_empty:NTF \l__xsim_tmpa_clist
+ { \bool_set_true:N \l____xsim_collection_condition_bool }
+ {
+ \clist_map_inline:Vn
+ \l__xsim_tmpa_clist
+ {
+ \tl_set:Nx \l__xsim_tmpa_tl
+ { \__xsim_get_condition_tag:w ##1 \q_stop }
+ \tl_set:Nx \l__xsim_tmpb_tl
+ { \__xsim_get_condition_values:w ##1 \q_stop }
+ \xsim_if_tag_type_exist:VTF \l__xsim_tmpa_tl
+ {
+ \xsim_has_tags:nnVVT {#2} {#3} \l__xsim_tmpa_tl \l__xsim_tmpb_tl
+ {
+ \bool_set_true:N \l____xsim_collection_condition_bool
+ \clist_map_break:
+ }
+ }
+ { \msg_warning:nnV {xsim} {tag-unknown} \l__xsim_tmpa_tl }
+ }
+ }
+ \bool_if:NTF \l____xsim_collection_condition_bool
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+\cs_new:Npn \__xsim_get_condition_tag:w #1=#2 \q_stop {#1}
+\cs_new:Npn \__xsim_get_condition_values:w #1=#2 \q_stop {#2}
+
+% #1: type
+% #2: ID
+\cs_new_protected:Npn \xsim_collect:nn #1#2
+ {
+ \xsim_foreach_collection:n
+ {
+ \xsim_if_collection_active:nT {##1}
+ {
+ \xsim_collection_conditions_if:nnnT {##1} {#1} {#2}
+ { \xsim_add_to_collection:nnn {##1} {#1} {#2} }
+ }
+ }
+ }
+\cs_generate_variant:Nn \xsim_collect:nn {nV}
+
+% #1: collection name
+% #2: type
+% #3: ID
+\cs_new_protected:Npn \xsim_add_to_collection:nnn #1#2#3
+ {
+ \xsim_verbose:n
+ { Adding~ exercise~ type~ `#2'~ ID~ `#3'~ to~ collection~ `#1'. }
+ \clist_set:Nx \l__xsim_tmpa_clist
+ { \xsim_get_property:nnn {#2} {#3} {collections} }
+ \clist_if_in:NnF \l__xsim_tmpa_clist {#1}
+ { \clist_put_right:Nn \l__xsim_tmpa_clist {#1} }
+ \xsim_set_property:nnnV {#2} {#3} {collections} \l__xsim_tmpa_clist
+ \xsim_add_to_list:nn {collection:#1} {#2-#3}
+ }
+
+% ----------------------------------------------------------------------------
+\bool_new:N \l__xsim_printcollection_headings_bool
+\tl_new:N \l__xsim_printcollection_headings_template_tl
+\tl_new:N \l__xsim_print_collection_choice_tl
+
+\keys_define:nn {xsim/print-collection}
+ {
+ headings .bool_set:N = \l__xsim_printcollection_headings_bool ,
+ headings .initial:n = false ,
+ headings-template .tl_set:N = \l__xsim_printcollection_headings_template_tl ,
+ headings-template .initial:n = collection ,
+ print .tl_set:N = \l__xsim_print_collection_choice_tl ,
+ print .initial:n = exercises
+ }
+
+% #1: options
+% #2: collection name
+\cs_new_protected:Npn \xsim_print_collection:nn #1#2
+ {
+ \group_begin:
+ \keys_set:nn {xsim/print-collection} {#1}
+ \clist_clear:N \l__xsim_tmpa_clist
+ \clist_clear:N \l__xsim_tmpb_clist
+ \xsim_foreach_exercise_type_id:nn {}
+ {
+ \xsim_get_property_if_set:nnnT {##1} {##2} {collections}
+ {
+ \clist_if_in:NnT \l_xsim_property_value_tl {#2}
+ {
+ \str_set:Nn \l__xsim_tmpa_str {##1}
+ \clist_put_right:NV \l__xsim_tmpa_clist \l__xsim_tmpa_str
+ \clist_put_right:Nn \l__xsim_tmpb_clist {##2}
+ }
+ }
+ }
+ \xsim_foreach_exercise_type:n
+ {
+ \bool_if:NT \l__xsim_printcollection_headings_bool
+ {
+ \clist_if_in:NnT \l__xsim_tmpa_clist {##1}
+ {
+ \tl_set:Nn \ExerciseType {##1}
+ \xsim_use_template:nV
+ {heading}
+ \l__xsim_printcollection_headings_template_tl
+ }
+ }
+ \clist_map_inline:Nn \l__xsim_tmpa_clist
+ {
+ \str_if_eq:nnT {##1} {####1}
+ {
+ \clist_pop:NN \l__xsim_tmpa_clist \l__xsim_tmpa_tl
+ \clist_pop:NN \l__xsim_tmpb_clist \l__xsim_tmpb_tl
+ \str_case:Vn \l__xsim_print_collection_choice_tl
+ {
+ {exercises} { \xsim_insert:nVnn {##1} \l__xsim_tmpb_tl {} {exercise} }
+ {solutions} { \xsim_insert:nVnn {##1} \l__xsim_tmpb_tl {} {solution} }
+ {both} {
+ \xsim_insert:nVnn {##1} \l__xsim_tmpb_tl {} {exercise}
+ \xsim_insert:nVnn {##1} \l__xsim_tmpb_tl {} {solution}
+ }
+ }
+ }
+ }
+ }
+ \group_end:
+ }
+
+% ----------------------------------------------------------------------------
+\xsim_new_collection:nn {all~ exercises} {}
+\xsim_activate_collection:n {all~ exercises}
+
+\XSIMmoduleend
+\XSIMmodule{blanks}{add blanks, cloze}
+
+\bool_new:N \l__xsim_blank_width_bool
+\bool_new:N \l__xsim_blank_linespread_bool
+\bool_new:N \l__xsim_fill_blank_bool
+\tl_new:N \l__xsim_blank_linespread_tl
+\tl_new:N \l__xsim_blank_scale_tl
+\dim_new:N \l__xsim_blank_dim
+\dim_new:N \l__xsim_blank_line_increment_dim
+\dim_new:N \l__xsim_blank_line_minimum_length_dim
+\box_new:N \l__xsim_blank_box
+
+\cs_new_protected:Npn \xsim_write_cloze_blank:n #1 {#1}
+\cs_new_protected:Npn \xsim_write_cloze_filled:n #1 {#1}
+
+\keys_define:nn {xsim/blank}
+ {
+ blank-style .code:n =
+ \cs_set_protected:Npn \xsim_write_cloze_blank:n ##1 {#1} ,
+ blank-style .initial:n = \underline {#1} ,
+ filled-style .code:n =
+ \cs_set_protected:Npn \xsim_write_cloze_filled:n ##1 {#1} ,
+ filled-style .initial:n = \underline {#1} ,
+ style .meta:n =
+ {
+ blank-style = #1 ,
+ filled-style = #1
+ } ,
+ fill .bool_set:N = \l__xsim_fill_blank_bool ,
+ fill .initial:n = false ,
+ scale .tl_set:N = \l__xsim_blank_scale_tl ,
+ scale .initial:n = 1 ,
+ width .code:n =
+ {
+ \bool_set_true:N \l__xsim_blank_width_bool
+ \dim_set:Nn \l__xsim_blank_dim {#1}
+ } ,
+ linespread .code:n =
+ \bool_set_true:N \l__xsim_blank_linespread_bool
+ \tl_set:Nn \l__xsim_blank_linespread_tl {#1} ,
+ linespread .initial:n = 1 ,
+ line-increment .dim_set:N = \l__xsim_blank_line_increment_dim ,
+ line-increment .initial:n = 0.001\linewidth ,
+ line-minimum-length .dim_set:N = \l__xsim_blank_line_minimum_length_dim ,
+ line-minimum-length .initial:n = 2em
+ }
+
+\cs_new_protected:Npn \xsim_blank:n #1
+ {
+ \box_clear:N \l__xsim_blank_box
+ \mode_if_math:TF
+ { \hbox_set:Nn \l__xsim_blank_box { $ \m@th \mathpalette{}{#1} $ } }
+ { \hbox_set:Nn \l__xsim_blank_box {#1} }
+ \bool_lazy_or:nnTF
+ { \xsim_if_inside_solution_p: }
+ { \l__xsim_fill_blank_bool }
+ { \xsim_write_cloze_filled:n {#1} }
+ {
+ \bool_if:NTF \l__xsim_blank_width_bool
+ { \__xsim_blank_skip:V \l__xsim_blank_dim }
+ { \__xsim_blank_skip:n { \box_wd:N \l__xsim_blank_box } }
+ }
+ }
+
+\cs_new_protected:Npn \__xsim_blank_skip:n #1
+ {
+ \bool_if:NTF \l__xsim_blank_width_bool
+ { \dim_set:Nn \l__xsim_tmpa_dim {#1} }
+ {
+ \fp_set:Nn \l__xsim_tmpa_fp
+ { \dim_to_fp:n {#1} * \l__xsim_blank_scale_tl }
+ \dim_set:Nn \l__xsim_tmpa_dim { \fp_to_dim:N \l__xsim_tmpa_fp }
+ }
+ \dim_compare:nTF
+ { \l__xsim_tmpa_dim > \l__xsim_blank_line_minimum_length_dim }
+ {
+ \mode_if_math:TF
+ { \xsim_write_cloze_blank:n { \skip_horizontal:N \l__xsim_tmpa_dim } }
+ {
+ \dim_do_while:nn { \l__xsim_tmpa_dim > \c_zero_dim }
+ {
+ % I wonder what the correct l3 way would be -- if there is
+ % one, yet:
+ % \tex_hfil:D
+ \tex_penalty:D \hyphenpenalty
+ % \tex_hfilneg:D
+ \dim_compare:nTF
+ { \l__xsim_tmpa_dim < \l__xsim_blank_line_increment_dim }
+ { \xsim_write_cloze_blank:n { \skip_horizontal:N \l__xsim_tmpa_dim } }
+ {
+ \xsim_write_cloze_blank:n
+ { \skip_horizontal:N \l__xsim_blank_line_increment_dim }
+ }
+ \dim_sub:Nn \l__xsim_tmpa_dim { \l__xsim_blank_line_increment_dim }
+ }
+ }
+ }
+ {
+ \xsim_write_cloze_blank:n
+ { \skip_horizontal:N \l__xsim_blank_line_minimum_length_dim }
+ }
+ }
+\cs_generate_variant:Nn \__xsim_blank_skip:n {V}
+
+\XSIMmoduleend
+\XSIMmodule{grades}{distribute goal sums to grades}
+
+\msg_new:nnn {xsim} {grade-unknown}
+ { The~ grade~ `#1'~ has~ never~ been~ declared~ \msg_line_context: }
+
+\bool_new:N \l__xsim_grades_half_bool
+\fp_new:N \l__xsim_grade_round_fp
+\fp_zero:N \l__xsim_grade_round_fp
+\prop_new:N \l__xsim_relative_grades_prop
+\tl_new:N \l__xsim_grade_split_tl
+
+\cs_new:Npn \__xsim_fp_round_to_half:n #1
+ { round( 2*(#1),0)/2 }
+
+\cs_new:Npn \__xsim_grades_round:n #1
+ { round ( #1 , \l__xsim_grade_round_fp ) }
+
+% #1: factor
+% #2: goal sum
+\cs_new:Npn \__xsim_grade_rounded:nn #1#2
+ {
+ \bool_if:NTF \l__xsim_grades_half_bool
+ { \__xsim_fp_round_to_half:n }
+ { \__xsim_grades_round:n }
+ { (#1) * (#2) }
+ }
+
+\cs_new_protected:Npn \xsim_declare_relative_grades:n #1
+ {
+ \seq_set_split:NVn \l__xsim_tmpa_seq \l__xsim_grade_split_tl {#1}
+ \seq_map_inline:Nn \l__xsim_tmpa_seq
+ { \__xsim_declare_relative_grade:w ##1 \q_stop }
+ \xsim_verbose:n {Declaring~ relative~ grade~ distribution}
+ }
+
+\cs_new_protected:Npn \__xsim_declare_relative_grade:w #1 = #2 \q_stop
+ {
+ \tl_set:Nx \l__xsim_tmpa_tl { \tl_trim_spaces:n {#1} }
+ \tl_set:Nx \l__xsim_tmpb_tl { \tl_trim_spaces:n {#2} }
+ \prop_put:NVV \l__xsim_relative_grades_prop
+ \l__xsim_tmpa_tl
+ \l__xsim_tmpb_tl
+ }
+
+% #1: grade
+% #2: sum of points
+% #3: code after grade requirement if == 1
+% #4: code after grade requirement if != 1
+\cs_new_protected:Npn \xsim_get_grade:nnnn #1#2#3#4
+ {
+ \prop_get:NnNTF \l__xsim_relative_grades_prop {#1} \l__xsim_tmpa_tl
+ {
+ \xsim_print_goal:nnn
+ {
+ min(
+ \__xsim_grade_rounded:nn
+ { \l__xsim_tmpa_tl }
+ {#2} ,
+ #2
+ )
+ }
+ {#3}
+ {#4}
+ }
+ { \msg_error:nnn {xsim} {grade-unknown} {#1} }
+ }
+
+% #1: grade
+% #2: goal
+% #3: code after grade requirement if == 1
+% #4: code after grade requirement if != 1
+\cs_new_protected:Npn \xsim_get_grade_goal:nnnn #1#2#3#4
+ {
+ \xsim_if_goal_exist:nTF {#2}
+ {
+ \xsim_get_grade:nnnn
+ {#1}
+ { \use:c {g__xsim_total_goal_#2_fp} }
+ {#3}
+ {#4}
+ }
+ { \msg_error:nnn {xsim} {goal-unknown} {#2} }
+ }
+
+% #1: grade
+% #2: goal list (separated with +)
+% #3: code after grade requirement if == 1
+% #4: code after grade requirement if != 1
+\cs_new_protected:Npn \xsim_get_grade_requirement:nnnn #1#2#3#4
+ {
+ \seq_set_split:Nnn \l__xsim_tmpa_seq {+} {#2}
+ \fp_zero:N \l__xsim_tmpa_fp
+ \seq_map_inline:Nn \l__xsim_tmpa_seq
+ {
+ \fp_add:Nn \l__xsim_tmpa_fp
+ { \use:c {g__xsim_total_goal_\tl_trim_spaces:n {##1} _fp} }
+ }
+ \xsim_get_grade:nnnn {#1} { \l__xsim_tmpa_fp } {#3} {#4}
+ }
+
+% #1: grade
+% #2: code after grade requirement if == 1
+% #3: code after grade requirement if != 1
+\cs_new_protected:Npn \xsim_get_absolute_grade_requirement:nnn #1#2#3
+ {
+ \fp_zero:N \l__xsim_tmpa_fp
+ \xsim_foreach_goal:n
+ {
+ \fp_add:Nn \l__xsim_tmpa_fp
+ { \use:c {g__xsim_total_goal_##1_fp} }
+ }
+ \xsim_get_grade:nnnn {#1} { \l__xsim_tmpa_fp } {#2} {#3}
+ }
+
+\keys_define:nn {xsim/grades}
+ {
+ round .fp_set:N = \l__xsim_grade_round_fp ,
+ half .bool_set:N = \l__xsim_grades_half_bool ,
+ split .tl_set:N = \l__xsim_grade_split_tl ,
+ split .initial:n = {,}
+ }
+
+\XSIMmoduleend
+\XSIMmodule{random}{randomly select exercises from collections}
+
+\msg_new:nnn {xsim} {random-numbers-unavailable}
+ {
+ You~ are~ compiling~ your~ document~ using ~XeLaTeX.~ Please~ be~ aware~
+ that~ random~ selection~ of~ exercises~ is~ unavailable~ in~ XeLaTeX.~ If~
+ you~ use~ this~ feature~ you~ can~ safely~ ignore~ this~ message.
+ }
+
+\sys_if_engine_xetex:T
+ { \msg_warning:nn {xsim} {random-numbers-unavailable} }
+
+\tl_new:N \l_xsim_random_collection_tl
+\tl_new:N \l__xsim_print_random_choice_tl
+\seq_new:N \g__xsim_random_list_seq
+\seq_new:N \l__xsim_allowed_exercise_ids_seq
+\int_new:N \g__xsim_random_list_id_int
+\bool_new:N \l__xsim_sort_random_bool
+\clist_new:N \l_xsim_random_exclude_list_clist
+
+% #1: random list id
+% #2: csv list of integers
+\xsim_new_aux_property:cpn {random} #1#2
+ {
+ \xsim_random_list_if_exist:nF {#1}
+ { \xsim_new_random_list:n {#1} }
+ \xsim_set_random_list:nn {#1} {#2}
+ }
+
+\cs_new_protected:Npn \xsim_new_random_list:n #1
+ {
+ \xsim_verbose:n {Defining~ new~ random~ list~ `#1'}
+ \seq_new:c {g__xsim_random_#1 _seq}
+ }
+
+\cs_new_protected:Npn \xsim_set_random_list:nn #1#2
+ { \seq_gset_from_clist:cn {g__xsim_random_#1_seq} {#2} }
+
+\cs_new_protected:Npn \xsim_set_random_list_from_seq:nN #1#2
+ { \seq_gset_eq:cN {g__xsim_random_#1_seq} #2 }
+
+\cs_new:Npn \xsim_use_random_list:nn #1#2
+ { \seq_use:cn {g__xsim_random_#1_seq} {#2} }
+
+\cs_new_protected:Npn \xsim_map_random_list:nn #1#2
+ { \seq_map_inline:cn {g__xsim_random_#1_seq} {#2} }
+
+\prg_new_conditional:Npnn \xsim_random_list_if_exist:n #1 {p,T,F,TF}
+ {
+ \seq_if_exist:cTF {g__xsim_random_#1_seq}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+\prg_new_conditional:Npnn \xsim_random_list_if_empty:n #1 {p,T,F,TF}
+ {
+ \seq_if_empty:cTF {g__xsim_random_#1_seq}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+% #1: random list id
+% #2: sequence variable to set list from
+\cs_new_protected:Npn \xsim_save_random_list:nN #1#2
+ { % TODO: check if #2 is empty
+ \xsim_random_list_if_exist:nF {#1}
+ { \xsim_new_random_list:n {#1} }
+ \xsim_random_list_if_empty:nT {#1}
+ { \xsim_set_random_list_from_seq:nN {#1} #2 }
+ \xsim_verbose:n {Saving~ random~ list~ `#1'}
+ \xsim_add_property_to_aux:nn {random}
+ { {#1} { \xsim_use_random_list:nn {#1} {,} } }
+ }
+\cs_generate_variant:Nn \xsim_save_random_list:nN {x}
+
+% #1: collection
+% #2: number of items
+% #3: clist variable of excluded ids
+\cs_new_protected:Npn \xsim_print_random_list:nnN #1#2#3
+ {
+ \xsim_if_collection_exist:nTF {#1}
+ {
+ \int_gincr:N \g__xsim_random_list_id_int
+ \int_compare:nNnTF { \xsim_collection_count:n {#1} } = {0}
+ {
+ % TODO: message
+ \xsim_rerun:
+ }
+ {
+ % generate seq of allowed ids from collection:
+ \xsim_foreach_exercise_id:n
+ {
+ \xsim_get_type_for_id:nN {##1} \l__xsim_tmpa_str
+ \tl_set_rescan:Nnx \l__xsim_tmpa_tl {} { \l__xsim_tmpa_str }
+ \xsim_if_in_collection:nVnT {#1} \l__xsim_tmpa_tl {##1}
+ {
+ \clist_if_in:NnF #3 {##1}
+ { \seq_put_right:Nn \l__xsim_allowed_exercise_ids_seq {##1} }
+ }
+ }
+ \int_compare:nNnTF
+ {#2}
+ >
+ { \seq_count:N \l__xsim_allowed_exercise_ids_seq }
+ {
+ \int_set:Nn \l__xsim_tmpa_int
+ { \seq_count:N \l__xsim_allowed_exercise_ids_seq }
+ }
+ { \int_set:Nn \l__xsim_tmpa_int {#2} }
+ % generate random list:
+ \xsim_generate_random_list:nnnN
+ { \int_to_alph:n { \g__xsim_random_list_id_int } }
+ { \seq_count:N \l__xsim_allowed_exercise_ids_seq }
+ { \l__xsim_tmpa_int }
+ \g__xsim_random_list_seq
+ }
+ \xsim_save_random_list:xN
+ { \int_to_alph:n { \g__xsim_random_list_id_int } }
+ \g__xsim_random_list_seq
+ \xsim_verbose:x
+ {
+ Printing~ exercises~ of~ random~ list~
+ `\int_to_alph:n { \g__xsim_random_list_id_int }'~ of~
+ collection~ `#1'
+ }
+ \xsim_print_random_exercises:Nn
+ \l__xsim_allowed_exercise_ids_seq
+ { \int_to_alph:n { \g__xsim_random_list_id_int } }
+ }
+ { \msg_error:nnn {xsim} {unknown-collection} {#1} }
+ }
+\cs_generate_variant:Nn \xsim_print_random_list:nnN {V}
+
+% #1: random list id
+% #2: max number to choose from
+% #3: number of items
+% #4: seq variable
+\cs_new_protected:Npn \xsim_generate_random_list:nnnN #1#2#3#4
+ {
+ \bool_lazy_or:nnT
+ { !\xsim_random_list_if_exist_p:n {#1} }
+ { \xsim_random_list_if_empty_p:n {#1} }
+ {
+ \xsim_verbose:n
+ {Generating~ random~ list~ `#1'~ with~ #3~ out~ of~ #2~ items}
+ \seq_gclear:N #4
+ \int_compare:nNnF {#2} = 0
+ {
+ \int_do_until:nNnn { \seq_count:N #4 } = {#3}
+ {
+ \tl_set:Nx \l__xsim_tmpa_tl
+ { \fp_eval:n { randint(#2) } }
+ \seq_if_in:NVF #4
+ \l__xsim_tmpa_tl
+ { \seq_gput_right:NV #4 \l__xsim_tmpa_tl }
+ }
+ }
+ \bool_if:NT \l__xsim_sort_random_bool
+ {
+ \seq_gsort:Nn #4
+ {
+ \int_compare:nNnTF {##1} > {##2}
+ { \sort_return_swapped: }
+ { \sort_return_same: }
+ }
+ }
+ }
+ }
+
+% #1: seq variable of ids
+% #2: random list id
+\cs_new_protected:Npn \xsim_print_random_exercises:Nn #1#2
+ {
+ \seq_if_empty:NF #1
+ {
+ \bool_lazy_and:nnT
+ { \xsim_random_list_if_exist_p:n {#2} }
+ { !\xsim_random_list_if_empty_p:n {#2} }
+ {
+ \xsim_verbose:x
+ {
+ Printing~
+ \str_case:Vn \l__xsim_print_random_choice_tl
+ {
+ {exercises} {exercises~}
+ {solutions} {solutions~}
+ {both} { exercises~ and~ solutions~ }
+ }
+ of~ random~ list~ `#2'.
+ }
+ \xsim_map_random_list:nn {#2}
+ {
+ \tl_set:Nx \l__xsim_tmpa_tl
+ { \seq_item:Nn #1 {##1} }
+ \tl_set:Nx \l__xsim_tmpb_tl
+ { \xsim_get_type_for_property:nV {id} \l__xsim_tmpa_tl }
+ \bool_set_false:N \l__xsim_tmpa_bool
+ \bool_set_false:N \l__xsim_tmpb_bool
+ \str_case:VnF \l__xsim_print_random_choice_tl
+ {
+ {exercises} { \bool_set_true:N \l__xsim_tmpa_bool }
+ {solutions} { \bool_set_true:N \l__xsim_tmpb_bool }
+ {both} {
+ \bool_set_true:N \l__xsim_tmpa_bool
+ \bool_set_true:N \l__xsim_tmpb_bool
+ }
+ }
+ {
+ \msg_warning:nnV {xsim}
+ {print-collection-choice}
+ \l__xsim_print_random_choice_tl
+ }
+ \bool_if:NT \l__xsim_tmpa_bool
+ {
+ \xsim_if_exercise_exist:VVT
+ \l__xsim_tmpb_tl
+ \l__xsim_tmpa_tl
+ {
+ \xsim_insert:VVnn
+ \l__xsim_tmpb_tl
+ \l__xsim_tmpa_tl
+ {}
+ {exercise}
+ }
+ }
+ \bool_if:NT \l__xsim_tmpb_bool
+ {
+ \xsim_if_solution_exist:VVT
+ \l__xsim_tmpb_tl
+ \l__xsim_tmpa_tl
+ {
+ \xsim_insert:VVnn
+ \l__xsim_tmpb_tl
+ \l__xsim_tmpa_tl
+ {}
+ {solution}
+ }
+ }
+ }
+ }
+ }
+ }
+
+\keys_define:nn {xsim/random}
+ {
+ sort .bool_set:N = \l__xsim_sort_random_bool ,
+ sort .initial:n = true ,
+ collection .tl_set:N = \l_xsim_random_collection_tl ,
+ collection .initial:n = all~exercises ,
+ exclude .code:n = \__xsim_exclude_ids:n {#1} ,
+ print .tl_set:N = \l__xsim_print_random_choice_tl ,
+ print .initial:n = exercises
+ }
+
+\cs_new_protected:Npn \__xsim_exclude_ids:n #1
+ {
+ \seq_clear:N \l__xsim_tmpa_seq
+ \clist_map_inline:nn {#1}
+ {
+ \tl_set:Nx \l__xsim_tmpa_tl
+ { \xsim_get_id_for_property:nn {ID} {##1} }
+ \tl_if_blank:VTF \l__xsim_tmpa_tl
+ { \seq_put_right:Nn \l__xsim_tmpa_seq {##1} }
+ {
+ \seq_put_right:Nx \l__xsim_tmpa_seq
+ { \xsim_get_id_for_property:nn {ID} {##1} }
+ }
+ }
+ \seq_remove_duplicates:N \l__xsim_tmpa_seq
+ \clist_set_from_seq:NN
+ \l_xsim_random_exclude_list_clist
+ \l__xsim_tmpa_seq
+ }
+
+\XSIMmoduleend
+\XSIMmodule{translations}{language settings for XSIM}
+
+\RequirePackage{translations}
+
+\msg_new:nnn {xsim} {language-not-defined}
+ {
+ You~ chose~ the~ language~ `#1'~ which~ is~ not~ defined~ by~ xsim.~
+ `english'~ is~ used~ instead.~ If~ you~ just~ mistyped~ try~ again!~
+ Otherwise~ contact~ the~ author~ and~ he'll~ probably~ add~ your~
+ language.
+ }
+
+\msg_new:nnn {xsim} {empty-translation}
+ {
+ No~ translation~ provided~ for~ key~ `#1'~ in~ language~ `#2'~
+ \msg_line_context: .
+ }
+
+% --------------------------------------------------------------------------
+
+\bool_new:N \l__xsim_language_auto_bool
+\bool_set_true:N \l__xsim_language_auto_bool
+% this token list will hold the chosen language for xsim; since the
+% language is either chosen automatically or by option it is only available at
+% begin document
+\tl_new:N \l_xsim_language_tl
+\tl_set:Nn \l_xsim_language_tl {english}
+\tl_new:N \l__xsim_current_language_tl
+
+\tl_const:Nn \c__xsim_keyword_prefix_tl {xsim-keyword-}
+
+% ----------------------------------------------------------------------------
+
+\prop_new:N \g_xsim_translations_prop
+
+% translate the key #1
+\cs_new:Npn \xsim_translate:n #1
+ {
+ \bool_if:NTF \l__xsim_language_auto_bool
+ { \GetTranslation { \c__xsim_keyword_prefix_tl #1 } }
+ {
+ \GetTranslationFor
+ { \l_xsim_language_tl }
+ { \c__xsim_keyword_prefix_tl #1 }
+ }
+ }
+
+\xsim_at_begin_document:n
+ {
+ \bool_if:NTF \l__xsim_language_auto_bool
+ {
+ \tl_set:Nx \l_xsim_language_tl
+ { \@trnslt@language{\@trnslt@current@language} }
+ }
+ {
+ \tl_set_eq:NN
+ \l_xsim_language_tl
+ \l__xsim_current_language_tl
+ }
+ }
+
+% ----------------------------------------------------------------------------
+% #1: language
+% #2: keyword
+% #3: translation
+\cs_new_protected:Npn \xsim_declare_translation:nnn #1#2#3
+ {
+ \xsim_verbose:n
+ { Declaring~ `#1'~ tranlation~ of~ `#2':~ `#3'. }
+ \declaretranslation
+ {#1}
+ { \c__xsim_keyword_prefix_tl #2 }
+ {#3}
+ \prop_gput:Nnn \g_xsim_translations_prop {#2(#1)} {#3}
+ }
+\cs_generate_variant:Nn \xsim_declare_translation:nnn {V,VnV}
+
+% #1: key
+% #2: csv list: { <lang1> = <translation1> , <lang2> = <translation2> }
+\cs_new_protected:Npn \xsim_declare_translations:nn #1#2
+ {
+ \cs_set_protected:Npn \__xsim_declare_translation:n ##1
+ { \msg_warning:nnnn {xsim} {empty-translation} {#1} {##1} }
+ \cs_set_protected:Npn \__xsim_declare_translation:nn ##1##2
+ { \xsim_declare_translation:nnn {##1} {#1} {##2} }
+ \keyval_parse:NNn
+ \__xsim_declare_translation:n
+ \__xsim_declare_translation:nn
+ {#2}
+ }
+
+\cs_new:Npn \__xsim_parse_translate_list_entry:nnn #1#2#3 {}
+
+\cs_new_protected:Npn \__xsim_parse_translate_list_entry:www #1(#2)\q_mark#3\q_stop
+ { \__xsim_parse_translate_list_entry:nnn {#1} {#2} {#3} }
+
+\cs_new_protected:Npn \xsim_for_all_translations_do:n #1
+ {
+ \cs_set:Npn \__xsim_parse_translate_list_entry:nnn ##1##2##3 {#1}
+ \prop_map_inline:Nn \g_xsim_translations_prop
+ { \__xsim_parse_translate_list_entry:www ##1 \q_mark ##2 \q_stop }
+ }
+
+% ----------------------------------------------------------------------------
+
+\keys_define:nn {xsim}
+ {
+ language .value_required:n = true ,
+ language .code:n =
+ \tl_if_eq:nnTF {#1} {auto}
+ { \bool_set_true:N \l__xsim_language_auto_bool }
+ {
+ \bool_set_false:N \l__xsim_language_auto_bool
+ \tl_set:Nn \l__xsim_current_language_tl {#1}
+ } ,
+ language .initial:n = auto
+ }
+
+\XSIMmoduleend
+\XSIMmodule{interface}{user interface}
+
+\msg_new:nnn {xsim} {remove}
+ {
+ The~ command~ #2 is~ deprecated.~ As~ of~ version~ #1~ it~ serves~ no~
+ purpose~ and~ does~ nothing.
+ }
+
+\msg_new:nnn {xsim} {deprecate}
+ {
+ The~ command~ #2 is~ deprecated.~ As~ of~ version~ #1~ it~ serves~ no~
+ purpose~ and~ does~ nothing.~ Use~ #3 instead.
+ }
+
+\cs_new_protected:Npn \xsim_remove:nN #1#2
+ { \msg_warning:nnnn {xsim} {remove} {#1} {#2} }
+
+\cs_new_protected:Npn \xsim_deprecate:nNN #1#2#3
+ { \msg_warning:nnnn {xsim} {remove} {#1} {#2} {#3} }
+
+% ----------------------------------------------------------------------------
+\NewDocumentCommand \DeclareExerciseEnvironmentTemplate {m+m+m}
+ { \xsim_declare_environment_template:nnn {#1} {#2} {#3} }
+\@onlypreamble \DeclareExerciseEnvironmentTemplate
+
+\NewDocumentCommand \DeclareExerciseHeadingTemplate {m+m}
+ { \xsim_declare_heading_template:nn {#1} {#2} }
+\@onlypreamble \DeclareExerciseHeadingTemplate
+
+\NewDocumentCommand \DeclareExerciseTableTemplate {m+m}
+ { \xsim_declare_table_template:nn {#1} {#2} }
+\@onlypreamble \DeclareExerciseTableTemplate
+
+\NewDocumentCommand \UseExerciseTemplate {mm}
+ { \xsim_use_template:nn {#1} {#2} }
+
+% ----------------------------------------------------------------------------
+
+\NewDocumentCommand \DeclareExerciseType {mm}
+ { \xsim_declare_exercise_type:nn {#1} {#2} }
+\@onlypreamble \DeclareExerciseType
+
+\NewExpandableDocumentCommand \numberofusedexercises {}
+ { \int_use:N \g_xsim_max_id_int }
+
+% ----------------------------------------------------------------------------
+
+\NewDocumentCommand \IfExistSolutionTF {+m+m}
+ { \xsim_if_solution_exist:ooTF {\ExerciseType} {\ExerciseID} {#1} {#2} }
+
+\NewDocumentCommand \IfExistSolutionT {+m}
+ { \IfExistSolutionTF {#1} {} }
+
+\NewDocumentCommand \IfExistSolutionF {+m}
+ { \IfExistSolutionTF {} {#1} }
+
+\NewExpandableDocumentCommand \IfInsideSolutionTF {+m+m}
+ { \xsim_if_inside_solution:TF {#1} {#2} }
+
+\NewExpandableDocumentCommand \IfInsideSolutionT {+m}
+ { \IfInsideSolutionTF {#1} {} }
+
+\NewExpandableDocumentCommand \IfInsideSolutionF {+m}
+ { \IfInsideSolutionTF {} {#1} }
+
+\NewExpandableDocumentCommand \IfSolutionPrintTF {+m+m}
+ { \xsim_if_solution_print:nTF {\ExerciseType} {#1} {#2} }
+
+\NewExpandableDocumentCommand \IfSolutionPrintT {+m}
+ { \IfSolutionPrintTF {#1} {} }
+
+\NewExpandableDocumentCommand \IfSolutionPrintF {+m}
+ { \IfSolutionPrintTF {} {#1} }
+
+% ----------------------------------------------------------------------------
+
+\NewDocumentCommand \DeclareExerciseProperty {t!st-m}
+ {
+ \IfBooleanTF {#2}
+ {
+ \IfBooleanTF {#3}
+ {
+ \xsim_declare_property:nnnn
+ { \c_false_bool }
+ { \c_true_bool }
+ { \c_true_bool }
+ {#4}
+ }
+ {
+ \xsim_declare_property:nnnn
+ { \c_false_bool }
+ { \c_true_bool }
+ { \c_false_bool }
+ {#4}
+ }
+ }
+ {
+ \IfBooleanTF {#1}
+ {
+ \IfBooleanTF {#3}
+ {
+ \xsim_declare_property:nnnn
+ { \c_true_bool }
+ { \c_false_bool }
+ { \c_true_bool }
+ {#4}
+ }
+ {
+ \xsim_declare_property:nnnn
+ { \c_true_bool }
+ { \c_false_bool }
+ { \c_false_bool }
+ {#4}
+ }
+ }
+ {
+ \IfBooleanTF {#3}
+ {
+ \xsim_declare_property:nnnn
+ { \c_false_bool }
+ { \c_false_bool }
+ { \c_true_bool }
+ {#4}
+ }
+ {
+ \xsim_declare_property:nnnn
+ { \c_false_bool }
+ { \c_false_bool }
+ { \c_false_bool }
+ {#4}
+ }
+ }
+ }
+ }
+\@onlypreamble \DeclareExerciseProperty
+
+\NewDocumentCommand \DeclareExercisePropertyAlias {mm}
+ { \xsim_make_property_alias:nn {#1} {#2} }
+\@onlypreamble \DeclareExercisePropertyAlias
+
+\NewDocumentCommand \SetExerciseProperty {m+m}
+ { \xsim_set_property:eenn {\ExerciseType} {\ExerciseID} {#1} {#2} }
+
+\NewDocumentCommand \SetExpandedExerciseProperty {m+m}
+ { \xsim_set_property:eene {\ExerciseType} {\ExerciseID} {#1} {#2} }
+
+\NewDocumentCommand \ExerciseSetProperty {mmm+m}
+ { \xsim_set_property:nnnn {#1} {#2} {#3} {#4} }
+
+\NewDocumentCommand \ExerciseSetExpandedProperty {mmm+m}
+ { \xsim_set_property:nnne {#1} {#2} {#3} {#4} }
+
+\NewExpandableDocumentCommand \IfExercisePropertyExistTF {+m+m+m}
+ { \xsim_if_property_exist:nTF {#1} {#2} {#3} }
+
+\NewExpandableDocumentCommand \IfExercisePropertyExistT {+m+m}
+ { \IfExercisePropertyExistTF {#1} {#2} {} }
+
+\NewExpandableDocumentCommand \IfExercisePropertyExistF {+m+m}
+ { \IfExercisePropertyExistTF {#1} {} {#2} }
+
+\NewDocumentCommand \IfExercisePropertySetTF {m+m+m}
+ { \xsim_if_property_set:eenTF {\ExerciseType} {\ExerciseID} {#1} {#2} {#3} }
+
+\NewDocumentCommand \IfExercisePropertySetT {m+m}
+ { \IfExercisePropertySetTF {#1} {#2} {} }
+
+\NewDocumentCommand \IfExercisePropertySetF {m+m}
+ { \IfExercisePropertySetTF {#1} {} {#2} }
+
+\NewExpandableDocumentCommand \GetExerciseProperty {m}
+ { \xsim_get_property:oon {\ExerciseType} {\ExerciseID} {#1} }
+
+\NewExpandableDocumentCommand \GetExerciseAliasProperty {m}
+ {
+ \xsim_get_property:oof
+ {\ExerciseType}
+ {\ExerciseID}
+ { \xsim_property_alias:n {#1} }
+ }
+
+\NewDocumentCommand \GetExercisePropertyTF {m+m+m}
+ {
+ \xsim_get_property_if_set:oonTF {\ExerciseType} {\ExerciseID} {#1}
+ {#2}
+ {#3}
+ }
+
+\NewDocumentCommand \GetExercisePropertyT {m+m}
+ { \GetExercisePropertyTF {#1} {#2} {} }
+\NewDocumentCommand \GetExercisePropertyF {m+m+m}
+ { \GetExercisePropertyTF {#1} {} {#2} }
+
+\NewExpandableDocumentCommand \GetExerciseIdForProperty {mm}
+ { \xsim_get_id_for_property:nn {#1} {#2} }
+
+\NewExpandableDocumentCommand \GetExerciseTypeForProperty {mm}
+ { \xsim_get_type_for_property:nn {#1} {#2} }
+
+\NewExpandableDocumentCommand \IfExerciseBooleanPropertyTF {+m+m+m}
+ {
+ \xsim_if_boolean_property:oonTF {\ExerciseType} {\ExerciseID} {#1}
+ {#2}
+ {#3}
+ }
+
+\NewExpandableDocumentCommand \IfExerciseBooleanPropertyT {+m+m}
+ { \IfExerciseBooleanPropertyTF {#1} {#2} {} }
+\NewExpandableDocumentCommand \IfExerciseBooleanPropertyF {+m+m}
+ { \IfExerciseBooleanPropertyTF {#1} {} {#2} }
+
+\NewDocumentCommand \SaveExerciseProperty {mm}
+ { \xsim_save_property:xxnN {\ExerciseType} {\ExerciseID} {#1} #2 }
+
+\NewDocumentCommand \GlobalSaveExerciseProperty {mm}
+ { \xsim_gsave_property:xxnN {\ExerciseType} {\ExerciseID} {#1} #2 }
+
+% ----------------------------------------------------------------------------
+
+\NewDocumentCommand \DeclareExerciseParameter {st!m}
+ {
+ \IfBooleanTF {#1} % fixed
+ {
+ \IfBooleanTF {#2} % mandatory
+ { \xsim_declare_parameter:nnn {true} {true} {#3} }
+ { \xsim_declare_parameter:nnn {true} {false} {#3} }
+ }
+ {
+ \IfBooleanTF {#2} % mandatory
+ { \xsim_declare_parameter:nnn {false} {true} {#3} }
+ { \xsim_declare_parameter:nnn {false} {false} {#3} }
+ }
+ }
+
+\NewExpandableDocumentCommand \GetExerciseParameter {m}
+ { \xsim_get_parameter:on {\ExerciseType} {#1} }
+
+\NewDocumentCommand \SetExerciseParameter {mmm}
+ { \xsim_set_parameter:nnn {#1} {#2} {#3} }
+
+\NewDocumentCommand \SetExerciseParameters {mm}
+ { \xsim_set_parameters:nn {#1} {#2} }
+
+\NewExpandableDocumentCommand \GetExerciseName {}
+ {
+ \IfInsideSolutionTF
+ { \GetExerciseParameter {solution-name} }
+ { \GetExerciseParameter {exercise-name} }
+ }
+
+\NewExpandableDocumentCommand \GetExerciseHeadingF {m}
+ {
+ \IfInsideSolutionTF
+ {
+ \IfExerciseParameterSetTF {solution-heading}
+ { \GetExerciseParameter {solution-heading} }
+ {#1}
+ }
+ {
+ \IfExerciseParameterSetTF {exercise-heading}
+ { \GetExerciseParameter {exercise-heading} }
+ {#1}
+ }
+ }
+
+\NewDocumentCommand \GetExerciseBody {m}
+ { \xsim_input:oon { \ExerciseType } { \ExerciseID } {#1} }
+
+\NewExpandableDocumentCommand \IfExerciseParameterSetTF {+m+m+m}
+ { \xsim_if_parameter_set:nnTF {\ExerciseType} {#1} {#2} {#3} }
+
+\NewExpandableDocumentCommand \IfExerciseParameterSetT {+m+m}
+ { \IfExerciseParameterSetTF {#1} {#2} {} }
+
+\NewExpandableDocumentCommand \IfExerciseParameterSetF {+m+m}
+ { \IfExerciseParameterSetTF {#1} {} {#2} }
+
+\NewExpandableDocumentCommand \ExerciseParameterIfSetTF {+m+m+m+m}
+ { \xsim_if_parameter_set:nnTF {#1} {#2} {#3} {#4} }
+
+\NewExpandableDocumentCommand \ExerciseParameterIfSetT {+m+m+m}
+ { \ExerciseParameterIfSetTF {#1} {#2} {#3} {} }
+
+\NewExpandableDocumentCommand \ExerciseParameterIfSetF {+m+m+m}
+ { \ExerciseParameterIfSetTF {#1} {#2} {} {#3} }
+
+\NewDocumentCommand \GetExerciseParameterTF {m+m+m}
+ { \xsim_get_parameter_if_set:onTF {\ExerciseType} {#1} {#2} {#3} }
+
+\NewDocumentCommand \GetExerciseParameterT {m+m}
+ { \GetExerciseParameterTF {#1} {#2} {} }
+
+\NewDocumentCommand \GetExerciseParameterF {m+m+m}
+ { \GetExerciseParameterTF {#1} {} {#2} }
+
+% ----------------------------------------------------------------------------
+
+\NewDocumentCommand \ExercisePropertyIfSetTF {mmm+m+m}
+ { \xsim_if_property_set:nnnTF {#1} {#2} {#3} {#4} {#5} }
+
+\NewDocumentCommand \ExercisePropertyIfSetT {mmm+m}
+ { \ExercisePropertyIfSetTF {#1} {#2} {#3} {#4} {} }
+
+\NewDocumentCommand \ExercisePropertyIfSetF {mmm+m}
+ { \ExercisePropertyIfSetTF {#1} {#2} {#3} {} {#4} }
+
+\NewExpandableDocumentCommand \ExercisePropertyGet {mmm}
+ { \xsim_get_property:nnn {#1} {#2} {#3} }
+
+\NewExpandableDocumentCommand \ExercisePropertyGetAlias {mm}
+ { \xsim_get_property:nnf {#1} {#2} { \xsim_property_alias:n {#1} } }
+
+\NewDocumentCommand \ExercisePropertySave {mmmm}
+ { \xsim_save_property:nnnN {#1} {#2} {#3} #4 }
+
+\NewDocumentCommand \ExercisePropertyGlobalSave {mmmm}
+ { \xsim_gsave_property:nnnN {#1} {#2} {#3} #4 }
+
+\NewExpandableDocumentCommand \ExerciseParameterGet {mm}
+ { \xsim_get_parameter:nn {#1} {#2} }
+
+% ----------------------------------------------------------------------------
+
+\NewExpandableDocumentCommand \XSIMtranslate {m}
+ { \xsim_translate:n {#1} }
+
+\NewExpandableDocumentCommand \XSIMexpandcode {+m}
+ { \use:e {#1} }
+
+\NewExpandableDocumentCommand \XSIMmixedcase {m}
+ { \text_titlecase:e {#1} }
+
+\NewDocumentCommand \XSIMputright {mm}
+ { \tl_put_right:Nn #1 {#2} }
+
+\NewExpandableDocumentCommand \XSIMifeqTF {+m+m+m+m}
+ { \tl_if_eq:eeTF {#1} {#2} {#3} {#4} }
+
+\NewExpandableDocumentCommand \XSIMifeqT {+m+m+m}
+ { \XSIMifeqTF {#1} {#2} {#3} {} }
+
+\NewExpandableDocumentCommand \XSIMifeqF {+m+m+m}
+ { \XSIMifeqTF {#1} {#2} {} {#3} }
+
+\NewExpandableDocumentCommand \XSIMifblankTF {+m+m+m}
+ { \tl_if_blank:eTF {#1} {#2} {#3} }
+
+\NewExpandableDocumentCommand \XSIMifblankT {+m+m}
+ { \XSIMifblankTF {#1} {#2} {} }
+
+\NewExpandableDocumentCommand \XSIMifblankF {+m+m}
+ { \XSIMifblankTF {#1} {} {#2} {} }
+
+% ----------------------------------------------------------------------------
+
+\NewDocumentCommand \DeclareExerciseGoal {m}
+ { \xsim_declare_exercise_goal:n {#1} }
+\@onlypreamble \DeclareExerciseGoal
+
+\NewDocumentCommand \IfExerciseGoalTF {mm+m+m}
+ {
+ \xsim_if_goal_value:xxnnTF
+ {\ExerciseType} {\ExerciseID} {#1}
+ {#2}
+ {#3} {#4}
+ }
+
+\NewDocumentCommand \IfExerciseGoalT {mm+m}
+ { \IfExerciseGoalTF {#1} {#2} {#3} {} }
+
+\NewDocumentCommand \IfExerciseGoalF {mm+m}
+ { \IfExerciseGoalTF {#1} {#2} {} {#3} }
+
+\NewDocumentCommand \IfExerciseGoalSingularTF {mmm}
+ { \IfExerciseGoalTF {#1} {=1} {#2} {#3} }
+
+\NewDocumentCommand \IfExerciseGoalSingularT {mm}
+ { \IfExerciseGoalT {#1} {=1} {#2} }
+
+\NewDocumentCommand \IfExerciseGoalSingularF {mm}
+ { \IfExerciseGoalF {#1} {=1} {#2} }
+
+\NewDocumentCommand \IfExerciseTypeGoalsSumTF {mmm+m+m}
+ { \xsim_if_goals_sum:nnnTF {#1} {#2} {#3} {#4} {#5} }
+
+\NewDocumentCommand \IfExerciseTypeGoalsSumT {mmm+m}
+ { \IfExerciseTypeGoalsSumTF {#1} {#2} {#3} {#4} {} }
+
+\NewDocumentCommand \IfExerciseTypeGoalsSumF {mmm+m}
+ { \IfExerciseTypeGoalsSumTF {#1} {#2} {#3} {} {#4} }
+
+\NewDocumentCommand \IfExerciseGoalsSumTF {mm+m+m}
+ { \xsim_if_total_goals_sum:nnTF {#1} {#2} {#3} {#4} }
+
+\NewDocumentCommand \IfExerciseGoalsSumT {mm+m}
+ { \IfExerciseGoalsSumTF {#1} {#2} {#3} {} }
+
+\NewDocumentCommand \IfExerciseGoalsSumF {mm+m}
+ { \IfExerciseGoalsSumTF {#1} {#2} {} {#3} }
+
+\NewDocumentCommand \TotalExerciseTypeGoal {mmmm}
+ { \xsim_print_goal_sum:nnnn {#1} {#2} {#3} {#4} }
+
+\NewDocumentCommand \TotalExerciseTypeGoals {mmmm}
+ { \xsim_print_goals_sum:nnnn {#1} {#2} {#3} {#4} }
+
+\NewDocumentCommand \TotalExerciseGoal {mmm}
+ { \xsim_print_total_goal_sum:nnn {#1} {#2} {#3} }
+
+\NewDocumentCommand \TotalExerciseGoals {mmm}
+ { \xsim_print_total_goals_sum:nnn {#1} {#2} {#3} }
+
+\NewDocumentCommand \AddtoExerciseTypeGoal {mmmm}
+ { \xsim_addto_goal:nnnn {#1} {#2} {#3} {#4} }
+
+\NewDocumentCommand \AddtoExerciseGoal {mm}
+ { \xsim_addto_goal:xxnn {\ExerciseType} {\ExerciseID} {#1} {#2} }
+
+\NewDocumentCommand \ExerciseGoalValuePrint {mmm}
+ { \xsim_print_goal:nnn {#1} {#2} {#3} }
+
+\NewDocumentCommand \AddtoExerciseTypeGoalPrint {mmmmmm}
+ {
+ \xsim_addto_goal:nnnn {#1} {#2} {#3} {#4}
+ \xsim_print_goal:nnn {#4} {#5} {#6}
+ }
+
+\NewDocumentCommand \AddtoExerciseGoalPrint {mmmm}
+ {
+ \xsim_addto_goal:xxnn {\ExerciseType} {\ExerciseID} {#1} {#2}
+ \xsim_print_goal:nnn {#2} {#3} {#4}
+ }
+
+% ----------------------------------------------------------------------------
+\NewDocumentCommand \DeclareGradeDistribution {m}
+ { \xsim_declare_relative_grades:n {#1} }
+
+\NewDocumentCommand \GetGradeRequirementForGoal {mmmm}
+ { \xsim_get_grade_goal:nnnn {#1} {#2} {#3} {#4} }
+
+\NewDocumentCommand \GetGradeRequirementForGoals {mmmm}
+ { \xsim_get_grade_requirement:nnnn {#1} {#2} {#3} {#4} }
+
+\NewDocumentCommand \GetGradeRequirement {mmm}
+ { \xsim_get_absolute_grade_requirement:nnn {#1} {#2} {#3} }
+
+% ----------------------------------------------------------------------------
+
+\NewDocumentCommand \DeclareExerciseTagging {m}
+ { \xsim_new_tag_type:n {#1} }
+\@onlypreamble \DeclareExerciseTagging
+
+\NewDocumentCommand \ProvideExerciseTagging {m}
+ {
+ \xsim_if_tag_type_exist:nTF {#1}
+ { \msg_warning:nnn {xsim} {tag-exists} {#1} }
+ { \xsim_new_tag_type:n {#1} }
+ }
+
+\NewDocumentCommand \ForEachExerciseTag {m+m}
+ { \xsim_foreach_exercise_tag:oonn {\ExerciseType} {\ExerciseID} {#1} {#2} }
+
+\NewDocumentCommand \ListExerciseTags {mm}
+ { \xsim_exercise_tags_use:oonn {\ExerciseType} {\ExerciseID} {#1} {#2} }
+
+\NewDocumentCommand \UseExerciseTags {mmmm}
+ {
+ \xsim_exercise_tags_use:oonnnn
+ {\ExerciseType}
+ {\ExerciseID}
+ {#1}
+ {#2}
+ {#3}
+ {#4}
+ }
+
+\NewDocumentCommand \IfExerciseTagSetTF {m+m+m}
+ { \xsim_if_tags_value:nTF {#1} {#2} {#3} }
+\NewDocumentCommand \IfExerciseTagSetT {m+m}
+ { \xsim_if_tags_value:nT {#1} {#2} }
+\NewDocumentCommand \IfExerciseTagSetF {m+m}
+ { \xsim_if_tags_value:nF {#1} {#2} }
+
+\NewDocumentCommand \IfExerciseTopicSetTF {m+m+m}
+ { \xsim_if_topic_value:nTF {#1} {#2} {#3} }
+\NewDocumentCommand \IfExerciseTopicSetT {m+m}
+ { \xsim_if_topic_value:nT {#1} {#2} }
+\NewDocumentCommand \IfExerciseTopicSetF {m+m}
+ { \xsim_if_topic_value:nF {#1} {#2} }
+
+% ----------------------------------------------------------------------------
+
+\NewDocumentCommand \XSIMatbegindocument {+m}
+ { \xsim_at_begin_document:n {#1} }
+
+\NewDocumentCommand \XSIMatenddocument {+m}
+ { \xsim_at_end_document:n {#1} }
+
+% ----------------------------------------------------------------------------
+
+\NewDocumentCommand \ForEachPrintedExerciseByType {+m}
+ { \xsim_foreach_exercise_type_id:nn {printed} {#1} }
+
+\tl_new:N \XSIMtmp
+
+\NewDocumentCommand \ForEachPrintedExerciseByID {+m}
+ {
+ \tl_set_eq:NN \XSIMtmp \ExerciseType
+ \xsim_foreach_exercise_id_type:nn {print} {#1}
+ \tl_set_eq:NN \ExerciseType \XSIMtmp
+ \tl_clear:N \XSIMtmp
+ }
+
+\NewDocumentCommand \ForEachUsedExerciseByType {+m}
+ {
+ \tl_set_eq:NN \XSIMtmp \ExerciseType
+ \xsim_foreach_exercise_type_id:nn {used} {#1}
+ \tl_set_eq:NN \ExerciseType \XSIMtmp
+ \tl_clear:N \XSIMtmp
+ }
+
+\NewDocumentCommand \ForEachUsedExerciseByID {+m}
+ {
+ \tl_set_eq:NN \XSIMtmp \ExerciseType
+ \xsim_foreach_exercise_id_type:nn {used} {#1}
+ \tl_set_eq:NN \ExerciseType \XSIMtmp
+ \tl_clear:N \XSIMtmp
+ }
+
+% ----------------------------------------------------------------------------
+
+\NewDocumentCommand \DeclareExerciseTranslations {mm}
+ { \xsim_declare_translations:nn {#1} {#2} }
+\@onlypreamble \DeclareExerciseTranslations
+
+\NewDocumentCommand \DeclareExerciseTranslation {mmm}
+ { \xsim_declare_translation:nnn {#1} {#2} {#3} }
+\@onlypreamble \DeclareExerciseTranslation
+
+\NewDocumentCommand \ForEachExerciseTranslation {+m}
+ { \xsim_for_all_translations_do:n {#1} }
+
+% ----------------------------------------------------------------------------
+
+\NewDocumentCommand \DeclareExerciseCollection {om}
+ {
+ \IfNoValueTF {#1}
+ { \xsim_new_collection:nn {#2} {} }
+ {
+ \xsim_new_collection:nn {#2} {#1}
+ \xsim_activate_collection:n {#2}
+ }
+ }
+\@onlypreamble \DeclareExerciseCollection
+
+\NewDocumentCommand \activatecollection {m}
+ { \xsim_activate_collection:n {#1} }
+
+\NewDocumentCommand \deactivatecollection {m}
+ { \xsim_deactivate_collection:n {#1} }
+
+% \NewDocumentCommand \collectexercisestype {mm}
+% { \xsim_collect_type_start:nn {#1} {#2} }
+
+\NewDocumentCommand \collectexercises {m}
+ { \xsim_collect_start:n {#1} }
+
+\NewDocumentCommand \collectexercisesstop {m}
+ { \xsim_collect_stop:n {#1} }
+
+\NewDocumentCommand \printcollection {O{}m}
+ { \xsim_print_collection:nn {#1} {#2} }
+
+\NewDocumentCommand \printrandomexercises {O{}m}
+ {
+ \group_begin:
+ \keys_set:nn {xsim/random} {#1}
+ \xsim_print_random_list:VnN
+ \l_xsim_random_collection_tl
+ {#2}
+ \l_xsim_random_exclude_list_clist
+ \group_end:
+ }
+
+% ----------------------------------------------------------------------------
+
+\NewDocumentCommand \blank {som}
+ {
+ \group_begin:
+ \IfNoValueF {#2} { \keys_set:nn {xsim/blank} {#2} }
+ \mode_if_vertical:TF
+ {
+ \IfBooleanTF {#1}
+ { \xsim_blank:n {#3} }
+ {
+ \bool_if:NT \l__xsim_blank_linespread_bool
+ { \linespread { \l__xsim_blank_linespread_tl } \selectfont }
+ \noindent \null \xsim_blank:n {#3} \par
+ }
+ }
+ { \xsim_blank:n {#3} }
+ \group_end:
+ }
+
+\NewDocumentCommand \examspace { sm }
+ {
+ \IfBooleanTF {#1}
+ { \xsim_examspace:nn { \c_true_bool } {#2} }
+ { \xsim_examspace:nn { \c_false_bool } {#2} }
+ }
+
+% ----------------------------------------------------------------------------
+
+\NewDocumentCommand \gradingtable {O{}}
+ {
+ \group_begin:
+ \keys_set:nn {xsim/grading-table} {#1}
+ \xsim_setup_template:nVn {table} \l_xism_grading_table_template_tl
+ {
+ \providecommand* \ExerciseTableCode {}
+ \providecommand* \ExerciseTableType [1] {}
+ \providecommand* \ExerciseType {}
+ \tl_set_eq:NN \ExerciseType \l_xism_grading_table_exercise_type_tl
+ \renewcommand* \ExerciseTableCode {}
+ \renewcommand* \ExerciseTableType [1]
+ {
+ \XSIMifblankTF { \l_xism_grading_table_exercise_type_tl }
+ {##1}
+ { \l_xism_grading_table_exercise_type_tl }
+ }
+ }
+ \xsim_use_template:nV {table} \l_xism_grading_table_template_tl
+ \group_end:
+ }
+
+% ----------------------------------------------------------------------------
+
+\NewDocumentCommand \XSIMprint {mO{}mm}
+ { \xsim_insert:nenn {#3} { \xsim_normalize_id:n {#4} } {#2} {#1} }
+
+\NewDocumentCommand \XSIMxprint {mO{}mm}
+ { \xsim_insert:xxnn {#3} { \xsim_normalize_id:e {#4} } {#2} {#1} }
+
+\NewDocumentCommand \printexercise {O{}mm}
+ {
+ \clist_map_inline:nn {#3}
+ { \xsim_insert:nenn {#2} { \xsim_normalize_id:n {##1} } {#1} {exercise} }
+ }
+
+\NewDocumentCommand \xprintexercise {O{}mm}
+ {
+ \clist_map_inline:nn {#3}
+ { \xsim_insert:xxnn {#2} { \xsim_normalize_id:e {##1} } {#1} {exercise} }
+ }
+
+\NewDocumentCommand \printsolution {O{}mm}
+ {
+ \clist_map_inline:nn {#3}
+ { \xsim_insert:nenn {#2} { \xsim_normalize_id:n {##1} } {#1} {solution} }
+ }
+
+\NewDocumentCommand \xprintsolution {O{}mm}
+ {
+ \clist_map_inline:nn {#3}
+ { \xsim_insert:xxnn {#2} { \xsim_normalize_id:e {##1} } {#1} {solution} }
+ }
+
+% ----------------------------------------------------------------------------
+
+\NewDocumentCommand \printsolutionstype {sO{}m}
+ {
+ \IfBooleanTF {#1}
+ { \xsim_print_type_solutions:nnn { \c_true_bool } {#2} {#3} }
+ { \xsim_print_type_solutions:nnn { \c_false_bool } {#2} {#3} }
+ }
+
+\NewDocumentCommand \printsolutions {sO{}}
+ {
+ \IfBooleanTF {#1}
+ { \xsim_print_all_solutions_per_type:nn { \c_true_bool } {#2} }
+ { \xsim_print_all_solutions_per_type:nn { \c_false_bool } {#2} }
+ }
+
+\NewDocumentCommand \printallsolutions {sO{}}
+ {
+ \IfBooleanTF {#1}
+ { \xsim_print_all_solutions_per_id:nn { \c_true_bool } {#2} }
+ { \xsim_print_all_solutions_per_id:nn { \c_false_bool } {#2} }
+ }
+
+% ----------------------------------------------------------------------------
+
+\NewDocumentCommand \printforexercises {sO{}+mO{}}
+ {
+ \IfBooleanTF {#1}
+ {
+ \xsim_foreach_exercise_type:n
+ { \xsim_print_type_code:nnnnn { \c_true_bool } {#2} {#4} {##1} {#3} }
+ }
+ {
+ \xsim_foreach_exercise_type:n
+ { \xsim_print_type_code:nnnnn { \c_false_bool } {#2} {#4} {##1} {#3} }
+ }
+ }
+
+% ----------------------------------------------------------------------------
+
+\NewDocumentCommand \xsimsetup {+m}
+ { \xsim_setup:n {#1} }
+
+% ----------------------------------------------------------------------------
+\NewExpandableDocumentCommand \XSIMifchapterTF {+m+m}
+ { \xsim_if_chapter:TF {#1} {#2} }
+
+\NewExpandableDocumentCommand \XSIMifchapterT {+m}
+ { \xsim_if_chapter:T {#1} }
+
+\NewExpandableDocumentCommand \XSIMifchapterF {+m}
+ { \xsim_if_chapter:F {#1} }
+
+\XSIMmoduleend
+\XSIMmodule{definitions}{definition of user commands}
+
+% not exactly a user choice: the `exercises' environments rely on them:
+\DeclareExerciseParameter*!{exercise-env}
+\DeclareExerciseParameter*!{solution-env}
+\DeclareExerciseParameter !{exercise-name}
+\DeclareExerciseParameter !{solution-name}
+\DeclareExerciseParameter {exercises-name}
+\DeclareExerciseParameter {solutions-name}
+\DeclareExerciseParameter !{exercise-template}
+\DeclareExerciseParameter !{solution-template}
+\DeclareExerciseParameter* {counter}
+\DeclareExerciseParameter* {solution-counter}
+\DeclareExerciseParameter* {number}
+\DeclareExerciseParameter {within}
+\DeclareExerciseParameter {the-counter}
+
+% these are additional - but are used in the `default' environment
+% template:
+\DeclareExerciseParameter {exercise-heading}
+\DeclareExerciseParameter {solution-heading}
+
+% ----------------------------------------------------------------------------
+
+% not exactly a user choice, must be present at various places:
+\DeclareExerciseProperty! {id}
+\DeclareExerciseProperty! {ID}
+\DeclareExerciseProperty {counter}
+\DeclareExerciseProperty {counter-value}
+\DeclareExerciseProperty * {solution}
+\XSIMifchapterT{
+ \DeclareExerciseProperty {chapter-value}
+ \DeclareExerciseProperty {chapter}
+}
+\DeclareExerciseProperty {section-value}
+\DeclareExerciseProperty {section}
+\DeclareExerciseProperty {sectioning}
+
+% those are additional and wouldn't *need* to be present except for
+% pre-defined templates which make use of them (the page and page-value
+% property actually needs to be defined for xsim to be able to save the
+% corresponding values):
+\DeclareExerciseProperty {subtitle}
+\DeclareExerciseProperty {points}
+\DeclareExerciseProperty {bonus-points}
+\DeclareExerciseProperty {page-value}
+\DeclareExerciseProperty {page}
+
+\DeclareExercisePropertyAlias {ID} {id}
+
+% ----------------------------------------------------------------------------
+
+\DeclareExerciseTagging {tags}
+\DeclareExerciseTagging {topics}
+
+\xsimsetup{tags/ignore-untagged=false}
+
+% ----------------------------------------------------------------------------
+
+\DeclareExerciseGoal {points}
+\DeclareExerciseGoal {bonus-points}
+
+\NewDocumentCommand \printgoal {m}
+ { \ExerciseGoalValuePrint {#1} {} {} }
+
+\NewDocumentCommand \points {m}
+ {
+ \ExerciseGoalValuePrint {#1}
+ { \, \XSIMtranslate {point} }
+ { \, \XSIMtranslate {points} }
+ }
+
+\NewDocumentCommand \addpoints {sm}
+ {
+ \AddtoExerciseGoal {points} {#2}
+ \IfBooleanF {#1} { \points {#2} }
+ }
+
+\NewDocumentCommand \printpoints {m}
+ {
+ \TotalExerciseTypeGoal {#1} {points}
+ { \, \XSIMtranslate {point} }
+ { \, \XSIMtranslate {points} }
+ }
+
+\NewDocumentCommand \printtotalpoints {}
+ {
+ \TotalExerciseGoal {points}
+ { \, \XSIMtranslate {point} }
+ { \, \XSIMtranslate {points} }
+ }
+
+\NewDocumentCommand \addbonus {sm}
+ {
+ \AddtoExerciseGoal {bonus-points} {#2}
+ \IfBooleanF {#1} { \points {#2} }
+ }
+
+\NewDocumentCommand \printbonus {m}
+ {
+ \TotalExerciseTypeGoal {#1} {bonus-points}
+ { \, \XSIMtranslate {point} }
+ { \, \XSIMtranslate {points} }
+ }
+
+\NewDocumentCommand \printtotalbonus {}
+ {
+ \TotalExerciseGoal {bonus-points}
+ { \, \XSIMtranslate {point} }
+ { \, \XSIMtranslate {points} }
+ }
+
+% ----------------------------------------------------------------------------
+\NewDocumentCommand \pointsforgrade {m}
+ {
+ \GetGradeRequirementForGoal {#1} {points}
+ { \, \XSIMtranslate {point} }
+ { \, \XSIMtranslate {points} }
+ }
+
+\NewDocumentCommand \goalsforgrade {mm}
+ {
+ \GetGradeRequirementForGoals {#2} {#1}
+ { \, \XSIMtranslate {point} }
+ { \, \XSIMtranslate {points} }
+ }
+
+\NewDocumentCommand \totalgoalforgrade {m}
+ {
+ \GetGradeRequirement {#1}
+ { \, \XSIMtranslate {point} }
+ { \, \XSIMtranslate {points} }
+ }
+
+% ----------------------------------------------------------------------------
+
+\xsim_if_package_blank:F
+ {
+ \DeclareExerciseType {exercise} {
+ exercise-env = exercise ,
+ solution-env = solution ,
+ exercise-name = \XSIMtranslate {exercise} ,
+ exercises-name = \XSIMtranslate {exercises} ,
+ solution-name = \XSIMtranslate {solution} ,
+ solutions-name = \XSIMtranslate {solutions} ,
+ exercise-template = default ,
+ solution-template = default ,
+ exercise-heading = \subsection* ,
+ solution-heading = \subsection*
+ }
+ }
+
+% ----------------------------------------------------------------------------
+
+\DeclareExerciseEnvironmentTemplate {default}
+ {
+ \GetExerciseHeadingF { \subsection* }
+ {
+ \XSIMmixedcase { \GetExerciseName } \nobreakspace
+ \GetExerciseProperty {counter}
+ \IfInsideSolutionF
+ {
+ \IfExercisePropertySetT {subtitle}
+ { ~ { \normalfont \itshape \GetExerciseProperty {subtitle} } }
+ }
+ }
+ \GetExercisePropertyT {points}
+ {
+ \marginpar
+ {
+ \IfInsideSolutionF { \rule {1.2cm} {1pt} \slash }
+ \printgoal {\PropertyValue}
+ \GetExercisePropertyT {bonus-points}
+ { \nobreakspace ( + \printgoal {\PropertyValue} ) }
+ \nobreakspace\XSIMtranslate {point-abbr}
+ }
+ }
+ }
+ { \par }
+
+% ----------------------------------------------------------------------------
+
+\DeclareExerciseHeadingTemplate {none} {}
+
+\DeclareExerciseHeadingTemplate {default}
+ { \section* { \XSIMtranslate {default-heading} } }
+
+\DeclareExerciseHeadingTemplate {collection}
+ { \section* { \XSIMtranslate {collection-heading} } }
+
+\DeclareExerciseHeadingTemplate {per-section}
+ { \section* { \XSIMtranslate {per-section-heading} } }
+
+\DeclareExerciseHeadingTemplate {per-chapter}
+ { \section* { \XSIMtranslate {per-chapter-heading} } }
+
+% ----------------------------------------------------------------------------
+
+\RequirePackage{array,booktabs}
+
+\DeclareExerciseTableTemplate {default*}
+ {
+ \XSIMputright \ExerciseTableCode
+ {
+ \toprule
+ \XSIMifblankF { \ExerciseType }
+ { \XSIMmixedcase { \GetExerciseParameter {exercise-name} } }
+ &
+ }
+ \ForEachUsedExerciseByType
+ {
+ \XSIMifeqT {#1} { \ExerciseTableType {#1} }
+ {
+ \XSIMifblankT { \ExerciseTableType {} }
+ {
+ \XSIMputright \ExerciseTableCode
+ {
+ \XSIMmixedcase
+ { \ExerciseParameterGet {#1} {exercise-name} ~ }
+ }
+ }
+ \XSIMputright \ExerciseTableCode { #3 & }
+ }
+ }
+ \XSIMputright \ExerciseTableCode
+ {
+ \XSIMtranslate {total} \\
+ \midrule \XSIMmixedcase { \XSIMtranslate {points} } &
+ }
+ \ForEachUsedExerciseByType
+ {
+ \XSIMifeqT {#1} { \ExerciseTableType {#1} }
+ {
+ \XSIMputright \ExerciseTableCode
+ { \XSIMifblankTF {#5} {\printgoal{0}} {\printgoal{#5}} & }
+ }
+ }
+ \XSIMputright \ExerciseTableCode
+ {
+ \XSIMifblankTF { \ExerciseType }
+ { \TotalExerciseGoal {points} {} {} }
+ { \TotalExerciseTypeGoal { \ExerciseType } {points} {} {} }
+ \\ \midrule
+ \XSIMtranslate {reached} &
+ }
+ \ForEachUsedExerciseByType
+ {
+ \XSIMifeqT {#1} { \ExerciseTableType {#1} }
+ { \XSIMputright \ExerciseTableCode {&} }
+ }
+ \XSIMputright \ExerciseTableCode { \\ \bottomrule }
+ \edef \numberofcolumns
+ {
+ \XSIMifblankTF { \ExerciseType }
+ {\numberofusedexercises}
+ {\csname numberof \ExerciseType s\endcsname}
+ }
+ \XSIMifeqF {\numberofcolumns} {0}
+ {
+ \begin {tabular} {l*{\numberofcolumns}{c}c}
+ \ExerciseTableCode
+ \end {tabular}
+ }
+ }
+
+\DeclareExerciseTableTemplate {default}
+ {
+ \XSIMputright \ExerciseTableCode
+ {
+ \toprule
+ \XSIMifblankF { \ExerciseType }
+ { \XSIMmixedcase { \GetExerciseParameter {exercise-name} } }
+ &
+ \XSIMmixedcase { \XSIMtranslate {points} } &
+ \XSIMtranslate {reached} \\
+ \midrule
+ }
+ \ForEachUsedExerciseByType
+ {
+ \XSIMifeqT {#1} { \ExerciseTableType {#1} }
+ {
+ \XSIMifblankT { \ExerciseTableType {} }
+ {
+ \XSIMputright \ExerciseTableCode
+ {
+ \XSIMmixedcase
+ { \ExerciseParameterGet {#1} {exercise-name} ~ }
+ }
+ }
+ \XSIMputright \ExerciseTableCode
+ { #3 & \XSIMifblankTF {#5} {\printgoal{0}} {\printgoal{#5}} & \\ }
+ }
+ }
+ \XSIMputright \ExerciseTableCode
+ {
+ \midrule
+ \XSIMtranslate {total} &
+ \XSIMifblankTF { \ExerciseType }
+ { \TotalExerciseGoal {points} {} {} }
+ { \TotalExerciseTypeGoal { \ExerciseType } {points} {} {} } &
+ \\ \bottomrule
+ }
+ \XSIMexpandcode
+ {
+ \noexpand \begin {tabular} {\XSIMifblankTF{\ExerciseType}{l}{c}cc}
+ \noexpand \ExerciseTableCode
+ \noexpand \end {tabular}
+ }
+ }
+
+% ----------------------------------------------------------------------------
+
+\DeclareExerciseTranslations {exercise} {
+ Fallback = exercise ,
+ English = exercise ,
+ French = exercice ,
+ German = \"Ubung
+}
+
+\DeclareExerciseTranslations {exercises} {
+ Fallback = exercises ,
+ English = exercises ,
+ French = exercices ,
+ German = \"Ubungen
+}
+
+\DeclareExerciseTranslations {question} {
+ Fallback = question ,
+ English = question ,
+ French = question ,
+ German = Aufgabe
+}
+
+\DeclareExerciseTranslations {questions} {
+ Fallback = questions ,
+ English = questions ,
+ French = questions ,
+ German = Aufgaben
+}
+
+\DeclareExerciseTranslations {solution} {
+ Fallback = solution ,
+ English = solution ,
+ French = solution ,
+ German = L\"osung
+}
+
+\DeclareExerciseTranslations {solutions} {
+ Fallback = solutions ,
+ English = solutions ,
+ French = solutions ,
+ German = L\"osungen
+}
+
+\DeclareExerciseTranslations {point-abbr} {
+ Fallback = p. ,
+ English = p. ,
+ French = p. ,
+ German = P.
+}
+
+\DeclareExerciseTranslations {point} {
+ Fallback = point ,
+ English = point ,
+ French = point ,
+ German = Punkt
+}
+
+\DeclareExerciseTranslations {points} {
+ Fallback = points ,
+ English = points ,
+ French = points ,
+ German = Punkte
+}
+
+\DeclareExerciseTranslations {reached} {
+ Fallback = reached ,
+ English = reached ,
+ French = obtenus ,
+ German = erreicht
+}
+
+\DeclareExerciseTranslations {total} {
+ Fallback = total ,
+ English = total ,
+ French = total ,
+ German = insgesamt
+}
+
+\DeclareExerciseTranslations {default-heading} {
+ Fallback = \XSIMmixedcase { \GetExerciseParameter {solutions-name} }~
+ to~ the~ \XSIMmixedcase { \GetExerciseParameter {exercises-name} } ,
+ English = \XSIMmixedcase { \GetExerciseParameter {solutions-name} }~
+ to~ the~ \XSIMmixedcase { \GetExerciseParameter {exercises-name} } ,
+ French = \XSIMmixedcase { \GetExerciseParameter {solutions-name} ~
+ des~ \GetExerciseParameter {exercises-name} } ,
+ German = \XSIMmixedcase { \GetExerciseParameter {solutions-name} }~
+ zu~ den~ \XSIMmixedcase { \GetExerciseParameter {exercises-name} }
+}
+
+\DeclareExerciseTranslations {collection-heading} {
+ Fallback = \XSIMmixedcase { \GetExerciseParameter {exercises-name} } ,
+ English = \XSIMmixedcase { \GetExerciseParameter {exercises-name} } ,
+ French = \XSIMmixedcase { \GetExerciseParameter {exercises-name} } ,
+ German = \XSIMmixedcase { \GetExerciseParameter {exercises-name} }
+}
+
+\DeclareExerciseTranslations {per-section-heading} {
+ Fallback = \XSIMmixedcase { \GetExerciseParameter {solutions-name} } ~
+ to~ the~ \XSIMmixedcase { \GetExerciseParameter {exercises-name} } ~
+ of~ Section \nobreakspace \ExerciseSection ,
+ English = \XSIMmixedcase { \GetExerciseParameter {solutions-name} } ~
+ to~ the~ \XSIMmixedcase { \GetExerciseParameter {exercises-name} } ~
+ of~ Section \nobreakspace \ExerciseSection ,
+ French = \XSIMmixedcase { \GetExerciseParameter {solutions-name} ~
+ des~ \GetExerciseParameter {exercises-name} ~ de~ la~
+ section \nobreakspace \ExerciseSection } ,
+ German = \XSIMmixedcase { \GetExerciseParameter {solutions-name} } ~
+ zu~ den~ \XSIMmixedcase { \GetExerciseParameter {exercises-name} }~
+ in~ Abschnitt \nobreakspace \ExerciseSection
+}
+
+\DeclareExerciseTranslations {per-chapter-heading} {
+ Fallback = \XSIMmixedcase { \GetExerciseParameter {solutions-name} } ~
+ to~ the~ \XSIMmixedcase { \GetExerciseParameter {exercises-name} } ~
+ of~ Chapter \nobreakspace \ExerciseChapter ,
+ English = \XSIMmixedcase { \GetExerciseParameter {solutions-name} } ~
+ to~ the~ \XSIMmixedcase { \GetExerciseParameter {exercises-name} } ~
+ of~ Chapter \nobreakspace \ExerciseChapter ,
+ French = \XSIMmixedcase { \GetExerciseParameter {solutions-name} ~
+ des~ \GetExerciseParameter {exercises-name} ~
+ du~ chapitre \nobreakspace \ExerciseChapter } ,
+ German = \XSIMmixedcase { \GetExerciseParameter {solutions-name} } ~
+ zu~ den~ \XSIMmixedcase { \GetExerciseParameter {exercises-name} } ~
+ in~ Kapitel \nobreakspace \ExerciseChapter
+}
+
+\XSIMmoduleend
+% finish package:
+\hook_gput_code:nnn {enddocument} {toplevel} { \xsim_close_aux:\xsim_do_rerun: }
+%----------------------------------------------------------------------------
+\file_input_stop:
diff --git a/macros/latex/contrib/xsim/code/xsim.verbwrite.code.tex b/macros/latex/contrib/xsim/xsimverb.sty
index e43c30d34d..712440d423 100644
--- a/macros/latex/contrib/xsim/code/xsim.verbwrite.code.tex
+++ b/macros/latex/contrib/xsim/xsimverb.sty
@@ -1,22 +1,22 @@
% ----------------------------------------------------------------------------
-% the XSIM package - verbwrite module
+% the XSIMVERB package
%
-% eXercise Sheets IMproved
+% write environments verbatim to files
%
% ----------------------------------------------------------------------------
% Clemens Niederberger
% Web: https://github.com/cgnieder/xsim
% E-Mail: contact@mychemistry.eu
% ----------------------------------------------------------------------------
-% Copyright 2017--2020 Clemens Niederberger
+% Copyright 2017--2021 Clemens Niederberger
%
% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
+% conditions of the LaTeX Project Public License, either version 1.3c
% of this license or (at your option) any later version.
% The latest version of this license is in
% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008/05/04 or later.
%
% This work has the LPPL maintenance status `maintained'.
%
@@ -25,9 +25,100 @@
% If you have any ideas, questions, suggestions or bugs to report, please
% feel free to contact me.
% ----------------------------------------------------------------------------
+\RequirePackage {l3keys2e}
+\ExplSyntaxOn
+
+\tl_const:Nn \c_xsimverb_date_tl {2021/01/31}
+\tl_const:Nn \c_xsimverb_version_major_number_tl {0}
+\tl_const:Nn \c_xsimverb_version_minor_number_tl {3}
+\tl_const:Nn \c_xsimverb_version_subrelease_tl {}
+\tl_const:Nx \c_xsimverb_version_number_tl
+ {
+ \c_xsimverb_version_major_number_tl .
+ \c_xsimverb_version_minor_number_tl
+ }
+\tl_const:Nx \c_xsimverb_version_tl
+ {
+ \c_xsimverb_version_number_tl
+ \c_xsimverb_version_subrelease_tl
+ }
+\tl_const:Nn \c_xsimverb_info_tl {write~ environments~ verbatim~ to~ files}
+
+\ProvidesExplPackage
+ {xsimverb}
+ {\c_xsimverb_date_tl}
+ {\c_xsimverb_version_tl}
+ {\c_xsimverb_info_tl}
+
+% options, information
+
+\cs_new_protected:Npn \xsimverb_bool_provide:N #1
+ { \bool_if_exist:NF #1 { \bool_new:N #1 } }
+
+\xsimverb_bool_provide:N \g__xsim_final_bool
+\xsimverb_bool_provide:N \g__xsim_verbose_bool
+\xsimverb_bool_provide:N \g_xsim_clear_aux_bool
+\xsimverb_bool_provide:N \g__xsim_write_to_file_bool
+\xsimverb_bool_provide:N \g_xsim_use_aux_bool
+\xsimverb_bool_provide:N \g__xsim_rerun_bool
+\xsimverb_bool_provide:N \g__xsim_debug_bool
+\xsimverb_bool_provide:N \g__xsim_blank_bool
+
+\keys_define:nn {xsimverb}
+ {
+ final .bool_gset:N = \g__xsim_final_bool ,
+ verbose .bool_gset:N = \g__xsim_verbose_bool ,
+ debug .bool_gset:N = \g__xsim_debug_bool ,
+ clear-aux .bool_gset:N = \g_xsim_clear_aux_bool ,
+ use-files .bool_gset:N = \g__xsim_write_to_file_bool ,
+ use-files .initial:n = false ,
+ no-files .choice: ,
+ no-files / true .meta:n = { use-files = false } ,
+ no-files / false .meta:n = { use-files = true } ,
+ no-files .default:n = true ,
+ use-aux .bool_gset:N = \g_xsim_use_aux_bool ,
+ use-aux .initial:n = false ,
+ blank .bool_gset:N = \g__xsim_blank_bool ,
+ blank .initial:n = false
+ }
+
+\ProcessKeysPackageOptions {xsimverb}
+
+\cs_if_exist:NF \xsim_if_final:T
+ {
+ \prg_new_conditional:Npnn \xsim_if_final: {p,T,F,TF}
+ {
+ \bool_if:NTF \g__xsim_final_bool
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+ \prg_new_conditional:Npnn \xsim_if_verbose: {p,T,F,TF}
+ {
+ \bool_if:NTF \g__xsim_verbose_bool
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ }
+
+\cs_if_exist:NF \xsim_verbose:n
+ {
+ \cs_new_protected:Npn \xsim_verbose:n #1
+ { \xsim_if_verbose:T { \msg_info:nnn {xsim} {verbose} {#1} } }
+ \cs_generate_variant:Nn \xsim_verbose:n {x}
+ }
+
+% --------------------------------------------------------------------------
+% #1: name
+% #2: description
+\cs_set_protected:Npn \XSIMmodule #1#2 {}
+\cs_set_protected:Npn \XSIMmoduleend {}
+
+% --------------------------------------------------------------------------
\XSIMmodule{verbwrite}{write contents of environments verbatim to files}
-\xsim_load_modules:n {base}
+\int_new:N \l__xsimverb_tmpa_int
+\tl_new:N \l__xsimverb_tmpa_tl
\iow_new:N \l__xsim_file_contents_iow
\tl_new:N \l_xsim_file_begin_tl
@@ -43,27 +134,29 @@
\group_end:
% ----------------------------------------------------------------------------
-
+\bool_new:N \l__xsim_stream_open_bool
% the `final' option will prevent writing to files:
% #1: write stream
% #2: file name
\cs_new_protected:Npn \__xsim_open_stream:Nn #1#2
{
\file_if_exist:nTF {#2}
- { \xsim_if_final:F { \iow_open:Nn #1 {#2} } }
{
- % \g__xsim_final_bool is a global variable; however, if it is true and
- % the exercise file doesn't exist, yet, we need to set it locally to
- % false in order to ensure that the file is correctly written and the
- % stream closed afterwards
- \bool_set_false:N \g__xsim_final_bool
+ \xsim_if_final:F
+ {
+ \bool_set_true:N \l__xsim_stream_open_bool
+ \iow_open:Nn #1 {#2}
+ }
+ }
+ {
+ \bool_set_true:N \l__xsim_stream_open_bool
\iow_open:Nn #1 {#2}
}
}
% #1: write stream
\cs_new_protected:Npn \__xsim_close_stream:N #1
- { \xsim_if_final:F { \iow_close:N #1 } }
+ { \bool_if:NT \l__xsim_stream_open_bool { \iow_close:N #1 } }
% #1: write stream
% #2: contents
@@ -73,21 +166,22 @@
{
% remove the /one/ space token with catcode 10 that is inserted if
% no options are given to the surrounding environment:
- \tl_set:Nn \l__xsim_tmpa_tl {#2}
- \tl_remove_once:Nn \l__xsim_tmpa_tl {~}
- % \tl_show:N \l__xsim_tmpa_tl
- % \int_show:n { \tl_count:N \l__xsim_tmpa_tl }
- % \tl_analysis_show:N \l__xsim_tmpa_tl
- \int_zero:N \l__xsim_tmpa_int
- \int_while_do:nn { \l__xsim_tmpa_int < \l_xsim_line_gobble_int }
+ \tl_set:Nn \l__xsimverb_tmpa_tl {#2}
+ \tl_remove_once:Nn \l__xsimverb_tmpa_tl {~}
+ % \tl_show:N \l__xsimverb_tmpa_tl
+ % \int_show:n { \tl_count:N \l__xsimverb_tmpa_tl }
+ % \tl_analysis_show:N \l__xsimverb_tmpa_tl
+ \int_zero:N \l__xsimverb_tmpa_int
+ \int_while_do:nn { \l__xsimverb_tmpa_int < \l_xsim_line_gobble_int }
{
- \int_incr:N \l__xsim_tmpa_int
- \tl_set:Nx \l__xsim_tmpa_tl { \tl_tail:N \l__xsim_tmpa_tl }
+ \int_incr:N \l__xsimverb_tmpa_int
+ \tl_set:Nx \l__xsimverb_tmpa_tl { \tl_tail:N \l__xsimverb_tmpa_tl }
}
- \iow_now:NV #1 \l__xsim_tmpa_tl
+ \iow_now:NV #1 \l__xsimverb_tmpa_tl
}
}
\cs_generate_variant:Nn \__xsim_write_to_stream:Nn {Nx}
+\cs_generate_variant:Nn \iow_now:Nn {NV}
\cs_new:Npn \__xsim_tab: { \c_space_tl \c_space_tl }
\cs_new:Npn \__xsim_par: { ^^J ^^J }
@@ -106,6 +200,7 @@
{ \bool_if:nF {#1} { \exp_not:V \c__xsim_active_eol_tl } }
}
\cs_generate_variant:Nn \xsim_file_write_start:nn {nV}
+\cs_generate_variant:Nn \use:nn {nx}
\cs_new_protected:Npn \__xsim_set_verb_catcodes:
{
@@ -135,17 +230,17 @@
\xsim_if_final:F %
{ %
\iow_now:Nx \l__xsim_file_contents_iow %
- { \l_xsim_file_begin_tl } %
+ { \exp_not:V \l_xsim_file_begin_tl } %
} %
} %
\__xsim_set_verb_catcodes: %
- \tl_set:Nx \l__xsim_tmpa_tl %
+ \tl_set:Nx \l__xsimverb_tmpa_tl %
{ \c__xsim_backslash_char_tl end \cs_to_str:N \{ \@currenvir \cs_to_str:N \} } %
\use:x %
{ %
\cs_set:cpn {__xsim_tmpa:www} %
- ####1 \l__xsim_tmpa_tl %
- ####2 \l__xsim_tmpa_tl %
+ ####1 \l__xsimverb_tmpa_tl %
+ ####2 \l__xsimverb_tmpa_tl %
####3 \exp_not:N \q_stop: %
} %
{ %
@@ -168,8 +263,8 @@
\cs_set:Npx \__xsim_M:w ##1 ^^M %
{ %
\exp_not:N \__xsim_tmpa:www ##1 %
- \l__xsim_tmpa_tl %
- \l__xsim_tmpa_tl %
+ \l__xsimverb_tmpa_tl %
+ \l__xsimverb_tmpa_tl %
\exp_not:N \q_stop: %
} %
\char_set_active_eq:nN {13} \__xsim_M:w %
@@ -185,7 +280,7 @@
\xsim_if_final:F
{
\iow_now:Nx \l__xsim_file_contents_iow
- { \l_xsim_file_end_tl }
+ { \exp_not:V \l_xsim_file_end_tl }
}
}
\__xsim_close_stream:N \l__xsim_file_contents_iow
@@ -213,5 +308,4 @@
\NewDocumentCommand \XSIMgobblechars {m}
{ \int_set:Nn \l_xsim_line_gobble_int {#1} }
-% ----------------------------------------------------------------------------
-\file_input_stop:
+\XSIMmoduleend
diff --git a/macros/luatex/latex/hu-berlin-bundle/README.md b/macros/luatex/latex/hu-berlin-bundle/README.md
index 40b582c70b..008b3c632f 100644
--- a/macros/luatex/latex/hu-berlin-bundle/README.md
+++ b/macros/luatex/latex/hu-berlin-bundle/README.md
@@ -67,6 +67,12 @@ All notable changes to this project will be documented in the [README.md](https:
This project **does not** adhere to [Semantic Versioning](http://semver.org/).
The markdown syntax is inspired by the conventions proposed by [keepachangelog.com](http://keepachangelog.com/).
+### v1.1.1 (2021/01/31)
+* (letter) fix for language switch when using markdown-pandoc-conversion workflow
+
+### v1.1.0 (2021/01/31)
+* (letter) language option now available also for the markdown-pandoc-conversion-workflow.
+
### v1.0.9 (2021/01/10)
* (letter) making everything multi-lingual (at least German and English); German is default language. You can load English e.g. by `documentclass[english]{hu-berlin-letter}` (addresses [issue No. 3](https://github.com/LukasCBossert/hu-berlin-bundle/issues/3))
diff --git a/macros/luatex/latex/hu-berlin-bundle/hu-berlin-bundle.dtx b/macros/luatex/latex/hu-berlin-bundle/hu-berlin-bundle.dtx
index 738f1cee2d..43bf8115a4 100644
--- a/macros/luatex/latex/hu-berlin-bundle/hu-berlin-bundle.dtx
+++ b/macros/luatex/latex/hu-berlin-bundle/hu-berlin-bundle.dtx
@@ -1,6 +1,6 @@
% \iffalse
%<*internal|cls|sty>
-\def\Version{2021/01/10 v1.0.9}
+\def\Version{2021/01/31 v1.1.1}
%</internal|cls|sty>
%<*internal>
\iffalse
@@ -304,6 +304,12 @@ All notable changes to this project will be documented in the [README.md](https:
This project **does not** adhere to [Semantic Versioning](http://semver.org/).
The markdown syntax is inspired by the conventions proposed by [keepachangelog.com](http://keepachangelog.com/).
+### v1.1.1 (2021/01/31)
+* (letter) fix for language switch when using markdown-pandoc-conversion workflow
+
+
+### v1.1.0 (2021/01/31)
+* (letter) language option now available also for the markdown-pandoc-conversion-workflow.
### v1.0.9 (2021/01/10)
* (letter) making everything multi-lingual (at least German and English); German is default language. You can load English e.g. by `documentclass[english]{hu-berlin-letter}` (addresses [issue No. 3](https://github.com/LukasCBossert/hu-berlin-bundle/issues/3))
@@ -720,6 +726,12 @@ sender: hu-berlin-letter-example
% \begin{macrocode}
subject: Short description
% \end{macrocode}
+% And if you want to have a different language, define it now.
+% You can choose between German (default)
+% and English.
+% \begin{macrocode}
+lang: english
+% \end{macrocode}
% The information for the addressee has to be written like this:
% \begin{macrocode}
addressee:
@@ -1306,8 +1318,11 @@ Thank you very much for your letter.
% \begin{macrocode}
%<*letter-md>
% \end{macrocode}
+% Defining the documentclass and the language, too.
% \begin{macrocode}
-\documentclass{hu-berlin-letter}
+\documentclass[
+$if(lang)$$lang$$else$german$endif$
+]{hu-berlin-letter}
% \end{macrocode}
% We predefine two variables.
% \begin{macrocode}
diff --git a/macros/luatex/latex/hu-berlin-bundle/hu-berlin-bundle.pdf b/macros/luatex/latex/hu-berlin-bundle/hu-berlin-bundle.pdf
index 3d08232e45..40de89af22 100644
--- a/macros/luatex/latex/hu-berlin-bundle/hu-berlin-bundle.pdf
+++ b/macros/luatex/latex/hu-berlin-bundle/hu-berlin-bundle.pdf
Binary files differ
diff --git a/macros/luatex/latex/hu-berlin-bundle/makefile b/macros/luatex/latex/hu-berlin-bundle/makefile
index 85956df80d..99438b405f 100644
--- a/macros/luatex/latex/hu-berlin-bundle/makefile
+++ b/macros/luatex/latex/hu-berlin-bundle/makefile
@@ -30,7 +30,7 @@ examples: files
$(MAKE) letter
$(MAKE) md2pdf-letter
-md2pdf-letter: files
+md2pdf-letter:
pandoc --pdf-engine=lualatex --template hu-berlin-letter-template.latex -o hu-berlin-letter-example-markdown.pdf hu-berlin-letter-example-markdown.md
letter: files
diff --git a/macros/unicodetex/latex/texnegar/INSTALL.txt b/macros/unicodetex/latex/texnegar/INSTALL.txt
index 1121a14459..30a096fb97 100644
--- a/macros/unicodetex/latex/texnegar/INSTALL.txt
+++ b/macros/unicodetex/latex/texnegar/INSTALL.txt
@@ -1,7 +1,7 @@
texnegar -- INSTALL
======================
- Source: texnegar.dtx (2021-01-27 v0.1c)
+ Source: texnegar.dtx (2021-01-31 v0.1d)
Author: Hossein Movahhedian
Info: filecontents + macro + verbatim
License: LPPL 1.3c
@@ -9,23 +9,23 @@
<dma8hm1334 AT gmail DOT com>
- To extract the package and at the same time produce the
- documentation, execute: xelatex thrice on texnegar.dtx.
+ documentation, execute: lualatex or xelatex thrice on texnegar.dtx.
Files should then be moved to appropriate locations.
--- *.dtx -> TEXMF/source/xelatex/texnegar/
--- *.ins -> TEXMF/source/xelatex/texnegar/
+-- *.dtx -> TEXMF/source/latex/texnegar/
+-- *.ins -> TEXMF/source/latex/texnegar/
--- *.sty -> TEXMF/tex/xelatex/texnegar/
--- *.lua -> TEXMF/tex/xelatex/texnegar/
--- texnegar-ini.tex -> TEXMF/tex/xelatex/texnegar/
--- texnegar-xetex-kashida.tex -> TEXMF/tex/xelatex/texnegar/
--- texnegar-common-kashida.tex -> TEXMF/tex/xelatex/texnegar/
+-- *.sty -> TEXMF/tex/latex/texnegar/
+-- *.lua -> TEXMF/tex/latex/texnegar/
+-- texnegar-ini.tex -> TEXMF/tex/latex/texnegar/
+-- texnegar-xetex-kashida.tex -> TEXMF/tex/latex/texnegar/
+-- texnegar-common-kashida.tex -> TEXMF/tex/latex/texnegar/
--- *.pdf -> TEXMF/doc/xelatex/texnegar/
--- *.tex -> TEXMF/doc/xelatex/texnegar/
--- *.ltx -> TEXMF/doc/xelatex/texnegar/
--- *.txt -> TEXMF/doc/xelatex/texnegar/
+-- *.pdf -> TEXMF/doc/latex/texnegar/
+-- *.tex -> TEXMF/doc/latex/texnegar/
+-- *.ltx -> TEXMF/doc/latex/texnegar/
+-- *.txt -> TEXMF/doc/latex/texnegar/
Don't forget to run 'texconfig rehash' afterwards.
diff --git a/macros/unicodetex/latex/texnegar/doc-ligature-texnegar.pdf b/macros/unicodetex/latex/texnegar/doc-ligature-texnegar.pdf
index 55bb7c1087..1a2a98538c 100644
--- a/macros/unicodetex/latex/texnegar/doc-ligature-texnegar.pdf
+++ b/macros/unicodetex/latex/texnegar/doc-ligature-texnegar.pdf
Binary files differ
diff --git a/macros/unicodetex/latex/texnegar/doc-ligature-xep.pdf b/macros/unicodetex/latex/texnegar/doc-ligature-xep.pdf
index 02c1be0ef2..abe4facd9e 100644
--- a/macros/unicodetex/latex/texnegar/doc-ligature-xep.pdf
+++ b/macros/unicodetex/latex/texnegar/doc-ligature-xep.pdf
Binary files differ
diff --git a/macros/unicodetex/latex/texnegar/doc-samples-glyph.pdf b/macros/unicodetex/latex/texnegar/doc-samples-glyph.pdf
index a72a792eb9..9461731e02 100644
--- a/macros/unicodetex/latex/texnegar/doc-samples-glyph.pdf
+++ b/macros/unicodetex/latex/texnegar/doc-samples-glyph.pdf
Binary files differ
diff --git a/macros/unicodetex/latex/texnegar/doc-samples-hrule.pdf b/macros/unicodetex/latex/texnegar/doc-samples-hrule.pdf
index 8e55b7dc26..25e9856e58 100644
--- a/macros/unicodetex/latex/texnegar/doc-samples-hrule.pdf
+++ b/macros/unicodetex/latex/texnegar/doc-samples-hrule.pdf
Binary files differ
diff --git a/macros/unicodetex/latex/texnegar/doc-samples-xep.pdf b/macros/unicodetex/latex/texnegar/doc-samples-xep.pdf
index f613613547..e1dbc20a38 100644
--- a/macros/unicodetex/latex/texnegar/doc-samples-xep.pdf
+++ b/macros/unicodetex/latex/texnegar/doc-samples-xep.pdf
Binary files differ
diff --git a/macros/unicodetex/latex/texnegar/texnegar-doc.ltx b/macros/unicodetex/latex/texnegar/texnegar-doc.ltx
index c740068a7d..6b38d66e34 100644
--- a/macros/unicodetex/latex/texnegar/texnegar-doc.ltx
+++ b/macros/unicodetex/latex/texnegar/texnegar-doc.ltx
@@ -1,7 +1,7 @@
%%
%% This is file `texnegar-doc.tex'
%%
-%% Copyright (c) Hossein Movahhedian 2020-2021
+%% Copyright (C) 2020-2021 Hossein Movahhedian
%%
%% It may be distributed and/or modified under the LaTeX Project Public License,
%% version 1.3c or higher (your choice). The latest version of
@@ -63,7 +63,7 @@
}
}
-\date{Released \quad 2021-01-27 \quad v0.1c}
+\date{Released \quad 2021-01-31 \quad v0.1d}
\definecolor{HMhighlightBlueI}{rgb}{0,0,1}
\definecolor{HMhighlightbgYellowII}{rgb}{1,1,1}
@@ -281,7 +281,7 @@ The options available in \TeXNegar{} are:
for using \texttt{texnegar} to implement kashida feature only.
\item \indextermsubsub{General Options}{\textbf{General Options}}{\texttt{Minimal}}{Off}: \\
- for using \texttt{texnegar} as a general purpose typesetter (including kashida implementation).
+ for using \texttt{texnegar} as a general purpose Persian typesetter (including kashida implementation).
This is the default value.
\end{itemize}
@@ -389,6 +389,26 @@ The options available in \TeXNegar{} are:
\begin{itemize}
\item \indexterm{LuaLaTeX-only Options}{\textbf{\hologo{LuaLaTeX}-only Options}}: \\
\begin{itemize}
+ \item \indextermsub{LuaLaTeX-only Options}{\textbf{\hologo{LuaLaTeX}-only Options}}{\texttt{Kashidafontfamily}}: \\
+ that fixes the issue in \texttt{ArabLuaTeX} if one uses fonts other than \textsf{HM Series} and \textsf{Adobe Arab},
+ among those are fonts such as \textsf{Scheherazade}, \textsf{Scheherazade New}, and \textsf{Amiri}.
+ The value of this option, as returned by \hologo{LuaTeX}, is the family name of the font without spaces.
+ A few examples of these values and the corresponding fonts are:
+
+ \begin{longtable}{ll}
+ value & corresponding fonts \\
+ \hline
+ \texttt{AdobeArab} & \textsf{\small Adobe Arab Regular}, \\
+ & \textsf{\small Adobe Arab Bold}, \dots\unkern. \\
+ \texttt{Amiri} & \textsf{\small Amiri Regular, Amiri Bold}, \\
+ & \textsf{\small Amiri Slanted}, \dots\unkern. \\
+ \texttt{HMXKayhan} & \textsf{\small HM XKayhan Regular}, \\
+ & \textsf{\small HM XKayhan Bold}, \dots\unkern. \\
+ \texttt{ScheherazadeNew} & \textsf{\small Scheherazade New Regular}, \\
+ & \textsf{\small Scheherazade New Bold}, \dots\unkern. \\
+ \texttt{Scheherazade} & \textsf{\small Scheherazade}, \dots\unkern. \\
+ \end{longtable}
+
\item \indextermsub{LuaLaTeX-only Options}{\textbf{\hologo{LuaLaTeX}-only Options}}{\texttt{hboxrecursion}}: \\
which enables kashida justification inside horizontal boxes recursively.
@@ -509,6 +529,12 @@ I also would like to thank the developer teams of TeX's friends especially LaTeX
\item Fixed the problem with \texttt{Scheherazade} and \texttt{Amiri} fonts.
\end{Itemize}
+\SubSecItem{2021-01-31~v0.1d}
+\begin{Itemize}
+ \item Added the option \texttt{Kashidafontfamily} that fixes the issue in \texttt{ArabLuaTeX} if one uses
+ fonts other than \textsf{HM Series} and \textsf{Adobe Arab}.
+\end{Itemize}
+
\section*{To Do's}
To do
diff --git a/macros/unicodetex/latex/texnegar/texnegar-doc.pdf b/macros/unicodetex/latex/texnegar/texnegar-doc.pdf
index fe4771d0d2..75a809b26d 100644
--- a/macros/unicodetex/latex/texnegar/texnegar-doc.pdf
+++ b/macros/unicodetex/latex/texnegar/texnegar-doc.pdf
Binary files differ
diff --git a/macros/unicodetex/latex/texnegar/texnegar-luatex-glyph.pdf b/macros/unicodetex/latex/texnegar/texnegar-luatex-glyph.pdf
index bfc142958c..38f55ce7ae 100644
--- a/macros/unicodetex/latex/texnegar/texnegar-luatex-glyph.pdf
+++ b/macros/unicodetex/latex/texnegar/texnegar-luatex-glyph.pdf
Binary files differ
diff --git a/macros/unicodetex/latex/texnegar/texnegar-luatex-leaders-glyph.pdf b/macros/unicodetex/latex/texnegar/texnegar-luatex-leaders-glyph.pdf
index 575bae99f9..d2175bb022 100644
--- a/macros/unicodetex/latex/texnegar/texnegar-luatex-leaders-glyph.pdf
+++ b/macros/unicodetex/latex/texnegar/texnegar-luatex-leaders-glyph.pdf
Binary files differ
diff --git a/macros/unicodetex/latex/texnegar/texnegar-luatex-leaders-hrule.pdf b/macros/unicodetex/latex/texnegar/texnegar-luatex-leaders-hrule.pdf
index 3d3a9a5b54..245750465a 100644
--- a/macros/unicodetex/latex/texnegar/texnegar-luatex-leaders-hrule.pdf
+++ b/macros/unicodetex/latex/texnegar/texnegar-luatex-leaders-hrule.pdf
Binary files differ
diff --git a/macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-glyph.pdf b/macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-glyph.pdf
index 585372d580..b27a5a2d23 100644
--- a/macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-glyph.pdf
+++ b/macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-glyph.pdf
Binary files differ
diff --git a/macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-leaders-glyph.pdf b/macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-leaders-glyph.pdf
index b1162a6dc2..8ebdff53b3 100644
--- a/macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-leaders-glyph.pdf
+++ b/macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-leaders-glyph.pdf
Binary files differ
diff --git a/macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-leaders-hrule.pdf b/macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-leaders-hrule.pdf
index 6124360681..e45da3f31f 100644
--- a/macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-leaders-hrule.pdf
+++ b/macros/unicodetex/latex/texnegar/texnegar-xetex-bidi-leaders-hrule.pdf
Binary files differ
diff --git a/macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-glyph.pdf b/macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-glyph.pdf
index 72274f832a..16a3d0bac9 100644
--- a/macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-glyph.pdf
+++ b/macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-glyph.pdf
Binary files differ
diff --git a/macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-leaders-glyph.pdf b/macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-leaders-glyph.pdf
index 5bac4724b5..b76e2e3e15 100644
--- a/macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-leaders-glyph.pdf
+++ b/macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-leaders-glyph.pdf
Binary files differ
diff --git a/macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-leaders-hrule.pdf b/macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-leaders-hrule.pdf
index 84e262a2e4..db2648da2d 100644
--- a/macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-leaders-hrule.pdf
+++ b/macros/unicodetex/latex/texnegar/texnegar-xetex-xepersian-leaders-hrule.pdf
Binary files differ
diff --git a/macros/unicodetex/latex/texnegar/texnegar.dtx b/macros/unicodetex/latex/texnegar/texnegar.dtx
index 17e8e83e3d..40a5baef1c 100644
--- a/macros/unicodetex/latex/texnegar/texnegar.dtx
+++ b/macros/unicodetex/latex/texnegar/texnegar.dtx
@@ -101,7 +101,7 @@ make time to fix.
% }^^A
% }
%
-% \date{Released \quad 2021-01-27 \quad v0.1c}
+% \date{Released \quad 2021-01-31 \quad v0.1d}
%
% \maketitle
%
@@ -137,7 +137,7 @@ make time to fix.
\RequirePackage{newverbs}[2010/09/02]
\RequirePackage{environ}[2014/05/04]
-\ProvidesExplPackage {texnegar} {2021-01-27} {0.1c} { Full implementation of kashida feature in XeLaTex and LuaLaTeX }
+\ProvidesExplPackage {texnegar} {2021-01-31} {0.1d} { Full implementation of kashida feature in XeLaTex and LuaLaTeX }
\sys_if_engine_luatex:T
{
@@ -165,7 +165,7 @@ make time to fix.
%
% \begin{macrocode}
%<*texnegar-luatex-sty>
-\ProvidesExplPackage {texnegar-luatex} {2021-01-27} {0.1c} { Full implementation of kashida feature in xetex and luatex }
+\ProvidesExplPackage {texnegar-luatex} {2021-01-31} {0.1d} { Full implementation of kashida feature in xetex and luatex }
\tex_input:D { texnegar-ini.tex }
@@ -201,7 +201,7 @@ make time to fix.
% \begin{macrocode}
%<*texnegar-xetex-sty>
\RequirePackage{zref-savepos}[2020-03-03]
-\ProvidesExplPackage {texnegar-xetex} {2021-01-27} {0.1c} { Full implementation of kashida feature in XeLaTex and LuaLaTeX }
+\ProvidesExplPackage {texnegar-xetex} {2021-01-31} {0.1d} { Full implementation of kashida feature in XeLaTex and LuaLaTeX }
\tex_input:D { texnegar-ini.tex }
@@ -218,7 +218,7 @@ make time to fix.
%
% \begin{macrocode}
%<*texnegar-ini-tex>
-\ProvidesExplFile {texnegar-ini.tex} {2021-01-27} {0.1c} { Full implementation of kashida feature in XeLaTex and LuaLaTeX }
+\ProvidesExplFile {texnegar-ini.tex} {2021-01-31} {0.1d} { Full implementation of kashida feature in XeLaTex and LuaLaTeX }
\def\TeXNegar{\TeX Negar}
@@ -278,6 +278,10 @@ make time to fix.
\bool_set_false:N \l_texnegar_kashida_fix_bool
+\bool_set_false:N \l_texnegar_kashida_fontfamily_bool
+\tl_new:N \l_texnegar_kashida_fontfamily_tl
+\tl_set:Nn \l_texnegar_kashida_fontfamily_tl { N/A }
+
\bool_set_false:N \l_texnegar_kashida_glyph_bool
\bool_set_false:N \l_texnegar_kashida_leaders_glyph_bool
\bool_set_false:N \l_texnegar_kashida_leaders_hrule_bool
@@ -409,6 +413,22 @@ make time to fix.
\keys_define:nn { texnegar }
{
+ Kashidafontfamily .code:n =
+ {
+ \tl_set:Nn \l_tmpa_tl { #1 }
+ \tl_case:Nn \l_tmpa_tl
+ {
+ \tl_if_empty:NTF \l_tmpa_tl
+ {
+ \bool_set_false:N \l_texnegar_kashida_fontfamily_bool
+ }
+ {
+ \bool_set_true:N \l_texnegar_kashida_fontfamily_bool
+ \tl_set:Nx \l_texnegar_kashida_fontfamily_tl { \l_tmpa_tl }
+ }
+ }
+ } ,
+
Minimal .code:n =
{
\tl_set:Nn \l_tmpa_tl { #1 }
@@ -643,7 +663,7 @@ make time to fix.
% \subsection{File: \texttt{texnegar-common-kashida.tex}}
% \begin{macrocode}
%<*texnegar-common-kashida-tex>
-\ProvidesExplFile {texnegar-common-kashida.tex} {2021-01-27} {0.1c} { Full implementation of kashida feature in XeLaTex and LuaLaTeX }
+\ProvidesExplFile {texnegar-common-kashida.tex} {2021-01-31} {0.1d} { Full implementation of kashida feature in XeLaTex and LuaLaTeX }
\bool_if:NT \l_texnegar_ligature_bool
{
@@ -720,7 +740,7 @@ make time to fix.
%
% \begin{macrocode}
%<*texnegar-xetex-kashida-tex>
-\ProvidesExplFile {texnegar-xetex-kashida.tex} {2021-01-27} {0.1c} { Full implementation of kashida feature in XeLaTex and LuaLaTeX }
+\ProvidesExplFile {texnegar-xetex-kashida.tex} {2021-01-31} {0.1d} { Full implementation of kashida feature in XeLaTex and LuaLaTeX }
\newXeTeXintercharclass \c_texnegar_d_charclass % dual-joiner class
\newXeTeXintercharclass \c_texnegar_l_charclass % lam
@@ -941,8 +961,8 @@ make time to fix.
-- local texnegar_char_table = texnegar_char_table
-- texnegar_char_table.module = {
-- name = "texnegar_char_table",
--- version = "0.1c",
--- date = "2021-01-27",
+-- version = "0.1d",
+-- date = "2021-01-31",
-- description = "Full implementation of kashida feature in XeLaTex and LuaLaTeX",
-- author = "Hossein Movahhedian",
-- copyright = "Hossein Movahhedian",
@@ -1166,8 +1186,8 @@ return peCharTableInitial, peCharTableMedial, peCharTableFinal
-- local texnegar = texnegar
-- texnegar.module = {
-- name = "texnegar",
--- version = "0.1c",
--- date = "2021-01-27",
+-- version = "0.1d",
+-- date = "2021-01-31",
-- description = "Full implementation of kashida feature in XeLaTex and LuaLaTeX",
-- author = "Hossein Movahhedian",
-- copyright = "Hossein Movahhedian",
@@ -1180,6 +1200,8 @@ return peCharTableInitial, peCharTableMedial, peCharTableFinal
-- texnegar.warning = warn or (function (s) luatexbase.module_warning("texnegar", s) end)
-- texnegar.error = err or (function (s) luatexbase.module_error("texnegar", s) end)
+local l_texnegar_kashida_fontfamily_bool = token.create("l_texnegar_kashida_fontfamily_bool")
+
local debug_getinfo = debug.getinfo
local string_format = string.format
@@ -1218,10 +1240,6 @@ local pattern_list = {
".*_(ini)t?$", ".*_(ini)t?_.*",
".*_(med)i?$", ".*_(med)i?_.*",
".*_(fin)a?$", ".*_(fin)a?_.*",
-
- ".*_(AltIni)t?[0-9]?$", ".*_(AltIni)t?[0-9]?_.*",
- ".*_(AltMed)i?[0-9]?$", ".*_(AltMed)i?[0-9]?_.*",
- ".*_(AltFin)a?[0-9]?$", ".*_(AltFin)a?[0-9]?_.*",
}
function GetFontsChars()
@@ -1261,19 +1279,24 @@ function GetFontsChars()
char_name = f.glyphs[f_id.characters[glyph_idx].index].name
char_unicode = f.glyphs[f_id.characters[glyph_idx].index].unicode
char_class = f.glyphs[f_id.characters[glyph_idx].index].class
- if not tbl_fonts_chars[f_fontname][glyph_idx] then
- if string.match(f_fontname, "^(Amiri).*") == "Amiri" and char_name == 'uni0640.long1' then
- current_kashida_unicode = glyph_idx
- end
- tbl_fonts_chars[f_fontname][glyph_idx] = {char_name, char_unicode, char_class}
- for _, pattern in ipairs( pattern_list ) do
- local pos_alt = string.match(char_name, pattern)
- if pos_alt == 'ini' or pos_alt == 'AltIni' then
- tbl_fonts_chars_init[f_fontname][glyph_idx] = {char_name, char_unicode, char_class}
- elseif pos_alt == 'med' or pos_alt == 'AltMed' then
- tbl_fonts_chars_medi[f_fontname][glyph_idx] = {char_name, char_unicode, char_class}
- elseif pos_alt == 'fin' or pos_alt == 'AltFin' then
- tbl_fonts_chars_fina[f_fontname][glyph_idx] = {char_name, char_unicode, char_class}
+
+ kashida_fontfamily = token.get_macro("l_texnegar_kashida_fontfamily_tl")
+ fontfamily_match = string.match(f_fontname, "^(" .. kashida_fontfamily .. ").*")
+ if fontfamily_match == kashida_fontfamily then
+ if not tbl_fonts_chars[f_fontname][glyph_idx] then
+ if string.match(f_fontname, "^(Amiri).*") == "Amiri" and char_name == 'uni0640.long1' then
+ current_kashida_unicode = glyph_idx
+ end
+ tbl_fonts_chars[f_fontname][glyph_idx] = {char_name, char_unicode, char_class}
+ for _, pattern in ipairs( pattern_list ) do
+ local pos_alt = string.match(char_name, pattern)
+ if pos_alt == 'ini' or pos_alt == 'AltIni' then
+ tbl_fonts_chars_init[f_fontname][glyph_idx] = {char_name, char_unicode, char_class}
+ elseif pos_alt == 'med' or pos_alt == 'AltMed' then
+ tbl_fonts_chars_medi[f_fontname][glyph_idx] = {char_name, char_unicode, char_class}
+ elseif pos_alt == 'fin' or pos_alt == 'AltFin' then
+ tbl_fonts_chars_fina[f_fontname][glyph_idx] = {char_name, char_unicode, char_class}
+ end
end
end
end
@@ -1315,8 +1338,8 @@ dofile(kpse.find_file("texnegar-ini.lua"))
-- local texnegar_ini = texnegar_ini
-- texnegar_ini.module = {
-- name = "texnegar_ini",
--- version = "0.1c",
--- date = "2021-01-27",
+-- version = "0.1d",
+-- date = "2021-01-31",
-- description = "Full implementation of kashida feature in XeLaTex and LuaLaTeX",
-- author = "Hossein Movahhedian",
-- copyright = "Hossein Movahhedian",
@@ -1369,8 +1392,8 @@ dofile(kpse.find_file("texnegar-luatex-kashida.lua"))
-- local texnegar_luatex_kashida = texnegar_luatex_kashida
-- texnegar_luatex_kashida.module = {
-- name = "texnegar_luatex_kashida",
--- version = "0.1c",
--- date = "2021-01-27",
+-- version = "0.1d",
+-- date = "2021-01-31",
-- description = "Full implementation of kashida feature in XeLaTex and LuaLaTeX",
-- author = "Hossein Movahhedian",
-- copyright = "Hossein Movahhedian",
@@ -1471,6 +1494,7 @@ function GetGlyph(t_plb_line_glyph_node, t_tbl_line_fields, t_CharTableInitial,
local glyph_lang = t_plb_line_glyph_node.lang
local glyph_width = t_plb_line_glyph_node.width
local glyph_data = t_plb_line_glyph_node.data
+
if not (t_CharTableInitial[glyph_char] == nil) then
t_tbl_line_fields.joinerCharInitial = t_tbl_line_fields.joinerCharInitial + 1
t_plb_line_glyph_node.data = 1
@@ -1821,7 +1845,6 @@ function ProcessTableVlist(tmpvl_n)
local tmpvl_n_id = tmpvl_n.id
local tmpvl_n_subtype = tmpvl_n.subtype
- print(string_format(" %s: 00-0 tmpvl_n: id: %d, subtype: %d", funcName, tmpvl_n_id, tmpvl_n_subtype))
for vbNode in node.traverse(tmpvl_n) do
if vbNode.id == 1 and vbNode.subtype == 0 then
for tr_vbNode in node.traverse(vbNode.head) do
@@ -1844,28 +1867,27 @@ function PostLineBreakFilter(hboxes_stack, groupcode)
local tbl_fonts_chars_init = { }
local tbl_fonts_chars_medi = { }
local tbl_fonts_chars_fina = { }
+
tbl_fonts_used, tbl_fonts_chars, tbl_fonts_chars_init, tbl_fonts_chars_medi, tbl_fonts_chars_fina = GetFontsChars()
- for k1, v1 in pairs(tbl_fonts_chars_init) do
- for k2, v2 in pairs(tbl_fonts_chars_init[k1]) do
- if k2 and not peCharTableInitial[k2] then
- peCharTableInitial[k2] = utf8.char(k2)
+ local f_fontname
+
+ for f_fontname, v in pairs(tbl_fonts_used) do
+ for k1, v1 in pairs(tbl_fonts_chars_init[f_fontname]) do
+ if k1 and not peCharTableInitial[k1] then
+ peCharTableInitial[k1] = utf8.char(k1)
end
end
- end
- for k1, v1 in pairs(tbl_fonts_chars_medi) do
- for k2, v2 in pairs(tbl_fonts_chars_medi[k1]) do
- if k2 and not peCharTableMedial[k2] then
- peCharTableMedial[k2] = utf8.char(k2)
+ for k1, v1 in pairs(tbl_fonts_chars_medi[f_fontname]) do
+ if k1 and not peCharTableMedial[k1] then
+ peCharTableMedial[k1] = utf8.char(k1)
end
end
- end
- for k1, v1 in pairs(tbl_fonts_chars_fina) do
- for k2, v2 in pairs(tbl_fonts_chars_fina[k1]) do
- if k2 and not peCharTableFinal[k2] then
- peCharTableFinal[k2] = utf8.char(k2)
+ for k1, v1 in pairs(tbl_fonts_chars_fina[f_fontname]) do
+ if k1 and not peCharTableFinal[k1] then
+ peCharTableFinal[k1] = utf8.char(k1)
end
end
end
diff --git a/macros/unicodetex/latex/texnegar/texnegar.ins b/macros/unicodetex/latex/texnegar/texnegar.ins
index 6ed26bf948..a5b915ccf9 100644
--- a/macros/unicodetex/latex/texnegar/texnegar.ins
+++ b/macros/unicodetex/latex/texnegar/texnegar.ins
@@ -2,7 +2,7 @@
File: texnegar.ins
-Copyright (C) 2020 Hossein Movahhedian
+Copyright (C) 2020-2021 Hossein Movahhedian
It may be distributed and/or modified under the LaTeX Project Public License,
version 1.3c or higher (your choice). The latest version of
@@ -16,7 +16,7 @@ this license is at: http://www.latex-project.org/lppl.txt
\preamble
-Copyright (C) 2020 Hossein Movahhedian
+Copyright (C) 2020-2021 Hossein Movahhedian
It may be distributed and/or modified under the LaTeX Project Public License,
version 1.3c or higher (your choice). The latest version of
diff --git a/macros/unicodetex/latex/texnegar/texnegar.pdf b/macros/unicodetex/latex/texnegar/texnegar.pdf
index 834f5bee65..3abdf6da0b 100644
--- a/macros/unicodetex/latex/texnegar/texnegar.pdf
+++ b/macros/unicodetex/latex/texnegar/texnegar.pdf
Binary files differ
diff --git a/macros/unicodetex/latex/texnegar/xepersian-XB.pdf b/macros/unicodetex/latex/texnegar/xepersian-XB.pdf
index 6858bae735..18a3e065fa 100644
--- a/macros/unicodetex/latex/texnegar/xepersian-XB.pdf
+++ b/macros/unicodetex/latex/texnegar/xepersian-XB.pdf
Binary files differ
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb b/systems/texlive/tlnet/tlpkg/texlive.tlpdb
index c9ee5282e1..b64c522187 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb
@@ -26,7 +26,7 @@ depend container_split_src_files/1
depend frozen/0
depend minrelease/2016
depend release/2020
-depend revision/57555
+depend revision/57567
name 00texlive.image
category TLCore
@@ -158034,7 +158034,7 @@ catalogue-version 3.33
name kpfonts-otf
category Package
-revision 56965
+revision 57563
shortdesc OTF version of the Kp-fonts
relocated 1
longdesc This bundle provides OpenType versions of the Type1 Kp-fonts
@@ -158048,11 +158048,11 @@ longdesc st), ancient long-s and a long-tailed capital Q are available
longdesc via font features. Math fonts cover all usual symbols including
longdesc AMS'; a full list of available symbols is provided, see the
longdesc 'List of glyphs'.
-containersize 1011932
-containerchecksum 5b276450ecfc349949dc093a8d4e3cbf5bcaaba4600ebaf8806c5e1501f6cf163b56f41bd6646f2aa98c2d3dd8177c1a5455ab672227c46251417cdedc6c6a15
-doccontainersize 2070208
-doccontainerchecksum 57b5064033755149ff9877f669d617f6652d698f6f63a6fea62d6b1d1c31faeaaf19ccfb5489643cdb299a4c7ad1c3a40df34ae45dbec500253c2394a3170bbb
-docfiles size=555
+containersize 1071952
+containerchecksum 1cb18bafc1c97b5c938e199ea649392771279ca14c192f02b702a4306a2fb3925040cb56aee6e780cc71e380b5f597e9b960e12a7240279a59fe517d38afe995
+doccontainersize 2055036
+doccontainerchecksum 365c4dbe250c983851dd793bcdc7240c569a7ec546108e9ec09477b37141c2af5b2c4e90cc2612dafdc23a04319dc9b494f14be59a53f242d50320fc6e072630
+docfiles size=552
RELOC/doc/fonts/kpfonts-otf/Kpfonts-OTF-Doc-English.ltx
RELOC/doc/fonts/kpfonts-otf/Kpfonts-OTF-Doc-English.pdf details="Package documentation (English)" language="en"
RELOC/doc/fonts/kpfonts-otf/Kpfonts-OTF-Doc-French.ltx
@@ -158060,7 +158060,7 @@ docfiles size=555
RELOC/doc/fonts/kpfonts-otf/README.md details="Readme"
RELOC/doc/fonts/kpfonts-otf/unimath-kpfonts.ltx
RELOC/doc/fonts/kpfonts-otf/unimath-kpfonts.pdf details="List of glyphs"
-runfiles size=811
+runfiles size=820
RELOC/fonts/opentype/public/kpfonts-otf/KpMath-Bold.otf
RELOC/fonts/opentype/public/kpfonts-otf/KpMath-Light.otf
RELOC/fonts/opentype/public/kpfonts-otf/KpMath-Regular.otf
@@ -158090,8 +158090,8 @@ runfiles size=811
catalogue-also kpfonts
catalogue-ctan /fonts/kpfonts-otf
catalogue-license ofl lppl1.3
-catalogue-topics font font-otf font-serif font-sans font-mono font-maths font-supp
-catalogue-version 0.32
+catalogue-topics font font-body font-serif font-sans font-proportional font-mono font-maths font-otf font-supp
+catalogue-version 0.34
name ksfh_nat
category Package
@@ -168733,18 +168733,18 @@ catalogue-version 0.1
name lexend
category Package
-revision 54512
+revision 57564
shortdesc The Lexend fonts for XeLaTeX and LuaLaTeX through fontspec
relocated 1
-longdesc The purpose of this package is pretty straight forward: The
+longdesc The purpose of this package is pretty straightforward: The
longdesc Lexend font collection has been designed by Dr. Bonnie
longdesc Shaver-Troup and Thomas Jockin to make reading easier for
-longdesc everyone. Now my goal is it to bring this wonderful collection
-longdesc to world of LaTeX.
-containersize 186872
-containerchecksum b300453d91ef643b17e1bc7520ecff8550e394e2df22447274af5fc1405bc48723ef65ba7e322e83b6e10653ac89080428973b300ee55fe8e15eb590e85c7733
-doccontainersize 141744
-doccontainerchecksum 83e56c79e99c7aebbdfccdc4cd75f597e53034bb6153870e40592b7e769366c8e921f00191f6608b63ac723223418e3333d498b4ca86c1f0a23cfa5444d88d34
+longdesc everyone. Now my goal is to bring this wonderful collection to
+longdesc the world of LaTeX.
+containersize 186932
+containerchecksum 6a9e4ab844e5189e996b73ee95d5ea5bda0d5d9f7b00a707d5bf9b7ceb97eb2f37baef9310252227701d6fc280a14a8a79ff524b5cdee3610c4dc48968f6b3b5
+doccontainersize 143084
+doccontainerchecksum fa21e0311899513ca5f7031471189ce0269fcb35b5bb38d2e3d2e8015dab11ab2a10cc086ba6d41f24c25d99b32f91750371e3297c505ef4a522d61aaa24e5bd
docfiles size=43
RELOC/doc/fonts/lexend/LICENSE
RELOC/doc/fonts/lexend/README.md details="Readme"
@@ -168774,8 +168774,8 @@ catalogue-contact-repository https://github.com/BrainStone/latex-lexend
catalogue-contact-support https://discord.me/bungeechat
catalogue-ctan /fonts/lexend
catalogue-license lppl1.3c ofl
-catalogue-topics font
-catalogue-version 1.0.2
+catalogue-topics font font-collection font-body font-sans font-proportional font-ttf font-supp
+catalogue-version 1.1.0.70
name lexikon
category Package
@@ -287164,7 +287164,7 @@ binfiles arch=x86_64-solaris size=1
name tex4ht
category Package
-revision 57555
+revision 57565
shortdesc Convert (La)TeX to HTML/XML
longdesc A converter from TeX and LaTeX to SGML-based formats such as
longdesc (X)HTML, MathML, OpenDocument, and DocBook, providing a
@@ -287179,10 +287179,10 @@ longdesc restricted-syntax systems such as hyperlatex and gellmu. Note
longdesc that CTAN no longer holds the definitive sources of the
longdesc package: see the 'Readme' file.
depend tex4ht.ARCH
-containersize 903656
-containerchecksum c93fe006add08fd9cc6cb3e7cdb921a9b505b07576b18bdbe292a5808ec6cba15164a2d8aa0bb33d7707b7498b4419baf8233d2f40431fd6152e84f8156e42b7
+containersize 903628
+containerchecksum 79af2c2b7aeb5cfb5277decf9f317f76234d6263f6462d721890b37fc616782feab3456f2adb66e8cceca1ee98b0955f4559d56e687d625d3129e4757590ad4f
doccontainersize 136160
-doccontainerchecksum a164d807ef7589ea8f5b844bdf782dcfafa68beaaf30dbcc8c8847816bb2d9555a97119e9c9d7953b04c05f824ad41f92017282cf8ec101cb37117086924e21f
+doccontainerchecksum 4be5478ff031179d7f9fc2cbaff7d17e52fee647cf1bd7e8e4b1a0dc6bd7fb642ef0d374d617b28a0dbe7629e65660620eb1640fedba91702184d012193c865e
docfiles size=259
texmf-dist/doc/generic/tex4ht/Makefile
texmf-dist/doc/generic/tex4ht/TeX4ht-doc.tex
@@ -296055,16 +296055,16 @@ docfiles size=591
name texlive-docindex
category TLCore
-revision 57548
+revision 57557
shortdesc top-level TeX Live doc.html, etc.
longdesc These files are regenerated as needed, which is often, so we
longdesc make them a separate package. See the tl-update-auto script for
longdesc the process.
containersize 388
-containerchecksum 26b12c77a1860e2e647a596b0df53e8e169bb4a359fb714bcffd2fc6bbb1fbc1b9542732274ce0285419d0d4296c6890c8e180e26e79aba8e5853e960350e6ff
-doccontainersize 171808
-doccontainerchecksum dc8586076d1206667a9de079405f58bc419fdde31cc2c8c76bd8573f4e5a133495cd8725290f0a9c3804809b1f6e3a095704e7d4a64691fc8618682d31244cf2
-docfiles size=340
+containerchecksum 00e21669f6d698fbce9750089f47afd2bb3066d1cfdb42367298c0b7ddc504d334f7de8412ec62e2a0df8531d5f0e3e715cb2b3dc84101f5bcf735a9caca116f
+doccontainersize 172728
+doccontainerchecksum d622643cd7c01148b1a7059eb0a84eb6dcad34bb755df4c5ebf43546890928039354889523b3c9a236e23339e2a88275158ae8b122904794ea8b2118804ff58a
+docfiles size=343
doc.html
name texlive-en
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
index 955476661d..c6737f20a7 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
@@ -1 +1 @@
-7b33c3101ad2c6953a82e41b92e90c1a texlive.tlpdb
+c82b3cf892351b66b144ef0b4d6fa8a6 texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
index 92d7874b54..8b8e051c9c 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
@@ -1 +1 @@
-bf5a05418733b589bce328869cee8f79521b5d80fb9985a2953ba6ea67aec3204a092e9e3d4630656595a40a33190d73c25a708162e6bdc019c5b46e87cf4055 texlive.tlpdb
+66362860c8996f473c39e4dfdd7d2cd0066cb082c74fd6160f5465325cd7667dd87c6b66f1baf2a6765ac289ce242042be8ddcde67abe69ea5b1d9d9c1779066 texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
index f8e13a68da..5da5db81b7 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
@@ -1,10 +1,10 @@
-----BEGIN PGP SIGNATURE-----
-iQEcBAEBCgAGBQJgFK7mAAoJEEzhh34ZQ4xw7AsH/2KMwKF9dPXWE77A0PFep+48
-mvvHLkpFU2uJURoAJl8LOHMJjIVV5x13vWVkGX6PLmqGSrths24HOvkIyTHbZnzI
-ilGaVFFBTw3wjwY025Og7Ey5RzD3agmEttiWAZr59JRNa7Ub1R+0QkV3TZjo6wYg
-iJyKGXHiSM/9tqU9UxLra9ad8I2NC4qc8LTBPNPiG8v6DdD5SxkRcxyrbY3mJiBB
-33wyJnHvbp9oRPtdxNjTaRkloAP5ae4aMwK4c3dICbm6J+LJgUdTU7MQeK7V43yJ
-yrriQJG6E/QDH32L3sURtNEOQM9N7bFVF4Hj0ECYRbQYHTWx4QVUfqJF2NFXThA=
-=9N+0
+iQEcBAEBCgAGBQJgFgDWAAoJEEzhh34ZQ4xwh98IALp0Nn4QYRVrko+EUt9ZlxsC
+O1NG8q8GBzx7qu86OCnmBsYLsGIXmDOgMh0psNrTsRY7e/hQFbORIzMapk3ZMsPs
+YfX8W1NMXW0Wry0dQb7IQdOdRaAKGwMdguqnrrwsT5rvavtUp4CZ9TqUjRQTLBGm
+gvgGHEPHM6kf0c/Kty+H6nO4NrJEjnoP7GKYSQdK0KZ/dPNSSYND+8RH+Vy2tccK
+sR9ew6JdgG9skBQhyp0EqQvTt5E4b1oz3vSiV8qiz8y4u8pJhmsQUOpjw72MUHbv
+jW08UPePe4pHCiQiBCqSpi5BvChFDp79jSMd4SCuDz9RBweoB3Uas/Rsq7Hqou0=
+=crPW
-----END PGP SIGNATURE-----
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
index 5bd440489a..4cf29ff5f4 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
Binary files differ
diff --git a/systems/win32/miktex/tm/packages/next/pr.ini b/systems/win32/miktex/tm/packages/next/pr.ini
index 77f5d9e50c..d19c3fb192 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=1612041322
+date=1612127692
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=4147c8c1ccac18a4d9e6411858fb4783
+lstdigest=0599198948c1c07140d83ffa152fbdb1
numpkg=4044
relstate=next
-version=7700
+version=7701
;;;;This configuration file is signed by a MiKTeX maintainer. The signature follows.
;;;;-----BEGIN MIKTEX SIGNATURE-----
-;;;; signature/miktex: oRxcH1ruMC4yOzJSltAxXXJCQShQerOCVMa20Wp3t1piZxlpYiH6VFzY7lSwOuewfJRIffnRAN3CsylwY+qgSWC4IVUe75ApjWepCB3Vl+gGOGLoVNtL3EPj6loamAIOOn+C9vF2B8p/iLMKau1y2iESJbiDhff3+1dr8JDhOC/yTr7Afu9XazG2w6kR3cFbcCJAVfg5t8UChYJncZ9pTVTlW22YeNRkvNFHAS+tcRyVbX+8EgDRT90eck4je8yNnpIhSIsy0BWdJLADg2dPdwj+po2OndjBDlqcvHnNb1OlxEE+XqXE2T37ZiDYaN+Llvi+BCfw0AREuTiC92sUJg==
+;;;; signature/miktex: Xl6byWCigYiuelrI3jxQn1LdaUTIs0RnuUcBZHWH+NitVMYEvOZO5uBfa0z4rjCcIR6NSJRtnSXFCZvq8btOZYEdCIh9QUa23PtgfU9gxtGyn2gqnBy12coUbX0i6S2nZZNNhNFTR81EgkqTabdPCva+lkTISqC91ZGHf7JBiJMvMl8VLBP3gJ/baXlPWn1+b6yrW8gZtu0XgjZ17zm47zTjPpeLH0b4kiYWcjHsH8NiaAwpAVmbCKrZg7PilDoEDbuvfbHF/3GXbIG7+xZbWop66tyy+I48x8tRND0t2TLFwfnW45O5ul4p57IOvQazJNViCdaHlO+5eYL5hHdXZw==
;;;;-----END MIKTEX SIGNATURE-----
diff --git a/systems/win32/miktex/tm/packages/pr.ini b/systems/win32/miktex/tm/packages/pr.ini
index 3ffd2ee672..a9606634d3 100644
--- a/systems/win32/miktex/tm/packages/pr.ini
+++ b/systems/win32/miktex/tm/packages/pr.ini
@@ -1,13 +1,13 @@
[repository]
-date=1612041120
+date=1612127513
lastupd=asymptote changes chinese-jfm cmap ebproof fancyhdr fontsetup footnotehyper l3backend l3experimental multirow pmx asmeconf babel bxjscls dccpaper ean13isbn fontsize ltximg media4svg
-lstdigest=1f14b5d4455df36f8efaf96a97af1e9d
+lstdigest=7ffebb71fad9f993ba4e9033d883287c
numpkg=4044
relstate=stable
-version=7700
+version=7701
;;;;This configuration file is signed by a MiKTeX maintainer. The signature follows.
;;;;-----BEGIN MIKTEX SIGNATURE-----
-;;;; signature/miktex: slRwvVsb+pP77n1Q/5if0j5+Z6V485vxmU7/OBWzpmgXloWva0sehmJemjrFLC8rP/Esn91T66Qjf4xhIP4Q7tjh/kT4oz3VoRcJjGg0j1X3GBLrahUVdaP5Mg9F3N2fnpwHTjVXHpN/2VfLiWaCz5dGtSDEhLjiKb0Tm3p3ogj/MHNy4IJCYc3Guh3/aH6i82fpkypGuJ6YmYew+XHyrm0mqcbYwOBdTMx72IjgNHwmEpL33IEJ0SlSewDzN+8sHvXs8UvaQ4BKPQOVQK8xXAkwv3DRDOkrTs76vZiUQpzW9PhPon7QMSEWJ0u3e45Bd+fc6F3w02jUFN751g1LIg==
+;;;; signature/miktex: lRPs9X+CBKOjfKhQrvV6jRd+SUJelOf6krMho+iY8fX6pYufg6otEhto5MqyVXbzRbSk8TYZJb63LIDMntghmVthK3LuP56UvxbAFLJW2xMdrhLqYCXdckkNAERFmTN2wORxp72ZZ2CBEgZ2/cu7NgruEIrcq/tLJduX8WkbgzFD1pcdj2bhOQT4x5sjlfGwfIF3Jodu1muXaRLNUlG0laPei33AbEduJa+fn7K0nPgxIcSwAuFvbLmOkDjNisd0cgJ4ZFWba5AAu1CsN8wEkqSm5J+KThZz4Kukg0HQQhji65ZcbThGqxjSn+Vqdzq6CWu5IobzI8TL4jwiOXuIFQ==
;;;;-----END MIKTEX SIGNATURE-----
diff --git a/timestamp b/timestamp
index faa32b324a..2c347b1b7c 100644
--- a/timestamp
+++ b/timestamp
@@ -2,4 +2,4 @@
# The source CTAN of this site's material:
dante.ctan.org
# The year-month-day-hour-minute of this site's material:
-2021-01-31-02-02
+2021-02-01-02-02