summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2022-07-29 03:01:04 +0000
committerNorbert Preining <norbert@preining.info>2022-07-29 03:01:04 +0000
commitda2dc471ec5bb2620f0ef5a4a700b236d1a8af06 (patch)
treed928b5b5abe4df9287ffda090d15e777c78bd783
parent5937dac9360bdf40d1b0baf9d7384b109fb5b7a7 (diff)
CTAN sync 202207290301
-rw-r--r--FILES.byname1306
-rw-r--r--FILES.byname.gzbin2444412 -> 2445598 bytes
-rw-r--r--FILES.last07days824
-rw-r--r--graphics/circuit_macros/CHANGES6
-rw-r--r--graphics/circuit_macros/Copying2
-rw-r--r--graphics/circuit_macros/README24
-rw-r--r--graphics/circuit_macros/darrow.m42
-rw-r--r--graphics/circuit_macros/doc/Circuit_macros.pdfbin1020598 -> 1023203 bytes
-rw-r--r--graphics/circuit_macros/doc/DiodesMan.m46
-rw-r--r--graphics/circuit_macros/doc/Version.tex2
-rw-r--r--graphics/circuit_macros/doc/body.tex93
-rw-r--r--graphics/circuit_macros/doc/defines.tex32
-rw-r--r--graphics/circuit_macros/dpictools.pic47
-rw-r--r--graphics/circuit_macros/examples/Diodes.m46
-rw-r--r--graphics/circuit_macros/examples/ShadeSector.m414
-rw-r--r--graphics/circuit_macros/examples/Shaky.m4107
-rw-r--r--graphics/circuit_macros/examples/csc.m483
-rw-r--r--graphics/circuit_macros/examples/examples.pdfbin898616 -> 902995 bytes
-rw-r--r--graphics/circuit_macros/examples/files.tex6
-rw-r--r--graphics/circuit_macros/examples/ics.m416
-rw-r--r--graphics/circuit_macros/examples/mf/cct.mf2
-rw-r--r--graphics/circuit_macros/examples/sfg.m433
-rw-r--r--graphics/circuit_macros/examples/svg/DiodesSVG.m46
-rw-r--r--graphics/circuit_macros/examples/svg/GeometrySVG.m4183
-rw-r--r--graphics/circuit_macros/examples/svg/LoglogSVG.m412
-rw-r--r--graphics/circuit_macros/examples/svg/Makefile8
-rw-r--r--graphics/circuit_macros/examples/svg/PconnSVG.m47
-rw-r--r--graphics/circuit_macros/examples/svg/SmithchartSVG.m4222
-rw-r--r--graphics/circuit_macros/examples/svg/cscSVG.m4101
-rw-r--r--graphics/circuit_macros/examples/svg/ex15SVG.m42
-rw-r--r--graphics/circuit_macros/examples/svg/examplesSVG.htmx36
-rw-r--r--graphics/circuit_macros/examples/svg/icsSVG.m416
-rw-r--r--graphics/circuit_macros/examples/svg/keyboardSVG.m4269
-rw-r--r--graphics/circuit_macros/examples/svg/sfgSVG.m439
-rw-r--r--graphics/circuit_macros/examples/tubedefs.m46
-rw-r--r--graphics/circuit_macros/gpic.m42
-rw-r--r--graphics/circuit_macros/lib3D.m42
-rw-r--r--graphics/circuit_macros/libSLD.m493
-rw-r--r--graphics/circuit_macros/libcct.m425
-rw-r--r--graphics/circuit_macros/libgen.m499
-rw-r--r--graphics/circuit_macros/liblog.m42
-rw-r--r--graphics/circuit_macros/mfpic.m42
-rw-r--r--graphics/circuit_macros/mpost.m42
-rw-r--r--graphics/circuit_macros/pgf.m42
-rw-r--r--graphics/circuit_macros/postscript.m42
-rw-r--r--graphics/circuit_macros/psfrag.m42
-rw-r--r--graphics/circuit_macros/pstricks.m42
-rw-r--r--graphics/circuit_macros/svg.m432
-rw-r--r--graphics/circuit_macros/xfig.m42
-rw-r--r--macros/latex/contrib/csassignments/csassignments.dtx9
-rw-r--r--macros/latex/contrib/csassignments/csassignments.pdfbin134810 -> 142906 bytes
-rw-r--r--macros/latex/contrib/nicematrix/nicematrix-french.pdfbin507325 -> 511876 bytes
-rw-r--r--macros/latex/contrib/nicematrix/nicematrix-french.tex104
-rw-r--r--macros/latex/contrib/nicematrix/nicematrix.dtx894
-rw-r--r--macros/latex/contrib/nicematrix/nicematrix.pdfbin1564304 -> 1296290 bytes
-rw-r--r--macros/luatex/generic/lua-widow-control/CHANGELOG.md7
-rw-r--r--macros/luatex/generic/lua-widow-control/README.md2
-rw-r--r--macros/luatex/generic/lua-widow-control/lua-widow-control-2022-02-22.sty4
-rw-r--r--macros/luatex/generic/lua-widow-control/lua-widow-control.lua29
-rw-r--r--macros/luatex/generic/lua-widow-control/lua-widow-control.opm2
-rw-r--r--macros/luatex/generic/lua-widow-control/lua-widow-control.pdfbin509126 -> 506634 bytes
-rw-r--r--macros/luatex/generic/lua-widow-control/lua-widow-control.sty6
-rw-r--r--macros/luatex/generic/lua-widow-control/lua-widow-control.tex2
-rw-r--r--macros/luatex/generic/lua-widow-control/lwc-manual.tex4
-rw-r--r--macros/luatex/generic/lua-widow-control/t-lua-widow-control.mkxl4
-rw-r--r--macros/luatex/generic/lua-widow-control/tb133chernoff-widows.pdfbin391529 -> 391523 bytes
-rw-r--r--macros/xetex/latex/exam-zh/CHANGELOG.md352
-rw-r--r--macros/xetex/latex/exam-zh/LICENSE416
-rw-r--r--macros/xetex/latex/exam-zh/README.md261
-rw-r--r--macros/xetex/latex/exam-zh/doc/back/about-author.tex9
-rw-r--r--macros/xetex/latex/exam-zh/doc/back/development.tex14
-rw-r--r--macros/xetex/latex/exam-zh/doc/back/main-changelog.tex10
-rw-r--r--macros/xetex/latex/exam-zh/doc/back/package.tex25
-rw-r--r--macros/xetex/latex/exam-zh/doc/body/cover.tex21
-rw-r--r--macros/xetex/latex/exam-zh/doc/body/installation.tex153
-rw-r--r--macros/xetex/latex/exam-zh/doc/body/introduction.tex21
-rw-r--r--macros/xetex/latex/exam-zh/doc/body/usage.tex2578
-rw-r--r--macros/xetex/latex/exam-zh/doc/exam-zh-doc-setup.tex65
-rw-r--r--macros/xetex/latex/exam-zh/doc/exam-zh-doc.pdfbin0 -> 1085430 bytes
-rw-r--r--macros/xetex/latex/exam-zh/doc/exam-zh-doc.tex87
-rw-r--r--macros/xetex/latex/exam-zh/doc/figures/firstpage.pdfbin0 -> 213099 bytes
-rw-r--r--macros/xetex/latex/exam-zh/doc/figures/gitee-main.pngbin0 -> 204716 bytes
-rw-r--r--macros/xetex/latex/exam-zh/doc/figures/gitee-release.pngbin0 -> 171403 bytes
-rw-r--r--macros/xetex/latex/exam-zh/doc/xdyydoc.cls1145
-rw-r--r--macros/xetex/latex/exam-zh/examples/example-multiple.pdfbin0 -> 167892 bytes
-rw-r--r--macros/xetex/latex/exam-zh/examples/example-multiple.tex671
-rw-r--r--macros/xetex/latex/exam-zh/examples/example-single.pdfbin0 -> 148036 bytes
-rw-r--r--macros/xetex/latex/exam-zh/examples/example-single.tex337
-rw-r--r--macros/xetex/latex/exam-zh/examples/example-single_student_version.pdfbin0 -> 155299 bytes
-rw-r--r--macros/xetex/latex/exam-zh/tex/exam-zh-chinese-english.sty665
-rw-r--r--macros/xetex/latex/exam-zh/tex/exam-zh-choices.sty555
-rw-r--r--macros/xetex/latex/exam-zh/tex/exam-zh-font.sty580
-rw-r--r--macros/xetex/latex/exam-zh/tex/exam-zh-question.sty1260
-rw-r--r--macros/xetex/latex/exam-zh/tex/exam-zh-symbols.sty1198
-rw-r--r--macros/xetex/latex/exam-zh/tex/exam-zh.cls2214
-rw-r--r--macros/xetex/latex/xduts/README.md2
-rw-r--r--macros/xetex/latex/xduts/xduts.dtx172
-rw-r--r--macros/xetex/latex/xduts/xduts.pdfbin704529 -> 707188 bytes
-rw-r--r--systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl3
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb184
-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.xzbin2396760 -> 2395860 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
107 files changed, 16189 insertions, 1699 deletions
diff --git a/FILES.byname b/FILES.byname
index becf9ee350..c29df98d2d 100644
--- a/FILES.byname
+++ b/FILES.byname
@@ -5263,7 +5263,7 @@
1990/10/02 | 5440 | dviware/vutex/vaxvms.hlp
1990/10/02 | 812 | dviware/vutex/vaxvms.ins
1990/10/02 | 127576 | dviware/vutex/vutex.web
-2022/07/27 | 64114 | FILES.last07days
+2022/07/28 | 53919 | FILES.last07days
2021/07/24 | 1139410 | fonts/aboensis/Aboensis.glyphs
2021/07/24 | 18907382 | fonts/aboensis/aboensis.pdf
2021/07/24 | 137860 | fonts/aboensis/Aboensis-Regular.otf
@@ -151735,479 +151735,482 @@
2020/05/24 | 7475 | graphics/bookshelf/README.md
2020/05/24 | 41 | graphics/bookshelf/VERSION
2020/05/24 | 1783280 | graphics/bookshelf.zip
-2022/02/11 | 1185 | graphics/circuit_macros/boxdims.sty
-2022/02/11 | 13335 | graphics/circuit_macros/CHANGES
-2022/02/11 | 462 | graphics/circuit_macros/Copying
-2022/02/11 | 14279 | graphics/circuit_macros/darrow.m4
-2022/02/11 | 26 | graphics/circuit_macros/doc/ACsymbol.m4
-2022/02/11 | 494 | graphics/circuit_macros/doc/AmpTableMan.m4
-2022/02/11 | 1940 | graphics/circuit_macros/doc/AmpTable.tex
-2022/02/11 | 1230 | graphics/circuit_macros/doc/AntennasMan.m4
-2022/02/11 | 1618 | graphics/circuit_macros/doc/ArrestersMan.m4
-2022/02/11 | 1017 | graphics/circuit_macros/doc/arrowex.m4
-2022/02/11 | 2634 | graphics/circuit_macros/doc/AudioMan.m4
-2022/02/11 | 10164 | graphics/circuit_macros/doc/Audio.tex
-2022/02/11 | 131 | graphics/circuit_macros/doc/Axes.m4
-2022/02/11 | 614 | graphics/circuit_macros/doc/BigResistor.m4
-2022/02/11 | 1619 | graphics/circuit_macros/doc/BipMan.m4
-2022/02/11 | 5545 | graphics/circuit_macros/doc/Bip.tex
-2022/02/11 | 1074 | graphics/circuit_macros/doc/bistableMan.m4
-2022/02/11 | 1860 | graphics/circuit_macros/doc/bi_trans.m4
-2022/02/11 | 130 | graphics/circuit_macros/doc/bitrbody.m4
-2022/02/11 | 50 | graphics/circuit_macros/doc/bitr.m4
-2022/02/11 | 151444 | graphics/circuit_macros/doc/body.tex
-2022/02/11 | 1953 | graphics/circuit_macros/doc/Buffer.m4
-2022/02/11 | 1063 | graphics/circuit_macros/doc/CapacitorsMan.m4
-2022/02/11 | 4312 | graphics/circuit_macros/doc/Circuit_macros.bib
-2022/02/11 | 1020598 | graphics/circuit_macros/doc/Circuit_macros.pdf
-2022/02/11 | 3019 | graphics/circuit_macros/doc/Circuit_macros.tex
-2022/02/11 | 1857 | graphics/circuit_macros/doc/Composite.m4
-2022/02/11 | 1121 | graphics/circuit_macros/doc/ConfigA.m4
-2022/02/11 | 1258 | graphics/circuit_macros/doc/ConfigB.m4
-2022/02/11 | 1292 | graphics/circuit_macros/doc/ConfigC.m4
-2022/02/11 | 2179 | graphics/circuit_macros/doc/ConnMan.m4
-2022/02/11 | 6550 | graphics/circuit_macros/doc/Conn.tex
-2022/02/11 | 3326 | graphics/circuit_macros/doc/ContactMan.m4
-2022/02/11 | 1585 | graphics/circuit_macros/doc/ContactsMan.m4
-2022/02/11 | 6067 | graphics/circuit_macros/doc/Contacts.tex
-2022/02/11 | 13833 | graphics/circuit_macros/doc/Contact.tex
-2022/02/11 | 1995 | graphics/circuit_macros/doc/Corners.m4
-2022/02/11 | 1329 | graphics/circuit_macros/doc/currents.m4
-2022/02/11 | 2389 | graphics/circuit_macros/doc/Dac.m4
-2022/02/11 | 1151 | graphics/circuit_macros/doc/Darlington.m4
-2022/02/11 | 26 | graphics/circuit_macros/doc/DCsymbol.m4
-2022/02/11 | 103859 | graphics/circuit_macros/doc/defines.tex
-2022/02/11 | 1485 | graphics/circuit_macros/doc/DemultiplexerMan.m4
-2022/02/11 | 4817 | graphics/circuit_macros/doc/Demultiplexer.tex
-2022/02/11 | 1695 | graphics/circuit_macros/doc/DiodesMan.m4
-2022/02/11 | 12050 | graphics/circuit_macros/doc/Diodes.tex
-2022/02/11 | 483 | graphics/circuit_macros/doc/eboxdims.m4
-2022/02/11 | 980 | graphics/circuit_macros/doc/EmarrowsMan.m4
-2022/02/11 | 5502 | graphics/circuit_macros/doc/Emarrows.tex
-2022/02/11 | 1229 | graphics/circuit_macros/doc/fbfilter.m4
-2022/02/11 | 5315 | graphics/circuit_macros/doc/fetMan.m4
-2022/02/11 | 16420 | graphics/circuit_macros/doc/fet.tex
-2022/02/11 | 329 | graphics/circuit_macros/doc/FF.m4
-2022/02/11 | 1975 | graphics/circuit_macros/doc/FlipFlop.m4
-2022/02/11 | 970 | graphics/circuit_macros/doc/Flowdiag.m4
-2022/02/11 | 999 | graphics/circuit_macros/doc/FusesMan.m4
-2022/02/11 | 4789 | graphics/circuit_macros/doc/Fuses.tex
-2022/02/11 | 831 | graphics/circuit_macros/doc/GroundsMan.m4
-2022/02/11 | 2661 | graphics/circuit_macros/doc/Grounds.tex
-2022/02/11 | 1132 | graphics/circuit_macros/doc/HeadersMan.m4
-2022/02/11 | 7503 | graphics/circuit_macros/doc/Headers.tex
-2022/02/11 | 2013 | graphics/circuit_macros/doc/HybridPi.m4
-2022/02/11 | 1342 | graphics/circuit_macros/doc/InductorsMan.m4
-2022/02/11 | 2362 | graphics/circuit_macros/doc/JackMan.m4
-2022/02/11 | 12006 | graphics/circuit_macros/doc/Jack.tex
-2022/02/11 | 2119 | graphics/circuit_macros/doc/LogicMan.m4
-2022/02/11 | 7533 | graphics/circuit_macros/doc/Logic.tex
-2022/02/11 | 269 | graphics/circuit_macros/doc/Loop.m4
-2022/02/11 | 387 | graphics/circuit_macros/doc/lrarrows.m4
-2022/02/11 | 4969 | graphics/circuit_macros/doc/Makefile
-2022/02/11 | 963 | graphics/circuit_macros/doc/MoreTableMan.m4
-2022/02/11 | 1575 | graphics/circuit_macros/doc/mplex.m4
-2022/02/11 | 1400 | graphics/circuit_macros/doc/MultiplexerMan.m4
-2022/02/11 | 4964 | graphics/circuit_macros/doc/Multiplexer.tex
-2022/02/11 | 499 | graphics/circuit_macros/doc/NLGMan.m4
-2022/02/11 | 3183 | graphics/circuit_macros/doc/NLG.tex
-2022/02/11 | 1128 | graphics/circuit_macros/doc/NPDTMan.m4
-2022/02/11 | 5137 | graphics/circuit_macros/doc/NPDT.tex
-2022/02/11 | 1040 | graphics/circuit_macros/doc/NportMan.m4
-2022/02/11 | 4666 | graphics/circuit_macros/doc/Nport.tex
-2022/02/11 | 783 | graphics/circuit_macros/doc/Oblique.m4
-2022/02/11 | 137 | graphics/circuit_macros/doc/opampexbody.m4
-2022/02/11 | 56 | graphics/circuit_macros/doc/opampex.m4
-2022/02/11 | 1433 | graphics/circuit_macros/doc/OpampMan.m4
-2022/02/11 | 835 | graphics/circuit_macros/doc/Opto.m4
-2022/02/11 | 1624 | graphics/circuit_macros/doc/ParSeries.m4
-2022/02/11 | 1982 | graphics/circuit_macros/doc/PconnMan.m4
-2022/02/11 | 15033 | graphics/circuit_macros/doc/Pconn.tex
-2022/02/11 | 801 | graphics/circuit_macros/doc/Potentiometers.m4
-2022/02/11 | 774 | graphics/circuit_macros/doc/quick.m4
-2022/02/11 | 2086 | graphics/circuit_macros/doc/relaycoilMan.m4
-2022/02/11 | 1259 | graphics/circuit_macros/doc/RelayMan.m4
-2022/02/11 | 7316 | graphics/circuit_macros/doc/Relay.tex
-2022/02/11 | 1149 | graphics/circuit_macros/doc/ResistorsMan.m4
-2022/02/11 | 369 | graphics/circuit_macros/doc/sampleIC.m4
-2022/02/11 | 404 | graphics/circuit_macros/doc/Series.m4
-2022/02/11 | 1406 | graphics/circuit_macros/doc/ShiftRMan.m4
-2022/02/11 | 9425 | graphics/circuit_macros/doc/ShiftR.tex
-2022/02/11 | 421 | graphics/circuit_macros/doc/Sinus.m4
-2022/02/11 | 7464 | graphics/circuit_macros/doc/SLDsMan.m4
-2022/02/11 | 40591 | graphics/circuit_macros/doc/SLDs.tex
-2022/02/11 | 2225 | graphics/circuit_macros/doc/SourcesMan.m4
-2022/02/11 | 15388 | graphics/circuit_macros/doc/Sources.tex
-2022/02/11 | 217 | graphics/circuit_macros/doc/stringdims.m4
-2022/02/11 | 4780 | graphics/circuit_macros/doc/SwitchesMan.m4
-2022/02/11 | 19142 | graphics/circuit_macros/doc/Switches.tex
-2022/02/11 | 1463 | graphics/circuit_macros/doc/Taps.m4
-2022/02/11 | 11 | graphics/circuit_macros/doc/test.tex
-2022/02/11 | 1022 | graphics/circuit_macros/doc/TgateMan.m4
-2022/02/11 | 4178 | graphics/circuit_macros/doc/Tgate.tex
-2022/02/11 | 150 | graphics/circuit_macros/doc/Thermal.m4
-2022/02/11 | 3321 | graphics/circuit_macros/doc/thyristorMan.m4
-2022/02/11 | 20418 | graphics/circuit_macros/doc/thyristor.tex
-2022/02/11 | 535 | graphics/circuit_macros/doc/Tline.m4
-2022/02/11 | 165 | graphics/circuit_macros/doc/tranbody.m4
-2022/02/11 | 660 | graphics/circuit_macros/doc/ujtMan.m4
-2022/02/11 | 2441 | graphics/circuit_macros/doc/ujt.tex
-2022/02/11 | 944 | graphics/circuit_macros/doc/VariableMan.m4
-2022/02/11 | 10401 | graphics/circuit_macros/doc/Variable.tex
-2022/02/11 | 12 | graphics/circuit_macros/doc/Version.tex
-2022/02/11 | 3346 | graphics/circuit_macros/doc/WindingsMan.m4
-2022/02/11 | 449 | graphics/circuit_macros/doc/woodchips.m4
-2022/02/11 | 2912 | graphics/circuit_macros/doc/Workflow.m4
-2022/02/11 | 1526 | graphics/circuit_macros/doc/XformMan.m4
-2022/02/11 | 25849 | graphics/circuit_macros/doc/Xform.tex
-2022/02/11 | 23167 | graphics/circuit_macros/dpictools.pic
-2022/02/11 | 1730 | graphics/circuit_macros/examples/ABlogix.m4
-2022/02/11 | 2402 | graphics/circuit_macros/examples/Adder.m4
-2022/02/11 | 4205 | graphics/circuit_macros/examples/Alogix.m4
-2022/02/11 | 494 | graphics/circuit_macros/examples/AmpTable.m4
-2022/02/11 | 1230 | graphics/circuit_macros/examples/Antennas.m4
-2022/02/11 | 5013 | graphics/circuit_macros/examples/AntiqueClock.m4
-2022/02/11 | 1615 | graphics/circuit_macros/examples/Arresters.m4
-2022/02/11 | 1767 | graphics/circuit_macros/examples/ArrowFn.m4
-2022/02/11 | 6270 | graphics/circuit_macros/examples/ASME_Y14-5.m4
-2022/02/11 | 771 | graphics/circuit_macros/examples/Attention.m4
-2022/02/11 | 2634 | graphics/circuit_macros/examples/Audio.m4
-2022/02/11 | 2517 | graphics/circuit_macros/examples/Autoencoder.m4
-2022/02/11 | 1962 | graphics/circuit_macros/examples/Autologix.m4
-2022/02/11 | 4638 | graphics/circuit_macros/examples/Ball.m4
-2022/02/11 | 1619 | graphics/circuit_macros/examples/Bip.m4
-2022/02/11 | 917 | graphics/circuit_macros/examples/birds.m4
-2022/02/11 | 1075 | graphics/circuit_macros/examples/bistable.m4
-2022/02/11 | 3175 | graphics/circuit_macros/examples/Blogix.m4
-2022/02/11 | 2542 | graphics/circuit_macros/examples/brace.m4
-2022/02/11 | 1024 | graphics/circuit_macros/examples/Btree.m4
-2022/02/11 | 3509 | graphics/circuit_macros/examples/Buttons.m4
-2022/02/11 | 991 | graphics/circuit_macros/examples/Byte.m4
-2022/02/11 | 6371 | graphics/circuit_macros/examples/CanLogic.m4
-2022/02/11 | 1201 | graphics/circuit_macros/examples/Capacitors.m4
-2022/02/11 | 233 | graphics/circuit_macros/examples/Ccurve.m4
-2022/02/11 | 1039 | graphics/circuit_macros/examples/chaos.m4
-2022/02/11 | 1175 | graphics/circuit_macros/examples/Chips.m4
-2022/02/11 | 7670 | graphics/circuit_macros/examples/Chuck.m4
-2022/02/11 | 482 | graphics/circuit_macros/examples/clock.m4
-2022/02/11 | 750 | graphics/circuit_macros/examples/Connectors.m4
-2022/02/11 | 2178 | graphics/circuit_macros/examples/Conn.m4
-2022/02/11 | 27105 | graphics/circuit_macros/examples/Consumption.m4
-2022/02/11 | 3326 | graphics/circuit_macros/examples/Contact.m4
-2022/02/11 | 1585 | graphics/circuit_macros/examples/Contacts.m4
-2022/02/11 | 7069 | graphics/circuit_macros/examples/control.m4
-2022/02/11 | 551 | graphics/circuit_macros/examples/Counting.m4
-2022/02/11 | 1521 | graphics/circuit_macros/examples/Coxeter.m4
-2022/02/11 | 1358 | graphics/circuit_macros/examples/Crossbar.m4
-2022/02/11 | 2562 | graphics/circuit_macros/examples/Crow.m4
-2022/02/11 | 1879 | graphics/circuit_macros/examples/Cruller.m4
-2022/02/11 | 7434 | graphics/circuit_macros/examples/csc.m4
-2022/02/11 | 6003 | graphics/circuit_macros/examples/CSlight.m4
-2022/02/11 | 5890 | graphics/circuit_macros/examples/Csource.m4
-2022/02/11 | 460 | graphics/circuit_macros/examples/debug1.tex
-2022/02/11 | 1959 | graphics/circuit_macros/examples/debug2.m4
-2022/02/11 | 655 | graphics/circuit_macros/examples/Decoder.m4
-2022/02/11 | 1485 | graphics/circuit_macros/examples/Demultiplexer.m4
-2022/02/11 | 654 | graphics/circuit_macros/examples/diamond.m4
-2022/02/11 | 6854 | graphics/circuit_macros/examples/Dini.m4
-2022/02/11 | 1695 | graphics/circuit_macros/examples/Diodes.m4
-2022/02/11 | 1966 | graphics/circuit_macros/examples/Drive.m4
-2022/02/11 | 4891 | graphics/circuit_macros/examples/EEP.m4
-2022/02/11 | 980 | graphics/circuit_macros/examples/Emarrows.m4
-2022/02/11 | 6282 | graphics/circuit_macros/examples/Escher.m4
-2022/02/11 | 4023 | graphics/circuit_macros/examples/Euro.m4
-2022/02/11 | 2412 | graphics/circuit_macros/examples/ex00.m4
-2022/02/11 | 2283 | graphics/circuit_macros/examples/ex01.m4
-2022/02/11 | 1100 | graphics/circuit_macros/examples/ex02.m4
-2022/02/11 | 673 | graphics/circuit_macros/examples/ex03.m4
-2022/02/11 | 1654 | graphics/circuit_macros/examples/ex04.m4
-2022/02/11 | 1865 | graphics/circuit_macros/examples/ex05.m4
-2022/02/11 | 1700 | graphics/circuit_macros/examples/ex06.m4
-2022/02/11 | 2556 | graphics/circuit_macros/examples/ex08.m4
-2022/02/11 | 4313 | graphics/circuit_macros/examples/ex09.m4
-2022/02/11 | 1492 | graphics/circuit_macros/examples/ex10.m4
-2022/02/11 | 2361 | graphics/circuit_macros/examples/ex11.m4
-2022/02/11 | 3339 | graphics/circuit_macros/examples/ex12.m4
-2022/02/11 | 1003 | graphics/circuit_macros/examples/ex15.m4
-2022/02/11 | 1865 | graphics/circuit_macros/examples/ex16.m4
-2022/02/11 | 1126 | graphics/circuit_macros/examples/ex17.m4
-2022/02/11 | 865 | graphics/circuit_macros/examples/ex18.m4
-2022/02/11 | 2000 | graphics/circuit_macros/examples/ex21.m4
-2022/02/11 | 898616 | graphics/circuit_macros/examples/examples.pdf
-2022/02/11 | 1766 | graphics/circuit_macros/examples/examples.tex
-2022/02/11 | 8372 | graphics/circuit_macros/examples/exp.m4
-2022/02/11 | 1816 | graphics/circuit_macros/examples/Eye.m4
-2022/02/11 | 5311 | graphics/circuit_macros/examples/fet.m4
-2022/02/11 | 17627 | graphics/circuit_macros/examples/files.tex
-2022/02/11 | 645 | graphics/circuit_macros/examples/Floor.m4
-2022/02/11 | 11270 | graphics/circuit_macros/examples/FlowchartDefs.m4
-2022/02/11 | 4751 | graphics/circuit_macros/examples/Flow.m4
-2022/02/11 | 999 | graphics/circuit_macros/examples/Fuses.m4
-2022/02/11 | 5177 | graphics/circuit_macros/examples/Geometry.m4
-2022/02/11 | 421 | graphics/circuit_macros/examples/GrayCode.m4
-2022/02/11 | 5486 | graphics/circuit_macros/examples/graysurf.m4
-2022/02/11 | 828 | graphics/circuit_macros/examples/Grounds.m4
-2022/02/11 | 1132 | graphics/circuit_macros/examples/Headers.m4
-2022/02/11 | 1458 | graphics/circuit_macros/examples/header.tex
-2022/02/11 | 13330 | graphics/circuit_macros/examples/Heathkit.m4
-2022/02/11 | 2068 | graphics/circuit_macros/examples/I2L.m4
-2022/02/11 | 1668 | graphics/circuit_macros/examples/IC10107.m4
-2022/02/11 | 11432 | graphics/circuit_macros/examples/ics.m4
-2022/02/11 | 32 | graphics/circuit_macros/examples/Incl.eps.bb
-2022/02/11 | 45323 | graphics/circuit_macros/examples/Incl.eps.gz
-2022/02/11 | 741 | graphics/circuit_macros/examples/Incleps.m4
-2022/02/11 | 29772 | graphics/circuit_macros/examples/Incl.pdf
-2022/02/11 | 709 | graphics/circuit_macros/examples/Inclpdf.m4
-2022/02/11 | 1392 | graphics/circuit_macros/examples/Inductors.m4
-2022/02/11 | 2571 | graphics/circuit_macros/examples/IntersectingPlanes.m4
-2022/02/11 | 2362 | graphics/circuit_macros/examples/Jack.m4
-2022/02/11 | 2696 | graphics/circuit_macros/examples/keyval.m4
-2022/02/11 | 489 | graphics/circuit_macros/examples/Koch.m4
-2022/02/11 | 7127 | graphics/circuit_macros/examples/lcct.m4
-2022/02/11 | 2119 | graphics/circuit_macros/examples/Logic.m4
-2022/02/11 | 2304 | graphics/circuit_macros/examples/Loglog.m4
-2022/02/11 | 4501 | graphics/circuit_macros/examples/Lyap.m4
-2022/02/11 | 9293 | graphics/circuit_macros/examples/Makefile
-2022/02/11 | 2986 | graphics/circuit_macros/examples/MC.m4
-2022/02/11 | 2846 | graphics/circuit_macros/examples/Metamodel.m4
-2022/02/11 | 95148 | graphics/circuit_macros/examples/mf/cct.mf
-2022/02/11 | 764 | graphics/circuit_macros/examples/mf/cct.tfm
-2022/02/11 | 4615 | graphics/circuit_macros/examples/mf/font.m4
-2022/02/11 | 1529 | graphics/circuit_macros/examples/mf/Makefile
-2022/02/11 | 1076 | graphics/circuit_macros/examples/mf/mftest
-2022/02/11 | 3785 | graphics/circuit_macros/examples/Mixer.m4
-2022/02/11 | 960 | graphics/circuit_macros/examples/MoreTable.m4
-2022/02/11 | 1922 | graphics/circuit_macros/examples/MotorControl.m4
-2022/02/11 | 409 | graphics/circuit_macros/examples/mpost/examplesmpost.tex
-2022/02/11 | 4247 | graphics/circuit_macros/examples/mpost/Makefile
-2022/02/11 | 685 | graphics/circuit_macros/examples/mpost/mptest
-2022/02/11 | 703 | graphics/circuit_macros/examples/mpost/README-mpost
-2022/02/11 | 418 | graphics/circuit_macros/examples/mpost/tstmpost.tex
-2022/02/11 | 1400 | graphics/circuit_macros/examples/Multiplexer.m4
-2022/02/11 | 499 | graphics/circuit_macros/examples/NLG.m4
-2022/02/11 | 1128 | graphics/circuit_macros/examples/NPDT.m4
-2022/02/11 | 1040 | graphics/circuit_macros/examples/Nport.m4
-2022/02/11 | 2792 | graphics/circuit_macros/examples/OpAmpFilter.m4
-2022/02/11 | 1433 | graphics/circuit_macros/examples/Opamp.m4
-2022/02/11 | 2442 | graphics/circuit_macros/examples/Optoiso.m4
-2022/02/11 | 1852 | graphics/circuit_macros/examples/Orbits.m4
-2022/02/11 | 1802 | graphics/circuit_macros/examples/Pconn.m4
-2022/02/11 | 1419 | graphics/circuit_macros/examples/person.m4
-2022/02/11 | 2674 | graphics/circuit_macros/examples/Planes.m4
-2022/02/11 | 6160 | graphics/circuit_macros/examples/Plate.m4
-2022/02/11 | 1174 | graphics/circuit_macros/examples/PPA.m4
-2022/02/11 | 715 | graphics/circuit_macros/examples/psfrag/examplespsfrag.tex
-2022/02/11 | 4683 | graphics/circuit_macros/examples/psfrag/Makefile
-2022/02/11 | 317 | graphics/circuit_macros/examples/psfrag/README-psfrag.txt
-2022/02/11 | 371 | graphics/circuit_macros/examples/psfrag/tstpsfrag.tex
-2022/02/11 | 3954 | graphics/circuit_macros/examples/PushPull.m4
-2022/02/11 | 2014 | graphics/circuit_macros/examples/pwrsupply.m4
-2022/02/11 | 918 | graphics/circuit_macros/examples/Quantum.m4
-2022/02/11 | 774 | graphics/circuit_macros/examples/quick.m4
-2022/02/11 | 3727 | graphics/circuit_macros/examples/random.m4
-2022/02/11 | 2872 | graphics/circuit_macros/examples/README-examples
-2022/02/11 | 7006 | graphics/circuit_macros/examples/Rectifiers.m4
-2022/02/11 | 3825 | graphics/circuit_macros/examples/recycle.m4
-2022/02/11 | 2086 | graphics/circuit_macros/examples/relaycoil.m4
-2022/02/11 | 1259 | graphics/circuit_macros/examples/Relay.m4
-2022/02/11 | 1145 | graphics/circuit_macros/examples/Resistors.m4
-2022/02/11 | 1443 | graphics/circuit_macros/examples/Resolver.m4
-2022/02/11 | 4569 | graphics/circuit_macros/examples/rose.m4
-2022/02/11 | 221 | graphics/circuit_macros/examples/rotate.tex
-2022/02/11 | 1525 | graphics/circuit_macros/examples/rotatetext.m4
-2022/02/11 | 533 | graphics/circuit_macros/examples/Rotbox.m4
-2022/02/11 | 365 | graphics/circuit_macros/examples/rotellipse.m4
-2022/02/11 | 740 | graphics/circuit_macros/examples/SampleFlow.m4
-2022/02/11 | 1778 | graphics/circuit_macros/examples/Schottky.m4
-2022/02/11 | 2761 | graphics/circuit_macros/examples/sfg.m4
-2022/02/11 | 4827 | graphics/circuit_macros/examples/Shaky.m4
-2022/02/11 | 7721 | graphics/circuit_macros/examples/shapes.m4
-2022/02/11 | 1406 | graphics/circuit_macros/examples/ShiftR.m4
-2022/02/11 | 1331 | graphics/circuit_macros/examples/Sierpinski.m4
-2022/02/11 | 419 | graphics/circuit_macros/examples/Sixpole.m4
-2022/02/11 | 370 | graphics/circuit_macros/examples/snake.m4
-2022/02/11 | 2165 | graphics/circuit_macros/examples/Sources.m4
-2022/02/11 | 1906 | graphics/circuit_macros/examples/SPM.m4
-2022/02/11 | 380 | graphics/circuit_macros/examples/SQUID.m4
-2022/02/11 | 953 | graphics/circuit_macros/examples/squiggle.m4
-2022/02/11 | 1783 | graphics/circuit_macros/examples/Stator.m4
-2022/02/11 | 1955 | graphics/circuit_macros/examples/svg/ABlogixSVG.m4
-2022/02/11 | 2528 | graphics/circuit_macros/examples/svg/AdderSVG.m4
-2022/02/11 | 4340 | graphics/circuit_macros/examples/svg/AlogixSVG.m4
-2022/02/11 | 538 | graphics/circuit_macros/examples/svg/AmpTableSVG.m4
-2022/02/11 | 1090 | graphics/circuit_macros/examples/svg/AntennasSVG.m4
-2022/02/11 | 1894 | graphics/circuit_macros/examples/svg/ArrowFnSVG.m4
-2022/02/11 | 2720 | graphics/circuit_macros/examples/svg/AudioSVG.m4
-2022/02/11 | 2989 | graphics/circuit_macros/examples/svg/AutoencoderSVG.m4
-2022/02/11 | 1668 | graphics/circuit_macros/examples/svg/Banking.m4
-2022/02/11 | 1812 | graphics/circuit_macros/examples/svg/BipSVG.m4
-2022/02/11 | 4289 | graphics/circuit_macros/examples/svg/BtreeSVG.m4
-2022/02/11 | 3567 | graphics/circuit_macros/examples/svg/ButtonsSVG.m4
-2022/02/11 | 937 | graphics/circuit_macros/examples/svg/ByteSVG.m4
-2022/02/11 | 6413 | graphics/circuit_macros/examples/svg/CanLogicSVG.m4
-2022/02/11 | 1160 | graphics/circuit_macros/examples/svg/CapacitorsSVG.m4
-2022/02/11 | 1214 | graphics/circuit_macros/examples/svg/ChipsSVG.m4
-2022/02/11 | 715 | graphics/circuit_macros/examples/svg/ConnectorsSVG.m4
-2022/02/11 | 2111 | graphics/circuit_macros/examples/svg/ConnSVG.m4
-2022/02/11 | 1737 | graphics/circuit_macros/examples/svg/ContactsSVG.m4
-2022/02/11 | 3646 | graphics/circuit_macros/examples/svg/ContactSVG.m4
-2022/02/11 | 8006 | graphics/circuit_macros/examples/svg/controlSVG.m4
-2022/02/11 | 793 | graphics/circuit_macros/examples/svg/CountingSVG.m4
-2022/02/11 | 2525 | graphics/circuit_macros/examples/svg/CrowSVG.m4
-2022/02/11 | 1874 | graphics/circuit_macros/examples/svg/CrullerSVG.m4
-2022/02/11 | 7489 | graphics/circuit_macros/examples/svg/cscSVG.m4
-2022/02/11 | 7418 | graphics/circuit_macros/examples/svg/CsourceSVG.m4
-2022/02/11 | 745 | graphics/circuit_macros/examples/svg/DecoderSVG.m4
-2022/02/11 | 1373 | graphics/circuit_macros/examples/svg/DemultiplexerSVG.m4
-2022/02/11 | 609 | graphics/circuit_macros/examples/svg/diamondSVG.m4
-2022/02/11 | 6854 | graphics/circuit_macros/examples/svg/DiniSVG.m4
-2022/02/11 | 1550 | graphics/circuit_macros/examples/svg/DiodesSVG.m4
-2022/02/11 | 1966 | graphics/circuit_macros/examples/svg/DriveSVG.m4
-2022/02/11 | 4763 | graphics/circuit_macros/examples/svg/EEPSVG.m4
-2022/02/11 | 1070 | graphics/circuit_macros/examples/svg/EmarrowsSVG.m4
-2022/02/11 | 6285 | graphics/circuit_macros/examples/svg/EscherSVG.m4
-2022/02/11 | 2443 | graphics/circuit_macros/examples/svg/ex00SVG.m4
-2022/02/11 | 2629 | graphics/circuit_macros/examples/svg/ex01SVG.m4
-2022/02/11 | 1093 | graphics/circuit_macros/examples/svg/ex02SVG.m4
-2022/02/11 | 855 | graphics/circuit_macros/examples/svg/ex03SVG.m4
-2022/02/11 | 1891 | graphics/circuit_macros/examples/svg/ex04SVG.m4
-2022/02/11 | 3390 | graphics/circuit_macros/examples/svg/ex05SVG.m4
-2022/02/11 | 2018 | graphics/circuit_macros/examples/svg/ex06SVG.m4
-2022/02/11 | 2559 | graphics/circuit_macros/examples/svg/ex08SVG.m4
-2022/02/11 | 4119 | graphics/circuit_macros/examples/svg/ex09SVG.m4
-2022/02/11 | 1699 | graphics/circuit_macros/examples/svg/ex10SVG.m4
-2022/02/11 | 2685 | graphics/circuit_macros/examples/svg/ex11SVG.m4
-2022/02/11 | 3522 | graphics/circuit_macros/examples/svg/ex12SVG.m4
-2022/02/11 | 970 | graphics/circuit_macros/examples/svg/ex15SVG.m4
-2022/02/11 | 1893 | graphics/circuit_macros/examples/svg/ex16SVG.m4
-2022/02/11 | 1204 | graphics/circuit_macros/examples/svg/ex17SVG.m4
-2022/02/11 | 1065 | graphics/circuit_macros/examples/svg/ex18SVG.m4
-2022/02/11 | 1882 | graphics/circuit_macros/examples/svg/ex21SVG.m4
-2022/02/11 | 25002 | graphics/circuit_macros/examples/svg/examplesSVG.htmx
-2022/02/11 | 8517 | graphics/circuit_macros/examples/svg/expSVG.m4
-2022/02/11 | 1700 | graphics/circuit_macros/examples/svg/EyeSVG.m4
-2022/02/11 | 5365 | graphics/circuit_macros/examples/svg/fetSVG.m4
-2022/02/11 | 5171 | graphics/circuit_macros/examples/svg/FlowSVG.m4
-2022/02/11 | 538 | graphics/circuit_macros/examples/svg/FontsSVG.m4
-2022/02/11 | 1996 | graphics/circuit_macros/examples/svg/FourbarSVG.m4
-2022/02/11 | 959 | graphics/circuit_macros/examples/svg/FusesSVG.m4
-2022/02/11 | 5214 | graphics/circuit_macros/examples/svg/GeometrySVG.m4
-2022/02/11 | 1875 | graphics/circuit_macros/examples/svg/GrayCodeSVG.m4
-2022/02/11 | 5469 | graphics/circuit_macros/examples/svg/graysurfSVG.m4
-2022/02/11 | 810 | graphics/circuit_macros/examples/svg/GroundsSVG.m4
-2022/02/11 | 1265 | graphics/circuit_macros/examples/svg/HeadersSVG.m4
-2022/02/11 | 12711 | graphics/circuit_macros/examples/svg/HeathkitSVG.m4
-2022/02/11 | 2171 | graphics/circuit_macros/examples/svg/I2LSVG.m4
-2022/02/11 | 11601 | graphics/circuit_macros/examples/svg/icsSVG.m4
-2022/02/11 | 4003 | graphics/circuit_macros/examples/svg/InclepsSVG.m4
-2022/02/11 | 21384 | graphics/circuit_macros/examples/svg/Incl.jpg
-2022/02/11 | 1343 | graphics/circuit_macros/examples/svg/InductorsSVG.m4
-2022/02/11 | 2051 | graphics/circuit_macros/examples/svg/JackSVG.m4
-2022/02/11 | 7203 | graphics/circuit_macros/examples/svg/lcctSVG.m4
-2022/02/11 | 6216 | graphics/circuit_macros/examples/svg/LgateSVG.m4
-2022/02/11 | 63 | graphics/circuit_macros/examples/svg/local_init.m4
-2022/02/11 | 1931 | graphics/circuit_macros/examples/svg/LogicSVG.m4
-2022/02/11 | 30452 | graphics/circuit_macros/examples/svg/LoglogSVG.m4
-2022/02/11 | 5353 | graphics/circuit_macros/examples/svg/Makefile
-2022/02/11 | 3473 | graphics/circuit_macros/examples/svg/MCSVG.m4
-2022/02/11 | 3489 | graphics/circuit_macros/examples/svg/MixerSVG.m4
-2022/02/11 | 973 | graphics/circuit_macros/examples/svg/MoreTableSVG.m4
-2022/02/11 | 1953 | graphics/circuit_macros/examples/svg/MotorControlSVG.m4
-2022/02/11 | 1403 | graphics/circuit_macros/examples/svg/MultiplexerSVG.m4
-2022/02/11 | 532 | graphics/circuit_macros/examples/svg/NLGSVG.m4
-2022/02/11 | 1157 | graphics/circuit_macros/examples/svg/NPDTSVG.m4
-2022/02/11 | 748 | graphics/circuit_macros/examples/svg/Np.m4
-2022/02/11 | 1238 | graphics/circuit_macros/examples/svg/NportSVG.m4
-2022/02/11 | 1034 | graphics/circuit_macros/examples/svg/OpampSVG.m4
-2022/02/11 | 2551 | graphics/circuit_macros/examples/svg/OptoisoSVG.m4
-2022/02/11 | 10193 | graphics/circuit_macros/examples/svg/paletteSVG.m4
-2022/02/11 | 1776 | graphics/circuit_macros/examples/svg/PconnSVG.m4
-2022/02/11 | 6153 | graphics/circuit_macros/examples/svg/PlateSVG.m4
-2022/02/11 | 3778 | graphics/circuit_macros/examples/svg/PushPullSVG.m4
-2022/02/11 | 2027 | graphics/circuit_macros/examples/svg/pwrsupplySVG.m4
-2022/02/11 | 947 | graphics/circuit_macros/examples/svg/QuantumSVG.m4
-2022/02/11 | 901 | graphics/circuit_macros/examples/svg/quickSVG.m4
-2022/02/11 | 3756 | graphics/circuit_macros/examples/svg/randomSVG.m4
-2022/02/11 | 7546 | graphics/circuit_macros/examples/svg/RectifiersSVG.m4
-2022/02/11 | 3825 | graphics/circuit_macros/examples/svg/recycleSVG.m4
-2022/02/11 | 2069 | graphics/circuit_macros/examples/svg/relaycoilSVG.m4
-2022/02/11 | 1431 | graphics/circuit_macros/examples/svg/RelaySVG.m4
-2022/02/11 | 1186 | graphics/circuit_macros/examples/svg/ResistorsSVG.m4
-2022/02/11 | 5412 | graphics/circuit_macros/examples/svg/roseSVG.m4
-2022/02/11 | 563 | graphics/circuit_macros/examples/svg/RotboxSVG.m4
-2022/02/11 | 1837 | graphics/circuit_macros/examples/svg/SchottkySVG.m4
-2022/02/11 | 3290 | graphics/circuit_macros/examples/svg/sfgSVG.m4
-2022/02/11 | 7507 | graphics/circuit_macros/examples/svg/shapesSVG.m4
-2022/02/11 | 1313 | graphics/circuit_macros/examples/svg/ShiftRSVG.m4
-2022/02/11 | 1331 | graphics/circuit_macros/examples/svg/SierpinskiSVG.m4
-2022/02/11 | 419 | graphics/circuit_macros/examples/svg/SixpoleSVG.m4
-2022/02/11 | 4376 | graphics/circuit_macros/examples/svg/slddiagsSVG.m4
-2022/02/11 | 1907 | graphics/circuit_macros/examples/svg/SourcesSVG.m4
-2022/02/11 | 417 | graphics/circuit_macros/examples/svg/SQUIDSVG.m4
-2022/02/11 | 1050 | graphics/circuit_macros/examples/svg/SVGconfig.m4
-2022/02/11 | 5132 | graphics/circuit_macros/examples/svg/SwitchesSVG.m4
-2022/02/11 | 1055 | graphics/circuit_macros/examples/svg/TgateSVG.m4
-2022/02/11 | 1444 | graphics/circuit_macros/examples/svg/ThreeSVG.m4
-2022/02/11 | 3310 | graphics/circuit_macros/examples/svg/thyristorSVG.m4
-2022/02/11 | 1612 | graphics/circuit_macros/examples/svg/TimerSVG.m4
-2022/02/11 | 14057 | graphics/circuit_macros/examples/svg/tstSVG.htmx
-2022/02/11 | 1630 | graphics/circuit_macros/examples/svg/TTLnandSVG.m4
-2022/02/11 | 3091 | graphics/circuit_macros/examples/svg/TtreeSVG.m4
-2022/02/11 | 12478 | graphics/circuit_macros/examples/svg/TubediagsSVG.m4
-2022/02/11 | 682 | graphics/circuit_macros/examples/svg/ujtSVG.m4
-2022/02/11 | 24141 | graphics/circuit_macros/examples/svg/UNOSVG.m4
-2022/02/11 | 988 | graphics/circuit_macros/examples/svg/VariableSVG.m4
-2022/02/11 | 2994 | graphics/circuit_macros/examples/svg/WindingsSVG.m4
-2022/02/11 | 353 | graphics/circuit_macros/examples/svg/windows.m4
-2022/02/11 | 3631 | graphics/circuit_macros/examples/svg/wormSVG.m4
-2022/02/11 | 1559 | graphics/circuit_macros/examples/svg/XformSVG.m4
-2022/02/11 | 1985 | graphics/circuit_macros/examples/svg/XORSVG.m4
-2022/02/11 | 1546 | graphics/circuit_macros/examples/svg/Xtest.m4
-2022/02/11 | 4782 | graphics/circuit_macros/examples/Switches.m4
-2022/02/11 | 591 | graphics/circuit_macros/examples/test.m4
-2022/02/11 | 416 | graphics/circuit_macros/examples/testpdf.tex
-2022/02/11 | 1022 | graphics/circuit_macros/examples/Tgate.m4
-2022/02/11 | 1287 | graphics/circuit_macros/examples/Three.m4
-2022/02/11 | 3321 | graphics/circuit_macros/examples/thyristor.m4
-2022/02/11 | 219 | graphics/circuit_macros/examples/tst1.tex
-2022/02/11 | 409 | graphics/circuit_macros/examples/tst.tex
-2022/02/11 | 464 | graphics/circuit_macros/examples/tsttikz.tex
-2022/02/11 | 1558 | graphics/circuit_macros/examples/TTLnand.m4
-2022/02/11 | 2097 | graphics/circuit_macros/examples/Ttree.m4
-2022/02/11 | 9840 | graphics/circuit_macros/examples/tubedefs.m4
-2022/02/11 | 13264 | graphics/circuit_macros/examples/Tubediags.m4
-2022/02/11 | 660 | graphics/circuit_macros/examples/ujt.m4
-2022/02/11 | 932 | graphics/circuit_macros/examples/Variable.m4
-2022/02/11 | 1906 | graphics/circuit_macros/examples/venus.m4
-2022/02/11 | 442 | graphics/circuit_macros/examples/Wheat.m4
-2022/02/11 | 3346 | graphics/circuit_macros/examples/Windings.m4
-2022/02/11 | 353 | graphics/circuit_macros/examples/windows.m4
-2022/02/11 | 2801 | graphics/circuit_macros/examples/worm.m4
-2022/02/11 | 337 | graphics/circuit_macros/examples/xfig/Makefile
-2022/02/11 | 21398 | graphics/circuit_macros/examples/xfig/xfiglib.fig
-2022/02/11 | 5969 | graphics/circuit_macros/examples/xfig/xfiglib.m4
-2022/02/11 | 1526 | graphics/circuit_macros/examples/Xform.m4
-2022/02/11 | 1823 | graphics/circuit_macros/examples/XOR.m4
-2022/02/11 | 656 | graphics/circuit_macros/examples/Zcos.m4
-2022/02/11 | 1019 | graphics/circuit_macros/gpic.m4
-2022/02/11 | 4089 | graphics/circuit_macros/INSTALL
-2022/02/11 | 12765 | graphics/circuit_macros/lib3D.m4
-2022/02/11 | 177455 | graphics/circuit_macros/libcct.m4
-2022/02/11 | 89412 | graphics/circuit_macros/libgen.m4
-2022/02/11 | 47825 | graphics/circuit_macros/liblog.m4
-2022/02/11 | 32529 | graphics/circuit_macros/libSLD.m4
-2022/02/11 | 19176 | graphics/circuit_macros/Licence.txt
-2022/02/11 | 1639 | graphics/circuit_macros/Makefile
-2022/02/11 | 1114 | graphics/circuit_macros/mfpic.m4
-2022/02/11 | 1640 | graphics/circuit_macros/mpost.m4
-2022/02/11 | 2085 | graphics/circuit_macros/pgf.m4
-2022/02/11 | 2834 | graphics/circuit_macros/postscript.m4
-2022/02/11 | 706 | graphics/circuit_macros/psfrag.m4
-2022/02/11 | 2099 | graphics/circuit_macros/pstricks.m4
-2022/02/11 | 16073 | graphics/circuit_macros/README
-2022/02/11 | 11598 | graphics/circuit_macros/svg.m4
-2022/02/11 | 1029 | graphics/circuit_macros/xfig.m4
-2022/02/11 | 2644552 | graphics/circuit_macros.zip
+2022/07/27 | 1185 | graphics/circuit_macros/boxdims.sty
+2022/07/27 | 13500 | graphics/circuit_macros/CHANGES
+2022/07/27 | 462 | graphics/circuit_macros/Copying
+2022/07/27 | 14279 | graphics/circuit_macros/darrow.m4
+2022/07/27 | 26 | graphics/circuit_macros/doc/ACsymbol.m4
+2022/07/27 | 494 | graphics/circuit_macros/doc/AmpTableMan.m4
+2022/07/27 | 1940 | graphics/circuit_macros/doc/AmpTable.tex
+2022/07/27 | 1230 | graphics/circuit_macros/doc/AntennasMan.m4
+2022/07/27 | 1618 | graphics/circuit_macros/doc/ArrestersMan.m4
+2022/07/27 | 1017 | graphics/circuit_macros/doc/arrowex.m4
+2022/07/27 | 2634 | graphics/circuit_macros/doc/AudioMan.m4
+2022/07/27 | 10164 | graphics/circuit_macros/doc/Audio.tex
+2022/07/27 | 131 | graphics/circuit_macros/doc/Axes.m4
+2022/07/27 | 614 | graphics/circuit_macros/doc/BigResistor.m4
+2022/07/27 | 1619 | graphics/circuit_macros/doc/BipMan.m4
+2022/07/27 | 5545 | graphics/circuit_macros/doc/Bip.tex
+2022/07/27 | 1074 | graphics/circuit_macros/doc/bistableMan.m4
+2022/07/27 | 1860 | graphics/circuit_macros/doc/bi_trans.m4
+2022/07/27 | 130 | graphics/circuit_macros/doc/bitrbody.m4
+2022/07/27 | 50 | graphics/circuit_macros/doc/bitr.m4
+2022/07/27 | 152931 | graphics/circuit_macros/doc/body.tex
+2022/07/27 | 1953 | graphics/circuit_macros/doc/Buffer.m4
+2022/07/27 | 1063 | graphics/circuit_macros/doc/CapacitorsMan.m4
+2022/07/27 | 4312 | graphics/circuit_macros/doc/Circuit_macros.bib
+2022/07/27 | 1023203 | graphics/circuit_macros/doc/Circuit_macros.pdf
+2022/07/27 | 3019 | graphics/circuit_macros/doc/Circuit_macros.tex
+2022/07/27 | 1857 | graphics/circuit_macros/doc/Composite.m4
+2022/07/27 | 1121 | graphics/circuit_macros/doc/ConfigA.m4
+2022/07/27 | 1258 | graphics/circuit_macros/doc/ConfigB.m4
+2022/07/27 | 1292 | graphics/circuit_macros/doc/ConfigC.m4
+2022/07/27 | 2179 | graphics/circuit_macros/doc/ConnMan.m4
+2022/07/27 | 6550 | graphics/circuit_macros/doc/Conn.tex
+2022/07/27 | 3326 | graphics/circuit_macros/doc/ContactMan.m4
+2022/07/27 | 1585 | graphics/circuit_macros/doc/ContactsMan.m4
+2022/07/27 | 6067 | graphics/circuit_macros/doc/Contacts.tex
+2022/07/27 | 13833 | graphics/circuit_macros/doc/Contact.tex
+2022/07/27 | 1995 | graphics/circuit_macros/doc/Corners.m4
+2022/07/27 | 1329 | graphics/circuit_macros/doc/currents.m4
+2022/07/27 | 2389 | graphics/circuit_macros/doc/Dac.m4
+2022/07/27 | 1151 | graphics/circuit_macros/doc/Darlington.m4
+2022/07/27 | 26 | graphics/circuit_macros/doc/DCsymbol.m4
+2022/07/27 | 104332 | graphics/circuit_macros/doc/defines.tex
+2022/07/27 | 1485 | graphics/circuit_macros/doc/DemultiplexerMan.m4
+2022/07/27 | 4817 | graphics/circuit_macros/doc/Demultiplexer.tex
+2022/07/27 | 1790 | graphics/circuit_macros/doc/DiodesMan.m4
+2022/07/27 | 12050 | graphics/circuit_macros/doc/Diodes.tex
+2022/07/27 | 483 | graphics/circuit_macros/doc/eboxdims.m4
+2022/07/27 | 980 | graphics/circuit_macros/doc/EmarrowsMan.m4
+2022/07/27 | 5502 | graphics/circuit_macros/doc/Emarrows.tex
+2022/07/27 | 1229 | graphics/circuit_macros/doc/fbfilter.m4
+2022/07/27 | 5315 | graphics/circuit_macros/doc/fetMan.m4
+2022/07/27 | 16420 | graphics/circuit_macros/doc/fet.tex
+2022/07/27 | 329 | graphics/circuit_macros/doc/FF.m4
+2022/07/27 | 1975 | graphics/circuit_macros/doc/FlipFlop.m4
+2022/07/27 | 970 | graphics/circuit_macros/doc/Flowdiag.m4
+2022/07/27 | 999 | graphics/circuit_macros/doc/FusesMan.m4
+2022/07/27 | 4789 | graphics/circuit_macros/doc/Fuses.tex
+2022/07/27 | 831 | graphics/circuit_macros/doc/GroundsMan.m4
+2022/07/27 | 2661 | graphics/circuit_macros/doc/Grounds.tex
+2022/07/27 | 1132 | graphics/circuit_macros/doc/HeadersMan.m4
+2022/07/27 | 7503 | graphics/circuit_macros/doc/Headers.tex
+2022/07/27 | 2013 | graphics/circuit_macros/doc/HybridPi.m4
+2022/07/27 | 1342 | graphics/circuit_macros/doc/InductorsMan.m4
+2022/07/27 | 2362 | graphics/circuit_macros/doc/JackMan.m4
+2022/07/27 | 12006 | graphics/circuit_macros/doc/Jack.tex
+2022/07/27 | 2119 | graphics/circuit_macros/doc/LogicMan.m4
+2022/07/27 | 7533 | graphics/circuit_macros/doc/Logic.tex
+2022/07/27 | 269 | graphics/circuit_macros/doc/Loop.m4
+2022/07/27 | 387 | graphics/circuit_macros/doc/lrarrows.m4
+2022/07/27 | 4969 | graphics/circuit_macros/doc/Makefile
+2022/07/27 | 963 | graphics/circuit_macros/doc/MoreTableMan.m4
+2022/07/27 | 1575 | graphics/circuit_macros/doc/mplex.m4
+2022/07/27 | 1400 | graphics/circuit_macros/doc/MultiplexerMan.m4
+2022/07/27 | 4964 | graphics/circuit_macros/doc/Multiplexer.tex
+2022/07/27 | 499 | graphics/circuit_macros/doc/NLGMan.m4
+2022/07/27 | 3183 | graphics/circuit_macros/doc/NLG.tex
+2022/07/27 | 1128 | graphics/circuit_macros/doc/NPDTMan.m4
+2022/07/27 | 5137 | graphics/circuit_macros/doc/NPDT.tex
+2022/07/27 | 1040 | graphics/circuit_macros/doc/NportMan.m4
+2022/07/27 | 4666 | graphics/circuit_macros/doc/Nport.tex
+2022/07/27 | 783 | graphics/circuit_macros/doc/Oblique.m4
+2022/07/27 | 137 | graphics/circuit_macros/doc/opampexbody.m4
+2022/07/27 | 56 | graphics/circuit_macros/doc/opampex.m4
+2022/07/27 | 1433 | graphics/circuit_macros/doc/OpampMan.m4
+2022/07/27 | 835 | graphics/circuit_macros/doc/Opto.m4
+2022/07/27 | 1624 | graphics/circuit_macros/doc/ParSeries.m4
+2022/07/27 | 1982 | graphics/circuit_macros/doc/PconnMan.m4
+2022/07/27 | 15033 | graphics/circuit_macros/doc/Pconn.tex
+2022/07/27 | 801 | graphics/circuit_macros/doc/Potentiometers.m4
+2022/07/27 | 774 | graphics/circuit_macros/doc/quick.m4
+2022/07/27 | 2086 | graphics/circuit_macros/doc/relaycoilMan.m4
+2022/07/27 | 1259 | graphics/circuit_macros/doc/RelayMan.m4
+2022/07/27 | 7316 | graphics/circuit_macros/doc/Relay.tex
+2022/07/27 | 1149 | graphics/circuit_macros/doc/ResistorsMan.m4
+2022/07/27 | 369 | graphics/circuit_macros/doc/sampleIC.m4
+2022/07/27 | 404 | graphics/circuit_macros/doc/Series.m4
+2022/07/27 | 1406 | graphics/circuit_macros/doc/ShiftRMan.m4
+2022/07/27 | 9425 | graphics/circuit_macros/doc/ShiftR.tex
+2022/07/27 | 421 | graphics/circuit_macros/doc/Sinus.m4
+2022/07/27 | 7464 | graphics/circuit_macros/doc/SLDsMan.m4
+2022/07/27 | 40591 | graphics/circuit_macros/doc/SLDs.tex
+2022/07/27 | 2225 | graphics/circuit_macros/doc/SourcesMan.m4
+2022/07/27 | 15388 | graphics/circuit_macros/doc/Sources.tex
+2022/07/27 | 217 | graphics/circuit_macros/doc/stringdims.m4
+2022/07/27 | 4780 | graphics/circuit_macros/doc/SwitchesMan.m4
+2022/07/27 | 19142 | graphics/circuit_macros/doc/Switches.tex
+2022/07/27 | 1463 | graphics/circuit_macros/doc/Taps.m4
+2022/07/27 | 11 | graphics/circuit_macros/doc/test.tex
+2022/07/27 | 1022 | graphics/circuit_macros/doc/TgateMan.m4
+2022/07/27 | 4178 | graphics/circuit_macros/doc/Tgate.tex
+2022/07/27 | 150 | graphics/circuit_macros/doc/Thermal.m4
+2022/07/27 | 3321 | graphics/circuit_macros/doc/thyristorMan.m4
+2022/07/27 | 20418 | graphics/circuit_macros/doc/thyristor.tex
+2022/07/27 | 535 | graphics/circuit_macros/doc/Tline.m4
+2022/07/27 | 165 | graphics/circuit_macros/doc/tranbody.m4
+2022/07/27 | 660 | graphics/circuit_macros/doc/ujtMan.m4
+2022/07/27 | 2441 | graphics/circuit_macros/doc/ujt.tex
+2022/07/27 | 944 | graphics/circuit_macros/doc/VariableMan.m4
+2022/07/27 | 10401 | graphics/circuit_macros/doc/Variable.tex
+2022/07/27 | 12 | graphics/circuit_macros/doc/Version.tex
+2022/07/27 | 3346 | graphics/circuit_macros/doc/WindingsMan.m4
+2022/07/27 | 449 | graphics/circuit_macros/doc/woodchips.m4
+2022/07/27 | 2912 | graphics/circuit_macros/doc/Workflow.m4
+2022/07/27 | 1526 | graphics/circuit_macros/doc/XformMan.m4
+2022/07/27 | 25849 | graphics/circuit_macros/doc/Xform.tex
+2022/07/27 | 23650 | graphics/circuit_macros/dpictools.pic
+2022/07/27 | 1730 | graphics/circuit_macros/examples/ABlogix.m4
+2022/07/27 | 2402 | graphics/circuit_macros/examples/Adder.m4
+2022/07/27 | 4205 | graphics/circuit_macros/examples/Alogix.m4
+2022/07/27 | 494 | graphics/circuit_macros/examples/AmpTable.m4
+2022/07/27 | 1230 | graphics/circuit_macros/examples/Antennas.m4
+2022/07/27 | 5013 | graphics/circuit_macros/examples/AntiqueClock.m4
+2022/07/27 | 1615 | graphics/circuit_macros/examples/Arresters.m4
+2022/07/27 | 1767 | graphics/circuit_macros/examples/ArrowFn.m4
+2022/07/27 | 6270 | graphics/circuit_macros/examples/ASME_Y14-5.m4
+2022/07/27 | 771 | graphics/circuit_macros/examples/Attention.m4
+2022/07/27 | 2634 | graphics/circuit_macros/examples/Audio.m4
+2022/07/27 | 2517 | graphics/circuit_macros/examples/Autoencoder.m4
+2022/07/27 | 1962 | graphics/circuit_macros/examples/Autologix.m4
+2022/07/27 | 4638 | graphics/circuit_macros/examples/Ball.m4
+2022/07/27 | 1619 | graphics/circuit_macros/examples/Bip.m4
+2022/07/27 | 917 | graphics/circuit_macros/examples/birds.m4
+2022/07/27 | 1075 | graphics/circuit_macros/examples/bistable.m4
+2022/07/27 | 3175 | graphics/circuit_macros/examples/Blogix.m4
+2022/07/27 | 2542 | graphics/circuit_macros/examples/brace.m4
+2022/07/27 | 1024 | graphics/circuit_macros/examples/Btree.m4
+2022/07/27 | 3509 | graphics/circuit_macros/examples/Buttons.m4
+2022/07/27 | 991 | graphics/circuit_macros/examples/Byte.m4
+2022/07/27 | 6371 | graphics/circuit_macros/examples/CanLogic.m4
+2022/07/27 | 1201 | graphics/circuit_macros/examples/Capacitors.m4
+2022/07/27 | 233 | graphics/circuit_macros/examples/Ccurve.m4
+2022/07/27 | 1039 | graphics/circuit_macros/examples/chaos.m4
+2022/07/27 | 1175 | graphics/circuit_macros/examples/Chips.m4
+2022/07/27 | 7670 | graphics/circuit_macros/examples/Chuck.m4
+2022/07/27 | 482 | graphics/circuit_macros/examples/clock.m4
+2022/07/27 | 750 | graphics/circuit_macros/examples/Connectors.m4
+2022/07/27 | 2178 | graphics/circuit_macros/examples/Conn.m4
+2022/07/27 | 27105 | graphics/circuit_macros/examples/Consumption.m4
+2022/07/27 | 3326 | graphics/circuit_macros/examples/Contact.m4
+2022/07/27 | 1585 | graphics/circuit_macros/examples/Contacts.m4
+2022/07/27 | 7069 | graphics/circuit_macros/examples/control.m4
+2022/07/27 | 551 | graphics/circuit_macros/examples/Counting.m4
+2022/07/27 | 1521 | graphics/circuit_macros/examples/Coxeter.m4
+2022/07/27 | 1358 | graphics/circuit_macros/examples/Crossbar.m4
+2022/07/27 | 2562 | graphics/circuit_macros/examples/Crow.m4
+2022/07/27 | 1879 | graphics/circuit_macros/examples/Cruller.m4
+2022/07/27 | 7732 | graphics/circuit_macros/examples/csc.m4
+2022/07/27 | 6003 | graphics/circuit_macros/examples/CSlight.m4
+2022/07/27 | 5890 | graphics/circuit_macros/examples/Csource.m4
+2022/07/27 | 460 | graphics/circuit_macros/examples/debug1.tex
+2022/07/27 | 1959 | graphics/circuit_macros/examples/debug2.m4
+2022/07/27 | 655 | graphics/circuit_macros/examples/Decoder.m4
+2022/07/27 | 1485 | graphics/circuit_macros/examples/Demultiplexer.m4
+2022/07/27 | 654 | graphics/circuit_macros/examples/diamond.m4
+2022/07/27 | 6854 | graphics/circuit_macros/examples/Dini.m4
+2022/07/27 | 1787 | graphics/circuit_macros/examples/Diodes.m4
+2022/07/27 | 1966 | graphics/circuit_macros/examples/Drive.m4
+2022/07/27 | 4891 | graphics/circuit_macros/examples/EEP.m4
+2022/07/27 | 980 | graphics/circuit_macros/examples/Emarrows.m4
+2022/07/27 | 6282 | graphics/circuit_macros/examples/Escher.m4
+2022/07/27 | 4023 | graphics/circuit_macros/examples/Euro.m4
+2022/07/27 | 2412 | graphics/circuit_macros/examples/ex00.m4
+2022/07/27 | 2283 | graphics/circuit_macros/examples/ex01.m4
+2022/07/27 | 1100 | graphics/circuit_macros/examples/ex02.m4
+2022/07/27 | 673 | graphics/circuit_macros/examples/ex03.m4
+2022/07/27 | 1654 | graphics/circuit_macros/examples/ex04.m4
+2022/07/27 | 1865 | graphics/circuit_macros/examples/ex05.m4
+2022/07/27 | 1700 | graphics/circuit_macros/examples/ex06.m4
+2022/07/27 | 2556 | graphics/circuit_macros/examples/ex08.m4
+2022/07/27 | 4313 | graphics/circuit_macros/examples/ex09.m4
+2022/07/27 | 1492 | graphics/circuit_macros/examples/ex10.m4
+2022/07/27 | 2361 | graphics/circuit_macros/examples/ex11.m4
+2022/07/27 | 3339 | graphics/circuit_macros/examples/ex12.m4
+2022/07/27 | 1003 | graphics/circuit_macros/examples/ex15.m4
+2022/07/27 | 1865 | graphics/circuit_macros/examples/ex16.m4
+2022/07/27 | 1126 | graphics/circuit_macros/examples/ex17.m4
+2022/07/27 | 865 | graphics/circuit_macros/examples/ex18.m4
+2022/07/27 | 2000 | graphics/circuit_macros/examples/ex21.m4
+2022/07/27 | 902995 | graphics/circuit_macros/examples/examples.pdf
+2022/07/27 | 1766 | graphics/circuit_macros/examples/examples.tex
+2022/07/27 | 8372 | graphics/circuit_macros/examples/exp.m4
+2022/07/27 | 1816 | graphics/circuit_macros/examples/Eye.m4
+2022/07/27 | 5311 | graphics/circuit_macros/examples/fet.m4
+2022/07/27 | 17653 | graphics/circuit_macros/examples/files.tex
+2022/07/27 | 645 | graphics/circuit_macros/examples/Floor.m4
+2022/07/27 | 11270 | graphics/circuit_macros/examples/FlowchartDefs.m4
+2022/07/27 | 4751 | graphics/circuit_macros/examples/Flow.m4
+2022/07/27 | 999 | graphics/circuit_macros/examples/Fuses.m4
+2022/07/27 | 5177 | graphics/circuit_macros/examples/Geometry.m4
+2022/07/27 | 421 | graphics/circuit_macros/examples/GrayCode.m4
+2022/07/27 | 5486 | graphics/circuit_macros/examples/graysurf.m4
+2022/07/27 | 828 | graphics/circuit_macros/examples/Grounds.m4
+2022/07/27 | 1132 | graphics/circuit_macros/examples/Headers.m4
+2022/07/27 | 1458 | graphics/circuit_macros/examples/header.tex
+2022/07/27 | 13330 | graphics/circuit_macros/examples/Heathkit.m4
+2022/07/27 | 2068 | graphics/circuit_macros/examples/I2L.m4
+2022/07/27 | 1668 | graphics/circuit_macros/examples/IC10107.m4
+2022/07/27 | 11440 | graphics/circuit_macros/examples/ics.m4
+2022/07/27 | 32 | graphics/circuit_macros/examples/Incl.eps.bb
+2022/07/27 | 45323 | graphics/circuit_macros/examples/Incl.eps.gz
+2022/07/27 | 741 | graphics/circuit_macros/examples/Incleps.m4
+2022/07/27 | 29772 | graphics/circuit_macros/examples/Incl.pdf
+2022/07/27 | 709 | graphics/circuit_macros/examples/Inclpdf.m4
+2022/07/27 | 1392 | graphics/circuit_macros/examples/Inductors.m4
+2022/07/27 | 2571 | graphics/circuit_macros/examples/IntersectingPlanes.m4
+2022/07/27 | 2362 | graphics/circuit_macros/examples/Jack.m4
+2022/07/27 | 2696 | graphics/circuit_macros/examples/keyval.m4
+2022/07/27 | 489 | graphics/circuit_macros/examples/Koch.m4
+2022/07/27 | 7127 | graphics/circuit_macros/examples/lcct.m4
+2022/07/27 | 2119 | graphics/circuit_macros/examples/Logic.m4
+2022/07/27 | 2304 | graphics/circuit_macros/examples/Loglog.m4
+2022/07/27 | 4501 | graphics/circuit_macros/examples/Lyap.m4
+2022/07/27 | 9293 | graphics/circuit_macros/examples/Makefile
+2022/07/27 | 2986 | graphics/circuit_macros/examples/MC.m4
+2022/07/27 | 2846 | graphics/circuit_macros/examples/Metamodel.m4
+2022/07/27 | 95148 | graphics/circuit_macros/examples/mf/cct.mf
+2022/07/27 | 764 | graphics/circuit_macros/examples/mf/cct.tfm
+2022/07/27 | 4615 | graphics/circuit_macros/examples/mf/font.m4
+2022/07/27 | 1529 | graphics/circuit_macros/examples/mf/Makefile
+2022/07/27 | 1076 | graphics/circuit_macros/examples/mf/mftest
+2022/07/27 | 3785 | graphics/circuit_macros/examples/Mixer.m4
+2022/07/27 | 960 | graphics/circuit_macros/examples/MoreTable.m4
+2022/07/27 | 1922 | graphics/circuit_macros/examples/MotorControl.m4
+2022/07/27 | 409 | graphics/circuit_macros/examples/mpost/examplesmpost.tex
+2022/07/27 | 4247 | graphics/circuit_macros/examples/mpost/Makefile
+2022/07/27 | 685 | graphics/circuit_macros/examples/mpost/mptest
+2022/07/27 | 703 | graphics/circuit_macros/examples/mpost/README-mpost
+2022/07/27 | 418 | graphics/circuit_macros/examples/mpost/tstmpost.tex
+2022/07/27 | 1400 | graphics/circuit_macros/examples/Multiplexer.m4
+2022/07/27 | 499 | graphics/circuit_macros/examples/NLG.m4
+2022/07/27 | 1128 | graphics/circuit_macros/examples/NPDT.m4
+2022/07/27 | 1040 | graphics/circuit_macros/examples/Nport.m4
+2022/07/27 | 2792 | graphics/circuit_macros/examples/OpAmpFilter.m4
+2022/07/27 | 1433 | graphics/circuit_macros/examples/Opamp.m4
+2022/07/27 | 2442 | graphics/circuit_macros/examples/Optoiso.m4
+2022/07/27 | 1852 | graphics/circuit_macros/examples/Orbits.m4
+2022/07/27 | 1802 | graphics/circuit_macros/examples/Pconn.m4
+2022/07/27 | 1419 | graphics/circuit_macros/examples/person.m4
+2022/07/27 | 2674 | graphics/circuit_macros/examples/Planes.m4
+2022/07/27 | 6160 | graphics/circuit_macros/examples/Plate.m4
+2022/07/27 | 1174 | graphics/circuit_macros/examples/PPA.m4
+2022/07/27 | 715 | graphics/circuit_macros/examples/psfrag/examplespsfrag.tex
+2022/07/27 | 4683 | graphics/circuit_macros/examples/psfrag/Makefile
+2022/07/27 | 317 | graphics/circuit_macros/examples/psfrag/README-psfrag.txt
+2022/07/27 | 371 | graphics/circuit_macros/examples/psfrag/tstpsfrag.tex
+2022/07/27 | 3954 | graphics/circuit_macros/examples/PushPull.m4
+2022/07/27 | 2014 | graphics/circuit_macros/examples/pwrsupply.m4
+2022/07/27 | 918 | graphics/circuit_macros/examples/Quantum.m4
+2022/07/27 | 774 | graphics/circuit_macros/examples/quick.m4
+2022/07/27 | 3727 | graphics/circuit_macros/examples/random.m4
+2022/07/27 | 2872 | graphics/circuit_macros/examples/README-examples
+2022/07/27 | 7006 | graphics/circuit_macros/examples/Rectifiers.m4
+2022/07/27 | 3825 | graphics/circuit_macros/examples/recycle.m4
+2022/07/27 | 2086 | graphics/circuit_macros/examples/relaycoil.m4
+2022/07/27 | 1259 | graphics/circuit_macros/examples/Relay.m4
+2022/07/27 | 1145 | graphics/circuit_macros/examples/Resistors.m4
+2022/07/27 | 1443 | graphics/circuit_macros/examples/Resolver.m4
+2022/07/27 | 4569 | graphics/circuit_macros/examples/rose.m4
+2022/07/27 | 221 | graphics/circuit_macros/examples/rotate.tex
+2022/07/27 | 1525 | graphics/circuit_macros/examples/rotatetext.m4
+2022/07/27 | 533 | graphics/circuit_macros/examples/Rotbox.m4
+2022/07/27 | 365 | graphics/circuit_macros/examples/rotellipse.m4
+2022/07/27 | 740 | graphics/circuit_macros/examples/SampleFlow.m4
+2022/07/27 | 1778 | graphics/circuit_macros/examples/Schottky.m4
+2022/07/27 | 3991 | graphics/circuit_macros/examples/sfg.m4
+2022/07/27 | 295 | graphics/circuit_macros/examples/ShadeSector.m4
+2022/07/27 | 3749 | graphics/circuit_macros/examples/Shaky.m4
+2022/07/27 | 7721 | graphics/circuit_macros/examples/shapes.m4
+2022/07/27 | 1406 | graphics/circuit_macros/examples/ShiftR.m4
+2022/07/27 | 1331 | graphics/circuit_macros/examples/Sierpinski.m4
+2022/07/27 | 419 | graphics/circuit_macros/examples/Sixpole.m4
+2022/07/27 | 370 | graphics/circuit_macros/examples/snake.m4
+2022/07/27 | 2165 | graphics/circuit_macros/examples/Sources.m4
+2022/07/27 | 1906 | graphics/circuit_macros/examples/SPM.m4
+2022/07/27 | 380 | graphics/circuit_macros/examples/SQUID.m4
+2022/07/27 | 953 | graphics/circuit_macros/examples/squiggle.m4
+2022/07/27 | 1783 | graphics/circuit_macros/examples/Stator.m4
+2022/07/27 | 1955 | graphics/circuit_macros/examples/svg/ABlogixSVG.m4
+2022/07/27 | 2528 | graphics/circuit_macros/examples/svg/AdderSVG.m4
+2022/07/27 | 4340 | graphics/circuit_macros/examples/svg/AlogixSVG.m4
+2022/07/27 | 538 | graphics/circuit_macros/examples/svg/AmpTableSVG.m4
+2022/07/27 | 1090 | graphics/circuit_macros/examples/svg/AntennasSVG.m4
+2022/07/27 | 1894 | graphics/circuit_macros/examples/svg/ArrowFnSVG.m4
+2022/07/27 | 2720 | graphics/circuit_macros/examples/svg/AudioSVG.m4
+2022/07/27 | 2989 | graphics/circuit_macros/examples/svg/AutoencoderSVG.m4
+2022/07/27 | 1668 | graphics/circuit_macros/examples/svg/Banking.m4
+2022/07/27 | 1812 | graphics/circuit_macros/examples/svg/BipSVG.m4
+2022/07/27 | 4289 | graphics/circuit_macros/examples/svg/BtreeSVG.m4
+2022/07/27 | 3567 | graphics/circuit_macros/examples/svg/ButtonsSVG.m4
+2022/07/27 | 937 | graphics/circuit_macros/examples/svg/ByteSVG.m4
+2022/07/27 | 6413 | graphics/circuit_macros/examples/svg/CanLogicSVG.m4
+2022/07/27 | 1160 | graphics/circuit_macros/examples/svg/CapacitorsSVG.m4
+2022/07/27 | 1214 | graphics/circuit_macros/examples/svg/ChipsSVG.m4
+2022/07/27 | 715 | graphics/circuit_macros/examples/svg/ConnectorsSVG.m4
+2022/07/27 | 2111 | graphics/circuit_macros/examples/svg/ConnSVG.m4
+2022/07/27 | 1737 | graphics/circuit_macros/examples/svg/ContactsSVG.m4
+2022/07/27 | 3646 | graphics/circuit_macros/examples/svg/ContactSVG.m4
+2022/07/27 | 8006 | graphics/circuit_macros/examples/svg/controlSVG.m4
+2022/07/27 | 793 | graphics/circuit_macros/examples/svg/CountingSVG.m4
+2022/07/27 | 2525 | graphics/circuit_macros/examples/svg/CrowSVG.m4
+2022/07/27 | 1874 | graphics/circuit_macros/examples/svg/CrullerSVG.m4
+2022/07/27 | 7778 | graphics/circuit_macros/examples/svg/cscSVG.m4
+2022/07/27 | 7418 | graphics/circuit_macros/examples/svg/CsourceSVG.m4
+2022/07/27 | 745 | graphics/circuit_macros/examples/svg/DecoderSVG.m4
+2022/07/27 | 1373 | graphics/circuit_macros/examples/svg/DemultiplexerSVG.m4
+2022/07/27 | 609 | graphics/circuit_macros/examples/svg/diamondSVG.m4
+2022/07/27 | 6854 | graphics/circuit_macros/examples/svg/DiniSVG.m4
+2022/07/27 | 1647 | graphics/circuit_macros/examples/svg/DiodesSVG.m4
+2022/07/27 | 1966 | graphics/circuit_macros/examples/svg/DriveSVG.m4
+2022/07/27 | 4763 | graphics/circuit_macros/examples/svg/EEPSVG.m4
+2022/07/27 | 1070 | graphics/circuit_macros/examples/svg/EmarrowsSVG.m4
+2022/07/27 | 6285 | graphics/circuit_macros/examples/svg/EscherSVG.m4
+2022/07/27 | 2443 | graphics/circuit_macros/examples/svg/ex00SVG.m4
+2022/07/27 | 2629 | graphics/circuit_macros/examples/svg/ex01SVG.m4
+2022/07/27 | 1093 | graphics/circuit_macros/examples/svg/ex02SVG.m4
+2022/07/27 | 855 | graphics/circuit_macros/examples/svg/ex03SVG.m4
+2022/07/27 | 1891 | graphics/circuit_macros/examples/svg/ex04SVG.m4
+2022/07/27 | 3390 | graphics/circuit_macros/examples/svg/ex05SVG.m4
+2022/07/27 | 2018 | graphics/circuit_macros/examples/svg/ex06SVG.m4
+2022/07/27 | 2559 | graphics/circuit_macros/examples/svg/ex08SVG.m4
+2022/07/27 | 4119 | graphics/circuit_macros/examples/svg/ex09SVG.m4
+2022/07/27 | 1699 | graphics/circuit_macros/examples/svg/ex10SVG.m4
+2022/07/27 | 2685 | graphics/circuit_macros/examples/svg/ex11SVG.m4
+2022/07/27 | 3522 | graphics/circuit_macros/examples/svg/ex12SVG.m4
+2022/07/27 | 966 | graphics/circuit_macros/examples/svg/ex15SVG.m4
+2022/07/27 | 1893 | graphics/circuit_macros/examples/svg/ex16SVG.m4
+2022/07/27 | 1204 | graphics/circuit_macros/examples/svg/ex17SVG.m4
+2022/07/27 | 1065 | graphics/circuit_macros/examples/svg/ex18SVG.m4
+2022/07/27 | 1882 | graphics/circuit_macros/examples/svg/ex21SVG.m4
+2022/07/27 | 24863 | graphics/circuit_macros/examples/svg/examplesSVG.htmx
+2022/07/27 | 8517 | graphics/circuit_macros/examples/svg/expSVG.m4
+2022/07/27 | 1700 | graphics/circuit_macros/examples/svg/EyeSVG.m4
+2022/07/27 | 5365 | graphics/circuit_macros/examples/svg/fetSVG.m4
+2022/07/27 | 5171 | graphics/circuit_macros/examples/svg/FlowSVG.m4
+2022/07/27 | 538 | graphics/circuit_macros/examples/svg/FontsSVG.m4
+2022/07/27 | 1996 | graphics/circuit_macros/examples/svg/FourbarSVG.m4
+2022/07/27 | 959 | graphics/circuit_macros/examples/svg/FusesSVG.m4
+2022/07/27 | 5225 | graphics/circuit_macros/examples/svg/GeometrySVG.m4
+2022/07/27 | 1875 | graphics/circuit_macros/examples/svg/GrayCodeSVG.m4
+2022/07/27 | 5469 | graphics/circuit_macros/examples/svg/graysurfSVG.m4
+2022/07/27 | 810 | graphics/circuit_macros/examples/svg/GroundsSVG.m4
+2022/07/27 | 1265 | graphics/circuit_macros/examples/svg/HeadersSVG.m4
+2022/07/27 | 12711 | graphics/circuit_macros/examples/svg/HeathkitSVG.m4
+2022/07/27 | 2171 | graphics/circuit_macros/examples/svg/I2LSVG.m4
+2022/07/27 | 11601 | graphics/circuit_macros/examples/svg/icsSVG.m4
+2022/07/27 | 4003 | graphics/circuit_macros/examples/svg/InclepsSVG.m4
+2022/07/27 | 21384 | graphics/circuit_macros/examples/svg/Incl.jpg
+2022/07/27 | 1343 | graphics/circuit_macros/examples/svg/InductorsSVG.m4
+2022/07/27 | 2051 | graphics/circuit_macros/examples/svg/JackSVG.m4
+2022/07/27 | 10699 | graphics/circuit_macros/examples/svg/keyboardSVG.m4
+2022/07/27 | 7203 | graphics/circuit_macros/examples/svg/lcctSVG.m4
+2022/07/27 | 6216 | graphics/circuit_macros/examples/svg/LgateSVG.m4
+2022/07/27 | 63 | graphics/circuit_macros/examples/svg/local_init.m4
+2022/07/27 | 1931 | graphics/circuit_macros/examples/svg/LogicSVG.m4
+2022/07/27 | 30451 | graphics/circuit_macros/examples/svg/LoglogSVG.m4
+2022/07/27 | 5396 | graphics/circuit_macros/examples/svg/Makefile
+2022/07/27 | 3473 | graphics/circuit_macros/examples/svg/MCSVG.m4
+2022/07/27 | 3489 | graphics/circuit_macros/examples/svg/MixerSVG.m4
+2022/07/27 | 973 | graphics/circuit_macros/examples/svg/MoreTableSVG.m4
+2022/07/27 | 1953 | graphics/circuit_macros/examples/svg/MotorControlSVG.m4
+2022/07/27 | 1403 | graphics/circuit_macros/examples/svg/MultiplexerSVG.m4
+2022/07/27 | 532 | graphics/circuit_macros/examples/svg/NLGSVG.m4
+2022/07/27 | 1157 | graphics/circuit_macros/examples/svg/NPDTSVG.m4
+2022/07/27 | 748 | graphics/circuit_macros/examples/svg/Np.m4
+2022/07/27 | 1238 | graphics/circuit_macros/examples/svg/NportSVG.m4
+2022/07/27 | 1034 | graphics/circuit_macros/examples/svg/OpampSVG.m4
+2022/07/27 | 2551 | graphics/circuit_macros/examples/svg/OptoisoSVG.m4
+2022/07/27 | 10193 | graphics/circuit_macros/examples/svg/paletteSVG.m4
+2022/07/27 | 1766 | graphics/circuit_macros/examples/svg/PconnSVG.m4
+2022/07/27 | 6153 | graphics/circuit_macros/examples/svg/PlateSVG.m4
+2022/07/27 | 3778 | graphics/circuit_macros/examples/svg/PushPullSVG.m4
+2022/07/27 | 2027 | graphics/circuit_macros/examples/svg/pwrsupplySVG.m4
+2022/07/27 | 947 | graphics/circuit_macros/examples/svg/QuantumSVG.m4
+2022/07/27 | 901 | graphics/circuit_macros/examples/svg/quickSVG.m4
+2022/07/27 | 3756 | graphics/circuit_macros/examples/svg/randomSVG.m4
+2022/07/27 | 7546 | graphics/circuit_macros/examples/svg/RectifiersSVG.m4
+2022/07/27 | 3825 | graphics/circuit_macros/examples/svg/recycleSVG.m4
+2022/07/27 | 2069 | graphics/circuit_macros/examples/svg/relaycoilSVG.m4
+2022/07/27 | 1431 | graphics/circuit_macros/examples/svg/RelaySVG.m4
+2022/07/27 | 1186 | graphics/circuit_macros/examples/svg/ResistorsSVG.m4
+2022/07/27 | 5412 | graphics/circuit_macros/examples/svg/roseSVG.m4
+2022/07/27 | 563 | graphics/circuit_macros/examples/svg/RotboxSVG.m4
+2022/07/27 | 1837 | graphics/circuit_macros/examples/svg/SchottkySVG.m4
+2022/07/27 | 4761 | graphics/circuit_macros/examples/svg/sfgSVG.m4
+2022/07/27 | 7507 | graphics/circuit_macros/examples/svg/shapesSVG.m4
+2022/07/27 | 1313 | graphics/circuit_macros/examples/svg/ShiftRSVG.m4
+2022/07/27 | 1331 | graphics/circuit_macros/examples/svg/SierpinskiSVG.m4
+2022/07/27 | 419 | graphics/circuit_macros/examples/svg/SixpoleSVG.m4
+2022/07/27 | 4376 | graphics/circuit_macros/examples/svg/slddiagsSVG.m4
+2022/07/27 | 8806 | graphics/circuit_macros/examples/svg/SmithchartSVG.m4
+2022/07/27 | 1907 | graphics/circuit_macros/examples/svg/SourcesSVG.m4
+2022/07/27 | 417 | graphics/circuit_macros/examples/svg/SQUIDSVG.m4
+2022/07/27 | 1050 | graphics/circuit_macros/examples/svg/SVGconfig.m4
+2022/07/27 | 5132 | graphics/circuit_macros/examples/svg/SwitchesSVG.m4
+2022/07/27 | 1055 | graphics/circuit_macros/examples/svg/TgateSVG.m4
+2022/07/27 | 1444 | graphics/circuit_macros/examples/svg/ThreeSVG.m4
+2022/07/27 | 3310 | graphics/circuit_macros/examples/svg/thyristorSVG.m4
+2022/07/27 | 1612 | graphics/circuit_macros/examples/svg/TimerSVG.m4
+2022/07/27 | 14057 | graphics/circuit_macros/examples/svg/tstSVG.htmx
+2022/07/27 | 1630 | graphics/circuit_macros/examples/svg/TTLnandSVG.m4
+2022/07/27 | 3091 | graphics/circuit_macros/examples/svg/TtreeSVG.m4
+2022/07/27 | 12478 | graphics/circuit_macros/examples/svg/TubediagsSVG.m4
+2022/07/27 | 682 | graphics/circuit_macros/examples/svg/ujtSVG.m4
+2022/07/27 | 24141 | graphics/circuit_macros/examples/svg/UNOSVG.m4
+2022/07/27 | 988 | graphics/circuit_macros/examples/svg/VariableSVG.m4
+2022/07/27 | 2994 | graphics/circuit_macros/examples/svg/WindingsSVG.m4
+2022/07/27 | 353 | graphics/circuit_macros/examples/svg/windows.m4
+2022/07/27 | 3631 | graphics/circuit_macros/examples/svg/wormSVG.m4
+2022/07/27 | 1559 | graphics/circuit_macros/examples/svg/XformSVG.m4
+2022/07/27 | 1985 | graphics/circuit_macros/examples/svg/XORSVG.m4
+2022/07/27 | 1546 | graphics/circuit_macros/examples/svg/Xtest.m4
+2022/07/27 | 4782 | graphics/circuit_macros/examples/Switches.m4
+2022/07/27 | 591 | graphics/circuit_macros/examples/test.m4
+2022/07/27 | 416 | graphics/circuit_macros/examples/testpdf.tex
+2022/07/27 | 1022 | graphics/circuit_macros/examples/Tgate.m4
+2022/07/27 | 1287 | graphics/circuit_macros/examples/Three.m4
+2022/07/27 | 3321 | graphics/circuit_macros/examples/thyristor.m4
+2022/07/27 | 219 | graphics/circuit_macros/examples/tst1.tex
+2022/07/27 | 409 | graphics/circuit_macros/examples/tst.tex
+2022/07/27 | 464 | graphics/circuit_macros/examples/tsttikz.tex
+2022/07/27 | 1558 | graphics/circuit_macros/examples/TTLnand.m4
+2022/07/27 | 2097 | graphics/circuit_macros/examples/Ttree.m4
+2022/07/27 | 9869 | graphics/circuit_macros/examples/tubedefs.m4
+2022/07/27 | 13264 | graphics/circuit_macros/examples/Tubediags.m4
+2022/07/27 | 660 | graphics/circuit_macros/examples/ujt.m4
+2022/07/27 | 932 | graphics/circuit_macros/examples/Variable.m4
+2022/07/27 | 1906 | graphics/circuit_macros/examples/venus.m4
+2022/07/27 | 442 | graphics/circuit_macros/examples/Wheat.m4
+2022/07/27 | 3346 | graphics/circuit_macros/examples/Windings.m4
+2022/07/27 | 353 | graphics/circuit_macros/examples/windows.m4
+2022/07/27 | 2801 | graphics/circuit_macros/examples/worm.m4
+2022/07/27 | 337 | graphics/circuit_macros/examples/xfig/Makefile
+2022/07/27 | 21398 | graphics/circuit_macros/examples/xfig/xfiglib.fig
+2022/07/27 | 5969 | graphics/circuit_macros/examples/xfig/xfiglib.m4
+2022/07/27 | 1526 | graphics/circuit_macros/examples/Xform.m4
+2022/07/27 | 1823 | graphics/circuit_macros/examples/XOR.m4
+2022/07/27 | 656 | graphics/circuit_macros/examples/Zcos.m4
+2022/07/27 | 1019 | graphics/circuit_macros/gpic.m4
+2022/07/27 | 4089 | graphics/circuit_macros/INSTALL
+2022/07/27 | 12765 | graphics/circuit_macros/lib3D.m4
+2022/07/27 | 177866 | graphics/circuit_macros/libcct.m4
+2022/07/27 | 90918 | graphics/circuit_macros/libgen.m4
+2022/07/27 | 47825 | graphics/circuit_macros/liblog.m4
+2022/07/27 | 32742 | graphics/circuit_macros/libSLD.m4
+2022/07/27 | 19176 | graphics/circuit_macros/Licence.txt
+2022/07/27 | 1639 | graphics/circuit_macros/Makefile
+2022/07/27 | 1114 | graphics/circuit_macros/mfpic.m4
+2022/07/27 | 1640 | graphics/circuit_macros/mpost.m4
+2022/07/27 | 2085 | graphics/circuit_macros/pgf.m4
+2022/07/27 | 2834 | graphics/circuit_macros/postscript.m4
+2022/07/27 | 706 | graphics/circuit_macros/psfrag.m4
+2022/07/27 | 2099 | graphics/circuit_macros/pstricks.m4
+2022/07/27 | 15867 | graphics/circuit_macros/README
+2022/07/27 | 12558 | graphics/circuit_macros/svg.m4
+2022/07/27 | 1029 | graphics/circuit_macros/xfig.m4
+2022/07/28 | 2659251 | graphics/circuit_macros.zip
2018/09/22 | 49163 | graphics/coloremoji/coloremoji.sty
2018/09/22 | 15169 | graphics/coloremoji/emoji_images/hires/1F004.pdf
2018/09/22 | 24318 | graphics/coloremoji/emoji_images/hires/1F0CF.pdf
@@ -189213,7 +189216,7 @@
2022/01/12 | 202258 | install/macros/luatex/generic/luamplib.tds.zip
2022/06/15 | 1966772 | install/macros/luatex/generic/luaotfload.tds.zip
2015/10/04 | 277014 | install/macros/luatex/generic/luatexbase.tds.zip
-2022/06/18 | 845647 | install/macros/luatex/generic/lua-widow-control.tds.zip
+2022/07/28 | 841767 | install/macros/luatex/generic/lua-widow-control.tds.zip
2020/03/23 | 891718 | install/macros/luatex/latex/arabluatex.tds.zip
2021/11/21 | 970369 | install/macros/luatex/latex/ekdosis.tds.zip
2021/07/17 | 1183440 | install/macros/luatex/latex/emoji.tds.zip
@@ -202217,7 +202220,7 @@
2013/04/01 | 14776 | macros/context/contrib/context-visualcounter/tex/context/third/visualcounter/t-visualcounter.mkvi
2018/03/05 | 11 | macros/context/contrib/context-visualcounter/VERSION
2018/03/22 | 276789 | macros/context/contrib/context-visualcounter.zip
-2022/07/24 | 113753026 | macros/context/latest/cont-tmf.zip
+2022/07/27 | 113762760 | macros/context/latest/cont-tmf.zip
2016/04/21 | 32846 | macros/cstex/base/cmexb.tar.gz
2016/06/26 | 1728262 | macros/cstex/base/csfonts-t1.tar.gz
2007/03/01 | 187106 | macros/cstex/base/csfonts.tar.gz
@@ -212161,11 +212164,11 @@
2021/08/15 | 1062027 | macros/latex/contrib/cryptocode/cryptocode.pdf
2021/08/15 | 1393 | macros/latex/contrib/cryptocode/README.md
2021/08/15 | 1133384 | macros/latex/contrib/cryptocode.zip
-2022/06/07 | 25234 | macros/latex/contrib/csassignments/csassignments.dtx
+2022/07/28 | 25352 | macros/latex/contrib/csassignments/csassignments.dtx
2022/06/07 | 1883 | macros/latex/contrib/csassignments/csassignments.ins
-2022/06/07 | 134810 | macros/latex/contrib/csassignments/csassignments.pdf
+2022/07/28 | 142906 | macros/latex/contrib/csassignments/csassignments.pdf
2022/06/07 | 1205 | macros/latex/contrib/csassignments/README.md
-2022/06/07 | 117242 | macros/latex/contrib/csassignments.zip
+2022/07/28 | 119659 | macros/latex/contrib/csassignments.zip
2020/03/20 | 3739 | macros/latex/contrib/csbulletin/csbulacronym.sty
2020/03/20 | 18016 | macros/latex/contrib/csbulletin/csbulletin.cls
2020/03/20 | 264133 | macros/latex/contrib/csbulletin/csbulletin.pdf
@@ -223700,13 +223703,13 @@
1996/03/22 | 18862 | macros/latex/contrib/niceframe/umrandb.mf
2015/01/17 | 1370 | macros/latex/contrib/niceframe/umrand.mf
2015/01/17 | 287910 | macros/latex/contrib/niceframe.zip
-2022/07/16 | 722891 | macros/latex/contrib/nicematrix/nicematrix.dtx
-2022/07/16 | 507325 | macros/latex/contrib/nicematrix/nicematrix-french.pdf
-2022/07/16 | 194825 | macros/latex/contrib/nicematrix/nicematrix-french.tex
+2022/07/28 | 738928 | macros/latex/contrib/nicematrix/nicematrix.dtx
+2022/07/28 | 511876 | macros/latex/contrib/nicematrix/nicematrix-french.pdf
+2022/07/27 | 196300 | macros/latex/contrib/nicematrix/nicematrix-french.tex
2022/01/22 | 1423 | macros/latex/contrib/nicematrix/nicematrix.ins
-2022/07/16 | 1564304 | macros/latex/contrib/nicematrix/nicematrix.pdf
+2022/07/28 | 1296290 | macros/latex/contrib/nicematrix/nicematrix.pdf
2021/11/10 | 1023 | macros/latex/contrib/nicematrix/README.md
-2022/07/16 | 2197087 | macros/latex/contrib/nicematrix.zip
+2022/07/28 | 1964317 | macros/latex/contrib/nicematrix.zip
2015/11/21 | 217 | macros/latex/contrib/nicetext/ANNOUNCE.txt
2012/03/18 | 254582 | macros/latex/contrib/nicetext/demo/arseneau.pdf
2011/09/14 | 10 | macros/latex/contrib/nicetext/demo/iso.txt
@@ -236882,26 +236885,26 @@
2021/03/02 | 4289 | macros/luatex/generic/luavlna/luavlna.tex
2021/03/02 | 3320 | macros/luatex/generic/luavlna/README.md
2021/03/02 | 104575 | macros/luatex/generic/luavlna.zip
-2022/06/18 | 7511 | macros/luatex/generic/lua-widow-control/CHANGELOG.md
-2022/06/18 | 3022 | macros/luatex/generic/lua-widow-control/lua-widow-control-2022-02-22.sty
-2022/06/18 | 44240 | macros/luatex/generic/lua-widow-control/lua-widow-control.lua
-2022/06/18 | 1807 | macros/luatex/generic/lua-widow-control/lua-widow-control.opm
-2022/06/18 | 509126 | macros/luatex/generic/lua-widow-control/lua-widow-control.pdf
-2022/06/18 | 9469 | macros/luatex/generic/lua-widow-control/lua-widow-control.sty
-2022/06/18 | 2233 | macros/luatex/generic/lua-widow-control/lua-widow-control.tex
-2022/06/18 | 1404 | macros/luatex/generic/lua-widow-control/lwc-manual.bib
-2022/06/18 | 8676 | macros/luatex/generic/lua-widow-control/lwc-manual.mkxl
-2022/06/18 | 5739 | macros/luatex/generic/lua-widow-control/lwc-manual-samples.tex
-2022/06/18 | 36633 | macros/luatex/generic/lua-widow-control/lwc-manual.tex
-2022/06/18 | 2810 | macros/luatex/generic/lua-widow-control/README.md
-2022/06/18 | 5911 | macros/luatex/generic/lua-widow-control/tb133chernoff-widows.bib
-2022/06/18 | 4630 | macros/luatex/generic/lua-widow-control/tb133chernoff-widows-figure.ctx
-2022/06/18 | 61886 | macros/luatex/generic/lua-widow-control/tb133chernoff-widows.ltx
-2022/06/18 | 391529 | macros/luatex/generic/lua-widow-control/tb133chernoff-widows.pdf
-2022/06/18 | 47183 | macros/luatex/generic/lua-widow-control/tb133chernoff-widows-plot.dat
-2022/06/18 | 32 | macros/luatex/generic/lua-widow-control/t-lua-widow-control.mkiv
-2022/06/18 | 2823 | macros/luatex/generic/lua-widow-control/t-lua-widow-control.mkxl
-2022/06/18 | 844254 | macros/luatex/generic/lua-widow-control.zip
+2022/07/28 | 7843 | macros/luatex/generic/lua-widow-control/CHANGELOG.md
+2022/07/28 | 3022 | macros/luatex/generic/lua-widow-control/lua-widow-control-2022-02-22.sty
+2022/07/28 | 43635 | macros/luatex/generic/lua-widow-control/lua-widow-control.lua
+2022/07/28 | 1807 | macros/luatex/generic/lua-widow-control/lua-widow-control.opm
+2022/07/28 | 506634 | macros/luatex/generic/lua-widow-control/lua-widow-control.pdf
+2022/07/28 | 9469 | macros/luatex/generic/lua-widow-control/lua-widow-control.sty
+2022/07/28 | 2233 | macros/luatex/generic/lua-widow-control/lua-widow-control.tex
+2022/07/28 | 1404 | macros/luatex/generic/lua-widow-control/lwc-manual.bib
+2022/07/28 | 8676 | macros/luatex/generic/lua-widow-control/lwc-manual.mkxl
+2022/07/28 | 5739 | macros/luatex/generic/lua-widow-control/lwc-manual-samples.tex
+2022/07/28 | 36637 | macros/luatex/generic/lua-widow-control/lwc-manual.tex
+2022/07/28 | 2810 | macros/luatex/generic/lua-widow-control/README.md
+2022/07/28 | 5911 | macros/luatex/generic/lua-widow-control/tb133chernoff-widows.bib
+2022/07/28 | 4630 | macros/luatex/generic/lua-widow-control/tb133chernoff-widows-figure.ctx
+2022/07/28 | 61886 | macros/luatex/generic/lua-widow-control/tb133chernoff-widows.ltx
+2022/07/28 | 391523 | macros/luatex/generic/lua-widow-control/tb133chernoff-widows.pdf
+2022/07/28 | 47183 | macros/luatex/generic/lua-widow-control/tb133chernoff-widows-plot.dat
+2022/07/28 | 32 | macros/luatex/generic/lua-widow-control/t-lua-widow-control.mkiv
+2022/07/28 | 2823 | macros/luatex/generic/lua-widow-control/t-lua-widow-control.mkxl
+2022/07/28 | 840332 | macros/luatex/generic/lua-widow-control.zip
2021/10/07 | 15321 | macros/luatex/generic/luaxml/luaxml-cssquery.lua
2021/10/07 | 16299 | macros/luatex/generic/luaxml/luaxml-domobject.lua
2021/10/07 | 1357 | macros/luatex/generic/luaxml/luaxml-entities.lua
@@ -246268,6 +246271,36 @@
2018/05/06 | 102506 | macros/xetex/latex/cqubeamer/logo/cquname.pdf
2018/05/06 | 2548 | macros/xetex/latex/cqubeamer/README.md
2018/05/06 | 3028850 | macros/xetex/latex/cqubeamer.zip
+2022/07/28 | 7845 | macros/xetex/latex/exam-zh/CHANGELOG.md
+2022/07/28 | 474 | macros/xetex/latex/exam-zh/doc/back/about-author.tex
+2022/07/28 | 824 | macros/xetex/latex/exam-zh/doc/back/development.tex
+2022/07/28 | 289 | macros/xetex/latex/exam-zh/doc/back/main-changelog.tex
+2022/07/28 | 926 | macros/xetex/latex/exam-zh/doc/back/package.tex
+2022/07/28 | 730 | macros/xetex/latex/exam-zh/doc/body/cover.tex
+2022/07/28 | 7688 | macros/xetex/latex/exam-zh/doc/body/installation.tex
+2022/07/28 | 1498 | macros/xetex/latex/exam-zh/doc/body/introduction.tex
+2022/07/27 | 97283 | macros/xetex/latex/exam-zh/doc/body/usage.tex
+2022/07/28 | 1085430 | macros/xetex/latex/exam-zh/doc/exam-zh-doc.pdf
+2022/07/28 | 1900 | macros/xetex/latex/exam-zh/doc/exam-zh-doc-setup.tex
+2022/07/22 | 1519 | macros/xetex/latex/exam-zh/doc/exam-zh-doc.tex
+2022/06/30 | 213099 | macros/xetex/latex/exam-zh/doc/figures/firstpage.pdf
+2022/07/28 | 204716 | macros/xetex/latex/exam-zh/doc/figures/gitee-main.png
+2022/07/28 | 171403 | macros/xetex/latex/exam-zh/doc/figures/gitee-release.png
+2022/07/24 | 34627 | macros/xetex/latex/exam-zh/doc/xdyydoc.cls
+2022/07/26 | 167892 | macros/xetex/latex/exam-zh/examples/example-multiple.pdf
+2022/07/26 | 23066 | macros/xetex/latex/exam-zh/examples/example-multiple.tex
+2022/07/26 | 148036 | macros/xetex/latex/exam-zh/examples/example-single.pdf
+2022/07/22 | 155299 | macros/xetex/latex/exam-zh/examples/example-single_student_version.pdf
+2022/07/26 | 11371 | macros/xetex/latex/exam-zh/examples/example-single.tex
+2022/02/08 | 19106 | macros/xetex/latex/exam-zh/LICENSE
+2022/07/28 | 11492 | macros/xetex/latex/exam-zh/README.md
+2022/07/28 | 20557 | macros/xetex/latex/exam-zh/tex/exam-zh-chinese-english.sty
+2022/07/28 | 20354 | macros/xetex/latex/exam-zh/tex/exam-zh-choices.sty
+2022/07/28 | 69032 | macros/xetex/latex/exam-zh/tex/exam-zh.cls
+2022/07/28 | 18087 | macros/xetex/latex/exam-zh/tex/exam-zh-font.sty
+2022/07/28 | 41206 | macros/xetex/latex/exam-zh/tex/exam-zh-question.sty
+2022/07/28 | 52853 | macros/xetex/latex/exam-zh/tex/exam-zh-symbols.sty
+2022/07/28 | 2182569 | macros/xetex/latex/exam-zh.zip
2018/10/27 | 66509 | macros/xetex/latex/facture-belge-simple-sans-tva/article-facture.pdf
2018/10/27 | 8961 | macros/xetex/latex/facture-belge-simple-sans-tva/article-facture.tex
2018/10/27 | 64816 | macros/xetex/latex/facture-belge-simple-sans-tva/article-note-de-frais.pdf
@@ -246646,12 +246679,12 @@
2011/05/07 | 5176 | macros/xetex/latex/unisugar/unisugar.sty
2011/05/07 | 25480 | macros/xetex/latex/unisugar/unisugar.tex
2011/05/08 | 495308 | macros/xetex/latex/unisugar.zip
-2022/06/28 | 2862 | macros/xetex/latex/xduts/README.md
-2022/06/28 | 881135 | macros/xetex/latex/xduts/xdulogo.pdf
-2022/06/28 | 235454 | macros/xetex/latex/xduts/xduts.dtx
-2022/06/28 | 1111 | macros/xetex/latex/xduts/xduts.ins
-2022/06/28 | 704529 | macros/xetex/latex/xduts/xduts.pdf
-2022/06/28 | 1609053 | macros/xetex/latex/xduts.zip
+2022/07/28 | 2861 | macros/xetex/latex/xduts/README.md
+2022/07/28 | 881135 | macros/xetex/latex/xduts/xdulogo.pdf
+2022/07/28 | 238818 | macros/xetex/latex/xduts/xduts.dtx
+2022/07/28 | 1111 | macros/xetex/latex/xduts/xduts.ins
+2022/07/28 | 707188 | macros/xetex/latex/xduts/xduts.pdf
+2022/07/28 | 1612320 | macros/xetex/latex/xduts.zip
2017/08/03 | 11999 | macros/xetex/latex/xechangebar/cbtest1.tex
2017/08/03 | 338 | macros/xetex/latex/xechangebar/README
2017/08/03 | 35213 | macros/xetex/latex/xechangebar/xechangebar.sty
@@ -282507,7 +282540,7 @@
2022/07/23 | 1528 | systems/texlive/tlnet/archive/collection-pictures.r63957.tar.xz
2022/04/29 | 960 | systems/texlive/tlnet/archive/collection-plaingeneric.r63165.tar.xz
2021/12/17 | 812 | systems/texlive/tlnet/archive/collection-pstricks.r61329.tar.xz
-2022/07/26 | 1624 | systems/texlive/tlnet/archive/collection-publishers.r63977.tar.xz
+2022/07/28 | 1628 | systems/texlive/tlnet/archive/collection-publishers.r63988.tar.xz
2020/03/04 | 340 | systems/texlive/tlnet/archive/collection-texworks.r54074.tar.xz
2020/03/04 | 388 | systems/texlive/tlnet/archive/collection-wintools.r54074.tar.xz
2022/02/28 | 648 | systems/texlive/tlnet/archive/collection-xetex.r62240.tar.xz
@@ -284662,9 +284695,9 @@
2019/08/06 | 202740 | systems/texlive/tlnet/archive/fixcmex.doc.r51825.tar.xz
2019/08/06 | 1400 | systems/texlive/tlnet/archive/fixcmex.r51825.tar.xz
2019/08/06 | 2868 | systems/texlive/tlnet/archive/fixcmex.source.r51825.tar.xz
-2022/07/20 | 321848 | systems/texlive/tlnet/archive/fixdif.doc.r63938.tar.xz
-2022/07/20 | 1796 | systems/texlive/tlnet/archive/fixdif.r63938.tar.xz
-2022/07/20 | 6864 | systems/texlive/tlnet/archive/fixdif.source.r63938.tar.xz
+2022/07/28 | 237836 | systems/texlive/tlnet/archive/fixdif.doc.r63986.tar.xz
+2022/07/28 | 1792 | systems/texlive/tlnet/archive/fixdif.r63986.tar.xz
+2022/07/28 | 7032 | systems/texlive/tlnet/archive/fixdif.source.r63986.tar.xz
2019/02/28 | 50024 | systems/texlive/tlnet/archive/fixfoot.doc.r17131.tar.xz
2019/02/28 | 3280 | systems/texlive/tlnet/archive/fixfoot.r17131.tar.xz
2022/07/24 | 286260 | systems/texlive/tlnet/archive/fixjfm.doc.r63967.tar.xz
@@ -285998,9 +286031,9 @@
2021/04/18 | 6520756 | systems/texlive/tlnet/archive/inter.r58892.tar.xz
2019/03/07 | 325808 | systems/texlive/tlnet/archive/interval.doc.r50265.tar.xz
2019/03/07 | 1620 | systems/texlive/tlnet/archive/interval.r50265.tar.xz
-2021/04/06 | 379136 | systems/texlive/tlnet/archive/intopdf.doc.r58743.tar.xz
-2021/04/06 | 1360 | systems/texlive/tlnet/archive/intopdf.r58743.tar.xz
-2021/04/06 | 2388 | systems/texlive/tlnet/archive/intopdf.source.r58743.tar.xz
+2022/07/28 | 380176 | systems/texlive/tlnet/archive/intopdf.doc.r63987.tar.xz
+2022/07/28 | 1372 | systems/texlive/tlnet/archive/intopdf.r63987.tar.xz
+2022/07/28 | 2444 | systems/texlive/tlnet/archive/intopdf.source.r63987.tar.xz
2019/02/28 | 274748 | systems/texlive/tlnet/archive/intro-scientific.doc.r15878.tar.xz
2019/02/28 | 540 | systems/texlive/tlnet/archive/intro-scientific.r15878.tar.xz
2019/02/28 | 73972 | systems/texlive/tlnet/archive/inversepath.doc.r15878.tar.xz
@@ -290682,6 +290715,9 @@
2019/02/28 | 2524 | systems/texlive/tlnet/archive/screenplay-pkg.r44965.tar.xz
2019/02/28 | 2764 | systems/texlive/tlnet/archive/screenplay.r27223.tar.xz
2019/02/28 | 17316 | systems/texlive/tlnet/archive/screenplay.source.r27223.tar.xz
+2022/07/28 | 731424 | systems/texlive/tlnet/archive/scripture.doc.r63988.tar.xz
+2022/07/28 | 5388 | systems/texlive/tlnet/archive/scripture.r63988.tar.xz
+2022/07/28 | 12456 | systems/texlive/tlnet/archive/scripture.source.r63988.tar.xz
2019/02/28 | 122072 | systems/texlive/tlnet/archive/scrjrnl.doc.r27810.tar.xz
2019/02/28 | 2608 | systems/texlive/tlnet/archive/scrjrnl.r27810.tar.xz
2019/02/28 | 4896 | systems/texlive/tlnet/archive/scrjrnl.source.r27810.tar.xz
@@ -291812,7 +291848,7 @@
2020/05/17 | 592 | systems/texlive/tlnet/archive/texlive-scripts.amd64-freebsd.r55172.tar.xz
2020/05/17 | 588 | systems/texlive/tlnet/archive/texlive-scripts.amd64-netbsd.r55172.tar.xz
2020/05/17 | 592 | systems/texlive/tlnet/archive/texlive-scripts.armhf-linux.r55172.tar.xz
-2022/07/27 | 419064 | systems/texlive/tlnet/archive/texlive-scripts.doc.r63980.tar.xz
+2022/07/28 | 419064 | systems/texlive/tlnet/archive/texlive-scripts.doc.r63985.tar.xz
2020/01/27 | 916 | systems/texlive/tlnet/archive/texlive-scripts-extra.aarch64-linux.r53577.tar.xz
2020/01/27 | 924 | systems/texlive/tlnet/archive/texlive-scripts-extra.amd64-freebsd.r53577.tar.xz
2020/01/27 | 916 | systems/texlive/tlnet/archive/texlive-scripts-extra.amd64-netbsd.r53577.tar.xz
@@ -291836,7 +291872,7 @@
2020/05/17 | 588 | systems/texlive/tlnet/archive/texlive-scripts.i386-linux.r55172.tar.xz
2020/05/17 | 592 | systems/texlive/tlnet/archive/texlive-scripts.i386-netbsd.r55172.tar.xz
2020/05/17 | 588 | systems/texlive/tlnet/archive/texlive-scripts.i386-solaris.r55172.tar.xz
-2022/07/27 | 113524 | systems/texlive/tlnet/archive/texlive-scripts.r63980.tar.xz
+2022/07/28 | 113488 | systems/texlive/tlnet/archive/texlive-scripts.r63985.tar.xz
2021/02/25 | 572 | systems/texlive/tlnet/archive/texlive-scripts.universal-darwin.r57908.tar.xz
2022/04/19 | 36296 | systems/texlive/tlnet/archive/texlive-scripts.win32.r63068.tar.xz
2020/05/17 | 588 | systems/texlive/tlnet/archive/texlive-scripts.x86_64-cygwin.r55172.tar.xz
@@ -293658,16 +293694,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
2022/07/17 | 124404 | systems/texlive/tlnet/install-tl
-2022/07/27 | 5808916 | systems/texlive/tlnet/install-tl-unx.tar.gz
-2022/07/27 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
-2022/07/27 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2022/07/28 | 5809003 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2022/07/28 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2022/07/28 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
2021/04/11 | 4945 | systems/texlive/tlnet/install-tl-windows.bat
-2022/07/27 | 20463507 | systems/texlive/tlnet/install-tl-windows.exe
-2022/07/27 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
-2022/07/27 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2022/07/27 | 25493368 | systems/texlive/tlnet/install-tl.zip
-2022/07/27 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
-2022/07/27 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2022/07/28 | 20465653 | systems/texlive/tlnet/install-tl-windows.exe
+2022/07/28 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2022/07/28 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2022/07/28 | 25493340 | systems/texlive/tlnet/install-tl.zip
+2022/07/28 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2022/07/28 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
2022/04/03 | 1229 | systems/texlive/tlnet/README.md
2022/04/03 | 0 | systems/texlive/tlnet/TEXLIVE_2022
2022/02/28 | 7791 | systems/texlive/tlnet/tlpkg/gpg/pubring.gpg
@@ -293677,7 +293713,7 @@
2022/02/28 | 1280 | systems/texlive/tlnet/tlpkg/gpg/trustdb.gpg
2022/05/27 | 49794 | systems/texlive/tlnet/tlpkg/installer/config.guess
2010/11/11 | 11651 | systems/texlive/tlnet/tlpkg/installer/COPYING.MinGW-runtime.txt
-2022/07/26 | 7304 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+2022/07/27 | 7189 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2022/07/21 | 222477 | systems/texlive/tlnet/tlpkg/installer/curl/curl-ca-bundle.crt
2020/04/15 | 2606592 | systems/texlive/tlnet/tlpkg/installer/curl/curl.exe
2017/04/16 | 2629 | systems/texlive/tlnet/tlpkg/installer/installer-options.txt
@@ -293719,12 +293755,12 @@
2021/05/16 | 20371 | systems/texlive/tlnet/tlpkg/TeXLive/TLCrypto.pm
2021/12/21 | 5429 | systems/texlive/tlnet/tlpkg/TeXLive/TLDownload.pm
2021/12/21 | 27582 | systems/texlive/tlnet/tlpkg/TeXLive/TLPaper.pm
-2022/07/27 | 17567561 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
-2022/07/27 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2022/07/28 | 17569351 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2022/07/28 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
2022/04/18 | 86658 | systems/texlive/tlnet/tlpkg/TeXLive/TLPDB.pm
-2022/07/27 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
-2022/07/27 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2022/07/27 | 2397644 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2022/07/28 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2022/07/28 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2022/07/28 | 2396760 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
2021/12/21 | 58848 | systems/texlive/tlnet/tlpkg/TeXLive/TLPOBJ.pm
2022/04/18 | 42116 | systems/texlive/tlnet/tlpkg/TeXLive/TLPSRC.pm
2021/12/21 | 16130 | systems/texlive/tlnet/tlpkg/TeXLive/TLTREE.pm
@@ -298989,7 +299025,7 @@
2020/10/03 | 318630 | systems/win32/miktex/tm/packages/filehook.tar.lzma
2012/12/04 | 924573 | systems/win32/miktex/tm/packages/fileinfo.tar.lzma
2011/09/21 | 281409 | systems/win32/miktex/tm/packages/filemod.tar.lzma
-2022/07/27 | 659099 | systems/win32/miktex/tm/packages/files.csv.lzma
+2022/07/28 | 659099 | 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
@@ -300656,9 +300692,9 @@
2018/01/12 | 157226 | systems/win32/miktex/tm/packages/miktex-zip-bin-x64.tar.lzma
2022/07/26 | 39695 | systems/win32/miktex/tm/packages/miktex-zlib-bin-2.9.tar.lzma
2022/07/26 | 43662 | systems/win32/miktex/tm/packages/miktex-zlib-bin-x64-2.9.tar.lzma
-2022/07/27 | 287595 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
-2022/07/27 | 1476408 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
-2022/07/27 | 1361131 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
+2022/07/28 | 287578 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
+2022/07/28 | 1476331 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
+2022/07/28 | 1360505 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
2022/07/26 | 13519 | systems/win32/miktex/tm/packages/miktex-zzip-bin-2.9.tar.lzma
2022/07/26 | 14444 | 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
@@ -300899,102 +300935,102 @@
2018/04/09 | 400132 | systems/win32/miktex/tm/packages/newunicodechar.tar.lzma
2011/09/19 | 101312 | systems/win32/miktex/tm/packages/newvbtm.tar.lzma
2021/03/17 | 232249 | systems/win32/miktex/tm/packages/newverbs.tar.lzma
-2022/07/27 | 658941 | systems/win32/miktex/tm/packages/next/files.csv.lzma
-2022/07/27 | 57317 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
-2022/07/27 | 1161754 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
-2022/07/27 | 31585 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
-2022/07/27 | 35265 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
-2022/07/27 | 65130 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
-2022/07/27 | 95470 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
-2022/07/27 | 77210 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
-2022/07/27 | 31562 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
-2022/07/27 | 394143 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
-2022/07/27 | 37050 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
-2022/07/27 | 57507 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
-2022/07/27 | 270465 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
-2022/07/27 | 196214 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
-2022/07/27 | 103247 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
-2022/07/27 | 24212 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
-2022/07/27 | 481892 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
-2022/07/27 | 52036 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
-2022/07/27 | 325980 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
-2022/07/27 | 45795 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
-2022/07/27 | 135464 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
-2022/07/27 | 1458152 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
-2022/07/27 | 112979 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
-2022/07/27 | 48851 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
-2022/07/27 | 28510 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
-2022/07/27 | 63240 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
-2022/07/27 | 155430 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
-2022/07/27 | 79064 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
-2022/07/27 | 81447 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
-2022/07/27 | 295944 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
-2022/07/27 | 25119 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
-2022/07/27 | 112880 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
-2022/07/27 | 73263 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
-2022/07/27 | 115577 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
-2022/07/27 | 43889 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
-2022/07/27 | 565081 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
-2022/07/27 | 247208 | systems/win32/miktex/tm/packages/next/miktex-hitex-bin-x64.tar.lzma
-2022/07/27 | 169678 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
-2022/07/27 | 109650 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
-2022/07/27 | 18381 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
-2022/07/27 | 30570 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
-2022/07/27 | 682213 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
-2022/07/27 | 599104 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
-2022/07/27 | 527570 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
-2022/07/27 | 103599 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
-2022/07/27 | 2023132 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
-2022/07/27 | 74099 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
-2022/07/27 | 32074 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
-2022/07/27 | 8826 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
-2022/07/27 | 209139 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
-2022/07/27 | 286685 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
-2022/07/27 | 104923 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
-2022/07/27 | 140014 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
-2022/07/27 | 325484 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
-2022/07/27 | 181724 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
-2022/07/27 | 55320 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
-2022/07/27 | 35230 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
-2022/07/27 | 43618 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
-2022/07/27 | 48038 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
-2022/07/27 | 52369 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
-2022/07/27 | 213847 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
-2022/07/27 | 41179 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
-2022/07/27 | 824996 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
-2022/07/27 | 203421 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
-2022/07/27 | 245151 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
-2022/07/27 | 88484 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
-2022/07/27 | 1323745 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
-2022/07/27 | 23949 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
-2022/07/27 | 37506 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
-2022/07/27 | 72978 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
-2022/07/27 | 58633 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
-2022/07/27 | 769653 | systems/win32/miktex/tm/packages/next/miktex-ptex-bin-x64.tar.lzma
-2022/07/27 | 1503055 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
-2022/07/27 | 52627 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
-2022/07/27 | 63803 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
-2022/07/27 | 27463 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
-2022/07/27 | 18510 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
-2022/07/27 | 70938 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
-2022/07/27 | 173178 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
-2022/07/27 | 68147 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
-2022/07/27 | 107438 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
-2022/07/27 | 2821671 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
-2022/07/27 | 62360 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
-2022/07/27 | 41189 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
-2022/07/27 | 33862 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
-2022/07/27 | 73687 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
-2022/07/27 | 352464 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
-2022/07/27 | 57501 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin-x64.tar.lzma
-2022/07/27 | 630435 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
-2022/07/27 | 43527 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
-2022/07/27 | 287597 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
-2022/07/27 | 1476819 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
-2022/07/27 | 1361081 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
-2022/07/27 | 14434 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
+2022/07/28 | 658941 | systems/win32/miktex/tm/packages/next/files.csv.lzma
+2022/07/28 | 57317 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
+2022/07/28 | 1161754 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
+2022/07/28 | 31587 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
+2022/07/28 | 35265 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
+2022/07/28 | 65130 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
+2022/07/28 | 95467 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
+2022/07/28 | 77210 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
+2022/07/28 | 31563 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
+2022/07/28 | 394145 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
+2022/07/28 | 37051 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
+2022/07/28 | 57504 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
+2022/07/28 | 270466 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
+2022/07/28 | 196214 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
+2022/07/28 | 103247 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
+2022/07/28 | 24212 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
+2022/07/28 | 481893 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
+2022/07/28 | 52037 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
+2022/07/28 | 325980 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
+2022/07/28 | 45794 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
+2022/07/28 | 135465 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
+2022/07/28 | 1458152 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
+2022/07/28 | 112978 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
+2022/07/28 | 48853 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
+2022/07/28 | 28510 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
+2022/07/28 | 63240 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
+2022/07/28 | 155430 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
+2022/07/28 | 79064 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
+2022/07/28 | 81448 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
+2022/07/28 | 295945 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
+2022/07/28 | 25119 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
+2022/07/28 | 112877 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
+2022/07/28 | 73263 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
+2022/07/28 | 115580 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
+2022/07/28 | 43889 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
+2022/07/28 | 565081 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
+2022/07/28 | 247207 | systems/win32/miktex/tm/packages/next/miktex-hitex-bin-x64.tar.lzma
+2022/07/28 | 169678 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
+2022/07/28 | 109651 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
+2022/07/28 | 18381 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
+2022/07/28 | 30569 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
+2022/07/28 | 682214 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
+2022/07/28 | 599104 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
+2022/07/28 | 527571 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
+2022/07/28 | 103598 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
+2022/07/28 | 2023132 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
+2022/07/28 | 74099 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
+2022/07/28 | 32074 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
+2022/07/28 | 8826 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
+2022/07/28 | 209138 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
+2022/07/28 | 286682 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
+2022/07/28 | 104922 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
+2022/07/28 | 140012 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
+2022/07/28 | 325483 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
+2022/07/28 | 181724 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
+2022/07/28 | 55319 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
+2022/07/28 | 35230 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
+2022/07/28 | 43618 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
+2022/07/28 | 48037 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
+2022/07/28 | 52370 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
+2022/07/28 | 213846 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
+2022/07/28 | 41179 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
+2022/07/28 | 824994 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
+2022/07/28 | 203421 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
+2022/07/28 | 245151 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
+2022/07/28 | 88482 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
+2022/07/28 | 1323743 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
+2022/07/28 | 23947 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
+2022/07/28 | 37505 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
+2022/07/28 | 72977 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
+2022/07/28 | 58631 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
+2022/07/28 | 769652 | systems/win32/miktex/tm/packages/next/miktex-ptex-bin-x64.tar.lzma
+2022/07/28 | 1503049 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
+2022/07/28 | 52627 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
+2022/07/28 | 63801 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
+2022/07/28 | 27465 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
+2022/07/28 | 18510 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
+2022/07/28 | 70940 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
+2022/07/28 | 173175 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
+2022/07/28 | 68146 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
+2022/07/28 | 107436 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
+2022/07/28 | 2821671 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
+2022/07/28 | 62358 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
+2022/07/28 | 41189 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
+2022/07/28 | 33862 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
+2022/07/28 | 73686 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
+2022/07/28 | 352464 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
+2022/07/28 | 57501 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin-x64.tar.lzma
+2022/07/28 | 630435 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
+2022/07/28 | 43527 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
+2022/07/28 | 287584 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
+2022/07/28 | 1476214 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
+2022/07/28 | 1360743 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
+2022/07/28 | 14433 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
2019/03/12 | 1412 | systems/win32/miktex/tm/packages/nextpage.tar.lzma
-2022/07/27 | 1172 | systems/win32/miktex/tm/packages/next/pr.ini
+2022/07/28 | 1172 | 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
@@ -301481,7 +301517,7 @@
2022/02/22 | 6917 | systems/win32/miktex/tm/packages/preview.tar.lzma
2019/06/20 | 375963 | systems/win32/miktex/tm/packages/prftree.tar.lzma
2021/04/23 | 274028 | systems/win32/miktex/tm/packages/principia.tar.lzma
-2022/07/27 | 1155 | systems/win32/miktex/tm/packages/pr.ini
+2022/07/28 | 1155 | 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
@@ -303408,7 +303444,7 @@
2004/06/04 | 404 | tds/tds.sed
2004/06/23 | 65418 | tds/tds.tex
2019/05/29 | 304264 | tds.zip
-2022/07/28 | 186 | timestamp
+2022/07/29 | 186 | timestamp
2002/08/26 | 61898 | usergrps/dante/antrag.pdf
2002/08/26 | 118217 | usergrps/dante/antrag.ps
2022/02/28 | 917 | usergrps/dante/dtk/doc/beispiel.bib
diff --git a/FILES.byname.gz b/FILES.byname.gz
index ddd09682e3..0384079d27 100644
--- a/FILES.byname.gz
+++ b/FILES.byname.gz
Binary files differ
diff --git a/FILES.last07days b/FILES.last07days
index acdb1ed6d0..27b461826a 100644
--- a/FILES.last07days
+++ b/FILES.last07days
@@ -1,139 +1,683 @@
+2022/07/28 | 95467 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
+2022/07/28 | 9469 | macros/luatex/generic/lua-widow-control/lua-widow-control.sty
+2022/07/28 | 926 | macros/xetex/latex/exam-zh/doc/back/package.tex
+2022/07/28 | 88482 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
+2022/07/28 | 8826 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
+2022/07/28 | 881135 | macros/xetex/latex/xduts/xdulogo.pdf
+2022/07/28 | 8676 | macros/luatex/generic/lua-widow-control/lwc-manual.mkxl
+2022/07/28 | 841767 | install/macros/luatex/generic/lua-widow-control.tds.zip
+2022/07/28 | 840332 | macros/luatex/generic/lua-widow-control.zip
+2022/07/28 | 824 | macros/xetex/latex/exam-zh/doc/back/development.tex
+2022/07/28 | 824994 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
+2022/07/28 | 81448 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
+2022/07/28 | 79064 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
+2022/07/28 | 7845 | macros/xetex/latex/exam-zh/CHANGELOG.md
+2022/07/28 | 7843 | macros/luatex/generic/lua-widow-control/CHANGELOG.md
+2022/07/28 | 77210 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
+2022/07/28 | 769652 | systems/win32/miktex/tm/packages/next/miktex-ptex-bin-x64.tar.lzma
+2022/07/28 | 7688 | macros/xetex/latex/exam-zh/doc/body/installation.tex
+2022/07/28 | 74099 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
+2022/07/28 | 738928 | macros/latex/contrib/nicematrix/nicematrix.dtx
+2022/07/28 | 73686 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
+2022/07/28 | 73263 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
+2022/07/28 | 731424 | systems/texlive/tlnet/archive/scripture.doc.r63988.tar.xz
+2022/07/28 | 730 | macros/xetex/latex/exam-zh/doc/body/cover.tex
+2022/07/28 | 72977 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
+2022/07/28 | 70940 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
+2022/07/28 | 707188 | macros/xetex/latex/xduts/xduts.pdf
+2022/07/28 | 7032 | systems/texlive/tlnet/archive/fixdif.source.r63986.tar.xz
+2022/07/28 | 69032 | macros/xetex/latex/exam-zh/tex/exam-zh.cls
+2022/07/28 | 682214 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
+2022/07/28 | 68146 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
+2022/07/28 | 659099 | systems/win32/miktex/tm/packages/files.csv.lzma
+2022/07/28 | 658941 | systems/win32/miktex/tm/packages/next/files.csv.lzma
+2022/07/28 | 65130 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
+2022/07/28 | 63801 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
+2022/07/28 | 63240 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
+2022/07/28 | 630435 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
+2022/07/28 | 62358 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
+2022/07/28 | 61886 | macros/luatex/generic/lua-widow-control/tb133chernoff-widows.ltx
+2022/07/28 | 599104 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
+2022/07/28 | 5911 | macros/luatex/generic/lua-widow-control/tb133chernoff-widows.bib
+2022/07/28 | 58631 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
+2022/07/28 | 5809003 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2022/07/28 | 57504 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
+2022/07/28 | 57501 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin-x64.tar.lzma
+2022/07/28 | 5739 | macros/luatex/generic/lua-widow-control/lwc-manual-samples.tex
+2022/07/28 | 57317 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
+2022/07/28 | 565081 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
+2022/07/28 | 55319 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
+2022/07/28 | 5388 | systems/texlive/tlnet/archive/scripture.r63988.tar.xz
+2022/07/28 | 52853 | macros/xetex/latex/exam-zh/tex/exam-zh-symbols.sty
+2022/07/28 | 527571 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
+2022/07/28 | 52627 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
+2022/07/28 | 52370 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
+2022/07/28 | 52037 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
+2022/07/28 | 511876 | macros/latex/contrib/nicematrix/nicematrix-french.pdf
+2022/07/28 | 506634 | macros/luatex/generic/lua-widow-control/lua-widow-control.pdf
+2022/07/28 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2022/07/28 | 48853 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
+2022/07/28 | 481893 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
+2022/07/28 | 48037 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
+2022/07/28 | 474 | macros/xetex/latex/exam-zh/doc/back/about-author.tex
+2022/07/28 | 47183 | macros/luatex/generic/lua-widow-control/tb133chernoff-widows-plot.dat
+2022/07/28 | 4630 | macros/luatex/generic/lua-widow-control/tb133chernoff-widows-figure.ctx
+2022/07/28 | 45794 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
+2022/07/28 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2022/07/28 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2022/07/28 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2022/07/28 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2022/07/28 | 43889 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
+2022/07/28 | 43635 | macros/luatex/generic/lua-widow-control/lua-widow-control.lua
+2022/07/28 | 43618 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
+2022/07/28 | 43527 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
+2022/07/28 | 419064 | systems/texlive/tlnet/archive/texlive-scripts.doc.r63985.tar.xz
+2022/07/28 | 41206 | macros/xetex/latex/exam-zh/tex/exam-zh-question.sty
+2022/07/28 | 41189 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
+2022/07/28 | 41179 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
+2022/07/28 | 394145 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
+2022/07/28 | 391523 | macros/luatex/generic/lua-widow-control/tb133chernoff-widows.pdf
+2022/07/28 | 380176 | systems/texlive/tlnet/archive/intopdf.doc.r63987.tar.xz
+2022/07/28 | 37505 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
+2022/07/28 | 37051 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
+2022/07/28 | 36637 | macros/luatex/generic/lua-widow-control/lwc-manual.tex
+2022/07/28 | 35265 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
+2022/07/28 | 352464 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
+2022/07/28 | 35230 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
+2022/07/28 | 33862 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
+2022/07/28 | 32 | macros/luatex/generic/lua-widow-control/t-lua-widow-control.mkiv
+2022/07/28 | 325980 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
+2022/07/28 | 325483 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
+2022/07/28 | 32074 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
+2022/07/28 | 31587 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
+2022/07/28 | 31563 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
+2022/07/28 | 30569 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
+2022/07/28 | 3022 | macros/luatex/generic/lua-widow-control/lua-widow-control-2022-02-22.sty
+2022/07/28 | 295945 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
+2022/07/28 | 289 | macros/xetex/latex/exam-zh/doc/back/main-changelog.tex
+2022/07/28 | 287584 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
+2022/07/28 | 287578 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
+2022/07/28 | 286682 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
+2022/07/28 | 2861 | macros/xetex/latex/xduts/README.md
+2022/07/28 | 28510 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
+2022/07/28 | 2823 | macros/luatex/generic/lua-widow-control/t-lua-widow-control.mkxl
+2022/07/28 | 2821671 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
+2022/07/28 | 2810 | macros/luatex/generic/lua-widow-control/README.md
+2022/07/28 | 27465 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
+2022/07/28 | 270466 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
+2022/07/28 | 2659251 | graphics/circuit_macros.zip
+2022/07/28 | 25493340 | systems/texlive/tlnet/install-tl.zip
+2022/07/28 | 25352 | macros/latex/contrib/csassignments/csassignments.dtx
+2022/07/28 | 25119 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
+2022/07/28 | 247207 | systems/win32/miktex/tm/packages/next/miktex-hitex-bin-x64.tar.lzma
+2022/07/28 | 245151 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
+2022/07/28 | 2444 | systems/texlive/tlnet/archive/intopdf.source.r63987.tar.xz
+2022/07/28 | 24212 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
+2022/07/28 | 2396760 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2022/07/28 | 23947 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
+2022/07/28 | 238818 | macros/xetex/latex/xduts/xduts.dtx
+2022/07/28 | 237836 | systems/texlive/tlnet/archive/fixdif.doc.r63986.tar.xz
+2022/07/28 | 2233 | macros/luatex/generic/lua-widow-control/lua-widow-control.tex
+2022/07/28 | 2182569 | macros/xetex/latex/exam-zh.zip
+2022/07/28 | 213846 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
+2022/07/28 | 209138 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
+2022/07/28 | 20557 | macros/xetex/latex/exam-zh/tex/exam-zh-chinese-english.sty
+2022/07/28 | 204716 | macros/xetex/latex/exam-zh/doc/figures/gitee-main.png
+2022/07/28 | 20465653 | systems/texlive/tlnet/install-tl-windows.exe
+2022/07/28 | 20354 | macros/xetex/latex/exam-zh/tex/exam-zh-choices.sty
+2022/07/28 | 203421 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
+2022/07/28 | 2023132 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
+2022/07/28 | 1964317 | macros/latex/contrib/nicematrix.zip
+2022/07/28 | 196214 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
+2022/07/28 | 1900 | macros/xetex/latex/exam-zh/doc/exam-zh-doc-setup.tex
+2022/07/28 | 18510 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
+2022/07/28 | 18381 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
+2022/07/28 | 181724 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
+2022/07/28 | 18087 | macros/xetex/latex/exam-zh/tex/exam-zh-font.sty
+2022/07/28 | 1807 | macros/luatex/generic/lua-widow-control/lua-widow-control.opm
+2022/07/28 | 1792 | systems/texlive/tlnet/archive/fixdif.r63986.tar.xz
+2022/07/28 | 17569351 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2022/07/28 | 173175 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
+2022/07/28 | 171403 | macros/xetex/latex/exam-zh/doc/figures/gitee-release.png
+2022/07/28 | 169678 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
+2022/07/28 | 1628 | systems/texlive/tlnet/archive/collection-publishers.r63988.tar.xz
+2022/07/28 | 1612320 | macros/xetex/latex/xduts.zip
+2022/07/28 | 155430 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
+2022/07/28 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2022/07/28 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2022/07/28 | 1503049 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
+2022/07/28 | 1498 | macros/xetex/latex/exam-zh/doc/body/introduction.tex
+2022/07/28 | 1476331 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
+2022/07/28 | 1476214 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
+2022/07/28 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2022/07/28 | 1458152 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
+2022/07/28 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2022/07/28 | 14433 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
+2022/07/28 | 142906 | macros/latex/contrib/csassignments/csassignments.pdf
+2022/07/28 | 1404 | macros/luatex/generic/lua-widow-control/lwc-manual.bib
+2022/07/28 | 140012 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
+2022/07/28 | 1372 | systems/texlive/tlnet/archive/intopdf.r63987.tar.xz
+2022/07/28 | 1360743 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
+2022/07/28 | 1360505 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
+2022/07/28 | 135465 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
+2022/07/28 | 1323743 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
+2022/07/28 | 1296290 | macros/latex/contrib/nicematrix/nicematrix.pdf
+2022/07/28 | 12456 | systems/texlive/tlnet/archive/scripture.source.r63988.tar.xz
+2022/07/28 | 119659 | macros/latex/contrib/csassignments.zip
+2022/07/28 | 1172 | systems/win32/miktex/tm/packages/next/pr.ini
+2022/07/28 | 1161754 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
+2022/07/28 | 1155 | systems/win32/miktex/tm/packages/pr.ini
+2022/07/28 | 115580 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
+2022/07/28 | 11492 | macros/xetex/latex/exam-zh/README.md
+2022/07/28 | 113488 | systems/texlive/tlnet/archive/texlive-scripts.r63985.tar.xz
+2022/07/28 | 112978 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
+2022/07/28 | 112877 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
+2022/07/28 | 1111 | macros/xetex/latex/xduts/xduts.ins
+2022/07/28 | 109651 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
+2022/07/28 | 1085430 | macros/xetex/latex/exam-zh/doc/exam-zh-doc.pdf
+2022/07/28 | 107436 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
+2022/07/28 | 104922 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
+2022/07/28 | 103598 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
+2022/07/28 | 103247 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
+2022/07/27 | 999 | graphics/circuit_macros/examples/Fuses.m4
+2022/07/27 | 999 | graphics/circuit_macros/doc/FusesMan.m4
+2022/07/27 | 991 | graphics/circuit_macros/examples/Byte.m4
+2022/07/27 | 988 | graphics/circuit_macros/examples/svg/VariableSVG.m4
+2022/07/27 | 9869 | graphics/circuit_macros/examples/tubedefs.m4
2022/07/27 | 98246 | macros/latex/contrib/fixdif/fixdif.pdf
-2022/07/27 | 95470 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
+2022/07/27 | 980 | graphics/circuit_macros/examples/Emarrows.m4
+2022/07/27 | 980 | graphics/circuit_macros/doc/EmarrowsMan.m4
+2022/07/27 | 973 | graphics/circuit_macros/examples/svg/MoreTableSVG.m4
+2022/07/27 | 97283 | macros/xetex/latex/exam-zh/doc/body/usage.tex
+2022/07/27 | 970 | graphics/circuit_macros/doc/Flowdiag.m4
+2022/07/27 | 966 | graphics/circuit_macros/examples/svg/ex15SVG.m4
+2022/07/27 | 963 | graphics/circuit_macros/doc/MoreTableMan.m4
+2022/07/27 | 960 | graphics/circuit_macros/examples/MoreTable.m4
+2022/07/27 | 959 | graphics/circuit_macros/examples/svg/FusesSVG.m4
+2022/07/27 | 953 | graphics/circuit_macros/examples/squiggle.m4
2022/07/27 | 952332 | systems/texlive/tlnet/archive/tex4ht.r63983.tar.xz
-2022/07/27 | 88484 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
-2022/07/27 | 8826 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
-2022/07/27 | 824996 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
-2022/07/27 | 81447 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
+2022/07/27 | 95148 | graphics/circuit_macros/examples/mf/cct.mf
+2022/07/27 | 947 | graphics/circuit_macros/examples/svg/QuantumSVG.m4
+2022/07/27 | 944 | graphics/circuit_macros/doc/VariableMan.m4
+2022/07/27 | 9425 | graphics/circuit_macros/doc/ShiftR.tex
+2022/07/27 | 937 | graphics/circuit_macros/examples/svg/ByteSVG.m4
+2022/07/27 | 932 | graphics/circuit_macros/examples/Variable.m4
+2022/07/27 | 9293 | graphics/circuit_macros/examples/Makefile
+2022/07/27 | 918 | graphics/circuit_macros/examples/Quantum.m4
+2022/07/27 | 917 | graphics/circuit_macros/examples/birds.m4
+2022/07/27 | 90918 | graphics/circuit_macros/libgen.m4
+2022/07/27 | 902995 | graphics/circuit_macros/examples/examples.pdf
+2022/07/27 | 901 | graphics/circuit_macros/examples/svg/quickSVG.m4
+2022/07/27 | 8806 | graphics/circuit_macros/examples/svg/SmithchartSVG.m4
+2022/07/27 | 865 | graphics/circuit_macros/examples/ex18.m4
+2022/07/27 | 855 | graphics/circuit_macros/examples/svg/ex03SVG.m4
+2022/07/27 | 8517 | graphics/circuit_macros/examples/svg/expSVG.m4
+2022/07/27 | 8372 | graphics/circuit_macros/examples/exp.m4
+2022/07/27 | 835 | graphics/circuit_macros/doc/Opto.m4
+2022/07/27 | 831 | graphics/circuit_macros/doc/GroundsMan.m4
+2022/07/27 | 828 | graphics/circuit_macros/examples/Grounds.m4
+2022/07/27 | 810 | graphics/circuit_macros/examples/svg/GroundsSVG.m4
2022/07/27 | 80210 | macros/latex/contrib/scripture/scripture.dtx
-2022/07/27 | 79064 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
+2022/07/27 | 801 | graphics/circuit_macros/doc/Potentiometers.m4
+2022/07/27 | 8006 | graphics/circuit_macros/examples/svg/controlSVG.m4
+2022/07/27 | 793 | graphics/circuit_macros/examples/svg/CountingSVG.m4
2022/07/27 | 787 | macros/latex/contrib/fixdif/README.md
-2022/07/27 | 77210 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
-2022/07/27 | 769653 | systems/win32/miktex/tm/packages/next/miktex-ptex-bin-x64.tar.lzma
+2022/07/27 | 783 | graphics/circuit_macros/doc/Oblique.m4
+2022/07/27 | 7778 | graphics/circuit_macros/examples/svg/cscSVG.m4
+2022/07/27 | 774 | graphics/circuit_macros/examples/quick.m4
+2022/07/27 | 774 | graphics/circuit_macros/doc/quick.m4
+2022/07/27 | 7732 | graphics/circuit_macros/examples/csc.m4
+2022/07/27 | 7721 | graphics/circuit_macros/examples/shapes.m4
+2022/07/27 | 771 | graphics/circuit_macros/examples/Attention.m4
+2022/07/27 | 7670 | graphics/circuit_macros/examples/Chuck.m4
+2022/07/27 | 764 | graphics/circuit_macros/examples/mf/cct.tfm
2022/07/27 | 755299 | macros/latex/contrib/scripture/scripture.pdf
+2022/07/27 | 7546 | graphics/circuit_macros/examples/svg/RectifiersSVG.m4
+2022/07/27 | 7533 | graphics/circuit_macros/doc/Logic.tex
+2022/07/27 | 750 | graphics/circuit_macros/examples/Connectors.m4
+2022/07/27 | 7507 | graphics/circuit_macros/examples/svg/shapesSVG.m4
+2022/07/27 | 7503 | graphics/circuit_macros/doc/Headers.tex
+2022/07/27 | 748 | graphics/circuit_macros/examples/svg/Np.m4
+2022/07/27 | 7464 | graphics/circuit_macros/doc/SLDsMan.m4
+2022/07/27 | 745 | graphics/circuit_macros/examples/svg/DecoderSVG.m4
2022/07/27 | 743231 | macros/latex/contrib/scripture.zip
-2022/07/27 | 74099 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
-2022/07/27 | 73687 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
-2022/07/27 | 73263 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
-2022/07/27 | 72978 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
-2022/07/27 | 70938 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
-2022/07/27 | 682213 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
-2022/07/27 | 68147 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
-2022/07/27 | 659099 | systems/win32/miktex/tm/packages/files.csv.lzma
-2022/07/27 | 658941 | systems/win32/miktex/tm/packages/next/files.csv.lzma
-2022/07/27 | 65130 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
-2022/07/27 | 63803 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
-2022/07/27 | 63240 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
-2022/07/27 | 630435 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
-2022/07/27 | 62360 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
-2022/07/27 | 599104 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
-2022/07/27 | 58633 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
-2022/07/27 | 5808916 | systems/texlive/tlnet/install-tl-unx.tar.gz
-2022/07/27 | 57507 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
-2022/07/27 | 57501 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin-x64.tar.lzma
-2022/07/27 | 57317 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
-2022/07/27 | 565081 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
-2022/07/27 | 55320 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
-2022/07/27 | 527570 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
-2022/07/27 | 52627 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
-2022/07/27 | 52369 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
-2022/07/27 | 52036 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
-2022/07/27 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
-2022/07/27 | 48851 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
-2022/07/27 | 481892 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
-2022/07/27 | 48038 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
-2022/07/27 | 45795 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
-2022/07/27 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2022/07/27 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
-2022/07/27 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2022/07/27 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
-2022/07/27 | 43889 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
-2022/07/27 | 43618 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
-2022/07/27 | 43527 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
+2022/07/27 | 741 | graphics/circuit_macros/examples/Incleps.m4
+2022/07/27 | 7418 | graphics/circuit_macros/examples/svg/CsourceSVG.m4
+2022/07/27 | 740 | graphics/circuit_macros/examples/SampleFlow.m4
+2022/07/27 | 7316 | graphics/circuit_macros/doc/Relay.tex
+2022/07/27 | 7203 | graphics/circuit_macros/examples/svg/lcctSVG.m4
+2022/07/27 | 7189 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+2022/07/27 | 715 | graphics/circuit_macros/examples/svg/ConnectorsSVG.m4
+2022/07/27 | 715 | graphics/circuit_macros/examples/psfrag/examplespsfrag.tex
+2022/07/27 | 7127 | graphics/circuit_macros/examples/lcct.m4
+2022/07/27 | 709 | graphics/circuit_macros/examples/Inclpdf.m4
+2022/07/27 | 706 | graphics/circuit_macros/psfrag.m4
+2022/07/27 | 7069 | graphics/circuit_macros/examples/control.m4
+2022/07/27 | 703 | graphics/circuit_macros/examples/mpost/README-mpost
+2022/07/27 | 7006 | graphics/circuit_macros/examples/Rectifiers.m4
+2022/07/27 | 685 | graphics/circuit_macros/examples/mpost/mptest
+2022/07/27 | 6854 | graphics/circuit_macros/examples/svg/DiniSVG.m4
+2022/07/27 | 6854 | graphics/circuit_macros/examples/Dini.m4
+2022/07/27 | 682 | graphics/circuit_macros/examples/svg/ujtSVG.m4
+2022/07/27 | 673 | graphics/circuit_macros/examples/ex03.m4
+2022/07/27 | 660 | graphics/circuit_macros/examples/ujt.m4
+2022/07/27 | 660 | graphics/circuit_macros/doc/ujtMan.m4
+2022/07/27 | 656 | graphics/circuit_macros/examples/Zcos.m4
+2022/07/27 | 655 | graphics/circuit_macros/examples/Decoder.m4
+2022/07/27 | 6550 | graphics/circuit_macros/doc/Conn.tex
+2022/07/27 | 654 | graphics/circuit_macros/examples/diamond.m4
+2022/07/27 | 645 | graphics/circuit_macros/examples/Floor.m4
+2022/07/27 | 6413 | graphics/circuit_macros/examples/svg/CanLogicSVG.m4
+2022/07/27 | 63 | graphics/circuit_macros/examples/svg/local_init.m4
+2022/07/27 | 6371 | graphics/circuit_macros/examples/CanLogic.m4
+2022/07/27 | 6285 | graphics/circuit_macros/examples/svg/EscherSVG.m4
+2022/07/27 | 6282 | graphics/circuit_macros/examples/Escher.m4
+2022/07/27 | 6270 | graphics/circuit_macros/examples/ASME_Y14-5.m4
+2022/07/27 | 6216 | graphics/circuit_macros/examples/svg/LgateSVG.m4
+2022/07/27 | 6160 | graphics/circuit_macros/examples/Plate.m4
+2022/07/27 | 6153 | graphics/circuit_macros/examples/svg/PlateSVG.m4
+2022/07/27 | 614 | graphics/circuit_macros/doc/BigResistor.m4
+2022/07/27 | 609 | graphics/circuit_macros/examples/svg/diamondSVG.m4
+2022/07/27 | 6067 | graphics/circuit_macros/doc/Contacts.tex
+2022/07/27 | 6003 | graphics/circuit_macros/examples/CSlight.m4
+2022/07/27 | 5969 | graphics/circuit_macros/examples/xfig/xfiglib.m4
+2022/07/27 | 591 | graphics/circuit_macros/examples/test.m4
+2022/07/27 | 5890 | graphics/circuit_macros/examples/Csource.m4
+2022/07/27 | 56 | graphics/circuit_macros/doc/opampex.m4
+2022/07/27 | 563 | graphics/circuit_macros/examples/svg/RotboxSVG.m4
+2022/07/27 | 5545 | graphics/circuit_macros/doc/Bip.tex
+2022/07/27 | 551 | graphics/circuit_macros/examples/Counting.m4
+2022/07/27 | 5502 | graphics/circuit_macros/doc/Emarrows.tex
+2022/07/27 | 5486 | graphics/circuit_macros/examples/graysurf.m4
+2022/07/27 | 5469 | graphics/circuit_macros/examples/svg/graysurfSVG.m4
+2022/07/27 | 5412 | graphics/circuit_macros/examples/svg/roseSVG.m4
+2022/07/27 | 5396 | graphics/circuit_macros/examples/svg/Makefile
+2022/07/27 | 538 | graphics/circuit_macros/examples/svg/FontsSVG.m4
+2022/07/27 | 538 | graphics/circuit_macros/examples/svg/AmpTableSVG.m4
+2022/07/27 | 5365 | graphics/circuit_macros/examples/svg/fetSVG.m4
+2022/07/27 | 535 | graphics/circuit_macros/doc/Tline.m4
+2022/07/27 | 533 | graphics/circuit_macros/examples/Rotbox.m4
+2022/07/27 | 532 | graphics/circuit_macros/examples/svg/NLGSVG.m4
+2022/07/27 | 5315 | graphics/circuit_macros/doc/fetMan.m4
+2022/07/27 | 5311 | graphics/circuit_macros/examples/fet.m4
+2022/07/27 | 5225 | graphics/circuit_macros/examples/svg/GeometrySVG.m4
+2022/07/27 | 5177 | graphics/circuit_macros/examples/Geometry.m4
+2022/07/27 | 5171 | graphics/circuit_macros/examples/svg/FlowSVG.m4
+2022/07/27 | 5137 | graphics/circuit_macros/doc/NPDT.tex
+2022/07/27 | 5132 | graphics/circuit_macros/examples/svg/SwitchesSVG.m4
+2022/07/27 | 50 | graphics/circuit_macros/doc/bitr.m4
+2022/07/27 | 5013 | graphics/circuit_macros/examples/AntiqueClock.m4
+2022/07/27 | 499 | graphics/circuit_macros/examples/NLG.m4
+2022/07/27 | 499 | graphics/circuit_macros/doc/NLGMan.m4
+2022/07/27 | 4969 | graphics/circuit_macros/doc/Makefile
+2022/07/27 | 4964 | graphics/circuit_macros/doc/Multiplexer.tex
+2022/07/27 | 494 | graphics/circuit_macros/examples/AmpTable.m4
+2022/07/27 | 494 | graphics/circuit_macros/doc/AmpTableMan.m4
+2022/07/27 | 489 | graphics/circuit_macros/examples/Koch.m4
+2022/07/27 | 4891 | graphics/circuit_macros/examples/EEP.m4
+2022/07/27 | 483 | graphics/circuit_macros/doc/eboxdims.m4
+2022/07/27 | 482 | graphics/circuit_macros/examples/clock.m4
+2022/07/27 | 4817 | graphics/circuit_macros/doc/Demultiplexer.tex
+2022/07/27 | 4789 | graphics/circuit_macros/doc/Fuses.tex
+2022/07/27 | 4782 | graphics/circuit_macros/examples/Switches.m4
+2022/07/27 | 47825 | graphics/circuit_macros/liblog.m4
+2022/07/27 | 4780 | graphics/circuit_macros/doc/SwitchesMan.m4
+2022/07/27 | 4763 | graphics/circuit_macros/examples/svg/EEPSVG.m4
+2022/07/27 | 4761 | graphics/circuit_macros/examples/svg/sfgSVG.m4
+2022/07/27 | 4751 | graphics/circuit_macros/examples/Flow.m4
+2022/07/27 | 4683 | graphics/circuit_macros/examples/psfrag/Makefile
+2022/07/27 | 4666 | graphics/circuit_macros/doc/Nport.tex
+2022/07/27 | 464 | graphics/circuit_macros/examples/tsttikz.tex
+2022/07/27 | 4638 | graphics/circuit_macros/examples/Ball.m4
+2022/07/27 | 462 | graphics/circuit_macros/Copying
+2022/07/27 | 4615 | graphics/circuit_macros/examples/mf/font.m4
+2022/07/27 | 460 | graphics/circuit_macros/examples/debug1.tex
+2022/07/27 | 4569 | graphics/circuit_macros/examples/rose.m4
+2022/07/27 | 45323 | graphics/circuit_macros/examples/Incl.eps.gz
+2022/07/27 | 4501 | graphics/circuit_macros/examples/Lyap.m4
+2022/07/27 | 449 | graphics/circuit_macros/doc/woodchips.m4
+2022/07/27 | 442 | graphics/circuit_macros/examples/Wheat.m4
+2022/07/27 | 4376 | graphics/circuit_macros/examples/svg/slddiagsSVG.m4
2022/07/27 | 434912 | systems/texlive/tlnet/archive/wrapstuff.doc.r63981.tar.xz
-2022/07/27 | 419064 | systems/texlive/tlnet/archive/texlive-scripts.doc.r63980.tar.xz
-2022/07/27 | 41189 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
-2022/07/27 | 41179 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
-2022/07/27 | 394143 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
-2022/07/27 | 37506 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
-2022/07/27 | 37050 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
-2022/07/27 | 35265 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
-2022/07/27 | 352464 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
-2022/07/27 | 35230 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
-2022/07/27 | 33862 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
-2022/07/27 | 325980 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
-2022/07/27 | 325484 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
-2022/07/27 | 32074 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
+2022/07/27 | 4340 | graphics/circuit_macros/examples/svg/AlogixSVG.m4
+2022/07/27 | 4313 | graphics/circuit_macros/examples/ex09.m4
+2022/07/27 | 4312 | graphics/circuit_macros/doc/Circuit_macros.bib
+2022/07/27 | 4289 | graphics/circuit_macros/examples/svg/BtreeSVG.m4
+2022/07/27 | 4247 | graphics/circuit_macros/examples/mpost/Makefile
+2022/07/27 | 421 | graphics/circuit_macros/examples/GrayCode.m4
+2022/07/27 | 421 | graphics/circuit_macros/doc/Sinus.m4
+2022/07/27 | 4205 | graphics/circuit_macros/examples/Alogix.m4
+2022/07/27 | 419 | graphics/circuit_macros/examples/svg/SixpoleSVG.m4
+2022/07/27 | 419 | graphics/circuit_macros/examples/Sixpole.m4
+2022/07/27 | 418 | graphics/circuit_macros/examples/mpost/tstmpost.tex
+2022/07/27 | 417 | graphics/circuit_macros/examples/svg/SQUIDSVG.m4
+2022/07/27 | 4178 | graphics/circuit_macros/doc/Tgate.tex
+2022/07/27 | 416 | graphics/circuit_macros/examples/testpdf.tex
+2022/07/27 | 4119 | graphics/circuit_macros/examples/svg/ex09SVG.m4
+2022/07/27 | 409 | graphics/circuit_macros/examples/tst.tex
+2022/07/27 | 409 | graphics/circuit_macros/examples/mpost/examplesmpost.tex
+2022/07/27 | 4089 | graphics/circuit_macros/INSTALL
+2022/07/27 | 40591 | graphics/circuit_macros/doc/SLDs.tex
+2022/07/27 | 404 | graphics/circuit_macros/doc/Series.m4
+2022/07/27 | 4023 | graphics/circuit_macros/examples/Euro.m4
+2022/07/27 | 4003 | graphics/circuit_macros/examples/svg/InclepsSVG.m4
+2022/07/27 | 3991 | graphics/circuit_macros/examples/sfg.m4
+2022/07/27 | 3954 | graphics/circuit_macros/examples/PushPull.m4
+2022/07/27 | 387 | graphics/circuit_macros/doc/lrarrows.m4
+2022/07/27 | 3825 | graphics/circuit_macros/examples/svg/recycleSVG.m4
+2022/07/27 | 3825 | graphics/circuit_macros/examples/recycle.m4
+2022/07/27 | 380 | graphics/circuit_macros/examples/SQUID.m4
+2022/07/27 | 3785 | graphics/circuit_macros/examples/Mixer.m4
+2022/07/27 | 3778 | graphics/circuit_macros/examples/svg/PushPullSVG.m4
+2022/07/27 | 3756 | graphics/circuit_macros/examples/svg/randomSVG.m4
+2022/07/27 | 3749 | graphics/circuit_macros/examples/Shaky.m4
+2022/07/27 | 3727 | graphics/circuit_macros/examples/random.m4
+2022/07/27 | 371 | graphics/circuit_macros/examples/psfrag/tstpsfrag.tex
+2022/07/27 | 370 | graphics/circuit_macros/examples/snake.m4
+2022/07/27 | 369 | graphics/circuit_macros/doc/sampleIC.m4
+2022/07/27 | 365 | graphics/circuit_macros/examples/rotellipse.m4
+2022/07/27 | 3646 | graphics/circuit_macros/examples/svg/ContactSVG.m4
+2022/07/27 | 3631 | graphics/circuit_macros/examples/svg/wormSVG.m4
+2022/07/27 | 3567 | graphics/circuit_macros/examples/svg/ButtonsSVG.m4
+2022/07/27 | 353 | graphics/circuit_macros/examples/windows.m4
+2022/07/27 | 353 | graphics/circuit_macros/examples/svg/windows.m4
+2022/07/27 | 3522 | graphics/circuit_macros/examples/svg/ex12SVG.m4
+2022/07/27 | 3509 | graphics/circuit_macros/examples/Buttons.m4
+2022/07/27 | 3489 | graphics/circuit_macros/examples/svg/MixerSVG.m4
+2022/07/27 | 3473 | graphics/circuit_macros/examples/svg/MCSVG.m4
+2022/07/27 | 3390 | graphics/circuit_macros/examples/svg/ex05SVG.m4
+2022/07/27 | 337 | graphics/circuit_macros/examples/xfig/Makefile
+2022/07/27 | 3346 | graphics/circuit_macros/examples/Windings.m4
+2022/07/27 | 3346 | graphics/circuit_macros/doc/WindingsMan.m4
+2022/07/27 | 3339 | graphics/circuit_macros/examples/ex12.m4
+2022/07/27 | 3326 | graphics/circuit_macros/examples/Contact.m4
+2022/07/27 | 3326 | graphics/circuit_macros/doc/ContactMan.m4
+2022/07/27 | 3321 | graphics/circuit_macros/examples/thyristor.m4
+2022/07/27 | 3321 | graphics/circuit_macros/doc/thyristorMan.m4
+2022/07/27 | 3310 | graphics/circuit_macros/examples/svg/thyristorSVG.m4
+2022/07/27 | 32 | graphics/circuit_macros/examples/Incl.eps.bb
+2022/07/27 | 329 | graphics/circuit_macros/doc/FF.m4
+2022/07/27 | 32742 | graphics/circuit_macros/libSLD.m4
+2022/07/27 | 3183 | graphics/circuit_macros/doc/NLG.tex
+2022/07/27 | 317 | graphics/circuit_macros/examples/psfrag/README-psfrag.txt
2022/07/27 | 3179 | macros/latex/contrib/fixdif/fixdif.ins
-2022/07/27 | 31585 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
-2022/07/27 | 31562 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
-2022/07/27 | 30570 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
-2022/07/27 | 295944 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
-2022/07/27 | 287597 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
-2022/07/27 | 287595 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
-2022/07/27 | 286685 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
-2022/07/27 | 28510 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
-2022/07/27 | 2821671 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
-2022/07/27 | 27463 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
-2022/07/27 | 270465 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
-2022/07/27 | 25493368 | systems/texlive/tlnet/install-tl.zip
-2022/07/27 | 25119 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
-2022/07/27 | 247208 | systems/win32/miktex/tm/packages/next/miktex-hitex-bin-x64.tar.lzma
-2022/07/27 | 245151 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
+2022/07/27 | 3175 | graphics/circuit_macros/examples/Blogix.m4
+2022/07/27 | 3091 | graphics/circuit_macros/examples/svg/TtreeSVG.m4
+2022/07/27 | 30451 | graphics/circuit_macros/examples/svg/LoglogSVG.m4
+2022/07/27 | 3019 | graphics/circuit_macros/doc/Circuit_macros.tex
+2022/07/27 | 2994 | graphics/circuit_macros/examples/svg/WindingsSVG.m4
+2022/07/27 | 2989 | graphics/circuit_macros/examples/svg/AutoencoderSVG.m4
+2022/07/27 | 2986 | graphics/circuit_macros/examples/MC.m4
+2022/07/27 | 29772 | graphics/circuit_macros/examples/Incl.pdf
+2022/07/27 | 295 | graphics/circuit_macros/examples/ShadeSector.m4
+2022/07/27 | 2912 | graphics/circuit_macros/doc/Workflow.m4
+2022/07/27 | 2872 | graphics/circuit_macros/examples/README-examples
+2022/07/27 | 2846 | graphics/circuit_macros/examples/Metamodel.m4
+2022/07/27 | 2834 | graphics/circuit_macros/postscript.m4
+2022/07/27 | 2801 | graphics/circuit_macros/examples/worm.m4
+2022/07/27 | 2792 | graphics/circuit_macros/examples/OpAmpFilter.m4
+2022/07/27 | 2720 | graphics/circuit_macros/examples/svg/AudioSVG.m4
+2022/07/27 | 27105 | graphics/circuit_macros/examples/Consumption.m4
+2022/07/27 | 26 | graphics/circuit_macros/doc/DCsymbol.m4
+2022/07/27 | 26 | graphics/circuit_macros/doc/ACsymbol.m4
+2022/07/27 | 269 | graphics/circuit_macros/doc/Loop.m4
+2022/07/27 | 2696 | graphics/circuit_macros/examples/keyval.m4
+2022/07/27 | 2685 | graphics/circuit_macros/examples/svg/ex11SVG.m4
+2022/07/27 | 2674 | graphics/circuit_macros/examples/Planes.m4
+2022/07/27 | 2661 | graphics/circuit_macros/doc/Grounds.tex
+2022/07/27 | 2634 | graphics/circuit_macros/examples/Audio.m4
+2022/07/27 | 2634 | graphics/circuit_macros/doc/AudioMan.m4
+2022/07/27 | 2629 | graphics/circuit_macros/examples/svg/ex01SVG.m4
+2022/07/27 | 25849 | graphics/circuit_macros/doc/Xform.tex
+2022/07/27 | 2571 | graphics/circuit_macros/examples/IntersectingPlanes.m4
+2022/07/27 | 2562 | graphics/circuit_macros/examples/Crow.m4
+2022/07/27 | 2559 | graphics/circuit_macros/examples/svg/ex08SVG.m4
+2022/07/27 | 2556 | graphics/circuit_macros/examples/ex08.m4
+2022/07/27 | 2551 | graphics/circuit_macros/examples/svg/OptoisoSVG.m4
+2022/07/27 | 2542 | graphics/circuit_macros/examples/brace.m4
+2022/07/27 | 2528 | graphics/circuit_macros/examples/svg/AdderSVG.m4
+2022/07/27 | 2525 | graphics/circuit_macros/examples/svg/CrowSVG.m4
+2022/07/27 | 2517 | graphics/circuit_macros/examples/Autoencoder.m4
+2022/07/27 | 24863 | graphics/circuit_macros/examples/svg/examplesSVG.htmx
2022/07/27 | 244927 | macros/latex/contrib/fixdif.zip
-2022/07/27 | 24212 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
-2022/07/27 | 2397644 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
-2022/07/27 | 23949 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
+2022/07/27 | 2443 | graphics/circuit_macros/examples/svg/ex00SVG.m4
+2022/07/27 | 2442 | graphics/circuit_macros/examples/Optoiso.m4
+2022/07/27 | 2441 | graphics/circuit_macros/doc/ujt.tex
+2022/07/27 | 24141 | graphics/circuit_macros/examples/svg/UNOSVG.m4
+2022/07/27 | 2412 | graphics/circuit_macros/examples/ex00.m4
+2022/07/27 | 2402 | graphics/circuit_macros/examples/Adder.m4
+2022/07/27 | 2389 | graphics/circuit_macros/doc/Dac.m4
+2022/07/27 | 23650 | graphics/circuit_macros/dpictools.pic
+2022/07/27 | 2362 | graphics/circuit_macros/examples/Jack.m4
+2022/07/27 | 2362 | graphics/circuit_macros/doc/JackMan.m4
+2022/07/27 | 2361 | graphics/circuit_macros/examples/ex11.m4
+2022/07/27 | 233 | graphics/circuit_macros/examples/Ccurve.m4
2022/07/27 | 23391 | macros/latex/contrib/fixdif/fixdif.dtx
-2022/07/27 | 213847 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
-2022/07/27 | 209139 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
-2022/07/27 | 20463507 | systems/texlive/tlnet/install-tl-windows.exe
-2022/07/27 | 203421 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
+2022/07/27 | 2304 | graphics/circuit_macros/examples/Loglog.m4
+2022/07/27 | 2283 | graphics/circuit_macros/examples/ex01.m4
+2022/07/27 | 2225 | graphics/circuit_macros/doc/SourcesMan.m4
+2022/07/27 | 221 | graphics/circuit_macros/examples/rotate.tex
+2022/07/27 | 219 | graphics/circuit_macros/examples/tst1.tex
+2022/07/27 | 217 | graphics/circuit_macros/doc/stringdims.m4
+2022/07/27 | 2179 | graphics/circuit_macros/doc/ConnMan.m4
+2022/07/27 | 2178 | graphics/circuit_macros/examples/Conn.m4
+2022/07/27 | 2171 | graphics/circuit_macros/examples/svg/I2LSVG.m4
+2022/07/27 | 2165 | graphics/circuit_macros/examples/Sources.m4
+2022/07/27 | 21398 | graphics/circuit_macros/examples/xfig/xfiglib.fig
+2022/07/27 | 21384 | graphics/circuit_macros/examples/svg/Incl.jpg
+2022/07/27 | 2119 | graphics/circuit_macros/examples/Logic.m4
+2022/07/27 | 2119 | graphics/circuit_macros/doc/LogicMan.m4
+2022/07/27 | 2111 | graphics/circuit_macros/examples/svg/ConnSVG.m4
+2022/07/27 | 2099 | graphics/circuit_macros/pstricks.m4
+2022/07/27 | 2097 | graphics/circuit_macros/examples/Ttree.m4
+2022/07/27 | 2086 | graphics/circuit_macros/examples/relaycoil.m4
+2022/07/27 | 2086 | graphics/circuit_macros/doc/relaycoilMan.m4
+2022/07/27 | 2085 | graphics/circuit_macros/pgf.m4
+2022/07/27 | 2069 | graphics/circuit_macros/examples/svg/relaycoilSVG.m4
+2022/07/27 | 2068 | graphics/circuit_macros/examples/I2L.m4
+2022/07/27 | 2051 | graphics/circuit_macros/examples/svg/JackSVG.m4
+2022/07/27 | 20418 | graphics/circuit_macros/doc/thyristor.tex
2022/07/27 | 2030 | macros/latex/contrib/scripture/README.md
-2022/07/27 | 2023132 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
-2022/07/27 | 196214 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
-2022/07/27 | 18510 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
-2022/07/27 | 18381 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
-2022/07/27 | 181724 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
-2022/07/27 | 17567561 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
-2022/07/27 | 173178 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
-2022/07/27 | 169678 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
+2022/07/27 | 2027 | graphics/circuit_macros/examples/svg/pwrsupplySVG.m4
+2022/07/27 | 2018 | graphics/circuit_macros/examples/svg/ex06SVG.m4
+2022/07/27 | 2014 | graphics/circuit_macros/examples/pwrsupply.m4
+2022/07/27 | 2013 | graphics/circuit_macros/doc/HybridPi.m4
+2022/07/27 | 2000 | graphics/circuit_macros/examples/ex21.m4
+2022/07/27 | 1996 | graphics/circuit_macros/examples/svg/FourbarSVG.m4
+2022/07/27 | 1995 | graphics/circuit_macros/doc/Corners.m4
+2022/07/27 | 1985 | graphics/circuit_macros/examples/svg/XORSVG.m4
+2022/07/27 | 1982 | graphics/circuit_macros/doc/PconnMan.m4
+2022/07/27 | 1975 | graphics/circuit_macros/doc/FlipFlop.m4
+2022/07/27 | 1966 | graphics/circuit_macros/examples/svg/DriveSVG.m4
+2022/07/27 | 1966 | graphics/circuit_macros/examples/Drive.m4
+2022/07/27 | 196300 | macros/latex/contrib/nicematrix/nicematrix-french.tex
+2022/07/27 | 1962 | graphics/circuit_macros/examples/Autologix.m4
+2022/07/27 | 1959 | graphics/circuit_macros/examples/debug2.m4
+2022/07/27 | 1955 | graphics/circuit_macros/examples/svg/ABlogixSVG.m4
+2022/07/27 | 1953 | graphics/circuit_macros/examples/svg/MotorControlSVG.m4
+2022/07/27 | 1953 | graphics/circuit_macros/doc/Buffer.m4
+2022/07/27 | 1940 | graphics/circuit_macros/doc/AmpTable.tex
+2022/07/27 | 1931 | graphics/circuit_macros/examples/svg/LogicSVG.m4
+2022/07/27 | 1922 | graphics/circuit_macros/examples/MotorControl.m4
+2022/07/27 | 19176 | graphics/circuit_macros/Licence.txt
+2022/07/27 | 19142 | graphics/circuit_macros/doc/Switches.tex
+2022/07/27 | 1907 | graphics/circuit_macros/examples/svg/SourcesSVG.m4
+2022/07/27 | 1906 | graphics/circuit_macros/examples/venus.m4
+2022/07/27 | 1906 | graphics/circuit_macros/examples/SPM.m4
+2022/07/27 | 1894 | graphics/circuit_macros/examples/svg/ArrowFnSVG.m4
+2022/07/27 | 1893 | graphics/circuit_macros/examples/svg/ex16SVG.m4
+2022/07/27 | 1891 | graphics/circuit_macros/examples/svg/ex04SVG.m4
+2022/07/27 | 1882 | graphics/circuit_macros/examples/svg/ex21SVG.m4
+2022/07/27 | 1879 | graphics/circuit_macros/examples/Cruller.m4
+2022/07/27 | 1875 | graphics/circuit_macros/examples/svg/GrayCodeSVG.m4
+2022/07/27 | 1874 | graphics/circuit_macros/examples/svg/CrullerSVG.m4
+2022/07/27 | 1865 | graphics/circuit_macros/examples/ex16.m4
+2022/07/27 | 1865 | graphics/circuit_macros/examples/ex05.m4
+2022/07/27 | 1860 | graphics/circuit_macros/doc/bi_trans.m4
+2022/07/27 | 1857 | graphics/circuit_macros/doc/Composite.m4
+2022/07/27 | 1852 | graphics/circuit_macros/examples/Orbits.m4
+2022/07/27 | 1837 | graphics/circuit_macros/examples/svg/SchottkySVG.m4
+2022/07/27 | 1823 | graphics/circuit_macros/examples/XOR.m4
+2022/07/27 | 1816 | graphics/circuit_macros/examples/Eye.m4
+2022/07/27 | 1812 | graphics/circuit_macros/examples/svg/BipSVG.m4
+2022/07/27 | 1802 | graphics/circuit_macros/examples/Pconn.m4
+2022/07/27 | 1790 | graphics/circuit_macros/doc/DiodesMan.m4
+2022/07/27 | 1787 | graphics/circuit_macros/examples/Diodes.m4
+2022/07/27 | 1783 | graphics/circuit_macros/examples/Stator.m4
+2022/07/27 | 1778 | graphics/circuit_macros/examples/Schottky.m4
+2022/07/27 | 177866 | graphics/circuit_macros/libcct.m4
+2022/07/27 | 1767 | graphics/circuit_macros/examples/ArrowFn.m4
+2022/07/27 | 1766 | graphics/circuit_macros/examples/svg/PconnSVG.m4
+2022/07/27 | 1766 | graphics/circuit_macros/examples/examples.tex
+2022/07/27 | 17653 | graphics/circuit_macros/examples/files.tex
+2022/07/27 | 1737 | graphics/circuit_macros/examples/svg/ContactsSVG.m4
+2022/07/27 | 1730 | graphics/circuit_macros/examples/ABlogix.m4
+2022/07/27 | 1700 | graphics/circuit_macros/examples/svg/EyeSVG.m4
+2022/07/27 | 1700 | graphics/circuit_macros/examples/ex06.m4
+2022/07/27 | 1699 | graphics/circuit_macros/examples/svg/ex10SVG.m4
+2022/07/27 | 1668 | graphics/circuit_macros/examples/svg/Banking.m4
+2022/07/27 | 1668 | graphics/circuit_macros/examples/IC10107.m4
+2022/07/27 | 165 | graphics/circuit_macros/doc/tranbody.m4
+2022/07/27 | 1654 | graphics/circuit_macros/examples/ex04.m4
+2022/07/27 | 1647 | graphics/circuit_macros/examples/svg/DiodesSVG.m4
+2022/07/27 | 16420 | graphics/circuit_macros/doc/fet.tex
+2022/07/27 | 1640 | graphics/circuit_macros/mpost.m4
+2022/07/27 | 1639 | graphics/circuit_macros/Makefile
+2022/07/27 | 1630 | graphics/circuit_macros/examples/svg/TTLnandSVG.m4
2022/07/27 | 16264 | systems/texlive/tlnet/archive/wrapstuff.source.r63981.tar.xz
-2022/07/27 | 155430 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
-2022/07/27 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2022/07/27 | 1624 | graphics/circuit_macros/doc/ParSeries.m4
+2022/07/27 | 1619 | graphics/circuit_macros/examples/Bip.m4
+2022/07/27 | 1619 | graphics/circuit_macros/doc/BipMan.m4
+2022/07/27 | 1618 | graphics/circuit_macros/doc/ArrestersMan.m4
+2022/07/27 | 1615 | graphics/circuit_macros/examples/Arresters.m4
+2022/07/27 | 1612 | graphics/circuit_macros/examples/svg/TimerSVG.m4
+2022/07/27 | 15867 | graphics/circuit_macros/README
+2022/07/27 | 1585 | graphics/circuit_macros/examples/Contacts.m4
+2022/07/27 | 1585 | graphics/circuit_macros/doc/ContactsMan.m4
+2022/07/27 | 1575 | graphics/circuit_macros/doc/mplex.m4
+2022/07/27 | 1559 | graphics/circuit_macros/examples/svg/XformSVG.m4
+2022/07/27 | 1558 | graphics/circuit_macros/examples/TTLnand.m4
+2022/07/27 | 1546 | graphics/circuit_macros/examples/svg/Xtest.m4
+2022/07/27 | 15388 | graphics/circuit_macros/doc/Sources.tex
2022/07/27 | 15364 | systems/texlive/tlnet/archive/rec-thy.r63982.tar.xz
-2022/07/27 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
-2022/07/27 | 1503055 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
-2022/07/27 | 1476819 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
-2022/07/27 | 1476408 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
-2022/07/27 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
-2022/07/27 | 1458152 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
-2022/07/27 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
-2022/07/27 | 14434 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
-2022/07/27 | 140014 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
+2022/07/27 | 1529 | graphics/circuit_macros/examples/mf/Makefile
+2022/07/27 | 152931 | graphics/circuit_macros/doc/body.tex
+2022/07/27 | 1526 | graphics/circuit_macros/examples/Xform.m4
+2022/07/27 | 1526 | graphics/circuit_macros/doc/XformMan.m4
+2022/07/27 | 1525 | graphics/circuit_macros/examples/rotatetext.m4
+2022/07/27 | 1521 | graphics/circuit_macros/examples/Coxeter.m4
+2022/07/27 | 150 | graphics/circuit_macros/doc/Thermal.m4
+2022/07/27 | 15033 | graphics/circuit_macros/doc/Pconn.tex
+2022/07/27 | 1492 | graphics/circuit_macros/examples/ex10.m4
+2022/07/27 | 1485 | graphics/circuit_macros/examples/Demultiplexer.m4
+2022/07/27 | 1485 | graphics/circuit_macros/doc/DemultiplexerMan.m4
+2022/07/27 | 1463 | graphics/circuit_macros/doc/Taps.m4
+2022/07/27 | 1458 | graphics/circuit_macros/examples/header.tex
+2022/07/27 | 1444 | graphics/circuit_macros/examples/svg/ThreeSVG.m4
+2022/07/27 | 1443 | graphics/circuit_macros/examples/Resolver.m4
+2022/07/27 | 1433 | graphics/circuit_macros/examples/Opamp.m4
+2022/07/27 | 1433 | graphics/circuit_macros/doc/OpampMan.m4
+2022/07/27 | 1431 | graphics/circuit_macros/examples/svg/RelaySVG.m4
+2022/07/27 | 14279 | graphics/circuit_macros/darrow.m4
+2022/07/27 | 1419 | graphics/circuit_macros/examples/person.m4
+2022/07/27 | 1406 | graphics/circuit_macros/examples/ShiftR.m4
+2022/07/27 | 1406 | graphics/circuit_macros/doc/ShiftRMan.m4
+2022/07/27 | 14057 | graphics/circuit_macros/examples/svg/tstSVG.htmx
+2022/07/27 | 1403 | graphics/circuit_macros/examples/svg/MultiplexerSVG.m4
+2022/07/27 | 1400 | graphics/circuit_macros/examples/Multiplexer.m4
+2022/07/27 | 1400 | graphics/circuit_macros/doc/MultiplexerMan.m4
2022/07/27 | 139880 | macros/latex/contrib/fixdif/fixdif-zh-cn.pdf
+2022/07/27 | 1392 | graphics/circuit_macros/examples/Inductors.m4
+2022/07/27 | 13833 | graphics/circuit_macros/doc/Contact.tex
+2022/07/27 | 137 | graphics/circuit_macros/doc/opampexbody.m4
+2022/07/27 | 1373 | graphics/circuit_macros/examples/svg/DemultiplexerSVG.m4
2022/07/27 | 136384 | systems/texlive/tlnet/archive/tex4ht.doc.r63983.tar.xz
-2022/07/27 | 1361131 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
-2022/07/27 | 1361081 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
2022/07/27 | 13609 | macros/latex/contrib/fixdif/fixdif-zh-cn.tex
-2022/07/27 | 135464 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
-2022/07/27 | 1323745 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
+2022/07/27 | 1358 | graphics/circuit_macros/examples/Crossbar.m4
+2022/07/27 | 13500 | graphics/circuit_macros/CHANGES
+2022/07/27 | 1343 | graphics/circuit_macros/examples/svg/InductorsSVG.m4
+2022/07/27 | 1342 | graphics/circuit_macros/doc/InductorsMan.m4
+2022/07/27 | 13330 | graphics/circuit_macros/examples/Heathkit.m4
+2022/07/27 | 1331 | graphics/circuit_macros/examples/svg/SierpinskiSVG.m4
+2022/07/27 | 1331 | graphics/circuit_macros/examples/Sierpinski.m4
+2022/07/27 | 1329 | graphics/circuit_macros/doc/currents.m4
+2022/07/27 | 13264 | graphics/circuit_macros/examples/Tubediags.m4
+2022/07/27 | 131 | graphics/circuit_macros/doc/Axes.m4
+2022/07/27 | 1313 | graphics/circuit_macros/examples/svg/ShiftRSVG.m4
+2022/07/27 | 130 | graphics/circuit_macros/doc/bitrbody.m4
+2022/07/27 | 12 | graphics/circuit_macros/doc/Version.tex
+2022/07/27 | 1292 | graphics/circuit_macros/doc/ConfigC.m4
+2022/07/27 | 1287 | graphics/circuit_macros/examples/Three.m4
2022/07/27 | 1280 | macros/latex/contrib/scripture/scripture.ins
+2022/07/27 | 12765 | graphics/circuit_macros/lib3D.m4
2022/07/27 | 1274008 | systems/texlive/tlnet/archive/tex4ht.source.r63983.tar.xz
+2022/07/27 | 12711 | graphics/circuit_macros/examples/svg/HeathkitSVG.m4
+2022/07/27 | 1265 | graphics/circuit_macros/examples/svg/HeadersSVG.m4
+2022/07/27 | 1259 | graphics/circuit_macros/examples/Relay.m4
+2022/07/27 | 1259 | graphics/circuit_macros/doc/RelayMan.m4
+2022/07/27 | 1258 | graphics/circuit_macros/doc/ConfigB.m4
+2022/07/27 | 12558 | graphics/circuit_macros/svg.m4
+2022/07/27 | 12478 | graphics/circuit_macros/examples/svg/TubediagsSVG.m4
+2022/07/27 | 1238 | graphics/circuit_macros/examples/svg/NportSVG.m4
2022/07/27 | 123836 | systems/texlive/tlnet/archive/rec-thy.doc.r63982.tar.xz
-2022/07/27 | 1172 | systems/win32/miktex/tm/packages/next/pr.ini
+2022/07/27 | 1230 | graphics/circuit_macros/examples/Antennas.m4
+2022/07/27 | 1230 | graphics/circuit_macros/doc/AntennasMan.m4
+2022/07/27 | 1229 | graphics/circuit_macros/doc/fbfilter.m4
+2022/07/27 | 1214 | graphics/circuit_macros/examples/svg/ChipsSVG.m4
+2022/07/27 | 12050 | graphics/circuit_macros/doc/Diodes.tex
+2022/07/27 | 1204 | graphics/circuit_macros/examples/svg/ex17SVG.m4
+2022/07/27 | 1201 | graphics/circuit_macros/examples/Capacitors.m4
+2022/07/27 | 12006 | graphics/circuit_macros/doc/Jack.tex
+2022/07/27 | 11 | graphics/circuit_macros/doc/test.tex
+2022/07/27 | 1186 | graphics/circuit_macros/examples/svg/ResistorsSVG.m4
+2022/07/27 | 1185 | graphics/circuit_macros/boxdims.sty
+2022/07/27 | 1175 | graphics/circuit_macros/examples/Chips.m4
+2022/07/27 | 1174 | graphics/circuit_macros/examples/PPA.m4
2022/07/27 | 11724 | systems/texlive/tlnet/archive/wrapstuff.r63981.tar.xz
-2022/07/27 | 1161754 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
-2022/07/27 | 1155 | systems/win32/miktex/tm/packages/pr.ini
-2022/07/27 | 115577 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
-2022/07/27 | 113524 | systems/texlive/tlnet/archive/texlive-scripts.r63980.tar.xz
-2022/07/27 | 112979 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
-2022/07/27 | 112880 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
-2022/07/27 | 109650 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
-2022/07/27 | 107438 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
-2022/07/27 | 104923 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
-2022/07/27 | 103599 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
-2022/07/27 | 103247 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
+2022/07/27 | 1160 | graphics/circuit_macros/examples/svg/CapacitorsSVG.m4
+2022/07/27 | 11601 | graphics/circuit_macros/examples/svg/icsSVG.m4
+2022/07/27 | 1157 | graphics/circuit_macros/examples/svg/NPDTSVG.m4
+2022/07/27 | 1151 | graphics/circuit_macros/doc/Darlington.m4
+2022/07/27 | 1149 | graphics/circuit_macros/doc/ResistorsMan.m4
+2022/07/27 | 1145 | graphics/circuit_macros/examples/Resistors.m4
+2022/07/27 | 11440 | graphics/circuit_macros/examples/ics.m4
+2022/07/27 | 113762760 | macros/context/latest/cont-tmf.zip
+2022/07/27 | 1132 | graphics/circuit_macros/examples/Headers.m4
+2022/07/27 | 1132 | graphics/circuit_macros/doc/HeadersMan.m4
+2022/07/27 | 1128 | graphics/circuit_macros/examples/NPDT.m4
+2022/07/27 | 1128 | graphics/circuit_macros/doc/NPDTMan.m4
+2022/07/27 | 11270 | graphics/circuit_macros/examples/FlowchartDefs.m4
+2022/07/27 | 1126 | graphics/circuit_macros/examples/ex17.m4
+2022/07/27 | 1121 | graphics/circuit_macros/doc/ConfigA.m4
+2022/07/27 | 1114 | graphics/circuit_macros/mfpic.m4
+2022/07/27 | 1100 | graphics/circuit_macros/examples/ex02.m4
+2022/07/27 | 1093 | graphics/circuit_macros/examples/svg/ex02SVG.m4
+2022/07/27 | 1090 | graphics/circuit_macros/examples/svg/AntennasSVG.m4
+2022/07/27 | 1076 | graphics/circuit_macros/examples/mf/mftest
+2022/07/27 | 1075 | graphics/circuit_macros/examples/bistable.m4
+2022/07/27 | 1074 | graphics/circuit_macros/doc/bistableMan.m4
+2022/07/27 | 1070 | graphics/circuit_macros/examples/svg/EmarrowsSVG.m4
+2022/07/27 | 10699 | graphics/circuit_macros/examples/svg/keyboardSVG.m4
+2022/07/27 | 1065 | graphics/circuit_macros/examples/svg/ex18SVG.m4
+2022/07/27 | 1063 | graphics/circuit_macros/doc/CapacitorsMan.m4
+2022/07/27 | 1055 | graphics/circuit_macros/examples/svg/TgateSVG.m4
+2022/07/27 | 1050 | graphics/circuit_macros/examples/svg/SVGconfig.m4
+2022/07/27 | 104332 | graphics/circuit_macros/doc/defines.tex
+2022/07/27 | 1040 | graphics/circuit_macros/examples/Nport.m4
+2022/07/27 | 1040 | graphics/circuit_macros/doc/NportMan.m4
+2022/07/27 | 10401 | graphics/circuit_macros/doc/Variable.tex
+2022/07/27 | 1039 | graphics/circuit_macros/examples/chaos.m4
+2022/07/27 | 1034 | graphics/circuit_macros/examples/svg/OpampSVG.m4
+2022/07/27 | 1029 | graphics/circuit_macros/xfig.m4
+2022/07/27 | 1024 | graphics/circuit_macros/examples/Btree.m4
+2022/07/27 | 1023203 | graphics/circuit_macros/doc/Circuit_macros.pdf
+2022/07/27 | 1022 | graphics/circuit_macros/examples/Tgate.m4
+2022/07/27 | 1022 | graphics/circuit_macros/doc/TgateMan.m4
+2022/07/27 | 1019 | graphics/circuit_macros/gpic.m4
+2022/07/27 | 10193 | graphics/circuit_macros/examples/svg/paletteSVG.m4
+2022/07/27 | 1017 | graphics/circuit_macros/doc/arrowex.m4
+2022/07/27 | 10164 | graphics/circuit_macros/doc/Audio.tex
+2022/07/27 | 1003 | graphics/circuit_macros/examples/ex15.m4
2022/07/26 | 99463 | systems/win32/miktex/tm/packages/miktex-mfware-bin-2.9.tar.lzma
2022/07/26 | 99307 | systems/win32/miktex/tm/packages/miktex-epstopdf-bin-2.9.tar.lzma
2022/07/26 | 9804 | systems/texlive/tlnet/archive/create-theorem.r63975.tar.xz
@@ -162,7 +706,6 @@
2022/07/26 | 74072 | systems/win32/miktex/tm/packages/miktex-lzma-bin-x64-2.9.tar.lzma
2022/07/26 | 73631 | systems/win32/miktex/tm/packages/miktex-web-bin-x64-2.9.tar.lzma
2022/07/26 | 73278 | systems/win32/miktex/tm/packages/miktex-graphite2-bin-x64-2.9.tar.lzma
-2022/07/26 | 7304 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2022/07/26 | 72927 | systems/win32/miktex/tm/packages/miktex-ps2pk-bin-x64-2.9.tar.lzma
2022/07/26 | 71907 | systems/win32/miktex/tm/packages/miktex-freeglut-bin-2.9.tar.lzma
2022/07/26 | 70970 | systems/win32/miktex/tm/packages/miktex-tex4ht-bin-x64-2.9.tar.lzma
@@ -281,6 +824,7 @@
2022/07/26 | 244550 | systems/win32/miktex/tm/packages/miktex-console-bin-2.9.tar.lzma
2022/07/26 | 24163 | systems/win32/miktex/tm/packages/miktex-devnag-bin-x64-2.9.tar.lzma
2022/07/26 | 23945 | systems/win32/miktex/tm/packages/miktex-popt-bin-x64-2.9.tar.lzma
+2022/07/26 | 23066 | macros/xetex/latex/exam-zh/examples/example-multiple.tex
2022/07/26 | 22141 | systems/win32/miktex/tm/packages/miktex-fribidixetex-bin-2.9.tar.lzma
2022/07/26 | 214282 | systems/win32/miktex/tm/packages/miktex-omegaware-bin-x64-2.9.tar.lzma
2022/07/26 | 21304 | systems/win32/miktex/tm/packages/miktex-devnag-bin-2.9.tar.lzma
@@ -304,13 +848,14 @@
2022/07/26 | 173049 | systems/win32/miktex/tm/packages/miktex-tex-bin-x64-2.9.tar.lzma
2022/07/26 | 1703 | macros/latex/contrib/wrapstuff/README.md
2022/07/26 | 169820 | systems/win32/miktex/tm/packages/miktex-hunspell-bin-x64-2.9.tar.lzma
+2022/07/26 | 167892 | macros/xetex/latex/exam-zh/examples/example-multiple.pdf
2022/07/26 | 16512 | systems/win32/miktex/tm/packages/miktex-tex2xindy-bin-2.9.tar.lzma
2022/07/26 | 16454 | systems/win32/miktex/tm/packages/miktex-kpathsea-bin-2.9.tar.lzma
-2022/07/26 | 1624 | systems/texlive/tlnet/archive/collection-publishers.r63977.tar.xz
2022/07/26 | 157170 | systems/win32/miktex/tm/packages/miktex-tex-bin-2.9.tar.lzma
2022/07/26 | 155639 | systems/win32/miktex/tm/packages/miktex-fontconfig-bin-x64-2.9.tar.lzma
2022/07/26 | 152533 | systems/win32/miktex/tm/packages/miktex-hunspell-bin-2.9.tar.lzma
2022/07/26 | 1502376 | systems/win32/miktex/tm/packages/miktex-runtime-bin-x64-2.9.tar.lzma
+2022/07/26 | 148036 | macros/xetex/latex/exam-zh/examples/example-single.pdf
2022/07/26 | 1448544 | systems/win32/miktex/tm/packages/miktex-dvisvgm-bin-x64-2.9.tar.lzma
2022/07/26 | 144590 | support/TeX4ht/source/tex4ht-mathml.tex
2022/07/26 | 14444 | systems/win32/miktex/tm/packages/miktex-zzip-bin-x64-2.9.tar.lzma
@@ -329,6 +874,7 @@
2022/07/26 | 1180255 | systems/win32/miktex/tm/packages/miktex-poppler-bin-2.9.tar.lzma
2022/07/26 | 1162661 | systems/win32/miktex/tm/packages/miktex-asymptote-bin-x64-2.9.tar.lzma
2022/07/26 | 115407 | systems/win32/miktex/tm/packages/miktex-gregorio-bin-x64-2.9.tar.lzma
+2022/07/26 | 11371 | macros/xetex/latex/exam-zh/examples/example-single.tex
2022/07/26 | 112999 | systems/win32/miktex/tm/packages/miktex-epstopdf-bin-x64-2.9.tar.lzma
2022/07/26 | 112936 | systems/win32/miktex/tm/packages/miktex-gd-bin-x64-2.9.tar.lzma
2022/07/26 | 109570 | systems/win32/miktex/tm/packages/miktex-jpeg-bin-x64-2.9.tar.lzma
@@ -497,6 +1043,7 @@
2022/07/24 | 379548 | systems/texlive/tlnet/archive/precattl.doc.r63967.tar.xz
2022/07/24 | 3588 | systems/texlive/tlnet/archive/precattl.r63967.tar.xz
2022/07/24 | 354044 | systems/texlive/tlnet/archive/textpos.doc.r63967.tar.xz
+2022/07/24 | 34627 | macros/xetex/latex/exam-zh/doc/xdyydoc.cls
2022/07/24 | 337868 | systems/texlive/tlnet/archive/eulerpx.doc.r63967.tar.xz
2022/07/24 | 3348 | systems/texlive/tlnet/archive/uwa-letterhead.r63967.tar.xz
2022/07/24 | 322096 | systems/texlive/tlnet/archive/oup-authoring-template.doc.r63967.tar.xz
@@ -526,7 +1073,6 @@
2022/07/24 | 1242344 | systems/texlive/tlnet/archive/siunitx.doc.r63967.tar.xz
2022/07/24 | 116508 | systems/texlive/tlnet/archive/siunitx.source.r63967.tar.xz
2022/07/24 | 11442 | macros/latex/contrib/crefthe/crefthe.sty
-2022/07/24 | 113753026 | macros/context/latest/cont-tmf.zip
2022/07/24 | 10892 | systems/texlive/tlnet/archive/gentombow.r63967.tar.xz
2022/07/24 | 10196 | systems/texlive/tlnet/archive/pxcjkcat.r63967.tar.xz
2022/07/23 | 996 | macros/latex/contrib/siunitx/README.md
@@ -597,46 +1143,10 @@
2022/07/22 | 44368 | systems/texlive/tlnet/archive/texlogsieve.r63954.tar.xz
2022/07/22 | 268120 | systems/texlive/tlnet/archive/tikzbricks.doc.r63952.tar.xz
2022/07/22 | 2284 | systems/texlive/tlnet/archive/tikzbricks.r63952.tar.xz
+2022/07/22 | 155299 | macros/xetex/latex/exam-zh/examples/example-single_student_version.pdf
2022/07/22 | 15348 | macros/latex/contrib/runcode/runcode.sty
+2022/07/22 | 1519 | macros/xetex/latex/exam-zh/doc/exam-zh-doc.tex
2022/07/22 | 11816 | systems/texlive/tlnet/archive/hvfloat.r63953.tar.xz
2022/07/22 | 111312 | systems/texlive/tlnet/archive/texlogsieve.doc.r63954.tar.xz
2022/07/22 | 10340744 | systems/texlive/tlnet/archive/hvfloat.doc.r63953.tar.xz
2022/07/22 | 1013286 | graphics/figput.zip
-2022/07/21 | 977780 | systems/texlive/tlnet/archive/gfsneohellenic.r63944.tar.xz
-2022/07/21 | 937 | graphics/figput/javascript/release/figput.html
-2022/07/21 | 870100 | systems/texlive/tlnet/archive/babel.doc.r63948.tar.xz
-2022/07/21 | 7923 | graphics/pgf/contrib/tikzbricks/tikzbricks.sty
-2022/07/21 | 78287 | graphics/figput/example/example.tex
-2022/07/21 | 737444 | systems/texlive/tlnet/archive/bodeplot.doc.r63946.tar.xz
-2022/07/21 | 718440 | systems/texlive/tlnet/archive/babel.source.r63948.tar.xz
-2022/07/21 | 6708 | systems/texlive/tlnet/archive/collection-latexextra.r63949.tar.xz
-2022/07/21 | 622916 | systems/texlive/tlnet/archive/tikzfill.doc.r63947.tar.xz
-2022/07/21 | 621 | macros/latex/contrib/intopdf/README.md
-2022/07/21 | 59279 | support/texlogsieve/texlogsieve.pdf
-2022/07/21 | 58516 | graphics/figput/javascript/release/figput.js
-2022/07/21 | 5433 | macros/latex/contrib/intopdf/intopdf.dtx
-2022/07/21 | 534244 | systems/texlive/tlnet/archive/feyn.doc.r63945.tar.xz
-2022/07/21 | 512 | graphics/pgf/contrib/tikzbricks/README.md
-2022/07/21 | 4944 | systems/texlive/tlnet/archive/bodeplot.r63946.tar.xz
-2022/07/21 | 4432 | systems/texlive/tlnet/archive/tikzfill.r63947.tar.xz
-2022/07/21 | 38044 | graphics/figput/figput-manual/figput-manual.tex
-2022/07/21 | 379897 | macros/latex/contrib/intopdf/intopdf.pdf
-2022/07/21 | 35149 | support/texlogsieve/LICENCE.txt
-2022/07/21 | 336 | graphics/figput/README.md
-2022/07/21 | 307735 | graphics/figput/example/example.pdf
-2022/07/21 | 2811 | support/texlogsieve/README.md
-2022/07/21 | 271210 | graphics/pgf/contrib/tikzbricks/tikzbricks-doc.pdf
-2022/07/21 | 269145 | graphics/pgf/contrib/tikzbricks.zip
-2022/07/21 | 227833 | graphics/figput/figput-manual/figput-manual.pdf
-2022/07/21 | 22509 | support/texlogsieve/texlogsieve.tex
-2022/07/21 | 222477 | systems/texlive/tlnet/tlpkg/installer/curl/curl-ca-bundle.crt
-2022/07/21 | 197589 | support/texlogsieve/texlogsieve
-2022/07/21 | 191140 | systems/texlive/tlnet/archive/babel.r63948.tar.xz
-2022/07/21 | 16364 | systems/texlive/tlnet/archive/feyn.source.r63945.tar.xz
-2022/07/21 | 15648 | systems/texlive/tlnet/archive/bodeplot.source.r63946.tar.xz
-2022/07/21 | 13508 | systems/texlive/tlnet/archive/feyn.r63945.tar.xz
-2022/07/21 | 133497 | support/texlogsieve.zip
-2022/07/21 | 12068 | graphics/pgf/contrib/tikzbricks/tikzbricks-doc.tex
-2022/07/21 | 11541 | support/texlogsieve/texlogsieve.1
-2022/07/21 | 1063 | graphics/figput/javascript/figput.html
-2022/07/21 | 10308 | systems/texlive/tlnet/archive/gfsneohellenic.doc.r63944.tar.xz
diff --git a/graphics/circuit_macros/CHANGES b/graphics/circuit_macros/CHANGES
index 80c44977e3..775d3f614d 100644
--- a/graphics/circuit_macros/CHANGES
+++ b/graphics/circuit_macros/CHANGES
@@ -1,5 +1,8 @@
CHANGES
+Version 9.9: Changes to libSLD macros, diode, sfg macros, rs_box,
+ r_text, svg_rot, examples. Changed SVG color macros for consistency with
+ other postprocessors.
Version 9.8: Changes to libSLD macros, with descriptions
added to the manual. Tweaked macros ArcAngle, opamp, inductor, cross,
crossover, diode, rs_box, r_text, Deltasymbol, arrester, dswitch,
@@ -40,8 +43,7 @@ Version 8.8: Tweaks for source macro. Change to svg.m4 for
embedding pic diagrams into Tikz pictures. Changed the name of the
manual from CMman.pdf to Circuit_macros.pdf. Option for dswitch.
Version 8.7: Fixes for more robust nested macros and SVG color. Options
-for
- the source macro.
+ for the source macro.
Version 8.6: Options for switch, lswitch. Simplified Quick Start section
of the manual. Added WARNING to m4 output for default configuration
file gpic.m4. Macro pconnex tweaked for tikz.
diff --git a/graphics/circuit_macros/Copying b/graphics/circuit_macros/Copying
index deabe0231f..6ff1081c39 100644
--- a/graphics/circuit_macros/Copying
+++ b/graphics/circuit_macros/Copying
@@ -1,4 +1,4 @@
-* Circuit_macros Version 9.8, copyright (c) 2022 J. D. Aplevich under *
+* Circuit_macros Version 9.9, copyright (c) 2022 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
diff --git a/graphics/circuit_macros/README b/graphics/circuit_macros/README
index 326bb4730d..430bf5e99f 100644
--- a/graphics/circuit_macros/README
+++ b/graphics/circuit_macros/README
@@ -1,5 +1,5 @@
-* Circuit_macros Version 9.8, copyright (c) 2022 J. D. Aplevich under *
+* Circuit_macros Version 9.9, copyright (c) 2022 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
@@ -116,7 +116,7 @@ USAGE
from within the tex document source as described in the manual. For
near-immediate viewing of the basic process, three windows can be kept
open: one in which to edit the source, one to process the source and
- produce postscript or pdf, and Okular or GSview 5.0, which updates
+ produce postscript or pdf, and a viewer such as GSview 5.0, which updates
when clicked.
INSTALLATION AND TESTING: See the INSTALL file.
@@ -160,9 +160,7 @@ GPIC:
and documentation is available from http://ftp.gnu.org/gnu/groff/
but there are mirror sites as well. A more extensive manual is found
in the documentation that comes with GNU pic, which is typically
- installed as gpic. A pdf copy is included with the dpic distribution
- and a version can be found on the web at
- http://www.kohala.com/start/troff/gpic.raymond.ps
+ installed as gpic. A pdf copy is included with the dpic distribution.
The original AT&T pic manual can be found at
http://doc.cat-v.org/unix/v10/10thEdMan/pic.pdf
@@ -188,10 +186,11 @@ SVG output, Inkscape:
EXAMPLES
A set of examples is included in this distribution, showing electric
circuits, block diagrams, flow charts, signal-flow graphs, basic
- use of colour and fill, and other applications. Read the manual
- Circuit_macros.pdf and view the files examples.pdf in the
- examples directory or make and view the html file in the examples/svg
- directory. For the curious, There are additional source
+ use of colour and fill, and other applications. Some of the examples
+ test the boundaries of the domain of application of dpic with m4 macros.
+ Read the manual Circuit_macros.pdf and view the files examples.pdf
+ in the examples directory or make and view the html file in the
+ examples/svg directory. For the curious, There are additional source
files in the examples directory that are not shown in examples.pdf.
For the possibly unstable development version of these macros, try
http://ece.uwaterloo.ca/~aplevich/Circuit_macros/
@@ -243,11 +242,8 @@ INTEGRATION WITH OTHER TOOLS:
showing how to use Circuit_macros with his setup is at
https://www.youtube.com/watch?time_continue=53&v=pFRIBvUJHS4
- A KDE interface created by Matteo Agostinelli can be found
- at http://wwwu.uni-klu.ac.at/magostin/cirkuit.html. A git
- repository of a newer version by Andrew G. for Linux is at
- https://github.com/ag-ckt/cirkuit/tree/V0.5.0. There is uncertainty
- about installation possibilities because of evolving library dependencies.
+ A git repository of a KDE interface by Andrew G. for Linux is at
+ https://github.com/ag-ckt/cirkuit/tree/V0.5.0.
Another recent introduction is at
https://www.root.cz/clanky/publikovanie-elektrickych-schem-a-diagramov-pomocou-circuit-macros/
diff --git a/graphics/circuit_macros/darrow.m4 b/graphics/circuit_macros/darrow.m4
index 4e3f757afc..e1d6073106 100644
--- a/graphics/circuit_macros/darrow.m4
+++ b/graphics/circuit_macros/darrow.m4
@@ -1,7 +1,7 @@
divert(-1)
darrow.m4 Macros for double lines and arrows
-* Circuit_macros Version 9.8, copyright (c) 2022 J. D. Aplevich under *
+* Circuit_macros Version 9.9, copyright (c) 2022 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
diff --git a/graphics/circuit_macros/doc/Circuit_macros.pdf b/graphics/circuit_macros/doc/Circuit_macros.pdf
index 9dd8ad8377..9c67589a6f 100644
--- a/graphics/circuit_macros/doc/Circuit_macros.pdf
+++ b/graphics/circuit_macros/doc/Circuit_macros.pdf
Binary files differ
diff --git a/graphics/circuit_macros/doc/DiodesMan.m4 b/graphics/circuit_macros/doc/DiodesMan.m4
index fb433235e1..33789fa5c7 100644
--- a/graphics/circuit_macros/doc/DiodesMan.m4
+++ b/graphics/circuit_macros/doc/DiodesMan.m4
@@ -1,5 +1,5 @@
.PS
-# Diodes.m4
+# DiodesMan.m4
cct_init
movewid = 2pt__
@@ -16,6 +16,8 @@ movewid = 2pt__
move down 0.2; right_
{diode(,B) ; move ; "`{\tt diode(,B)}'" ljust}
move down 0.2; right_
+ {diode(,b) ; move ; "`{\tt diode(,b)}'" ljust}
+ move down 0.2; right_
{diode(,G) ; move ; "`{\tt diode(,G)}'" ljust}
move down 0.2; right_
{diode(,D) ; move ; "`{\tt diode(,D)}'" ljust}
@@ -39,7 +41,7 @@ movewid = 2pt__
{diode(,MK) ; move ; "`{\tt diode(,MK)}'" ljust}
}
- move right_ 2.0
+ move down_ sourcerad_ right_ 2.0
{ {diode(,Z,RE) ; move ; "`{\tt diode(,Z,RE)}'" ljust}
move down 0.30; right_
{diode(,U) ; move ; "`{\tt diode(,U)}'" ljust}
diff --git a/graphics/circuit_macros/doc/Version.tex b/graphics/circuit_macros/doc/Version.tex
index 91db3d8a25..45c581b3af 100644
--- a/graphics/circuit_macros/doc/Version.tex
+++ b/graphics/circuit_macros/doc/Version.tex
@@ -1 +1 @@
-Version 9.8
+Version 9.9
diff --git a/graphics/circuit_macros/doc/body.tex b/graphics/circuit_macros/doc/body.tex
index c7c7b2bc6b..b984ec0435 100644
--- a/graphics/circuit_macros/doc/body.tex
+++ b/graphics/circuit_macros/doc/body.tex
@@ -956,7 +956,7 @@ Diodes are shown in \FR{Diodes}.
\begin{figure}[h!t]
\input DiodesMan
\caption{The macro {\tt
- diode(\linespec, B|CR|D|L|LE[R]|P[R]|S|T|U|V|v|w|Z|{\sl chars}, [R][E])}.
+ diode(\linespec, B|b|CR|D|L|LE[R]|P[R]|S|T|U|V|v|w|Z|{\sl chars}, [R][E])}.
Appending {\tt K} to the second argument draws an open arrowhead.}
\label{Diodes}
\end{figure}
@@ -984,14 +984,21 @@ Similarly, the macro
{\tt resized(}{\sl factor},`{\sl macro name}',{\sl macro arguments}{\tt )}
\par
\noindent
-can be used to resize the body of an element by temporarily multiplying
-the {\tt dimen\_} macro by {\sl factor}. More general resizing should be
-done by redefining {\tt dimen\_} as described in \SR{Circuitscaling:}.
-These two macros can be nested; the following scales the above example
-by 1.8, for example
+will resize the body of an element by temporarily multiplying
+the {\tt dimen\_} macro by {\sl factor} but
+\Mfour\ primitives can be employed instead as follows:
\par
-{\tt resized(1.8,`diode',right\_ 0.4);}
-{\tt resized(1.8,`reversed',`diode',right\_ 0.4)}
+{\tt pushdef(`dimen\_',dimen\_*({\sl factor})),%
+{\sl macro name}({\sl arguments}) popdef(`dimen\_')}
+\par
+\noindent
+More general resizing should be
+done by redefining {\tt dimen\_} globally as described in \SR{Circuitscaling:}.
+%These two macros can be nested; the following scales the above example
+%by 1.8, for example
+%\par
+%{\tt resized(1.8,`diode',right\_ 0.4);}
+%{\tt resized(1.8,`reversed',`diode',right\_ 0.4)}
Fuses are shown in \FR{Fuses}
and switches with numerous controls in \FR{Switches}.
@@ -1919,7 +1926,7 @@ using the macro
\par
\noindent
where the {\sl r, g, b} values are in the range 0 to 1
-(integers from 0 to 255 for \SVG) to specify the rgb color.
+to specify the rgb color.
This macro is a wrapper for the following, which may be more convenient
if many elements are to be given the same color:
@@ -2245,18 +2252,18 @@ which executes the given actions successively with
The {\tt examples.pdf} and {\tt examplesSVG.html}
documents include samplers of some of their uses.
- Writing macros for special elements is always an option but the SLD
- macros allow considerable scope for customization. Diagram-wide
- or block-scope changes are made by redefining
- environmental variables, particularly
+ The SLD macros allow considerable scope for
+ customization using key-value pairs to set internal parameters.
+ In addition, diagram-wide or block-scope changes are made as usual
+ by redefining environmental variables, particularly
{\tt linethick,} for example, and {\tt linewidth} for scaling.
Element body sizes are altered using, for example,
{\tt define(`dimen\_',dimen\_*1.2)} as for the normal circuit elements.
- To apply such a change to a single element, use
- {\tt pushdef(`dimen\_',{\sl expr})} {\sl element statements}
+ To apply such a change to a single element or a group of them,
+ use {\tt pushdef(`dimen\_',{\sl expr})} {\sl element statements}
{\tt popdef(`dimen\_').}
The SLD library also includes a number of redefinable default
-style parameters, which are currently:
+style parameters, which are currently as follows:
\begin{verbatim}
define(`sl_breakersize_',`dimen_*3/16') # breaker box size
define(`sl_breakersep_',`dimen_/2') # breaker separation from body
@@ -2270,14 +2277,15 @@ define(`sl_loadwid_',`dimen_*0.32') # load width
define(`sl_loadlen_',`dimen_*0.45') # load length
define(`sl_transcale_',1) # transformer body scale factor
define(`sl_busthick_',linethick*2) # sl_bus line thickness
-define(`sl_busindent_',`min(dimen_/5,rp_len/5)') # bus end extension
+define(`sl_busindent_',`min(dimen_/5,rp_len/5)') # busbar end indent
\end{verbatim}
- The macros also allow for extensive customization of individual
- elements using a key-value mechanism.
+%The macros also allow for extensive customization of individual
+%elements using a key-value mechanism.
The greatest control of appearance is obtained by drawing all
elements individually; however,
provision is made for automatically attaching circuit breakers
+ (which occur often)
and other symbols to elements.
\subsection{Two-terminal SLD elements\label{TwoTermSLD:}}
@@ -2320,6 +2328,13 @@ then, instead of a breaker,
an $n$-line slash symbol is drawn using the macro
{\tt sl\_slash(at {\sl position, keys,} [$n$:]R|L|U|D|{\sl degrees}).}
+The separation of the optional attached breaker or other stem elements from
+the body is controlled by the {\tt sl\_breakersep\_} global
+parameter. Adding {\tt sep={\sl expr}} to the body keys
+adjusts separations for an element; otherwise, adding
+this key to argument 3 or 4 adjusts the separation of
+the corresponding attached object.
+
Otherwise, one or more of the extensive {\tt sl\_ttbox} body
key-value pairs will insert a custom breaker as needed. These keys include:
{\tt lgth={\sl expr},
@@ -2380,7 +2395,9 @@ as necessary to customize and name the element head, of which the
default name is {\sl Head}.
The third argument controls the presence and type of the object in the stem
as for the two-terminal element breakers. The default breaker name is {\sl Br}
-and the default slash name is {\sl SL.}
+and the default slash name is {\sl SL,} and the separation from the head
+is specified using global {\tt sl\_breakersep\_} or the local
+{\tt sep={\sl expr}} parameters as for the two-terminal elements.
A stem of zero length is allowed when only the element head is needed.
Because a line segment of zero length has undefined direction, the
@@ -2448,7 +2465,18 @@ or the body-size parameter {\tt dimen\_.} For example, adding the line
\noindent%
after the {\tt cct\_init} line of {\tt quick.m4} produces slightly
-larger body sizes for all circuit elements. For logic elements, the
+larger body sizes for all circuit elements.
+
+For more localized resizing, use, for example,
+\par
+{\tt pushdef(`dimen\_',{\sl expression}) {\sl drawing commands}
+ popdef(`dimen\_')}
+\par
+\noindent
+(but ensure that the drawing commands have no net effect on the {\tt dimen\_}
+stack).
+
+For logic elements, the
equivalent to the {\tt dimen\_} macro is {\tt L\_unit}, which has
default value {\tt (linewid/10)}.
@@ -2570,6 +2598,7 @@ In the following,
two macros are defined to simplify the repeated drawing
of a series resistor and series inductor, and the macro {\tt tsection} defines
a subcircuit that is replicated several times to generate \FR{Tline}.
+\pagebreak
{\small \verbatiminput{Tline.m4}}
\begin{figure}[h!t]
% \ifpdf\vspace*{-\baselineskip}\fi%
@@ -3035,7 +3064,6 @@ the {\tt ifpstricks} macro in the second line of the diagram source) are
\hbox{}
-\pagebreak
Objects can be taylored to their attached text by invoking
\verb|\boxdims| and \verb|boxdim| explicitly.
The small source file in \FR{boxdims}, for example,
@@ -3121,17 +3149,24 @@ the rotation of text by \PSTricks postprocessing is illustrated by the file
which contains both horizontal text and text rotated $90^\circ$ along the
vertical line.
This rotation of text is also implemented by the macro
-{\tt rs\_boxs([angle={\sl expr};] {\sl text}[,{\sl expr, expr $\ldots$}])},
+{\tt rs\_boxs([angle={\sl degrees};] {\sl text}[,{\sl expr, expr $\ldots$}])},
which is similar
to {\tt s\_box} but rotates its argument by~$90^\circ,$ a default angle
that can be changed by preceding invocation with
\verb|define(`text_ang',|{\sl degrees}{\tt )}
-or by starting the first argument with {\tt angle={\sl expr};}.
+or by starting the first argument with {\tt angle={\sl degrees};}
+where {\sl degrees} is a decimal number (not an expression).
The {\tt rs\_box} macro
requires either \PSTricks or \TPGF and, like {\tt s\_box}, it calculates the
size of the resulting text box but requires the diagram to be
processed twice.
+The macro {\tt r\_text({\sl degrees, text,} at {\sl position})}
+works under \PSTricks, \TPGF, and \SVG, the last requiring
+processing twice. The {\sl degrees} argument is a decimal constant
+(not an expression) and the text is a simple string without quotes.
+The text box is not calculated.
+
Another common requirement is the filling of arbitrary shapes, as
illustrated by the following lines within a {\tt .m4} file:
@@ -3192,6 +3227,7 @@ The lines
\noindent\verb|\end{scope}%|
\vspace{\parsep}
+\pagebreak
This is accomplished, for example, by adapting the {\tt \bsl{}mtotex}
macro of \SR{Simplifications:} as follows:
@@ -3290,7 +3326,6 @@ as illustrated in \FR{Workflow} and in example files included with the
distribution. The \latex drawing commands alone or with {\tt eepic}
or {\tt pict2e} extensions are suitable only for simple diagrams.
-\pagebreak
\xection{Developer's notes\label{Developersnotes:}}
Years ago in the course of writing a book, I took a few days off to
write a \pic-like interpreter (\dpic) to eliminate the tedious coordinate
@@ -3321,7 +3356,7 @@ of lines. The learning curve of \pic\ compares well with other
possibilities, but some of the macros have become less readable as more
options and flexibility have been added, and if starting over today,
perhaps I would change some details. Compromises have been made in order
-to retain reasonable compatibility with the variety of postprocessors.
+to retain reasonable compatibility with the various postprocessors.
No choice of tool is without compromise, and producing good graphics
seems to be time consuming, no matter how it is done, but the payoff
can be worth the effort.
@@ -3370,10 +3405,13 @@ Many thanks to the people who continue to send comments, questions,
and, occasionally, bug fixes. What began as a tool for my own use changed
into a hobby that has persisted, thanks to your help and advice.
-\pagebreak
\xection{Bugs\label{Bugs:}}
This section provides hints and a list of common errors.
+First of all, be aware that old versions of \LaTeX, \dpic, and these
+macros are not always compatible. Updating an installation to current
+versions is often the way to eliminate mysterious error messages.
+
The distributed macros are not written for maximum robustness.
Macro arguments could be tested for correctness and
explanatory error messages could be written as necessary, but that
@@ -3391,7 +3429,6 @@ received.
\bflistitem}[2]{\phantomsection\pdfbookmark[subsection]{#1}{#2}{\bf #1: }}
\begin{enumerate}
-%\pagebreak
\item
\bflistitem{Misconfiguration}{misconfig}%
One of the configuration files
diff --git a/graphics/circuit_macros/doc/defines.tex b/graphics/circuit_macros/doc/defines.tex
index eb7d914fb2..dfcee2f91d 100644
--- a/graphics/circuit_macros/doc/defines.tex
+++ b/graphics/circuit_macros/doc/defines.tex
@@ -598,11 +598,12 @@
{macro for dimensioning diagrams;
{\sl arrowhead=}{\tt -> | <-}}
\macrodef{diode}{diode}{(\linespec,%
-B|CR|D|G|L|LE[R]|P[R]|S|Sh|T|U|V|v|w|Z|chars,%
+B|b|CR|D|G|L|LE[R]|P[R]|S|Sh|T|U|V|v|w|Z|chars,%
[R][E])}
{cct}
{diode:
{\tt B}=bi-directional,
+ {\tt b}=bi-directional with outlined zener crossbar,
{\tt CR}=current regulator,
{\tt D}=diac,
{\tt G}=Gunn,
@@ -1531,7 +1532,8 @@ elementspec}\char39,%
\macrodef{pushkeys\_}{pushkeys_}{({\sl string, key sequence})}
{gen}
{Multiple key-value definitions. Arg 2 is a semicolon-separated
- sequence of terms of the form {\tt {\sl key}:{\sl default value}:[N]}.
+ sequence of terms of the form {\tt {\sl key}:{\sl default value}:[N]}
+ which must contain no semicolons and the default values contain no colons.
Macro {\tt pushkey\_} is applied to each of the terms in order.
\seesect{Macroarguments:}}
\Letter{R}%
@@ -1603,14 +1605,13 @@ degrees})}
\macrodef{rgbdraw}{rgbdraw}{({\sl color triple}, {\sl drawing commands})}
{gen}
{color drawing for PSTricks, pgf, MetaPost, SVG postprocessors;
- (color entries are 0 to 1 except for SVG entries which are 0 to 255),
+ (color entries are 0 to 1),
see {\tt setrgb} \seesect{Semiconductors:}. Exceptionally, the color
of SVG arrows other than the default black has to be defined using the
{\tt outlined }{\sl string} and {\tt shaded }{\sl string} constructs.}
\macrodef{rgbfill}{rgbfill}{({\sl color triple}, {\sl closed path})}
{gen}
- {fill with arbitrary color (color entries are 0 to 1 except
- SVG entries which are 0 to 255); see {\tt
+ {fill with arbitrary color (color entries are 0 to 1); see {\tt
setrgb}\seesect{Semiconductors:}}
\macrodef{rgbstring}{rgbstring}{({\sl color triple or color name})}
{gen}
@@ -1629,9 +1630,12 @@ degrees})}
{Draw a right-angle symbol at {\sl Pos2}, of size
given by arg4. Arg5 =
line attributes, e.g., {\tt outlined "gray"}}
-\macrodef{r\_text}{s_text}{({\sl text},{\sl degrees})}
+\macrodef{r\_text}{r_text}{({\sl degrees},{\sl text},at {\sl position})}
{gen}
- {Rotate text by arg2 degrees (PSTricks, PGF, or SVG only).
+ {Rotate text by arg1 degrees (provides a single command for
+ PSTricks, PGF, or SVG only) placed at position in arg3.
+ The first argument is a decimal constant (not an expression) and
+ the text is a simple string without quotes.
\seesect{Interaction:}, \seesect{Pstricks:}}
\macrodef{rjust\_}{rjust_}{}
{gen}
@@ -1687,11 +1691,14 @@ degrees})}
\macrodef{rrot\_}{rrot_}{({\sl x, y, angle})}
{gen}
{\tt Here + vrot\_({\sl x, y, cos(angle), sin(angle))}}
-\macrodef{rs\_box}{rs_box}{([angle={\sl expr};]
+\macrodef{rs\_box}{rs_box}{([angle={\sl degrees};]
{\sl text},{\sl expr1},$\cdots$)}
{gen}
{like {\tt s\_box} but the text is rotated by {\tt text\_ang}
- (default 90) degrees. Two or more args are passed to {\tt sprintf()}.
+ (default 90) degrees, unless
+ the first argument begins with {\tt angle={\sl decimal number};},
+ in which case the number defines the rotation angle.
+ Two or more args are passed to {\tt sprintf()}.
If the first argument begins with {\tt angle={\sl expr};} then
the specified angle is used.
The examples {\tt define(`text\_ang',45); rs\_box(Hello World)} and
@@ -1800,8 +1807,7 @@ $\ldots$)}
name}])}
{gen}
{define colour for lines and text, optionally named (default
- {\tt lcspec});
- svg values are integers from 0 to 255\seesect{Semiconductors:}}
+ {\tt lcspec}); \seesect{Semiconductors:}}
\macrodef{setkey\_}{setkey_}{({\sl string, key, default,}[N])}
{gen}
{Key-value definition, like {\tt pushkey\_()} but the resulting
@@ -1976,6 +1982,7 @@ justification})}
{\tt scale={\sl expr} (default 1.0)};
{\tt grnd={\sl expr} attached ground at given angle
(type {\tt S} or {\tt N}))};
+ {\tt sep={\sl{}expr}};
{\tt stemlgth={\sl{}expr}};
{\tt wdth={\sl{}expr}};
{\tt direct=U|D|L|R|{\sl degrees}} (drawing direction).
@@ -1985,6 +1992,9 @@ justification})}
The {\tt L} (default) variant also defines internal labels
Internal labels {\sl L} and {\sl C} are included.
+ Key {\tt sep} is the type-{\tt S} separation from the head to the centre
+ of the slash symbol.
+
Key {\tt scale} allows scaling (default scale 1.0) but, with \dpic,
the {\tt scaled} directive can also be used.
\seesect{SingleLine:}}
diff --git a/graphics/circuit_macros/dpictools.pic b/graphics/circuit_macros/dpictools.pic
index fc3ec3f62c..66453a30e4 100644
--- a/graphics/circuit_macros/dpictools.pic
+++ b/graphics/circuit_macros/dpictools.pic
@@ -3,7 +3,7 @@
# m4 macro NeedDpicTools or the pic statement copy "HOMELIB_/dpictools.pic"
# when HOMELIB_ is defined or, generically, copy "<path>dpictools.pic"
-# Circuit_macros Version 9.8, copyright (c) 2022 J. D. Aplevich under #
+# Circuit_macros Version 9.9, copyright (c) 2022 J. D. Aplevich under #
# the LaTeX Project Public Licence in file Licence.txt. The files of #
# this distribution may be redistributed or modified provided that this #
# copyright notice is included and provided that modifications are clearly #
@@ -49,7 +49,6 @@ define testexpr { $1 = 0; [for i_testexpr=2 to $+ do {
# C-like loop. Commas in arg3 and arg4 must
# be in quotes or parentheses, e.g.,
# loop(i=1, i<=3, i+=1, print i) prints 1, 2, 3
-ld__ = 0
define loop {ld__+=1
$1
for lx__[ld__]=0 to 1 do {
@@ -167,8 +166,8 @@ define randn {
if "$3"=="" then { m_randn = 0 } else { m_randn = $3 }
if "$4"=="" then { s_randn = 1 } else { s_randn = $4 }
for i_randn=1 to n_randn by 2 do {
- loop( t_randn=2, t_randn >= 1, u_randn = 2*rand()-1; v_randn = 2*rand()-1
- t_randn = u_randn^2+v_randn^2 )
+ for done=0 to 1 do { u_randn=2*rand()-1; v_randn=2*rand()-1
+ t_randn = u_randn^2+v_randn^2; done=(t_randn<1) }
t_randn = sqrt( -2*loge(t_randn)/t_randn )
$1[i_randn] = u_randn*t_randn*s_randn+m_randn
if i_randn < n_randn then {
@@ -484,10 +483,14 @@ define lthick {(linethick bp__)}
if dpicopt==optSVG then { define px__ {*(scale/dpPPI)} } \
else { define px__ {*(scale/96)} } # Absolute pixels
-rtod_ = 57.295779513082323
-dtor_ = 0.017453292519943295
-twopi_ = 6.2831853071795862
-pi_ = twopi_/2
+define assign_dpicvars {
+ ld__ = 0
+ rtod_ = 57.295779513082323
+ dtor_ = 0.017453292519943295
+ twopi_ = 6.2831853071795862
+ pi_ = twopi_/2
+ $1
+ }
# Polar to rectangular conversion
define Rect_ {($1)*cos(($2)*dtor_),($1)*sin(($2)*dtor_)}
@@ -516,16 +519,16 @@ define dpshade { beginshade($1); $2; endshade } # like libgen shade()
# beginshade
if dpicopt==optPGF then {
define beginshade { if "$1"!="" then { dpshade_=$1 } else { dpshade_=0.5 }
- command "\global\let\dpicshdraw=\dpicdraw\global\def\dpicdraw{}"
- command "\global\def\dpicstop{--}"
- command sprintf("\dpicshdraw[fill=white!%g!black]",dpshade_*100) } } \
+ command "\global\let\dpicshdraw=\dpicdraw\global\def\dpicdraw{}"
+ command "\global\def\dpicstop{--}"
+ command sprintf("\dpicshdraw[fill=white!%g!black]",dpshade_*100) } } \
else { if dpicopt==optPSTricks then {
define beginshade { if "$1"!="" then { dpshade_=$1 } else { dpshade_=0.5 }
- command sprintf("\newgray{m4fillv}{%g}",dpshade_)
- command sprintf("\pscustom[fillstyle=solid,fillcolor=m4fillv]{%%") } } \
+ command sprintf("\newgray{m4fillv}{%g}",dpshade_)
+ command sprintf("\pscustom[fillstyle=solid,fillcolor=m4fillv]{%%") } } \
else { if dpicopt==optSVG then {
define beginshade { if "$1"!="" then { dpshade_=$1 } else { dpshade_=0.5 }
- command sprintf("<g fill=\"rgb(%g,%g,%g)\">",int(dpshade_*255+0.5),\
+ command sprintf("<g fill=\"rgb(%g,%g,%g)\">",int(dpshade_*255+0.5),\
int(dpshade_*255+0.5),int(dpshade_*255+0.5))} } }}
# endshade
@@ -550,6 +553,22 @@ else { if dpicopt==optSVG then {
#######################################################################
+assign_dpicvars()
# print " *** dpic: dpictools.pic processed"
define dpictools_ {1}
+ case(abs(dpicopt),
+ optMFpic := -abs(optMFpic),
+ optMpost := -abs(optMFpic),
+ optPDF := -abs(optPDF),
+ optPGF := -abs(optPGF),
+ optPict2e := -abs(optPict2e),
+ optPS := -abs(optPS),
+ optPSfrag := -abs(optPSfrag),
+ optPSTricks := -abs(optPSTricks),
+ optSVG := -abs(optSVG),
+ optTeX := -abs(optTeX),
+ opttTeX := -abs(opttTeX),
+ optxfig := -abs(optxfig) )
+ dpicopt := -abs(dpicopt)
+
# dpictools end
diff --git a/graphics/circuit_macros/examples/Diodes.m4 b/graphics/circuit_macros/examples/Diodes.m4
index d08a032253..bb34913822 100644
--- a/graphics/circuit_macros/examples/Diodes.m4
+++ b/graphics/circuit_macros/examples/Diodes.m4
@@ -16,6 +16,8 @@ movewid = 2pt__
move down 0.2; right_
{diode(,B) ; move ; "`{\tt diode(,B)}'" ljust}
move down 0.2; right_
+ {diode(,b) ; move ; "`{\tt diode(,b)}'" ljust}
+ move down 0.2; right_
{diode(,G) ; move ; "`{\tt diode(,G)}'" ljust}
move down 0.2; right_
{diode(,D) ; move ; "`{\tt diode(,D)}'" ljust}
@@ -39,13 +41,13 @@ movewid = 2pt__
{diode(,MK) ; move ; "`{\tt diode(,MK)}'" ljust}
}
- move right_ 2.0
+ move down_ sourcerad_ right_ 2.0
{ {diode(,Z,RE) ; move ; "`{\tt diode(,Z,RE)}'" ljust}
move down 0.30; right_
{diode(,U) ; move ; "`{\tt diode(,U)}'" ljust}
move down 0.25; right_
{diode(,T) ; move ; "`{\tt diode(,T)}'" ljust}
- move down 0.30; right_
+ move down 0.20; right_
{diode(,P) ; move ; "`{\tt diode(,P)}'" ljust}
move down 0.30; right_
{diode(,LE) ; move ; "`{\tt diode(,LE)}'" ljust}
diff --git a/graphics/circuit_macros/examples/ShadeSector.m4 b/graphics/circuit_macros/examples/ShadeSector.m4
new file mode 100644
index 0000000000..0632fdb14f
--- /dev/null
+++ b/graphics/circuit_macros/examples/ShadeSector.m4
@@ -0,0 +1,14 @@
+.PS
+# ShadedSector.m4
+# https://tex.stackexchange.com/questions/635327/multi-color-circular-gradient-in-tikz
+
+gen_init
+NeedDpicTools
+
+ rx = 4
+ n = int(rx/lthick)
+ for i=1 to n do { left_
+ hsvtorgb((1-i/n)*180,1,1,r,g,b)
+ arc rad i/n*rx with .c at (0,0) outlined rgbstring(r,g,b) }
+
+.PE
diff --git a/graphics/circuit_macros/examples/Shaky.m4 b/graphics/circuit_macros/examples/Shaky.m4
index 7eff994d91..81364cf515 100644
--- a/graphics/circuit_macros/examples/Shaky.m4
+++ b/graphics/circuit_macros/examples/Shaky.m4
@@ -5,7 +5,7 @@ NeedDpicTools
divert(-1)
`An attempt to draw shaky hand-drawn lines'
- `shakyline(linespec,type,shake=expr,[shakevals])
+ `shakyline(linespec,type,shake=val,[shakevals])
Draw a line with a tremor
arg3: shake parameter (default 1)
arg4=normal(0,1) perturbations used if given'
@@ -17,17 +17,18 @@ define(`shakyline',
End: L_end_
llen = distance(Start,End)
npts = round_(llen/linewid*4)
- setkey_($3,shake,1)
- if "$4"=="" then { randn(d,npts-1,0,m4shake*(llen/npts/8)) }\
- else { for i=1 to npts-1 do { d[i] = $4[i]*m4shake*(llen/npts/8) }}
+ pushkey_(`$3',shake,1)dnl
+ sval = m4shake*llen/npts/8
+ if "$4"=="" then { randn(d,npts-1,0,sval) }\
+ else { for i=1 to npts-1 do { d[i] = $4[i]*sval) }}
P[0]: Start
- for i=1 to npts-1 do { P[i]: i/npts between Start and End + (vec_(0,d[i])) }
+ for i=1 to npts-1 do { P[i]: i/npts between Start and End + vec_(0,d[i]) }
P[npts]: End
- spline $2 from P[0] to P[1]
- for i=2 to npts do { continue to P[i] }
+ spline ifdpic(ifelse(`$2',,ctension_)) $2 from P[0] to P[1]
+ for i=2 to npts do { continue to P[i] } popdef(`m4shake')
] with .Start at L_start_; move to L_end_')
- `shakyarc(arcspec,type,s=shake,[shakevals])
+ `shakyarc(arcspec,type,shake=val,[shakevals])
Draw an arc with a tremor
arg3: s=shake parameter (default 1)
arg4=normal(0,1) perturbations used if given'
@@ -44,99 +45,71 @@ define(`shakyarc',
ar = distance(Start,C)
llen = abs(ar*(ae-as))
npts = round_(llen/linewid*4)
- setkey_($3,s,1)
- if "$4"=="" then { randn(d,npts-1,0,m4s*(llen/npts/8)) }\
- else { for i=1 to npts-1 do { d[i] = $4[i]*m4s*(llen/npts/8) }}
+ pushkey_($3,shake,1)dnl
+ sval = m4shake*llen/npts/8
+ if "$4"=="" then { randn(d,npts-1,0,sval) }\
+ else { for i=1 to npts-1 do { d[i] = $4[i]*sval }}
P[0]: Start
for i=1 to npts-1 do { P[i]: C + (rect_(ar+d[i],as+i/npts*(ae-as))) }
P[npts]: End
- spline $2 from P[0] to P[1]
- for i=2 to npts do { continue to P[i] }
+ spline ifdpic(ifelse(`$2',,ctension_)) $2 from P[0] to P[1]
+ for i=2 to npts do { continue to P[i] } popdef(`m4shake')
] with .Start at last arc.start; move to last arc.end')
- `shakyspline(points,type,s=shake,[shakevals])
- Draw a spline with a tremor
- arg3: s=shake parameter (default 1)
- arg4=normal(0,1) perturbations used if given'
-define(`shakyspline',
-`rpoint_(ifelse(`$1',,`to rvec_(linewid,0)',`$1'))
- SP_start_: last line.start
- SP_end: last line.end
- [ Start: SP_start_
- End: SP_end
- llen = distance(Start,End)
- npts = round_(llen/linewid*4)
- setkey_($3,s,1)
- if "$4"=="" then { randn(d,npts-1,0,m4s*(llen/npts/8)) }\
- else { for i=1 to npts-1 do { d[i] = $4[i]*m4s*(llen/npts/8) }}
- P[0]: Start
- for i=1 to npts-1 do { P[i]: i/npts between Start and End + (vec_(0,d[i])) }
- P[npts]: End
- spline $2 from P[0] to P[1]
- for i=2 to npts do { continue to P[i] }
- ] with .Start at last line.start; move to last line.end')
-
`shakyfitcurve(V,n,linetype,
- m (default 0),s=val,[shakevals])
+ m (default 0),shake=val,[shakevals])
Like fitcurve but the control points
are perturbed
arg5: s=shake parameter (default 1)
arg6=normal(0,1) perturbations used if given'
define(`shakyfitcurve',`
- {[ m4fn = `$2'; m4fm = ifelse(`$4',,0,`$4')
- M4P_[0]: `$1'[m4fm]
- setkey_($5,s,1)
-# if "$6"=="" then { !!!!
-# else { for i=1 to npts-1 do { d[i] = $5[i]*m4s*(llen/npts/8) }}
- for i=m4fm+1 to m4fn-1 do { M4P_[i-m4fm]: `$1'[i]*(4/3) }
- M4P_[m4fn-m4fm]: `$1'[m4fn]
- n = m4fn-m4fm
- # forward substitution
- M4P_[1]: M4P_[1]-M4P_[0]/6
- d[1] = 1
- for i = 2 to n-1 do {
- M4P_[i]: M4P_[i]-M4P_[i-1]/(d[i-1]*6)
- d[i] = 1-1/d[i-1]/36 }
- # backward substitution
- for i= n-1 to 1 by -1 do {
- M4P_[i]: (M4P_[i]-M4P_[i+1]/6)/d[i] }
- # draw using computed control points
- spline 0.55 `$3' from M4P_[0] to 11/32 between M4P_[0] and M4P_[1] \
- then to 5/32 between M4P_[1] and M4P_[2]
- for i=2 to n-2 do { continue to M4P_[i] }
- continue to 27/32 between M4P_[n-2] and M4P_[n-1] \
- then to 21/32 between M4P_[n-1] and M4P_[n] then to M4P_[n]
- ] with .M4P_[0] at `$1'[ifelse(`$4',,0,`$4')]} ')
+ [ m4fn = ifelse(`$2',,2,`$2'); m4fm = ifelse(`$4',,0,`$4')
+ pushkey_($5,shake,1)dnl
+ if "$6"=="" then { randn(d,2*(m4fn-m4fm-1),0,m4shake) }\
+ else { for i=1 to 2*(m4fn-m4fm-1) do { d[i] = $6[i]*m4shake }}
+ M4PP_[0]: `$1'[m4fm]
+ for i=m4fm+1 to m4fn-1 do { M4PP_[i-m4fm]: `$1'[i] dnl
+ +(d[2*(i-m4fm-1)+1],d[2*(i-m4fm-1)+2])\
+ *distance(M4PP_[i-m4fm-1],`$1'[i])/16 }
+ M4PP_[m4fn-m4fm]: `$1'[m4fn]; End: M4PP_[m4fn-m4fm]
+ fitcurve(M4PP_,m4fn-m4fm) popdef(`m4shake')
+ ] with .M4PP_[0] at `$1'[ifelse(`$4',,0,`$4')]; move to last [].End ')
divert(0)
-[
+P1: [
linethick = 2.5
round(,,colored "gray")
nl = 10
for i=0 to nl do {
- shakyline(right 6/nl up 2*(2*pmod(i,2)-1),colored "gray",shake=2-i/nl*2)
+ shakyline(right 6/nl up 2*(2*pmod(i,2)-1),,shake=2)
{sprintf("%g",2-i/nl*2) at 1/2 between L_start_ and L_end_ }
round(,,colored "gray") }
]
-[
+P2: [
linethick = 2.5
na = 3
arcrad = 1
for i=1 to na do {
- shakyarc(,colored "gray",s=1)
+ shakyarc(,colored "gray",shake=2)
}
] with .nw at last [].sw +(0,-1)
-[
+P3: [
linethick = 2.5
na = 3
arcrad = 2
for i=1 to na do {
- shakyarc(,colored "gray",s=1)
+ shakyarc(,colored "gray",shake=2)
}
- ] with .sw at last [].se +(1,0)
+ ] with .w at last [].e +(1,0)
+P4: [
+ n = 0
+ for a=0 to 359 by 30 do { V[n]: (Rect_(1,a)); n+=1 }
+ V[n]: V[0]
+ shakyfitcurve(V,n,,,shake=1)
+ ] with .nw at P2.sw + (0,-0.5)
.PE
diff --git a/graphics/circuit_macros/examples/csc.m4 b/graphics/circuit_macros/examples/csc.m4
index 69b8d20c3c..fdf4b4404f 100644
--- a/graphics/circuit_macros/examples/csc.m4
+++ b/graphics/circuit_macros/examples/csc.m4
@@ -1,12 +1,11 @@
.PS
#.PS 3.5
# csc.m4
+# This file includes AntiqueClock and works for PSTricks, Tikz, and SVG
gen_init
NeedDpicTools
-ifelse(ifpstricks(T)`'ifmpost(T)`'ifpostscript(T)`'ifpgf(T),,
- `PSTricks, MetaPost, PGF, or Postscript required for this diagram',`
-skale = 3.5/3.97*0.9955
+skale = 0.878
circlerad=1.91*skale
hubrad=0.10*skale
s=0.5*skale
@@ -49,7 +48,6 @@ rgbdraw(midnight,
# Sail
thinlines_
- setrgb(midnight)
rgbfill(midnight,
line from coord(0.44,3.38) to coord(0.44,2.6) \
then to coord(2.1,-1.75) \
@@ -76,16 +74,18 @@ rgbdraw(midnight,
spline to coord(-1,-2.08) then to coord(0.55,-1.77)
)
]
-')
-# PSTricks or tikz only:
-ifelse(ifpstricks(T)`'ifpgf(T),T,`
+
Clock: [
+# PSTricks, tikz, or svg only:
+ifelse(ifpstricks(T)`'ifpgf(T)`'ifsvg(T),T,`
#.PS
# AntiqueClock.m4
#gen_init
#NeedDpicTools
iflatex(`latexcommand({\sf)')
+ifsvg(svg_font(font-family="sans-serif" font-stretch="condensed")
+ svg_rot_init(test))
# https://tex.stackexchange.com/questions/236923/generate-analog-clock-with-numbered-face-add-seconds-roman-numerals
@@ -127,17 +127,27 @@ define(`AntiqueHourHand',`[ hhsf = (`$1')/2.2
move to C
v = 0.25*hhsf
{ line to rvec_(1.1*hhsf,0) thick 0.15/(1bp__)*hhsf }
- { C1: circle rad v at rvec_(1.25*hhsf,0) fill_(0) }
+ C1: rvec_(1.25*hhsf,0)
d = `$1'-1.25*hhsf
q = 1bp__*hhsf
r1 = (d^2 + q^2 - v^2)/(v-q)/2
- h = r1+v
- shade(0,
- arc ccw from C1+vec_(d/h*v,(r1+q)/h*v) to \
- C1+vec_(d,q) rad r1 with .c at C1+vec_(d,r1+q)
- arc ccw from C1+vec_(d,-q) to C1+vec_(d/h*v,-(r1+q)/h*v) rad r1 \
- with .c at C1+vec_(d,-r1-q))
- ]')
+ tang = atan2((r1+q),d)
+ for i=0 to 3 do {
+ X[i]: C1+vec_(rect_(v, pi_+i/3*( tang-pi_)))
+ Y[i]: C1+vec_(rect_(v,-pi_+i/3*(-tang+pi_)))
+ }
+ n = 3
+ for i=1 to 4 do { aa = -pi_+tang + i/4*(pi_/2-tang)
+ XX: (d,r1+q)+(rect_(r1,aa))
+ n+=1;
+ X[n]: C1+vec_(XX.x, XX.y)
+ Y[n]: C1+vec_(XX.x,-XX.y)
+ }
+ m = n
+ for i= 0 to m do { n+=1; X[n]: Y[m-i] }
+ fitcurve(X,n,shaded rgbstring(0,0,0))
+ ]')
+
define(`AntiqueClock',`[ # h,m,s,diam
# Clock size parameters:
@@ -183,27 +193,34 @@ Face: circle thick 0 fill_(1) rad r3 at C
circle rad r6 at C
circle rad r7 at C
-# Text rotation for PSTricks or TikZ
- define(`rottext',
- `ifpstricks(`\rput[c]{%g}(0,0)',`ifpgf(`\pgftext[rotate=%g]',%g)')')
+# Ad hoc shift of rotated SVG text
+ ifsvg(`define adj {+(-cosd($`'1)*textht*0.5*sign(180-($`'1)),\
+ (0.25+0.25*cosd(2*($`'1)))*textht) }',
+ `define adj {}')
+
# Outer numbers
- command sprintf("\font\outerfont=cmss12 at %4.2fin",r3-r4)
- for mn = -15 to 15 by 5 do { sprintf("rottext{\outerfont %g}",\
- -mn/60*360,pmod(mn,60)) at C+(Rect_((r3+r4)/2,90-mn/60*360)) }
- for mn = 20 to 40 by 5 do { sprintf("rottext{\outerfont %g}",\
- 180-mn/60*360,mn) at C+(Rect_((r3+r4)/2,90-mn/60*360)) }
+ iflatex(`command sprintf("\font\outerfont=cmss12 at %4.2fin",r3-r4)')
+ ifsvg(`textht = (r3-r4)*0.6')
+ for_(-15,15,5,`aa=90-(m4x)*6
+ r_text(eval(-(m4x)*6),eval((m4x+60)%60),
+ at C+(Rect_((r3+r4)/2,aa)) adj(aa))')
+ for_(20,40,5,`aa=450-(m4x)*6
+ r_text(eval(180-m4x*6),m4x,at C+(Rect_((r3+r4)/2,aa)) adj(aa))')
# Outer tics
for mn = 1 to 60 do { t = 90-mn/60*360
line from C+(Rect_(r5,t)) to C+(Rect_(r4,t)) }
# Inner numbers
- command sprintf("\font\innerfont=cmss12 at %4.2fin",r5-r6)
- Loopover_(`mx',`t = (m4Lx-4)/12*360;
- sprintf("rottext{\scalebox{0.7}[1.0]{\innerfont mx}}",-t) \
- at C+(Rect_((r5+r6)/2,90-t))', IX,X,XI,XII,I,II,III)
- Loopover_(`mx',`t = (m4Lx+3)/12*360;
- sprintf("rottext{\scalebox{0.7}[1.0]{\innerfont mx}}",-t+180) \
- at C+(Rect_((r5+r6)/2,90-t))', IV,V,VI,VII,VIII)
+ iflatex(`command sprintf("\font\innerfont=cmss12 at %4.2fin",r5-r6)')
+ ifsvg(`textht = (r5-r6)*0.6')
+ Loopover_(`mx',`aa=180-(m4Lx-1)*30
+ r_text(eval(120-m4Lx*30),iflatex({\innerfont mx},mx),
+ at C+(Rect_((r5+r6)/2,aa)) adj(aa))',
+ IX,X,XI,XII,I,II,III)
+ Loopover_(`mx',`aa=360-m4Lx*30
+ r_text(eval(90-m4Lx*30), iflatex({\innerfont mx},mx),
+ at C+(Rect_((r5+r6)/2,aa)) adj(aa))',
+ IV,V,VI,VII,VIII)
# Inner tics
for mn = 5 to 60 by 5 do { t = 90-mn/60*360
@@ -216,15 +233,15 @@ Face: circle thick 0 fill_(1) rad r3 at C
# Center
dot(at C,0.1/4*r1,1)
- ]')
+ ]') `# AntiqueClock'
Clock1: AntiqueClock(,,,3.5)
# Clock2: AntiqueClock(4,50,07,2) at Clock1.e+(1.5,0)
iflatex(`latexcommand(}%)')
-
+ ifsvg(`command "</g>"')
#.PE
+',` "AntiqueClock.m4 requires PSTricks, Tikz-pgf, or SVG" ')
] with .sw at last [].se+(0.25,0)
-',` "AntiqueClock.m4 requires pstricks or pgf" ')
.PE
diff --git a/graphics/circuit_macros/examples/examples.pdf b/graphics/circuit_macros/examples/examples.pdf
index 7b89aac55c..dafab3e6a7 100644
--- a/graphics/circuit_macros/examples/examples.pdf
+++ b/graphics/circuit_macros/examples/examples.pdf
Binary files differ
diff --git a/graphics/circuit_macros/examples/files.tex b/graphics/circuit_macros/examples/files.tex
index 03c9ffa090..5fbcf50af8 100644
--- a/graphics/circuit_macros/examples/files.tex
+++ b/graphics/circuit_macros/examples/files.tex
@@ -99,7 +99,7 @@
\bfig{
{\small\centerline{\getpic{Xform}} }
- \caption{The transformer element, drawing direction down
+ \caption{Some variations of the transformer element, drawing direction down
\src{Xform.m4}.}
}
@@ -129,7 +129,7 @@
\bfig{
\centerline{\getpic{Relay}}
- \caption{Some variants of the {\tt relay} macro
+ \caption{Some variants of {\tt relay}
\src{Relay.m4}.}
}
@@ -667,7 +667,7 @@
\bfig{
\centerline{\getpic{Escher}}
- \caption{Two Escher-like objects
+ \caption{Penrose stairs and an Escher-like object
\src{Escher.m4}.}
}
diff --git a/graphics/circuit_macros/examples/ics.m4 b/graphics/circuit_macros/examples/ics.m4
index 98789b73cd..42286d5a8f 100644
--- a/graphics/circuit_macros/examples/ics.m4
+++ b/graphics/circuit_macros/examples/ics.m4
@@ -243,17 +243,17 @@ define(`HDMI_micro',`[
D0`$+$', D0\_SH, D0`$-$', CLK`$+$', CLK\_SH, CLK`$-$',
CEC, GND, SCL, SDA,$+${5}V)
line from Base.nw+(m4bwid*2/3-lg_pinsep,0) up plen
- r_text(21) at last line.c+(-5bp__,0)
- r_text(SH2) at last line.start + (0,-10bp__)
+ r_text(,21,at last line.c+(-5bp__,0))
+ r_text(,SH2,at last line.start + (0,-10bp__))
line from Base.nw+(m4bwid*2/3-2*lg_pinsep,0) up plen
- r_text(20) at last line.c+(-5bp__,0)
- r_text(SH1) at last line.start + (0,-10bp__)
+ r_text(,20,at last line.c+(-5bp__,0))
+ r_text(,SH1,at last line.start + (0,-10bp__))
line from Base.sw+(m4bwid*2/3-lg_pinsep,0) down plen
- r_text(23) at last line.c+(-5bp__,0)
- r_text(SH4) at last line.start + (0, 10bp__)
+ r_text(,23,at last line.c+(-5bp__,0))
+ r_text(,SH4,at last line.start + (0, 10bp__))
line from Base.sw+(m4bwid*2/3-2*lg_pinsep,0) down plen
- r_text(22) at last line.c+(-5bp__,0)
- r_text(SH3) at last line.start + (0, 10bp__)
+ r_text(,22,at last line.c+(-5bp__,0))
+ r_text(,SH3,at last line.start + (0, 10bp__))
#
`$4']')
diff --git a/graphics/circuit_macros/examples/mf/cct.mf b/graphics/circuit_macros/examples/mf/cct.mf
index 85a84e5a7f..10b713bb50 100644
--- a/graphics/circuit_macros/examples/mf/cct.mf
+++ b/graphics/circuit_macros/examples/mf/cct.mf
@@ -1,5 +1,5 @@
% cct.mf, generated by Mfpic, v1.10 2012/12/03,
-% from TeX source "font" on 2022/02/11 at 17:20
+% from TeX source "font" on 2022/07/27 at 16:40
numeric mfpicversion; mfpicversion := 110;
if unknown mode: mode := localfont; fi
if unknown mag: mag := 1000/1000; fi
diff --git a/graphics/circuit_macros/examples/sfg.m4 b/graphics/circuit_macros/examples/sfg.m4
index 9a97d828d5..a2efdb2ec6 100644
--- a/graphics/circuit_macros/examples/sfg.m4
+++ b/graphics/circuit_macros/examples/sfg.m4
@@ -14,7 +14,7 @@ T:[
sfgline(,K/M)
DDY2: sfgnode(,\ddot{y}_2,sfgbelow rjust)
sfgline(,s^{-1})
- DY2: sfgnode(,`\dot{y}_2=x_2',sfgbelow ljust)
+ DY2: sfgnode(,\d`'ot{y}_2=x_2,sfgbelow ljust) dnl dot is an m4 macro
sfgline(,s^{-1})
Y2: sfgnode(,y_2=x_1,sfgbelow ljust)
@@ -23,6 +23,7 @@ T:[
sfgarc(from Y2 to DDY2,-K/M,above,ccw,sf)
sfgarc(from Y2 to Y1,1,sfgabove,,sf)
]
+#showbox_(,"T")
# Graph 2
B: [
@@ -39,6 +40,7 @@ B: [
sfgself(at X1,R,\;a_{11},ljust,cw,1.5)
sfgself(at X2,-90,a_{22},sfgbelow)
] with .w at T.e + (linewid/2,-linewid/4)
+#showbox_(,"B")
# Graph 3
G3: [#sfg_init( 0.85,0.35/2 ) # change node spacing and increase node size
@@ -50,6 +52,7 @@ G3: [#sfg_init( 0.85,0.35/2 ) # change node spacing and increase node size
sfgarc(from N2 to N1,F_2,sfgabove,ccw,)
sfgarc(from N3 to N1,F_3,sfgbelow,ccw,1.4)
] with .nw at T.sw
+#showbox_(,"G3")
A: [#sfg_init( 0.75,0.15 )
sfg_wid = 0.75
@@ -65,6 +68,7 @@ A: [#sfg_init( 0.75,0.15 )
sfgself(at R,-90,e,sfgabove,cw)
arrow right linewid*2/3 from R.e
] with .w at G3.e+(linewid/2,0)
+#showbox_(,"A")
G4: [sfg_init( 2.0,0.25/2 ) # change node spacing and increase node size
s1 = 0.9
@@ -85,6 +89,33 @@ G4: [sfg_init( 2.0,0.25/2 ) # change node spacing and increase node size
sfgline(right_ sfg_wid/2,\nu+3\lambda,below,->)
{"$\ldots$" wid 0.3 ljust}
] with .nw at G3.sw+(0,-0.15)
+#showbox_(,"G4")
+
+# https://tex.stackexchange.com/questions/637455/tikz-how-to-set-exact-position-of-node
+G5: [sfg_init( 1.75,0.25/2 ) # change node spacing and increase node size
+ Dstar: sfgnode(,*)
+ D0: sfgnode(at Dstar+(2,0),\diamond_0)
+ sfgline(,`1-r_{x{-}1,x}-q^i_{x{-}1,x}',,->)
+ Ddots: sfgnode(,\cdots)
+ sfgline(,`1-r_{x{-}4,x}-q^i_{x{-}4,x}',,->)
+ D5: sfgnode(,\diamond_5)
+ DD: sfgnode(at D0+(0,-1.0),\dagger)
+ sfgself(at Dstar,L,,,,0.5)
+ "$`1-i_x-q^a_x'$" wid 45bp__ at Dstar + (-0.3,0.25)
+ sfgself(at DD,D,1\mathstrut,above_,,0.5)
+ sfgself(at D5,R,,,,0.5)
+ "$`1-q^i_x-r_x'$" wid 47bp__ at D5 + (0.3,0.25)
+ sfgarc(from D0 to Dstar ->,`r_{x,x}\mathstrut',below_,ccw)
+ sfgarc(from Dstar to D0 ->,`i_x\mathstrut',above_,ccw)
+ sfgarc(from Dstar to DD ->,`q^a_x\mathstrut',above_ ljust_,ccw)
+ sfgline(from D0 to DD,`\;q^i_{x,x}',ljust,->)
+ sfgarc(from Ddots to Dstar,`r_{j,x}\mathstrut',below_,ccw,,->)
+ sfgarc(from Ddots to DD ->,`q^i_{x{-}j,x}\mathstrut',above_ rjust_,)
+ sfgarc(from D5 to Dstar ->,`r_x\mathstrut',below_,ccw)
+ sfgarc(from D5 to DD ->,`q^i_x\mathstrut',above_ rjust_,)
+ ] with .nw at G4.sw+(0,-0.15)
+#howbox_(,"G5")
+
move from (T.w,G4.s)-(7bp__,6bp__) to B.ne+(15bp__,6bp__)
]
#showbox_
diff --git a/graphics/circuit_macros/examples/svg/DiodesSVG.m4 b/graphics/circuit_macros/examples/svg/DiodesSVG.m4
index 543132fe33..8af6a2e298 100644
--- a/graphics/circuit_macros/examples/svg/DiodesSVG.m4
+++ b/graphics/circuit_macros/examples/svg/DiodesSVG.m4
@@ -15,6 +15,8 @@ movewid = 2pt__
move down 0.2; right_
{diode(,B) ; move ; "`diode(,B)'" ljust}
move down 0.2; right_
+ {diode(,b) ; move ; "`diode(,b)'" ljust}
+ move down 0.2; right_
{diode(,G) ; move ; "`diode(,G)'" ljust}
move down 0.2; right_
{diode(,D) ; move ; "`diode(,D)'" ljust}
@@ -38,8 +40,8 @@ movewid = 2pt__
{diode(,MK) ; move ; "`diode(,MK)'" ljust}
}
- move right_ 2.0
-{ {diode(,Z,RE) ; move ; "`diode(,Z,RE)'" ljust}
+ move down_ sourcerad_ right_ 2.0
+{ {diode(,Z,RE) ; move ; "`diode(,Z,RE)'" wid 70bp__ ljust}
move down 0.25; right_
{diode(,T) ; move ; "`diode(,T)'" ljust}
move down 0.30; right_
diff --git a/graphics/circuit_macros/examples/svg/GeometrySVG.m4 b/graphics/circuit_macros/examples/svg/GeometrySVG.m4
index de5fc62523..576315d285 100644
--- a/graphics/circuit_macros/examples/svg/GeometrySVG.m4
+++ b/graphics/circuit_macros/examples/svg/GeometrySVG.m4
@@ -2,98 +2,9 @@
# Geometry.m4
# Some constructions from https://tex.stackexchange.com/
gen_init
+maxpswid = 9
-Fig1: [ ls = 2/3 # local scale
- A: Here; "A" at A above
- B: A+(-1*ls,-3.5*ls); "B" at B below rjust
- C: B+(4.6*ls,0); "C" at C below ljust
- AB: line from A to B
- BC: line from B to C
- CA: line from C to A
-
- perpto(A,BC,L); "L" at L below
- AL: line from A to L; RightAngle(A,L,C)
-
- angleLAC = atan2(C.x-L.x,A.y-L.y)
- S: move from A to (sin(angleLAC/2),-cos(angleLAC/2))
- AW: line from A to Intersect_(S,BC)
- W: Here; "W" at W below rjust
-
- perpto(C,AB,N); "N" at N above rjust
- CN: line from C to N; RightAngle(C,N,B)
-
- perpto(B,CA,M); "M" at M above
- CM: line from B to M; RightAngle(B,M,C)
-
- H: Intersect_(CN,AL); "H" at H +(4bp__,10bp__)
-
- thinlines_
- Equidist3(B,L,N,CC1,c1rad); C1: circle rad c1rad at CC1
- Equidist3(B,W,N,CC2,c2rad); C2: circle rad c2rad at CC2
- Equidist3(B,C,N,CC3,c3rad); C3: circle rad c3rad at CC3
- Equidist3(W,C,M,CC4,c4rad); C4: circle rad c4rad at CC4
- thicklines_
-
- Z: LCintersect(AW,CC2,C2.rad); "Z" at Z+(-5bp__,-5bp__)
- HZ: move from H to Z
- Y: LCintersect(HZ,CC4,C4.rad,R); "Y" at Y above
- X: LCintersect(HZ,CC2,C2.rad); "X" at X above rjust
-
- Loopover_(`P',`dot(at P)',X,Y,Z)
-
- line dashed from X to Y chop -linewid/2
- RightAngle(A,Z,Y)
- ]
-
-Fig2: [ ls = 3/4 # local scale
-# https://tex.stackexchange.com/questions/593272/drawing-complex-geometry
- P: dot(at Here); "P" at P.s below
- N: dot(at P+(3.5*ls,1.5*ls)); "N" at N.se ljust below
- O: dot(at (N,P)); "O" at O.s below
- R: dot(at 1/3 between O and P);"R" at R.s below
- M: dot(at (R,N)); "M" at M.se ljust below
- Q: dot(at (M.x,M.y+distance(M,N)/distance(N,O)*distance(P,O)));"Q" at Q.e ljust
- line from P to Q then to N then to O
- B: line to P chop -0.3
- line from M to N
- Pu: line from R to Q chop 0 chop -0.3
- H: line from P to N chop 0 chop -0.3
- X: dot(at Intersect_(Pu,H)); "X" at X.se ljust below
- thinlines_
- RightAngle(Q,M,N)
- RightAngle(Q,N,H.end)
- RightAngle(N,O,B.start)
- ArcAngle(N,P,Q,0.4); "svg_beta" at last arc.ne above ljust
- ArcAngle(O,P,N,0.5); "svg_alpha" at last arc.start+(5bp__,8bp__)
- ArcAngle(R,Q,N,0.5); "svg_alpha" at last arc.start+(8bp__,-5bp__)
- ] with .w at Fig1.e+(-0.4,0)
-
-Fig3: [
-# FourbarSVG.m4
-# https://tex.stackexchange.com/questions/609452/help-drawing-a-more-sophisticated-right-triangle-with-tikz-or-something-else
-
- textkht = 12/72
- unit = 0.6
- C: Here; { "C" at C rjust below }
- B: C+(4*unit,0); { "B" at B ljust below }
- A: C+(0,3*unit); { "A" at A rjust above }
- H: PerpTo(C,A,B); { "H" at H ljust above }
- line from C to H then to B then to C shaded rgbstring(0.5,0.8,0.9)
-# line from C to H then to B then to C shaded "CornflowerBlue"
- line from C to H then to A then to C shaded rgbstring(0.8,0.9,0.7)
-# line from C to H then to A then to C shaded "SpringGreen"
- ArcAngle(C,A,B,unit*0.4)
- ArcAngle(C,A,B,unit*0.5)
- ArcAngle(A,B,C,unit*0.5,,"svg_theta" rjust)
- ArcAngle(B,C,H,unit*0.5); {"svg_theta" at C+(unit*0.3,unit*0.17) }
- ArcAngle(B,C,A,unit*0.6)
- RightAngle(B,C,A,unit*0.17)
- RightAngle(C,H,A,unit*0.17)
-
- ] with .nw at Fig1.sw+(0.2,-0.3)
-
-Fig4: [
-
+Fig1: [
# FourbarSVG.m4
# https://tex.stackexchange.com/questions/563831/how-to-draw-four-bar-linkage-with-center-of-mass
ls = 1/25.4 # local scale
@@ -149,7 +60,95 @@ define(`pivot',`[
line from A0+(3*ls,0) right 8*ls
ArcAngle(Here,A0,B1,9*ls) ->; "svg_theta`'svg_sub(0)" \
at last arc.start+(2,2)*ls
+ ]
+
+Fig2: [
+# FourbarSVG.m4
+# https://tex.stackexchange.com/questions/609452/help-drawing-a-more-sophisticated-right-triangle-with-tikz-or-something-else
+
+ textkht = 12/72
+ unit = 0.6
+ C: Here; { "C" at C rjust below }
+ B: C+(4*unit,0); { "B" at B ljust below }
+ A: C+(0,3*unit); { "A" at A rjust above }
+ H: PerpTo(C,A,B); { "H" at H ljust above }
+ line from C to H then to B then to C shaded rgbstring(0.5,0.8,0.9)
+# line from C to H then to B then to C shaded "CornflowerBlue"
+ line from C to H then to A then to C shaded rgbstring(0.8,0.9,0.7)
+# line from C to H then to A then to C shaded "SpringGreen"
+ ArcAngle(C,A,B,unit*0.4)
+ ArcAngle(C,A,B,unit*0.5)
+ ArcAngle(A,B,C,unit*0.5,,"svg_theta" rjust)
+ ArcAngle(B,C,H,unit*0.5); {"svg_theta" at C+(unit*0.3,unit*0.17) }
+ ArcAngle(B,C,A,unit*0.6)
+ RightAngle(B,C,A,unit*0.17)
+ RightAngle(C,H,A,unit*0.17)
+ ] with .nw at Fig1.sw+(0.2,0)
+
+
+Fig3: [ ls = 3/4 # local scale
+# https://tex.stackexchange.com/questions/593272/drawing-complex-geometry
+ P: dot(at Here); "P" at P.s below
+ N: dot(at P+(3.5*ls,1.5*ls)); "N" at N.se ljust below
+ O: dot(at (N,P)); "O" at O.s below
+ R: dot(at 1/3 between O and P);"R" at R.s below
+ M: dot(at (R,N)); "M" at M.se ljust below
+ Q: dot(at (M.x,M.y+distance(M,N)/distance(N,O)*distance(P,O)));"Q" at Q.e ljust
+ line from P to Q then to N then to O
+ B: line to P chop -0.3
+ line from M to N
+ Pu: line from R to Q chop 0 chop -0.3
+ H: line from P to N chop 0 chop -0.3
+ X: dot(at Intersect_(Pu,H)); "X" at X.se ljust below
+ thinlines_
+ RightAngle(Q,M,N)
+ RightAngle(Q,N,H.end)
+ RightAngle(N,O,B.start)
+ ArcAngle(N,P,Q,0.4); "svg_beta" at last arc.ne above ljust
+ ArcAngle(O,P,N,0.5); "svg_alpha" at last arc.start+(5bp__,8bp__)
+ ArcAngle(R,Q,N,0.5); "svg_alpha" at last arc.start+(8bp__,-5bp__)
+ ] with .sw at Fig2.e+(-0.4,-0.7)
+
+Fig4: [ ls = 2/3 # local scale
+ A: Here; "A" at A above
+ B: A+(-1*ls,-3.5*ls); "B" at B below rjust
+ C: B+(4.6*ls,0); "C" at C below ljust
+ AB: line from A to B
+ BC: line from B to C
+ CA: line from C to A
+
+ perpto(A,BC,L); "L" at L below
+ AL: line from A to L; RightAngle(A,L,C)
+
+ angleLAC = atan2(C.x-L.x,A.y-L.y)
+ S: move from A to (sin(angleLAC/2),-cos(angleLAC/2))
+ AW: line from A to Intersect_(S,BC)
+ W: Here; "W" at W below rjust
+
+ perpto(C,AB,N); "N" at N above rjust
+ CN: line from C to N; RightAngle(C,N,B)
- ] with .nw at Fig3.ne+(0.2,0.2)
+ perpto(B,CA,M); "M" at M above
+ CM: line from B to M; RightAngle(B,M,C)
+
+ H: Intersect_(CN,AL); "H" at H +(4bp__,10bp__)
+
+ thinlines_
+ Equidist3(B,L,N,CC1,c1rad); C1: circle rad c1rad at CC1
+ Equidist3(B,W,N,CC2,c2rad); C2: circle rad c2rad at CC2
+ Equidist3(B,C,N,CC3,c3rad); C3: circle rad c3rad at CC3
+ Equidist3(W,C,M,CC4,c4rad); C4: circle rad c4rad at CC4
+ thicklines_
+
+ Z: LCintersect(AW,CC2,C2.rad); "Z" at Z+(-5bp__,-5bp__)
+ HZ: move from H to Z
+ Y: LCintersect(HZ,CC4,C4.rad,R); "Y" at Y above
+ X: LCintersect(HZ,CC2,C2.rad); "X" at X above rjust
+
+ Loopover_(`P',`dot(at P)',X,Y,Z)
+
+ line dashed from X to Y chop -linewid/2
+ RightAngle(A,Z,Y)
+ ] with .w at Fig3.e+(-0.4,0.8)
.PE
diff --git a/graphics/circuit_macros/examples/svg/LoglogSVG.m4 b/graphics/circuit_macros/examples/svg/LoglogSVG.m4
index 37e6d746c6..b010b7bd41 100644
--- a/graphics/circuit_macros/examples/svg/LoglogSVG.m4
+++ b/graphics/circuit_macros/examples/svg/LoglogSVG.m4
@@ -88,7 +88,7 @@ Cons: [
#gen_init
svg_font(Helvetica,10pt__)
-#svg_rot_init(test)
+#vg_rot_init(test)
svg_rot_init(LoglogSVG)
divert(-1)
@@ -519,7 +519,7 @@ Left: line from dtop(yearmin,tonsmin) to dtop(yearmin,tonsmax)
move to dtop(yearmin,y)
if y<2 then {{ line right htic }}
sprintf("%g",y) wid 5bp__ rjust }
- svg_rot(90,"Tonnes of oil equivalent per capita" at Left-(0.3,0))
+ svg_rot(90,"Tonnes of oil equivalent per capita",at Left-(0.3,0))
Right: line from dtop(yearmax,tonsmin) to dtop(yearmax,tonsmax)
for p=0 to popmax do {
@@ -585,16 +585,16 @@ Cl: "Coal" wid 20bp__ at dtop(2000,0.36+3pt__)
"Oil" wid 15bp__ at dtop(2000,0.9)
"Gas" wid 20bp__ at dtop(2000,1.41)
"Wood" wid 20bp__ at dtop(1889,0.15)
- svg_rot(50,"Population" at dtop(1975,0.9))
+ svg_rot(50,"Population",at dtop(1975,0.9))
brpos = 2017
Q: brace(down_ 2.96 with .c at dtop(brpos,1.03))
- svg_rot(90,"90 %" at Q.c+(15bp__,2bp__))
- svg_rot(90,"nonrenewable" at Q.c+(26bp__,2bp__))
+ svg_rot(90,"90 %",at Q.c+(15bp__,2bp__))
+ svg_rot(90,"nonrenewable",at Q.c+(26bp__,2bp__))
R: brace(down_ 0.28 with .c at dtop(brpos,.09))
[svg_rot(90,"10 %")] ht 15bp__ wid 10bp__ at R.c+(15bp__,4bp__)
- svg_rot(90,"renewable" at R.c+(26bp__,17bp__))
+ svg_rot(90,"renewable",at R.c+(26bp__,17bp__))
linethick_(0.6)
arrow <- from dtop(1998,1.55) left 0.15 up 0.2
diff --git a/graphics/circuit_macros/examples/svg/Makefile b/graphics/circuit_macros/examples/svg/Makefile
index 0b01e8bc61..c3144811dc 100644
--- a/graphics/circuit_macros/examples/svg/Makefile
+++ b/graphics/circuit_macros/examples/svg/Makefile
@@ -75,9 +75,9 @@ CCTSVG = \
ex01SVG.svg ex02SVG.svg ex03SVG.svg ex04SVG.svg ex05SVG.svg ex06SVG.svg \
ex08SVG.svg ex09SVG.svg ex10SVG.svg ex11SVG.svg ex12SVG.svg \
ex15SVG.svg ex16SVG.svg ex17SVG.svg ex18SVG.svg ex21SVG.svg \
- expSVG.svg fetSVG.svg graysurfSVG.svg lcctSVG.svg \
+ expSVG.svg fetSVG.svg graysurfSVG.svg keyboardSVG.svg lcctSVG.svg \
pwrsupplySVG.svg quickSVG.svg randomSVG.svg recycleSVG.svg relaycoilSVG.svg \
- roseSVG.svg sfgSVG.svg shapesSVG.svg paletteSVG.svg \
+ roseSVG.svg sfgSVG.svg shapesSVG.svg SmithchartSVG.svg paletteSVG.svg \
thyristorSVG.svg ujtSVG.svg UNOSVG.svg wormSVG.svg XORSVG.svg Np.svg
examplesSVG.html: examplesSVG.htmx
@@ -114,14 +114,14 @@ tstSVG.html: tstSVG.htmx $(TEST).svg
xst: Incleps.png
# necessary because of rotated text:
-LoglogSVG.svg test.svg:
+LoglogSVG.svg:
m4 $(M4LIBS) $*.m4 | sed -e '/^\%/d' > $*.pic
$(DPIC) -v $*.pic > $*.svg
m4 $(M4LIBS) $*.m4 | sed -e '/^\%/d' > $*.pic
$(DPIC) -v $*.pic > $*.svg
grep '<\!-- width' $*.svg | sed -e 's%<\!-- *%%' -e 's% *-->%%' > $*.siz
-ConnectorsSVG.svg cscSVG.svg test.svg:
+ConnectorsSVG.svg cscSVG.svg SmithchartSVG.svg test.svg:
m4 $(M4LIBS) $*.m4 | sed -e '/^\%/d' > $*.pic
$(DPIC) -v $*.pic > $*.svg
m4 $(M4LIBS) $*.m4 | sed -e '/^\%/d' > $*.pic
diff --git a/graphics/circuit_macros/examples/svg/PconnSVG.m4 b/graphics/circuit_macros/examples/svg/PconnSVG.m4
index 43fb2d20eb..7cef1f5619 100644
--- a/graphics/circuit_macros/examples/svg/PconnSVG.m4
+++ b/graphics/circuit_macros/examples/svg/PconnSVG.m4
@@ -45,14 +45,11 @@ P2: [
`"(,GC)"' at last [].s below
C12: pconnex(,GCF) with .w at last [].e + (0.2,0)
`"(,GCF)"' at last [].s below
-] with .nw at P1.C1.sw + (0,-0.35)
-
-P3:[
- C4: pconnex(,P)
+ C4: pconnex(,P) with .w at last [].e + (0.2,0)
`"(,P)"' at last [].s below
C11: pconnex(,PF) with .w at last [].e+(0.2,0)
`"(,PF)"' at C11.s below
-] with .nw at P2.C9.sw + (0,-0.35)
+] with .nw at P1.C1.sw + (0,-0.35)
command "</g>" # end font
diff --git a/graphics/circuit_macros/examples/svg/SmithchartSVG.m4 b/graphics/circuit_macros/examples/svg/SmithchartSVG.m4
new file mode 100644
index 0000000000..eb47e6585e
--- /dev/null
+++ b/graphics/circuit_macros/examples/svg/SmithchartSVG.m4
@@ -0,0 +1,222 @@
+.PS
+# Smithchart.m4
+gen_init
+#https://utah.instructure.com/courses/684846
+#https://www.youtube.com/watch?v=RptPsP8hS4g
+#https://www.youtube.com/watch?v=UUk1R01uEoE
+##https://www.youtube.com/watch?v=TsXd6GktlYQ
+
+scalefactor = 6.5/2 # to vary the final chart diameter
+scalefactor = 6.5/2*3/4 # 3/4 scale for svg examples
+# Basic definitions
+define Rac {($1/($1+1),0)*scalefactor} # centre of const ra circle
+define rar {1/abs($1+1)*scalefactor} # radius
+define Xac {(1,1/($1))*scalefactor} # centre of const xa circle
+define xar {1/abs($1)*scalefactor} # radius
+define Rc {CRc[$1*100]} # Rc circle indexed by value
+define Xc {CXc[$1*100]} # Xc circle indexed by value
+define grayline {outlined graystring($1)}
+define arct {arc thick $1}
+
+# `SGamma(ra,xa) chart location of complex value'
+define(`SGamma',`(ifelse(`$2',0,`Rc($1).w',
+ `Cintersect(Rac(`$1'),rar(`$1'),Xac(`$2'),xar(`$2'), dnl
+ ifelse(substr(`$2',0,1),-,R))'))')
+# 1-piece Ra arc
+define(`RaArc1',`ifinstr(`$1',to,for ix=`$1' do,ix=`$1';) {
+ Rc(ix): arct(`$2') grayline(`$2'g) dnl
+ from SGamma(ix,`$3') to SGamma(ix,-(`$3')) with .c at Rac(ix)}')
+# 2-piece Ra arc
+define(`RaArc2',`ifinstr(`$1',to,for ix=`$1' do,ix=`$1';) {
+ Rc(ix): arct(`$2') grayline(`$2'g) dnl
+ from SGamma(ix,`$3') to SGamma(ix,`$4') with .c at Rac(ix)
+ arct(`$2') grayline(`$2'g) dnl
+ from SGamma(ix,-(`$4')) to SGamma(ix,-(`$3')) with .c at Rac(ix)}')
+# Positive and negative Xa arcs
+define(`XaArc2',`ifinstr(`$1',to,for ix=`$1' do,ix=`$1';) {
+ Xc(ix): arct(`$2') grayline(`$2'g) dnl
+ from SGamma(`$3',ix) to SGamma(`$4',ix) with .c at Xac(ix)
+ Xc(-ix): arct(`$2') grayline(`$2'g) dnl
+ cw from SGamma(`$3',-ix) to SGamma(`$4',-ix) with .c at Xac(-ix)}')
+
+define(`Smithchart',`[
+iflatex(s_init(tst)
+ command "{\tiny")
+ifsvg(svg_font(sans-serif,10bp__)
+ svg_rot_init(SmithchartSVG))
+
+ thk = 1.2 # wicth of thick lines (pt)
+ thn = 0.4 # thin lines
+ thkg = 0.33 # weight of thick lines
+ thkg =0.5
+ thng = 0.4 # weight of thin lines
+ thng = 0.6
+
+C: circle thick thk rad rar(0) at (0,0)
+ line thick thk grayline(thkg) from C.w to C.e
+
+Rc(50): circle thick thk grayline(thkg) rad rar(50) at Rac(50)
+Loopover_(`term',`RaArc1(patsubst(term,:,`,'))',
+ 20:thn:50,
+ 30 to 40 by 10:thn:50,
+ 20:thk:20,
+ 12 to 18 by 2:thn:20,
+ 10:thn:50,
+ 10:thk:20,
+ 6 to 9:thn:10,
+ 5:thk:10,
+ 2.2 to 4.81 by 0.2:thn:5,
+ 4:thn:20,
+ 4:thk:5,
+ 3:thn:10,
+ 3:thk:5,
+ 2:thn:20,
+ 2:thk:5,
+ 1.1 to 1.91 by 0.2:thn:2,
+ 1.2 to 2.01 by 0.2:thk:2,
+ 1:thn:10,
+ 1:thk:5,
+ 0.2 to 1.81 by 0.2:thn:5,
+ 0.2 to 0.81 by 0.2:thk:2,
+ 0.6 to 0.91 by 0.1:thk:1,
+ 0.55 to 0.951 by 0.1:thn:1,
+ 0.1 to 0.91 by 0.2:thn:2,
+ 0.1 to 0.91 by 0.2:thk:1,
+ 0.22 to 0.481 by 0.02:thn:0.5,
+ 0.01 to 0.191 by 0.01:thn:0.2,
+ 0.05 to 0.151 by 0.1:thk:0.2)
+
+Loopover_(`term',`RaArc2(patsubst(term,:,`,'))',
+ 0.05 to 0.451 by 0.1:thn:1:0.5,
+ 0.02 to 0.181 by 0.02:thn:0.5:0.1)
+
+Xc(50): arct(thk) cw grayline(thkg) from C.e \
+ to SGamma(0,50) with .c at Xac(50)
+Xc(-50): arct(thk) grayline(thkg) from C.e \
+ to SGamma(0,-50) with .c at Xac(-50)
+
+Loopover_(`term',`XaArc2(patsubst(term,:,`,'))',
+ 10 to 20 by 10:thn:0:50,
+ 7 to 9 by 2:thn:0:10,
+ 2 to 18 by 2:thn:0:20,
+ 0.2 to 4.81 by 0.2:thn:0:5,
+ 1.1 to 1.91 by 0.2:thn:0:2,
+ 1 to 4:thn:0:10,
+ 0.1 to 0.91 by 0.2:thn:0:2,
+ 0.22 to 0.481 by 0.02:thn:0:0.5,
+ 0.55 to 0.951 by 0.1:thn:0:1,
+ 10 to 20 by 10:thk:0:20,
+ 5:thk:0:10,
+ 1.2 to 1.81 by 0.2:thk:0:2,
+ 1 to 4:thk:0:5,
+ 0.2 to 0.81 by 0.2:thk:0:2,
+ 0.1 to 0.91 by 0.2:thk:0:1)
+
+Loopover_(`term',`XaArc2(patsubst(term,:,`,'))',
+ 0.05 to 0.451 by 0.1:thn:0.5:1,
+ 0.02 to 0.181 by 0.02:thn:0:0.5,
+ 0.02 to 0.191 by 0.01:thn:0:0.2, dnl 0.02 should be 0.01
+ 0.05 to 0.151 by 0.1:thk:0:0.2)
+dnl these avoid TeX arithmetic overflow:
+ line thick thn grayline(thng) from SGamma(0,0.01) to SGamma(0.2,0.01)
+ line thick thn grayline(thng) from SGamma(0,-0.01) to SGamma(0.2,-0.01)
+ dot(at C,,1,grayline(thkg))
+
+dnl Internal labels start here
+ textht = C.wid/120
+# Horizontal axis
+Loopover_(`t',`box wid textht ht textht*1.5 colored "white" \
+ with .se at Rc(t).w+(-2bp__,2bp__)
+ r_text(90,"t",at Rc(t).w+(-textht/3,textht*1.5))',
+ 0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9, 1,1.2,1.4,1.6,1.8, 2,3,4,5,10,20,50)
+# Xc=1 labels
+Loopover_(`tt',
+ `define(`m4ta',patsubst(tt,:.*))define(`m4vl',patsubst(tt,.*:))dnl
+ X: SGamma(m4vl,1)
+ M: move from Rc(m4vl) to X; ax = lin_ang(M)*rtod_-90 #; print ax
+ r_text(m4ta,m4vl,at X+(Rect_(textht*2,ax+30)))
+ Y: X-Rc(m4vl); X: Rc(m4vl)+(Y.x,-Y.y)
+ r_text(-m4ta,m4vl,at X+(Rect_(textht*1.7,-(ax+30)))) ',
+ 10:0.2, 19:0.4, 26:0.6, 32:0.8, 37:1)
+# right-side circumference
+Loopover_(`tt',
+ `define(`m4ta',patsubst(tt,:.*))define(`m4vl',patsubst(tt,.*:))dnl
+ X: Xc(m4vl).start; ax = atan2(X.y,X.x)*rtod_ ; # print round_(ax)
+ r_text(m4ta,m4vl,at X+(Rect_(textht*2,ax-120)))
+ if m4vl>=2 then {
+ r_text(-m4ta,m4vl,at (X.x,-X.y)+(Rect_(textht*1.5,-ax+135))) }\
+ else { r_text(-m4ta,m4vl,at (X.x,-X.y)+(Rect_(textht*2,-ax+150))) } ',
+ 6:20, 11:10, 23:5, 28:4, 37:3, 53:2, 58:1.8, 64:1.6, 71:1.4, 80:1.2, 90:1)
+# left-side circumference
+Loopover_(`tt',
+ `X: Xc(m4Lx*0.1).start; # print round_(atan2(X.y,X.x)*rtod_-180)
+ r_text(-patsubst(tt,:,`,'),at X+(Rect_(textht*1.7,-m4Lx*11+40)))
+ r_text( patsubst(tt,:,`,'),at (X.x,-X.y)+(Rect_(textht*2.1,m4Lx*11-30))) ',
+ 11:0.1, 23:0.2, 33:0.3, 44:0.4, 53:0.5, 62:0.6, 70:0.7, 77:0.8, 84:0.9)
+# Ra=1 labels
+Loopover_(`tt',`X: SGamma(1,m4Lx*0.2)
+ M: move from Rac(1) to X; # print round_(lin_ang(M)*rtod_-180)
+ r_text(-eval(m4Lx*11),ifelse(m4Lx,5,1,0.eval(m4Lx*2)),
+ at X+(Rect_(textht*1.5,-m4Lx*11+40)))
+ r_text( eval(m4Lx*11),ifelse(m4Lx,5,1,0.eval(m4Lx*2)),
+ at (X.x,-X.y)+(Rect_(textht*2,m4Lx*11-30))) ',
+ 11:0.2, 23:0.4, 33:0.6, 44:0.8, 53:1)
+
+ textht *=0.9
+# Wavelength circle and tics
+ wvsep = textht*3/2
+ wltic = C.wid/120
+ circle thick thn grayline(thkg) diam C.diam+wltic/2+wvsep*11 at C
+W: circle thick thn grayline(thkg) diam C.diam+wvsep*8 at C
+ for tc=0 to 249 do {ax = 180-tc/250*360; line thick thn grayline(thkg) \
+ from W+(Rect_(W.rad+wltic/2,ax)) to W+(Rect_(W.rad-wltic/2,ax)) }
+# Wavelength circle labels
+for_(0,49,1,
+ `ifelse(eval(m4x<5),1,,
+ `r_text(eval(90-m4x*180/25),ifelse(m4x,0,0,eval(m4x<10),1,0.0`'m4x,0.`'m4x),
+ at W+(Rect_(W.rad+wltic/2+textht*0.5,180-m4x*180/25)))')
+ ifelse(eval(m4x<47),1,
+ `r_text(eval(90-m4x*180/25),ifelse(m4x,0,0,eval(m4x>40),1,0.0`'eval(50-m4x),
+ 0.`'eval(50-m4x)), at W+(Rect_(W.rad-wltic/2-textht*1.0,180-m4x*180/25)))')')
+
+ circle thick thn grayline(thkg) diam C.diam+wvsep*5 at C
+A: circle thick thn grayline(thkg) diam C.diam+wvsep*2.5 at C
+ for tc=0 to 359 by 2 do {line thick thn grayline(thkg) \
+ from A+(Rect_(A.rad+wltic/2,tc)) to A+(Rect_(A.rad,tc)) }
+for_(20,170,10,
+ `r_text(eval(-90+m4x),m4x,at A+(Rect_(A.rad+textht*0.5,m4x)))
+ r_text(eval( 90-m4x),-m4x,at A+(Rect_(A.rad+textht*1.2,-m4x)))
+ ')
+ r_text(90,180,at A-(A.rad+textht/2,0))
+Loopover_(`rca',
+ `r_text(eval(90-(180-rca/10)),eval(m4Lx*5+5),
+ at A+(Rect_(A.rad-textht*0.7,rca/10)))
+ r_text(eval(-90+(180-rca/10)),eval(-m4Lx*5-5),
+ at A+(Rect_(A.rad-textht*0.7,-rca/10))) ',
+ 195,295,392,490,588,685,782,880,967,1072,
+ 1165,1260,1352,1438,1518,1598,1645)
+
+# Internal labels
+ setrgb(thng,thng,thkg)
+ "RESISTANCE R/Zo OR CONDUCTANCE G/Yo" at C+SGamma(0.5,0)-(0,C.rad/40)
+ Loopover_(`Lttr',`ifelse(Lttr,*,,`r_text(eval(87-m4Lx*86/100),Lttr,
+ at W+(Rect_(W.rad+wltic/2+textht*0.5, 177-m4Lx*0.86))) ')',
+ W,A,V,E,L,E,N,G,T,H,S,*,T,O,W,A,R,D,*,G,E,N,E,R,A,T,O,R)
+ Loopover_(`Lttr',`ifelse(Lttr,*,,`r_text(eval(115-m4Lx*86/100),Lttr,
+ at W+(Rect_(W.rad-wltic/2-textht*1.0, 204-m4Lx*0.86))) ')',
+ W,A,V,E,L,E,N,G,T,H,S,*,T,O,W,A,R,D,*,L,O,A,D)
+ Loopover_(`Lttr',`ifelse(Lttr,*,,`define(`xa','13-m4Lx*86/100`)
+ r_text(eval(xa-90),Lttr,at A+(Rect_(A.rad+textht*0.7, xa))) ')',
+ R,E,F,L,E,C,T,I,O,N,*,C,O,E,F,F,I,C,I,E,N,T,*,A,N,G,L,E)
+ Loopover_(`Lttr',`ifelse(Lttr,*,,`define(`xa','14-m4Lx*86/100`)
+ r_text(eval(xa-90),Lttr,at A+(Rect_(A.rad-textht*0.7, xa))) ')',
+ T,R,A,N,S,M,I,S,S,I,O,N,*,C,O,E,F,F,I,C,I,E,N,T,*,A,N,G,L,E)
+ resetrgb
+
+iflatex(command "}%",
+ifsvg(command "</g>"))
+] at (0,0)')
+
+Smithchart
+
+.PE
diff --git a/graphics/circuit_macros/examples/svg/cscSVG.m4 b/graphics/circuit_macros/examples/svg/cscSVG.m4
index 8f1b954669..05cf0c70d4 100644
--- a/graphics/circuit_macros/examples/svg/cscSVG.m4
+++ b/graphics/circuit_macros/examples/svg/cscSVG.m4
@@ -1,19 +1,21 @@
.PS
#.PS 3.5
# csc.m4
+# This file includes AntiqueClock and works for PSTricks, Tikz, and SVG
gen_init
+NeedDpicTools
-skale = 3.5/3.97*0.9955
+skale = 0.878
circlerad=1.91*skale
hubrad=0.10*skale
s=0.5*skale
-define(`midnight',`26,26,112')
-define(`white',`255,255,255')
-define(`spokethick',0.1)
+define(`midnight',`0.1, 0.1, 0.44')
+define(`white',`1, 1, 1')
+define(`spokewidth',0.1)
define(`spoke',`dnl
- {line from rvec_(0,hubrad-spokethick/2) to rvec_(circlerad-0.05,0)}
- {line from rvec_(0,-(hubrad-spokethick/2)) to rvec_(circlerad-0.05,0)}')
+ {line from rvec_(0,hubrad-spokewidth/2) to rvec_(circlerad-0.05,0)}
+ {line from rvec_(0,-(hubrad-spokewidth/2)) to rvec_(circlerad-0.05,0)}')
define(`lwid',1)
define(`coord',`(s*(`$1'),s*(`$2'))')
@@ -23,7 +25,7 @@ rgbdraw(midnight,
linethick=`0.'eval(lwid*15)/(1pt__)
{circle with .c at Here
circle invis diam last circle.diam + linethick pt__ at last circle }
- linethick=spokethick/(1pt__)
+ linethick=spokewidth/(1pt__)
for angle = 0 to 330 by 30 do {
Point_(angle)
{spoke}
@@ -46,7 +48,7 @@ rgbdraw(midnight,
# Sail
thinlines_
- setrgb(midnight)
+ rgbfill(midnight,
line from coord(0.44,3.38) to coord(0.44,2.6) \
then to coord(2.1,-1.75) \
then to coord(1.22,-1.53) \
@@ -60,34 +62,33 @@ rgbdraw(midnight,
then to coord(-0.92,1.73) \
then to coord(0,2.9) \
then to coord(0.44,3.38)
+ )
# Hull
+ rgbfill(midnight,
spline from coord(2.1,-1.75) to coord(1.9,-2.2) \
then to coord(1.85,-2.3) then to coord(1.8,-2.33) \
then to coord(1,-2.5) then to coord(0,-2.6) then to coord(-0.38,-2.57) \
then to coord(-2.13,-2.4)
line to coord(-2.2,-2.05) then to coord(2.1,-1.75)
-# spline to coord(-1,-2.08) then to coord(0.55,-1.77)
- line to coord(2.1,-1.75)
- resetrgb
- setrgb(white)
- spline from coord(-2.2,-2.05) to coord(-1,-2.08) then to coord(0.55,-1.77)
- line to coord(-2.2,-2.05)
- resetrgb
- linethick=`0.'eval(lwid*15)/(1pt__)
-
+ spline to coord(-1,-2.08) then to coord(0.55,-1.77)
+ )
]
+
Clock: [
+# PSTricks, tikz, or svg only:
+ifelse(ifpstricks(T)`'ifpgf(T)`'ifsvg(T),T,`
#.PS
-# AntiqueClockSVG.m4
+# AntiqueClock.m4
#gen_init
-svg_font(font-family="sans-serif" font-stretch="condensed")
+#NeedDpicTools
-# https://tex.stackexchange.com/questions/236923/generate-analog-clock-with-numbered-face-add-seconds-roman-numerals
+iflatex(`latexcommand({\sf)')
+ifsvg(svg_font(font-family="sans-serif" font-stretch="condensed")
+# svg_rot_init(test))
+ svg_rot_init(cscSVG))
-#svg_rot_init(AntiqueClockSVG)
-#svg_rot_init(test)
-svg_rot_init(cscSVG)
+# https://tex.stackexchange.com/questions/236923/generate-analog-clock-with-numbered-face-add-seconds-roman-numerals
# `hms2deg(hr,min,sec) hr:min:sec to degrees
# blank arg1: degrees for minute hand
@@ -148,6 +149,7 @@ define(`AntiqueHourHand',`[ hhsf = (`$1')/2.2
fitcurve(X,n,shaded rgbstring(0,0,0))
]')
+
define(`AntiqueClock',`[ # h,m,s,diam
# Clock size parameters:
hour = ifelse(`$1',,3,`$1')
@@ -155,8 +157,8 @@ define(`AntiqueClock',`[ # h,m,s,diam
second = ifelse(`$3',,51,`$3')
# outer radius
ifelse(`$4',,`skale=0.5; r1=2',`r1=(`$4')/2; skale=r1/4')
- r2 = r1 - 0.5*skale
- r3 = r2 - 0.14*skale
+ r2 = r1-0.5*skale
+ r3 = r2-0.14*skale
r4 = r3 - 0.35*skale
r5 = r4 - 0.17*skale
r6 = r5 - 0.63*skale
@@ -191,32 +193,35 @@ Face: circle thick 0 fill_(1) rad r3 at C
circle rad r5 at C
circle rad r6 at C
circle rad r7 at C
+
# Ad hoc shift of rotated SVG text
- define adj { (-cosd($`'1)*textht*0.5*sign(180-($`'1)),\
- (0.25+0.25*cosd(2*($`'1)))*textht) }
+ ifsvg(`define adj {+(-cosd($`'1)*textht*0.5*sign(180-($`'1)),\
+ (0.25+0.25*cosd(2*($`'1)))*textht) }',
+ `define adj {}')
+ define adj {}
+
# Outer numbers
- textht = (r3-r4)*0.6
- for mn = -15 to 15 by 5 do { t = 90-mn/60*360
- R:(Rect_((r3+r4)/2,t))
- svg_rot(-mn/60*360,sprintf("%g",pmod(mn,60)) at C+R+adj(t))
- }
- for mn = 20 to 40 by 5 do { t = 450-mn/60*360
- R: (Rect_((r3+r4)/2,t))
- svg_rot(180-mn/60*360, sprintf("%g",pmod(mn,60)) at C+R+adj(t))
- }
+ iflatex(`command sprintf("\font\outerfont=cmss12 at %4.2fin",r3-r4)')
+ ifsvg(`textht = (r3-r4)*0.6')
+ for_(-15,15,5,`aa=90-(m4x)*6
+ r_text(eval(-(m4x)*6),eval((m4x+60)%60),
+ at C+(Rect_((r3+r4)/2,aa)) adj(aa))')
+ for_(20,40,5,`aa=450-(m4x)*6
+ r_text(eval(180-m4x*6),m4x,at C+(Rect_((r3+r4)/2,aa)) adj(aa))')
# Outer tics
for mn = 1 to 60 do { t = 90-mn/60*360
line from C+(Rect_(r5,t)) to C+(Rect_(r4,t)) }
# Inner numbers
- textht = (r5-r6)*0.6
- Loopover_(`mx',`tt = 90-(m4Lx-4)/12*360
- R: (Rect_((r5+r6)/2,tt))
- svg_rot(tt-90, "mx" at C+R+adj(tt)) ',
+ iflatex(`command sprintf("\font\innerfont=cmss12 at %4.2fin",r5-r6)')
+ ifsvg(`textht = (r5-r6)*0.6')
+ Loopover_(`mx',`aa=180-(m4Lx-1)*30
+ r_text(eval(120-m4Lx*30),iflatex({\innerfont mx},mx),
+ at C+(Rect_((r5+r6)/2,aa)) adj(aa))',
IX,X,XI,XII,I,II,III)
- Loopover_(`mx',`tt = 360-m4Lx*30
- R: (Rect_((r5+r6)/2,tt))
- svg_rot(tt-270, "mx" at C+R+adj(tt)) ',
+ Loopover_(`mx',`aa=360-m4Lx*30
+ r_text(eval(90-m4Lx*30), iflatex({\innerfont mx},mx),
+ at C+(Rect_((r5+r6)/2,aa)) adj(aa))',
IV,V,VI,VII,VIII)
# Inner tics
@@ -230,13 +235,15 @@ Face: circle thick 0 fill_(1) rad r3 at C
# Center
dot(at C,0.1/4*r1,1)
- ]')
+ ]') `# AntiqueClock'
Clock1: AntiqueClock(,,,3.5)
-# Clock2: AntiqueClock(4,48,07,2) at Clock1.e+(1.5,0)
+# Clock2: AntiqueClock(4,50,07,2) at Clock1.e+(1.5,0)
+
+ iflatex(`latexcommand(}%)')
+ ifsvg(`command "</g>"')
- command "</g>" # end font
#.PE
+',` "AntiqueClock.m4 requires PSTricks, Tikz-pgf, or SVG" ')
] with .sw at last [].se+(0.25,0)
-
.PE
diff --git a/graphics/circuit_macros/examples/svg/ex15SVG.m4 b/graphics/circuit_macros/examples/svg/ex15SVG.m4
index 055986740b..ca15109fa9 100644
--- a/graphics/circuit_macros/examples/svg/ex15SVG.m4
+++ b/graphics/circuit_macros/examples/svg/ex15SVG.m4
@@ -29,7 +29,7 @@ for i = 1 to n-1 do {
D: C+(Rect_(crad*g,110))
rm = crad+distance(C,D)
for r=lt to rm by lt do {
- u = (1-r/rm)*255
+ u = (1-r/rm)
if r < (1-g)*crad then { rgbdraw(u,u,u,circle rad r at D) } \
else { rgbdraw(u,u,u,arc cw from Cintersect(D,r,C,crad) \
to Cintersect(D,r,C,crad,R) with .c at D) }
diff --git a/graphics/circuit_macros/examples/svg/examplesSVG.htmx b/graphics/circuit_macros/examples/svg/examplesSVG.htmx
index a7c830ed54..f2ea0d8bc5 100644
--- a/graphics/circuit_macros/examples/svg/examplesSVG.htmx
+++ b/graphics/circuit_macros/examples/svg/examplesSVG.htmx
@@ -355,7 +355,7 @@ cfig(AudioSVG,
Audio elements)
cfig(XformSVG,
- The transformer element`,' drawing direction down)
+ Some variations of the transformer element`,' drawing direction down)
cfig(NPDTSVG,
Double throw with the m4tt`'NPDT</g> macro)
@@ -370,7 +370,7 @@ cfig(relaycoilSVG,
The m4tt`'relaycoil</g> macro)
cfig(RelaySVG,
- Some variants of the m4tt`'relay</g> macro)
+ Some variants of m4tt`'relay</g>)
cfig(JackSVG,
The m4tt`'jack</g> and m4tt`'plug</g> macros)
@@ -521,9 +521,6 @@ cfig(TubediagsSVG,
cfig(UNOSVG,
An Arduino UNO circuit adapted and redrawn)
- <!--
- m4tt`'https://content.arduino.cc/assets/UNO-TH_Rev3e_sch.pdf</g>
- -->
cfig(sfgSVG,
Signal-flow graphs)
@@ -540,7 +537,7 @@ cfig(DecoderSVG,
cfig(ex21SVG,
Some flip-flops)
-cfig(MultiplexerSVGfor showing
+cfig(MultiplexerSVG,
Multiplexer)
cfig(DemultiplexerSVG,
@@ -593,11 +590,6 @@ cfig(GrayCodeSVG,
Gray code 10-bit encoder disk pattern`,'
and a crossbar switch)
-<!--
-#cfig(CrossbarSVG,
-# A crossbar switch)
--->
-
cfig(ByteSVG,
Elementary splines)
@@ -639,11 +631,6 @@ cfig(LoglogSVG,
cfig(GeometrySVG,
Plane geometry examples)
-<!--
-#cfig(LyapSVG,
-# Illustrating a Lyapunov function)
--->
-
cfig(randomSVG,
Testing random numbers)
@@ -658,10 +645,8 @@ cfig(graysurfSVG,
cfig(shapesSVG,
Basic shapes)
-<!--
-#fig(AntiqueClockSVG,
-# An antique clock face)
--->
+cfig(keyboardSVG,
+ More objects drawn in relief)
cfig(cscSVG,
Conestoga Sailing Club (illustrating the filling of arbitrary shapes)`,'
@@ -696,7 +681,7 @@ cfig(SierpinskiSVG,
tests of pic macro recursion)
cfig(EscherSVG,
- Two Escher-like objects)
+ Penrose stairs and an Escher-like object)
cfig(recycleSVG,
Modest repetition and partial fill)
@@ -704,9 +689,12 @@ cfig(recycleSVG,
cfig(ex15SVG,
Simple diagrams that are easily drawn by looping)
+cfig(SmithchartSVG,
+ A Smith chart at 3/4 scale)
+
<!--
-cfig(CountingSVG,
- An example of enumeration)
+#fig(CountingSVG,
+# An example of enumeration)
-->
cfig(CrowSVG,
@@ -722,7 +710,7 @@ cfig(FlowSVG,
</p> -->
cfig(BtreeSVG,
- Binary trees)
+ Trees)
cfig(InclepsSVG,
Overlaying a figure with line graphics)
diff --git a/graphics/circuit_macros/examples/svg/icsSVG.m4 b/graphics/circuit_macros/examples/svg/icsSVG.m4
index f1eb9ae9ab..896e1008eb 100644
--- a/graphics/circuit_macros/examples/svg/icsSVG.m4
+++ b/graphics/circuit_macros/examples/svg/icsSVG.m4
@@ -246,17 +246,17 @@ define(`HDMI_micro',`[
D0`'svg_it(-), CLK`'svg_it(+), CLK_SH, CLK`'svg_it(-),
CEC, GND, SCL, SDA,svg_it(+)5V)
L1: line from Base.nw+(m4bwid*2/3-lg_pinsep,0) up plen
- svg_rot(90,"21" at last line.c +(-2bp__,0))
- svg_rot(90,"SH2" at last line.start + (4bp__,-8bp__))
+ svg_rot(90,"21",at last line.c +(-2bp__,0))
+ svg_rot(90,"SH2",at last line.start + (4bp__,-8bp__))
line from Base.nw+(m4bwid*2/3-2*lg_pinsep,0) up plen
- svg_rot(90,"20" at last line.c+(-2bp__,0))
- svg_rot(90,"SH1" at last line.start + (4bp__,-8bp__))
+ svg_rot(90,"20",at last line.c+(-2bp__,0))
+ svg_rot(90,"SH1",at last line.start + (4bp__,-8bp__))
line from Base.sw+(m4bwid*2/3-lg_pinsep,0) down plen
- svg_rot(90,"23" at last line.c+(-2bp__,0))
- svg_rot(90,"SH4" at last line.start + (4bp__,14bp__))
+ svg_rot(90,"23",at last line.c+(-2bp__,0))
+ svg_rot(90,"SH4",at last line.start + (4bp__,14bp__))
line from Base.sw+(m4bwid*2/3-2*lg_pinsep,0) down plen
- svg_rot(90,"22" at last line.c+(-2bp__,0))
- svg_rot(90,"SH3" at last line.start + (4bp__,14bp__))
+ svg_rot(90,"22",at last line.c+(-2bp__,0))
+ svg_rot(90,"SH3",at last line.start + (4bp__,14bp__))
#
`$4']')
diff --git a/graphics/circuit_macros/examples/svg/keyboardSVG.m4 b/graphics/circuit_macros/examples/svg/keyboardSVG.m4
new file mode 100644
index 0000000000..7966a7aa3b
--- /dev/null
+++ b/graphics/circuit_macros/examples/svg/keyboardSVG.m4
@@ -0,0 +1,269 @@
+.PS
+# keyboardSVG.m4
+ gen_init
+ scale=25.4 # unit is mm
+
+divert(-1)
+
+define(`kbd_u',(11mm__))
+define(`kbdrowsep',`movewid')
+define(`kbdshadewid',`(kbd_u/9)')
+
+ `kbdkey(name|text=chars,keys)
+ chars: string or string string
+ keys: wdth=expr; # base wid
+ hght=expr; # base ht
+ rad=expr; # base rad
+ shadewid=expr; # base shade wid
+ base=attribs; # base attributes
+ top=attribs; # top attributes '
+define(`kbdkey',
+ `pushkeys_(`$2',
+ wdth:kbd_u; hght:kbd_u*14/13+lthick; rad:kbd_u/10;
+ shadewid:kbdshadewid; base:fill_(0.3):N; top:fill_(0.9):N)dnl
+ [ Base: box wid m4wdth ht m4hght rad m4rad m4base
+ Top: box wid m4wdth-2*m4shadewid ht m4hght-m4shadewid-lthick \
+ rad m4rad*(kbd_u-2*m4shadewid)/(kbd_u) with .n \
+ at Base.n-(0,lthick) m4top
+ move to Top.w
+ ifelse(`$1',,,`pushkey_(`$1',text,,N)ifelse(m4text,,
+ `"iflatex(\sf) `$1'" above ljust',
+ `m4text');') `$3'
+ popdef(`m4wdth', `m4hght', `m4shadewid', `m4rad', `m4base', `m4top') dnl
+ popdef(`m4text') ] ')
+
+define(`tsmall',
+ `iflatex(`"{\sf\scriptsize `$1'}"',
+ ifelse(`$3',,")svg_fsize(`$1',ifelse(`$2',,75,`$2'))ifelse(`$3',,"))')
+
+define(`stkbdkey',
+ `iflatex(`command "{\sf\scriptsize"',`m4tmp=textht
+ textht = ifelse(`$1',,0.66*textht,`$1') ')
+ kbdkey(shift($*))
+ iflatex(`command "}%"',`textht = m4tmp')')
+
+ `enterkey(name|text=chars,keys)
+ chars: string or string string
+ keys: wdth=expr; # base wid
+ hght=expr; # base ht
+ bhght=expr; # ht of bottom part
+ rad=expr; # base rad
+ shadewid=expr; # base shade wid
+ base=attribs; # base attributes
+ top=attribs; # top attributes '
+define(`enterkey',
+ `pushkeys_(`$2',
+ wdth:kbd_u*2.26;
+ hght:kbd_u*14/13*2+kbdrowsep+linethick bp__;
+ bhght: kbd_u*14/13;
+ twdth: kbd_u*3/2;
+ rad:kbd_u/10;
+ shadewid:kbdshadewid;
+ base:fill_(0.3):N;
+ top:fill_(0.9):N)dnl
+ [ ltx = lthick; r = m4rad*(kbd_u-2*m4shadewid)/(kbd_u)
+# thick outer
+ linethick = (m4shadewid+r)/(1bp__); lth2 = lthick/2
+ NEx: Here; NE: NEx-(lth2,lth2); SE: NE-(0,m4hght-lth2*3-ltx*3/2)
+ SW: SE-(m4wdth-lthick,0)
+ W: SW+(0,m4bhght-lthick+ltx*3/2); NW: NE-(m4twdth-lthick,0); X: (NW,W)
+ d = 0.3; ro = m4rad-lth2
+ move to W; arcto(X,NW,m4rad+lth2,outlined graystring(d)); Tx:NW
+ Loopover_(`PK',`arcto(Tx,PK,ro,outlined graystring(d));Tx:PK',NE,SE,SW,W,X)
+ linethick = ltx
+# outer outline
+ NE: NEx; SE: NE-(0,m4hght+ltx); SW: SE-(m4wdth,0)
+ W: SW+(0,m4bhght); NW: NE-(m4twdth,0); X: (NW,W)
+ m4enteroutline(m4rad,,m4rad)
+# thick inner
+ linethick = m4shadewid/(1bp__)+linethick; lth2 = lthick/2
+ NE: NEx-(m4shadewid+lth2,lth2+ltx); SE: (NE,SE)+(0,m4shadewid*3/2)
+ SW: SE-(m4wdth-m4shadewid*3,0); W: SW+(0,m4bhght-m4shadewid*2-ltx*3/2);
+ NW: NE-(m4twdth-m4shadewid*3,0); X: (NW,W)
+ c = 0.9; ri = r-lth2
+ move to W; arcto(X,NW,ri+lth2*2,outlined graystring(c)); Tx:NW
+ Loopover_(`PK',`arcto(Tx,PK,ri,outlined graystring(c));Tx:PK',NE,SE,SW,W,X)
+ N: 1/2 between NW and NE
+ line from N to (N,SE) thick (NE.x-NW.x)/(1bp__) outlined graystring(c)
+ SSW: 1/2 between SW and W
+ line from SSW to (SE,SSW) thick (W.y-SW.y)/(1bp__) outlined graystring(c)
+# inner outline
+ NE: NE+(lth2,lth2); SE: SE+(lth2,-lth2); SW: SW-(lth2,lth2)
+ W: W+(-lth2,lth2); NW: NW+(-lth2,lth2); X: (NW,W)
+ linethick = ltx
+ m4enteroutline(ri,,ri+lth2*2)
+ move to (X,(1/2 between SW and W));
+ ifelse(`$1',,,`pushkey_(`$1',text,,N)dnl
+ ifelse(m4text,,`"iflatex(\sf) `$1'" above ljust',`m4text')')
+ popdef(`m4wdth', `m4hght', `m4bhght', `m4twdth', `m4shadewid', `m4rad',
+ `m4base', `m4top', `m4bhght' ) popdef(`m4text')dnl
+ `$3' ] ')
+define(`m4enteroutline',`move to W+(`$1',0); arcto(X,NW,`$3',`$2'); Tx: NW
+ Loopover_(`PP',`arcto(Tx,PP,`$1',`$2'); Tx: PP',NE,SE,SW,W,X)')
+define(`m4enterup',`[ u = ifelse(`$1',,kbd_u*0.3)
+ line right u/4 then up u/2 then right u/6 then up u/2 left u/4+u/6 \
+ then down u/2 left u/4+u/6 then right u/6 then down u/2 then right u/4
+ ]')
+
+define(`kbdsymb',`iflatex("\tt\char`$1'",`dsvg_symb(`$1')')')
+define(`m4kbdarrow',`arrow thick 1.5 ht kbd_u/5 wid kbd_u/5')
+
+divert(0)dnl
+
+define dsvg_symb {"&#$1;"}
+
+maxpswid = 25*kbd_u
+movewid = kbd_u/11
+
+define(`rshift',` at Here+(ifelse(`$1',,`kbd_u/8',`$1'),0) ')
+
+iflatex(`command "{\small\sf"',
+ `ifsvg(svg_font(Arial,kbd_u*16/13/4,0bp__))
+ textht=kbd_u/4 ')
+
+Row2: [
+ textoffset = kbd_u/8
+ Loopover_(`KK',`kbdkey(text=KK); move',
+ kbdsymb(126) ljust kbdsymb(96) ljust,
+ Loopover_(`NN',`kbdsymb(NN) ljust "m4Lx" ljust,',33,64,35,36,37,94,38,42,40)
+ kbdsymb(41) ljust "0" ljust,
+ kbdsymb(95) ljust "-" ljust,
+ kbdsymb(43) ljust "=" ljust,
+ kbdsymb(124) ljust kbdsymb(92) ljust,
+ "" )
+ m4kbdarrow left kbd_u*0.5 at last [].Top
+ ]
+Row1: [
+ kbdkey(tsmall(Esc,,N)); move right_ last [].wid+movewid*2
+ Loopover_(`KK',`kbdkey(KK); move',F1,F2,F3,F4)
+ move right_ last [].wid/2
+ Loopover_(`KK',`kbdkey(KK); move',F5,F6,F7,F8)
+ move right_ Row2.wid-Here.x-4*last [].wid-4*movewid
+ Loopover_(`KK',`kbdkey(KK); move',F9,F10,F11,F12)
+ ] with .sw at Row2.nw+(0,2*kbdrowsep)
+Row3: [
+# Uparrow: kbdkey(,,m4kbdarrow up kbd_u/2 at Top)
+ Tab: kbdkey(text=tsmall(Tab) rshift ljust,wdth=kbd_u*1.6,
+ [ A: m4kbdarrow left kbd_u/2; line thick A.thick up A.wid at A.end
+ A: m4kbdarrow right A.len at A-(0,kbd_u/2)
+ line thick A.thick up A.wid at A.end ] with .w at Top ); move
+ Loopover_(`KK',`KK: kbdkey(KK); move',Q,W,E,R,T,Y,U,I,O,P)
+ textoffset = kbd_u/8
+ kbdkey(text=kbdsymb(123) ljust kbdsymb(91) ljust); move
+ kbdkey(text=kbdsymb(125) ljust kbdsymb(93) ljust); move
+ w = Row2.wid-Here.x
+ R: box invis wid w-movewid ht last [].Base.ht
+ ] with .nw at Row2.sw-(0,kbdrowsep)
+Row4: [
+ Capslock: kbdkey(text=tsmall(Caps Lock) rshift ljust,
+ wdth=Row3.Tab.wid+Row3.Q.wid/3;); move
+ Loopover_(`KK',`KK: kbdkey(KK); move',A,S,D,F,G,H,J,K,L)
+ textoffset = kbd_u/8
+ kbdkey(text=kbdsymb(58) ljust kbdsymb(59) ljust); move
+ kbdkey(text=kbdsymb(34) ljust kbdsymb(39) ljust); move
+ ] with .nw at Row3.sw-(0,kbdrowsep)
+ Enter: enterkey(text=tsmall(Enter),,
+ m4kbdarrow <- from last ""+(kbd_u/2,0) \
+ right kbd_u/2 then up kbd_u/5 ) \
+ with .ne at (Row2.e,Row3.n)-(movewid,0)
+Row5: [
+ ShiftL: kbdkey(text=tsmall(Shift) at 0.4 between Top.w and Top.e,
+ wdth=kbd_u*2.4, m4enterup at 0.15 between Top.w and Top.e); move
+ Loopover_(`KK',`KK: kbdkey(KK); move',Z,X,C,V,B,N,M)
+ textoffset = kbd_u/8
+ kbdkey(text=kbdsymb(60) ljust kbdsymb(44) ljust); move
+ kbdkey(text=kbdsymb(62) ljust kbdsymb(46) ljust); move
+ kbdkey(text=kbdsymb(63) ljust kbdsymb(47) ljust); move
+ v = Row2.wid-Here.x-kbd_u-movewid*2
+ ShiftR: kbdkey(text=tsmall(Shift) at 1/2 between Top.w and Top.e,wdth=v,
+ m4enterup at 0.15 between Top.w and Top.e); move
+ kbdkey(); move
+ ] with .nw at Row4.sw+(0,-kbdrowsep)
+Row6: [
+ w = 22/18*kbd_u
+ CtrlL: kbdkey(text=tsmall(Ctrl) rshift ljust,wdth=w); move
+ kbdkey(,wdth=w); move
+ kbdkey(text=tsmall(Alt) rshift ljust,wdth=w); move
+ s = Row2.wid-(7*w+8*movewid)
+ kbdkey(,wdth=s); move
+ kbdkey(text=tsmall(Alt) rshift ljust,wdth=w); move
+ kbdkey(,wdth=w); move
+ kbdkey(,wdth=w); move
+ CtrlR: kbdkey(text=tsmall(Ctrl) rshift ljust,wdth=w); move
+ ] with .nw at Row5.sw+(0,-kbdrowsep)
+Arrowkeys: [ iflatex(`command "{\sf\scriptsize"',`textht *=0.66')
+Row1:[ textoffset = kbd_u/20
+ kbdkey(text=`"Print" ljust "Screen" ljust "SysRQ" ljust'); move
+ textoffset = kbd_u/12
+ kbdkey(text="Scroll" ljust "Lock" ljust); move
+ kbdkey(text="Pause" ljust "Break" ljust); move
+ ]
+Row2: [ textoffset = kbd_u/12
+ kbdkey(text="Insert" ljust); move
+ kbdkey(text=tsmall(Home) ljust); move
+ kbdkey(text="Page" ljust "Up" ljust); move
+ ] with .nw at Row1.sw-(0,2*kbdrowsep)
+Row3: [ textoffset = kbd_u/12
+ Delete: kbdkey(text="Delete" ljust); move
+ End: kbdkey(text="End" ljust); move
+ kbdkey(text="Page" ljust "Down" ljust); move
+ ] with .nw at Row2.sw+(0,-kbdrowsep)
+Row5: [
+ move right Row3.End.w.x + movewid
+ Uparrow: kbdkey(,,m4kbdarrow up kbd_u/2 at Top)
+ ] with .nw at Row3.sw-(0,Row3.Delete.ht+2*kbdrowsep)
+Row6: [
+ kbdkey(,,m4kbdarrow left kbd_u/2 at Top); move
+ kbdkey(,,m4kbdarrow down kbd_u/2 at Top); move
+ kbdkey(,,m4kbdarrow right kbd_u/2 at Top); move
+ ] with .nw at Row5.sw-(0,kbdrowsep)
+
+ iflatex(`command "}%"',`textht *=(1/0.66)')
+ ] with .nw at Row1.ne+(movewid,0)
+Keypad: [ move down_ Arrowkeys.n.y-Arrowkeys.Row2.e.y; right_
+ textoffset = kbd_u/8
+Row2:[
+ kbdkey(text=tsmall(Num) ljust tsmall(Lock) ljust); move
+ iflatex(`command "{\large"',`textht *=1.5')
+ kbdkey(text=kbdsymb(47) ljust); move
+ kbdkey(text=kbdsymb(42) ljust); move
+ kbdkey(text=kbdsymb(45) ljust); move
+ iflatex(`command "}"')
+ ]
+Row3:[ textoffset = kbd_u/12
+ kbdkey(text="7" ljust tsmall(Home) ljust); move
+ kbdkey(text="8" ljust "" ljust,,m4kbdarrow up_ kbd_u/3 \
+ at 3/4 between Top.ne and Top.sw); move
+ kbdkey(text="9" ljust tsmall(PgUp) ljust); move
+ ] with .nw at Row2.sw+(0,-kbdrowsep)
+Row4:[ textoffset = kbd_u/12
+ kbdkey(text="4" ljust "" ljust,,m4kbdarrow left kbd_u/3 \
+ at 0.7 between Top.ne and Top.sw); move
+ kbdkey(text="5" ljust "" ljust); move
+ Six: kbdkey(text="6" ljust "" ljust,,m4kbdarrow right kbd_u/3 \
+ at 0.7 between Top.ne and Top.sw); move
+ ] with .nw at Row3.sw+(0,-kbdrowsep)
+Row5:[ textoffset = kbd_u/12
+ kbdkey(text="1" ljust tsmall(End) ljust); move
+ kbdkey(text="2" ljust "" ljust,,m4kbdarrow down kbd_u/3 \
+ at 0.7 between Top.ne and Top.sw); move
+ kbdkey(text="3" ljust tsmall(PgDn) ljust); move
+ ] with .nw at Row4.sw+(0,-kbdrowsep)
+Row6:[ textoffset = kbd_u/12
+ kbdkey(text="0" ljust tsmall(Ins) ljust,
+ wdth=Row4.wid-Row4.Six.wid-2*movewid); move
+ kbdkey(text=kbdsymb(46) ljust tsmall(Del) ljust); move
+ ] with .nw at Row5.sw+(0,-kbdrowsep)
+Col4: [ textoffset = kbd_u/12
+ iflatex(`command "{\large"',`textht *=1.5')
+ kbdkey(text="+" ljust,hght=Row3.n.y-Row4.s.y); move
+ iflatex(`command "}"',`textht /=1.5')
+ kbdkey(text=tsmall(Enter) ljust,hght=Row5.n.y-Row6.s.y) \
+ with .nw at last [].sw - (0,kbdrowsep)
+ ] with .ne at (Row2.e,Row3.n)
+
+ ] with .nw at Arrowkeys.ne+(movewid,0)
+
+iflatex(`command "}%"',
+ifsvg(`command "</g>"'))
+.PE
diff --git a/graphics/circuit_macros/examples/svg/sfgSVG.m4 b/graphics/circuit_macros/examples/svg/sfgSVG.m4
index 793db01ae8..666f311ca4 100644
--- a/graphics/circuit_macros/examples/svg/sfgSVG.m4
+++ b/graphics/circuit_macros/examples/svg/sfgSVG.m4
@@ -82,21 +82,54 @@ G4: [sfg_init( 2.0,0.25/2 ) # change node spacing and increase node size
N2: sfgnode(,svg_fsize(2,120),,invis)
{ sfgarc(to N1 ->,,,ccw,s1) }
{ "p(1-p)svg_gamma+2`'svg_nu" at last [].M+(11bp__,0) above }
- { svg_choose(2,1) at last [].M+(-29bp__,8bp__) }
+ { svg_choose(2,1) at last [].M+(-19bp__,8bp__) }
{ sfgarc(to N0 ->,(1-p)svg_sup(2)`svg_gamma',above,ccw,s2) }
sfgline(right_ sfg_wid,`svg_nu'+2`svg_lambda',below,->)
N3: sfgnode(,svg_fsize(3,120),,invis)
{ sfgarc(to N2 ->,,,ccw,s1) }
{ "p`'svg_sup(2)(1-p)svg_gamma+3`'svg_nu" at last [].M+(0bp__,0) above }
- { svg_choose(3,2) at last [].M+(-43bp__,8bp__) }
+ { svg_choose(3,2) at last [].M+(-33bp__,8bp__) }
{ sfgarc(to N1 ->,,,ccw,s2) }
{ "p(1-p)`'svg_sup(2)`'svg_gamma" at last [].M+(8bp__,0) above }
- { svg_choose(3,1) at last [].M+(-26bp__,8bp__) }
+ { svg_choose(3,1) at last [].M+(-16bp__,8bp__) }
{ sfgarc(to N0 ->,(1-p)svg_sup(3)`svg_gamma',above,ccw,s2) }
sfgline(right_ sfg_wid*2/3,`svg_nu'+3`svg_lambda',below,->)
{"..." wid 0.3 ljust}
] with .nw at G3.sw+(0,-0.1)
+# https://tex.stackexchange.com/questions/637455/tikz-how-to-set-exact-position-of-node
+G5: [sfg_init( 1.75,0.25/2 ) # change node spacing and increase node size
+ Dstar: sfgnode(,* )
+ D0: sfgnode(at Dstar+(2,0),svg_small(&lt;&gt;)svg_sub(0) )
+ sfgline(,
+ svg_it(1-r`'svg_sub(`x-1,x')-q`'svg_sup(i)svg_sub(x-1`,'x,,,-0.8ex)),,->)
+ Ddots: sfgnode(,... )
+ sfgline(,svg_it(1-r`'svg_sub(x-4`,'x)-q`'svg_sup(i)svg_sub(x-4`,'x,,,-0.8ex)),
+ ,->)
+ D5: sfgnode(,svg_small(&lt;&gt;)svg_sub(5) )
+ DD: sfgnode(at D0+(0,-1.0),svg_symbol(&``#''8224;) )
+ sfgself(at Dstar,L,,,,0.5)
+ "svg_it(1-i`'svg_sub(x)-q`'svg_sub(x)svg_sup(a,,,-0.8ex))" wid 45bp__ \
+ at Dstar + (-0.3,0.25)
+ sfgself(at DD,D,1,above_,,0.5)
+ sfgself(at D5,R,,,,0.5)
+ "svg_it(1-q`'svg_sub(x)svg_sup(i,,,-0.8ex)-r`'svg_sub(x))" wid 47bp__ \
+ at D5 + (0.3,0.25)
+ sfgarc(from D0 to Dstar ->,svg_it(r`'svg_sub(x`,'x)),below_,ccw)
+ sfgarc(from Dstar to D0 ->,svg_it(i`'svg_sub(x)),above_,ccw)
+ sfgarc(from Dstar to DD ->,svg_it(q`'svg_sub(x)svg_sup(a,,,-0.8ex)),
+ above_ ljust_,ccw)
+ sfgline(from D0 to DD,svg_it(q`'svg_sup(i)svg_sub(x`,'x,,,-0.8ex)),ljust,->)
+ sfgarc(from Ddots to Dstar,svg_it(r`'svg_sub(j`,'x)),below_,ccw,,->)
+ sfgarc(from Ddots to DD ->,svg_it(q`'svg_sup(i)svg_sub(x-j`,'x)),
+ above_ rjust_,)
+ sfgarc(from D5 to Dstar ->,svg_it(r`'svg_sub(x)),below_,ccw)
+ sfgarc(from D5 to DD ->,svg_it(q`'svg_sup(i)svg_sub(x,,,-0.8ex)),
+ above_ rjust_,)
+ ] with .nw at G4.sw+(0,-0.15)
+#howbox_(,"G5")
+
+
move from (T.w,G4.s)-(7bp__,6bp__) to B.ne+(15bp__,6bp__)
command "</g>" # end font
.PE
diff --git a/graphics/circuit_macros/examples/tubedefs.m4 b/graphics/circuit_macros/examples/tubedefs.m4
index af47e307b7..fa79c05904 100644
--- a/graphics/circuit_macros/examples/tubedefs.m4
+++ b/graphics/circuit_macros/examples/tubedefs.m4
@@ -4,11 +4,11 @@ divert(-1)
# Size parameters
define(`tubediam',`dimen_')
-define(`tubethick',`2')
+define(`tubethick',`2') # thick line thickness
define(`tubepindiam',`tubediam*3/8')
define(`tubeplatelen',`tubediam/2')
define(`tubegridlen',`tubediam*7/12')
-define(`tubcathlen',`tubeplatelen-tubethick bp__')
+define(`tubecathlen',`tubeplatelen-tubethick bp__')
define(`tubedotthick',`1.2')
define(`tubedotdiam',`tubediam/6')
define(`tgap',`tubediam*3/20')
@@ -125,7 +125,7 @@ define(`tubegrid',`dashline(ifelse(`$1',,`right tubegridlen',`$1'),
`tubecathode(length,R)'
define(`tubecathode',`[
- box invis wid ifelse(`$1',,tubcathlen,`$1') ht tubeplatelen/6
+ box invis wid ifelse(`$1',,tubecathlen,`$1') ht tubeplatelen/6
ifinstr(`$2',R,
`line thick tubethick from last box.nw to last box.sw \
then to last box.se then to last box.ne',
diff --git a/graphics/circuit_macros/gpic.m4 b/graphics/circuit_macros/gpic.m4
index d1a151d759..78c643dc5b 100644
--- a/graphics/circuit_macros/gpic.m4
+++ b/graphics/circuit_macros/gpic.m4
@@ -1,7 +1,7 @@
divert(-1)
gpic.m4 Initialization for gpic.
-* Circuit_macros Version 9.8, copyright (c) 2022 J. D. Aplevich under *
+* Circuit_macros Version 9.9, copyright (c) 2022 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
diff --git a/graphics/circuit_macros/lib3D.m4 b/graphics/circuit_macros/lib3D.m4
index df80c32b28..8413b335ea 100644
--- a/graphics/circuit_macros/lib3D.m4
+++ b/graphics/circuit_macros/lib3D.m4
@@ -3,7 +3,7 @@ lib3D.m4 Macros for rotation, projection, and other
operations on argument triples representing
3D vectors or colors.
-* Circuit_macros Version 9.8, copyright (c) 2022 J. D. Aplevich under *
+* Circuit_macros Version 9.9, copyright (c) 2022 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
diff --git a/graphics/circuit_macros/libSLD.m4 b/graphics/circuit_macros/libSLD.m4
index 015fd0cf3f..3ad627c4cf 100644
--- a/graphics/circuit_macros/libSLD.m4
+++ b/graphics/circuit_macros/libSLD.m4
@@ -2,7 +2,7 @@ divert(-1)
libSLD.m4 Draft macros for single-line diagram elements
-* Circuit_macros Version 9.8, copyright (c) 2022 J. D. Aplevich under *
+* Circuit_macros Version 9.9, copyright (c) 2022 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
@@ -14,14 +14,15 @@ divert(-1)
# These *DRAFT* definitions are for single-line diagram (SLD) elements
# with or without attached circuit breakers or slashes. Many other elements
# applicable to SLD drawings are already in libcct.m4. The contributions
-# and suggestions of Benjamin Vilmann are acknowledged with thanks.
+# and suggestions of Benjamin Vilmann and Peter Jan Randewijk are
+# acknowledged with thanks.
# The line
# include(libSLD.m4)
# loads these definitions for use in a diagram.
# Notes for 1-terminal SLD elements:
-# Argument 1 is normally the linespec of the stem to set the element direction
+# Argument 1 is normally the linespec of the stem to set the direction
# and length.; e.g., D1: sl_disk draws a default disk with stem named D1.
# For a 0-length stem (which has undefined direction):
# arg1 can also be U, D, L, R (for up, down, left, right),
@@ -30,13 +31,9 @@ divert(-1)
# Zero-length stem examples: sl_box(U), sl_box(45 at Here+(1,0))
# Argument 2 contains semicolon (;)-separated key-value attributes
# of the element head as applicable: e.g., name=Carol; text="Stop"; lgth=expr
-# If argument 3 is blank then a plain stem is drawn. A non-blank argument 3
-# is C for a default closed breaker in the stem, O for an open breaker,
-# or X, /, or \ to put these symbols in the box; otherwise, key-value
-# pairs specify breaker details. If argument 3 begins with S: or Sn:
-# (where n is an integer) then an n-line slash symbol is drawn.
+# If argument 3 is blank then a plain stem is drawn as described below.
# The element body (head) can be named with name= . The default name is Head.
-# It is overlaid with or contained in a [] block.
+# The head is overlaid with or contained in a [] block.
# Notes for 2-terminal SLD elements:
# These obey the normal Circuit_macro two-terminal conventions.
@@ -45,27 +42,27 @@ divert(-1)
# e.g., name=Name; text="text"; wdth=expr; ...
# Except for sl_drawout and sl_breaker which do not have series breakers
# or slashes, nonblank arguments 3 and 4 put a breaker slash symbol
-# in the input and output respectively.
+# in the input and output respectively as described below.
-# Notes for attached breakers:
+# Notes for attached breakers and slashes:
# Nonblank arguments 3 and 4 of the two-terminal elements and argument 3 of
-# the 1-terminal elements specify a breaker in the input, output, and stem
-# respectivlely. An O creates a default-size open breaker, C a closed
-# breaker; and an X, /, or \ inserts the corresponding mark in the box;
-# otherwise, the argument contains key-value pairs to specify the
-# details of the box; e.g., box=dotted 2bp__ shaded "green"
-# The separation of the breaker from the element body or head is given
-# by parameter sl_breakersep_ or the key sep=expr.
-# Arguments 3 and 4 of the two-terminal elements that begin with S: or Sn:
-# (where n is an integer) and argument 3 of the 1-terminal elements
-# specify an n-slash symbol rather than a breaker.
+# the 1-terminal elements specify a breaker in the input, output,
+# and stem respectivlely. A non-blank argument is C for a default
+# closed breaker in the stem, O for an open breaker, or X, /, or \ to
+# put these symbols in the box; if the argument begins with S: or Sn:
+# (where n is an integer) then an n-line slash symbol is drawn rather
+# than a breaker; otherwise or in addition, key-value pairs specify
+# details of the object. The separation of the breaker or slash
+# from the element body or head is given by parameter sl_breakersep_
+# or key sep=expr. If this key is in the body or head keys then it
+# applies to both 2-terminal stem lines; it can also be given for each
+# stem individually.
# Notes for composite elements within a [ ] block:
-# The current transformer macro sl_ct is composite, with internal
-# labels defined as appropriate to the element. The macro sl_transormer3
-# is composite, with 3 principal termianls and other defined points.
-# Macro sl_busbar is also composite, with internal labels P1 to Pnp,
-# Start, and End.
+# The current transformer macro sl_ct has internal labels defined as
+# appropriate to the element. The macro sl_transormer3 has 3 principal
+# termianls and other defined points. Macro sl_busbar has internal
+# labels P1 to Pnp, Start, and End.
define(`sldlib_')
ifdef(`libcct_',,`include(libcct.m4)divert(-1)')
@@ -84,7 +81,7 @@ define(`sl_loadwid_',`dimen_*0.32') # load width
define(`sl_loadlen_',`dimen_*0.45') # load length
define(`sl_transcale_',1) # transformer body scale factor
define(`sl_busthick_',linethick*2) # sl_bus line thickness
-define(`sl_busindent_',`min(dimen_/5,rp_len/5)') # bus end extension
+define(`sl_busindent_',`min(dimen_/5,rp_len/5)') # busbar end indent
# One-terminal elements ###################################################
@@ -460,11 +457,12 @@ define(`sl_inverter',
breaker keys or S[n]: keys )'
`Draw the breaker slash in the element stem'
define(`m4_one',
-`pushkeys_(`$4',lgth:sl_breakersize_; sep:sl_breakersep_)dnl
+`pushkeys_(`$4',lgth:sl_breakersize_; sep:-1)define(`m4s_p',`ifelse(m4sep,(-1),
+ `pushkey_(`$3',sep,sl_breakersep_)`'m4sep`'popdef(`m4sep')',m4sep)')dnl
M4end: last line.end
{ifelse(regexp(`$4',^ *S),-1,
`ifelse(`$4',,,
- `line to last line.end-vec_(m4lgth+m4sep,0)
+ `line to last line.end-vec_(m4lgth+m4s_p,0)
pushdef(`m4bri',`ifelse(`$4',C,,`$4',O,`box=fill_(0)')')dnl
sl_breaker(to rvec_(m4lgth,0),`$4';m4bri;name=Br) popdef(`m4bri')')
$1(to M4end,`$3')',
@@ -473,7 +471,7 @@ define(`m4_one',
`define(`m4in',`ifelse(`$4',S,1,`$4',S:,1,
`patsubst(`$4',.*S\([0-9][0-9]*\):?.*,\1)')')dnl
define(`m4inkey',`patsubst(`$4',^ *S[0-9]*:?)') pushkey_(m4inkey,name,SL,N)
- sl_slash(at M4end-vec_(m4lgth+m4sep*2/3,0),
+ sl_slash(at M4end-vec_(m4lgth+m4s_p*2/3,0),
m4inkey;name=m4name,m4in:) popdef(`m4name')')')}
popdef(`m4lgth',`m4sep')')
@@ -559,37 +557,41 @@ define(`sl_drawout',
(Default breaker names are BrI and BrO)
(Default slash names are SLI and SLO)'
define(`m4_two',
-`pushkeys_(`$4',lgth:ifelse(`$2',,sl_ttboxlen_*2,`$2'); sep:sl_breakersep_)dnl
+`pushkeys_(`$4',lgth:ifelse(`$2',,sl_ttboxlen_*2,`$2'); sep:-1)dnl
+ define(`m4s_pI',`ifelse(m4sep,(-1),
+ `pushkey_(`$5',sep,sl_breakersep_) m4sep popdef(`m4sep')',m4sep)')dnl
+ define(`m4s_pO',`ifelse(m4sep,(-1),
+ `pushkey_(`$6',sep,sl_breakersep_) m4sep popdef(`m4sep')',m4sep)')dnl
ifelse(regexp(`$5',^ *S),-1,
`define(`m4il',`ifelse(`$5',,0,
- `pushkey_(`$5',lgth,sl_breakersize_) m4lgth popdef(`m4lgth')')')dnl
+ `pushkeys_(`$5',lgth:sl_breakersize_) m4lgth popdef(`m4lgth')')')dnl
define(`m4ol',`ifelse(`$6',,0,
`pushkey_(`$6',lgth,sl_breakersize_) m4lgth popdef(`m4lgth')')')dnl
- eleminit_(`$3',max(elen_,m4lgth+m4il*3.5+m4ol*3.5+m4sep*2))
+ eleminit_(`$3',max(elen_,m4lgth+m4il*3.5+m4ol*3.5+m4s_pI+m4s_pO))
M4end: last line.end
- { line to last line.c-vec_((m4lgth + m4il + m4ol + m4sep*2)/2,0)
+ { line to last line.c-vec_((m4lgth + m4il + m4ol + m4s_pI+m4s_pO)/2,0)
pushdef(`m4bri',`ifelse(`$5',,,`$5',C,,`$5',O,`box=fill_(0)')')dnl
ifelse(`$5',,,`sl_breaker(to rvec_(m4il,0),`$5';m4bri;name=BrI)
- line to rvec_(m4sep,0)')
+ line to rvec_(m4s_pI,0)')
$1(to rvec_(m4lgth,0),`$4',,,`$7',`$8')
pushdef(`m4bro',`ifelse(`$6',,,`$6',C,,`$6',O,`box=fill_(0)')')dnl
- ifelse(`$6',,,`line to rvec_(m4sep,0)
+ ifelse(`$6',,,`line to rvec_(m4s_pO,0)
sl_breaker(to rvec_(m4ol,0),`$6';m4bro;name=BrO)')
line to M4end popdef(`m4bri', `m4bro') }',
- `eleminit_(`$3',max(elen_,m4lgth+m4sep*4)) ; dnl slashes
+ `eleminit_(`$3',max(elen_,m4lgth+(m4s_pI+m4s_pO)*2)) ; dnl slashes
M4end: last line.end
{ $1(to M4end,`$4',,,`$7',`$8') }
ifelse(`$5',,,`define(`m4in',`ifelse(`$5',S,1,`$5',S:,1,
`patsubst(`$5',.*S\([0-9][0-9]*\):?.*,\1)')')dnl
define(`m4inkey',`patsubst(`$5',^ *S[0-9]*:?)')dnl
pushkey_(m4inkey,name,SLI,N)dnl
- {sl_slash(at rvec_(rp_len/2-m4lgth/2-m4sep,0),
+ {sl_slash(at rvec_(rp_len/2-m4lgth/2-m4s_pI,0),
m4inkey;name=m4name,m4in:)} popdef(`m4name')')
ifelse(`$6',,,`define(`m4on',`ifelse(`$6',S,1,`$6',S:,1,
`patsubst(`$6',.*S\([0-9][0-9]*\):*.*,\1)')')dnl
define(`m4onkey',`patsubst(`$6',^ *S[0-9]*:?)')dnl
pushkey_(m4onkey,name,SLO,N)dnl
- {sl_slash(at rvec_(rp_len/2+m4lgth/2+m4sep,0),
+ {sl_slash(at rvec_(rp_len/2+m4lgth/2+m4s_pO,0),
m4onkey;name=m4name,m4on:)} popdef(`m4name')') ')
line invis to M4end popdef(`m4lgth', `m4sep') ')
@@ -618,6 +620,7 @@ define(`m4ch_two',
scale=expr (default 1);
grnd=degrees (type S or N);
stemlgth=expr (type L or S);
+ sep=expr (type S slashes to head separation);
type=N omits the stem and slashes
type=Sn draws n slashes, e.g., type=S2
Arg3 sets the stem direction'
@@ -635,15 +638,15 @@ define(`sl_ct',`[ Origin: Here
line from L.c to L.c+vec_(0,-m4stemlgth)
Tc: Here popdef(`m4stemlgth')',
m4type,S,
- `C: circle rad sourcerad_*m4scale at Origin
- pushkey_(`$2',stemlgth,C.rad*4)dnl
+ `C: circle rad sourcerad_*m4scale*0.5 at Origin
+ pushkeys_(`$2',stemlgth:C.rad*6; sep:C.rad*2)dnl
Stem: line from C to C+vec_(m4stemlgth,0) chop C.rad chop 0; Tc: Here
ifelse(m4grnd,,,`ground(at C+(Rect_(C.rad,m4grnd)),,,m4grnd)'); \
pushdef(`m4n',`ifelse(m4type,S,2,`eval(patsubst(m4type,.*S))')')dnl
- sl_slash(at C+vec_(C.rad*2.5,0),,m4n:rp_ang*rtod_)
- popdef(`m4stemlgth',`m4n')',
+ sl_slash(at C+vec_(C.rad+m4sep,0),,m4n:rp_ang*rtod_)
+ popdef(`m4stemlgth',`m4sep',`m4n')',
m4type,N,
- `C: circle rad sourcerad_*m4scale at Origin
+ `C: circle rad sourcerad_*m4scale*0.5 at Origin
ifelse(m4grnd,,,`ground(at C+(Rect_(C.rad,m4grnd)),,,m4grnd)') ')
resetdir_ popdef(`m4type', `m4scale', `m4grnd' )
] with .Origin ifelse(`$1',,at Here,`$1') ')
@@ -662,11 +665,11 @@ define(`sl_busbar',
[ tmp_ang = rp_ang
eleminit_(`$1',(m4npoints-1)*dimen_)
Start: last line.start; End: last line.end
+ Line: line from Start to End m4line; C: Line.c
M: move from Start to End chop m4indent
for_(1,m4npoints,1,
`P`'m4x: (m4x-1)/(m4npoints-1) between M.start and M.end dnl
ifinstr(m4port,D,` ;dot(at P`'m4x)')')
- Line: line from Start to End m4line; C: Line.c
point_(tmp_ang) ] popdef(`m4line', `m4port', `m4indent') ')
`sl_slash( at position, keys, [n:]R|L|U|D|degrees)
diff --git a/graphics/circuit_macros/libcct.m4 b/graphics/circuit_macros/libcct.m4
index 3c4128b6d3..16ae9ba91e 100644
--- a/graphics/circuit_macros/libcct.m4
+++ b/graphics/circuit_macros/libcct.m4
@@ -1,7 +1,7 @@
divert(-1)
libcct.m4
-* Circuit_macros Version 9.8, copyright (c) 2022 J. D. Aplevich under *
+* Circuit_macros Version 9.9, copyright (c) 2022 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
@@ -1727,7 +1727,7 @@ SW: rvec_(adc_ht/2,-adc_ht/2)
`$7']')
`diode(linespec,
- B|CR|D|F|G|L|LE[R]|P[R]|S|Sh|T|U|V|v|w|Z|chars,
+ B|b|CR|D|F|G|L|LE[R]|P[R]|S|Sh|T|U|V|v|w|Z|chars,
[R][E])
Adding K to arg2 draws open arrowheads
Adding M draws a mid-arrowhead crossbar
@@ -1742,6 +1742,7 @@ define(`diode',
define(`m4cts',`ifelse(
dma_,,LACR,
dma_,B,uLAZQuR,
+ dma_,b,uLAzQuR,
dma_,CR,LACRrb,
dma_,D,LuAHdQR,
dma_,F,LFR,
@@ -1806,6 +1807,7 @@ define(`diode',
[u|d]v varicap diode-capacitor curved plate
Y bilateral core
Z zener bar
+ z zener bar outlined
arg 2: f= fill the arrowhead
M=arrowhead crossbar
R=right orientation
@@ -1936,6 +1938,13 @@ define(`m4gen_d',`{dnl
to rvec_(0,-m4dv/2-m4dy) \
then to rvec_(0, m4dv/2+m4dy) \
then to rvec_(m4dv/4,m4dv/2+m4dy)}')
+ sc_draw(`ddna_',z,dnl Outlined zener bar
+ `{line from rvec_(-m4dv/4,-m4dv/2-m4dy-lthick*2) \
+ to rvec_( lthick*0.7,-m4dv/2-m4dy) \
+ then to rvec_( lthick*0.7, m4dv/2+m4dy+lthick) }
+ {line from rvec_( m4dv/4, m4dv/2+m4dy+lthick*2) \
+ to rvec_(-lthick*0.7, m4dv/2+m4dy) \
+ then to rvec_(-lthick*0.7,-m4dv/2-m4dy-lthick) }')
ifinstr(ddna_,Q,dnl left arrowhead
`sc_draw(`ddna_',Qc,`define(`m4Qc')')sc_draw(`ddna_',Q,`undefine(`m4Qc')')dnl
define(`m4dn',`ifelse(m4a,u,m4dv/2,m4a,d,-m4dv/2,0)')dnl
@@ -1967,7 +1976,6 @@ define(`m4gen_d',`{dnl
`line from 0.5 between M4_s and M4_e to M4_e \
chop m4dh ifelse(m4a,,/2,m4a,d,/2+m4dv/4) chop 0')
')dnl
-
`em_arrows( type,degrees,length)
type=[N|I|E][D] N=nonionizing, I=ionizing,
E=simple; D=dot on arrow stem
@@ -2790,8 +2798,8 @@ define(`reversed',`eleminit_(`$2')
`resized(factor,`macro name in quotes',args)
multiply element body size by factor'
-define(`resized',`define(`m4resiztmp',dimen_)define(`dimen_',(dimen_)*(`$1'))dnl
- $2(shift(shift($@))) define(`dimen_',m4resiztmp)')
+define(`resized',`pushdef(`dimen_',(dimen_)*(`$1'))dnl
+ $2(shift(shift($@))) popdef(`dimen_')')
`variable(`element', type, [+|-]angle,
length, at position)
@@ -3674,6 +3682,7 @@ define(`earphone',`[ setdir_($1,R)
In2: Here
In3: rvec_(0,-m4h/8)')
`$4'; resetdir_ ]')
+
`Signal-flow graph macros: labeled node,
directed labeled chopped straight line,
directed labeled chopped arc, and a self
@@ -3746,8 +3755,8 @@ define(`sfgarc',`eleminit_(`$1',sfg_wid)
`arc m4c_l patsubst(patsubst(`$1',.*<-,<-),->.*$,->) ifelse(`$4',ccw,ccw,cw)\
from Cintersect(Start,sfg_rad,C,arcrd,ifelse(`$4',ccw,R)) \
to Cintersect(C,arcrd,End,sfg_rad,ifelse(`$4',ccw,R)) with .c at C')
- ifelse(`$2',,,`{move to M; "iflatex(`$ `$2'$',` $2')" ifelse(`$3',,
- `sfgabove',`$3')}')
+ ifelse(`$2',,,`move to M; "iflatex(`$ `$2'$',` $2')" ifelse(`$3',,
+ `sfgabove',`$3')')
] with .Start at last line.start
move to last line.end
')
@@ -3767,7 +3776,7 @@ define(`sfgself',`[ Origin: Here
ifelse(`$7',,`{ arrow m4c_l from rvec_(0,ifelse(`$5',cw,,-)sfg_aht/2) \
to rvec_(0,ifelse(`$5',cw,-)sfg_aht/2) ht sfg_aht wid sfg_awid }')
ifelse(`$3',,,
- `"iflatex(`$ `$3'$',` $3')" ifelse(`$4',,`sfgabove',`$4')') }
+ `{"iflatex(`$ `$3'$',` $3')" ifelse(`$4',,`sfgabove',`$4')}') }
m4sfgselfcurve(,
ifelse(`$5',ccw,`ifinstr(`$7',->,<-)',`ifinstr(`$7',<-,<-)'))
resetdir_ ] with .Origin ifelse(`$1',,at Here,`$1')
diff --git a/graphics/circuit_macros/libgen.m4 b/graphics/circuit_macros/libgen.m4
index 7862d04bb4..9fe00c721c 100644
--- a/graphics/circuit_macros/libgen.m4
+++ b/graphics/circuit_macros/libgen.m4
@@ -2,7 +2,7 @@ divert(-1)
libgen.m4 Base macros for dpic and gpic diagrams
-* Circuit_macros Version 9.8, copyright (c) 2022 J. D. Aplevich under *
+* Circuit_macros Version 9.9, copyright (c) 2022 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
@@ -44,7 +44,7 @@ dnl define(`HOMELIB_',`D:\Dwight\lib')
`NeedDpicTools( path )
If path is empty then HOMELIB_ is used
e.g. NeedDpicTools or NeedDpicTools(/home/lib/)'
-define(`NeedDpicTools',`if "dpictools_" != "1" then { copy dnl
+define(`NeedDpicTools',`if dpicopt > 0 then { copy dnl
ifelse(`$1',,`"HOMELIB_`'dpictools.pic"',`"`$1'dpictools.pic"') }')
Processor shortcuts
@@ -184,7 +184,7 @@ define(`SIdefaults',
define(`latexcommand',`command "ifmpost(verbatimtex) `$1' ifmpost(etex)"')
define(`m4announceprocessor',`dnl Do not change the format of the next line:
-`#' `$1' Version 9.8: ifelse(m4picprocessor,gpic,`Gpic',
+`#' `$1' Version 9.9: ifelse(m4picprocessor,gpic,`Gpic',
m4postprocessor,pstricks,`PSTricks',
m4postprocessor,pgf,`TikZ PGF',
m4postprocessor,mfpic,`Mfpic',
@@ -821,8 +821,8 @@ define(`m4Delch',
If string contains abc=expr; then
pushdef(`m4abc',(expr)) otherwise
pushdef(`m4abc',(default)).
- setkey_ uses define() instead of pushdef{}.
- Nonblank arg4 omits the parentheses.'
+ Nonblank arg4 omits the parentheses. The
+ expr and val may not contain ;'
define(`pushkey_',
`pushdef(`m4xt',index(`$1',`$2'=))ifelse(m4xt,-1,
`pushdef(key_prefix`'$2,`ifelse(`$3',,,ifelse(`$4',,(`$3'),`$3'))')',
@@ -833,6 +833,14 @@ define(`pushkey_',
substr(m4sktmp,0,index(m4sktmp,;))))')')dnl
popdef(`m4xt')')
+ `setkey_(string,key,default,[N])
+ string contains semicolon-separated
+ terms of the form key=val
+ If string contains abc=expr; then
+ define(`m4abc',(expr)) otherwise
+ define(`m4abc',(default)).
+ Nonblank arg4 omits the parentheses. The
+ expr and val may not contain ;'
define(`setkey_',
`define(`m4xt',index(`$1',`$2'=))ifelse(m4xt,-1,
`define(key_prefix`'$2,`ifelse(`$3',,,ifelse(`$4',,(`$3'),`$3'))')',
@@ -845,20 +853,32 @@ popdef(`m4xt')')
define(`key_prefix',`m4') # Could be locally redefined
- `pushkeys_(string,keysequence)
- Invoke pushkey_ on a sequence of terms.
- setkeys_(string,keysequence)
- Invoke setkey_ on a sequence of terms.
- Arg 2 is a sequence of semicolon (;)-separated
- terms of the form
- identifier:default value:N
- containing up to 3 fields separated by : '
-define(`pushkeys_',`Loopover_(`M4Z',`pushkey_(`$1',patsubst(M4Z,:,`,'))dnl',
- patsubst(`$2',;,`,'))')
-define(`setkeys_',`Loopover_(`M4Z',`setkey_(`$1',patsubst(M4Z,:,`,'))dnl',
- patsubst(`$2',;,`,'))')
-
- `String with exact typeset dimensions:
+ `pushkeys_(string,keysequence,keysep,itemsep)
+ Invoke pushkey_ on a sequence of terms.
+ Arg 2 is a sequence of terms separated by
+ arg3 (default ;) of the form
+ identifier:default value:N
+ containing up to 3 fields separated by arg 4
+ (default :). The separators may not appear
+ elsewhere in the terms.'
+define(`pushkeys_',`Loopover_(`M4Z',
+ `pushkey_(`$1',patsubst(M4Z,ifelse(`$4',,:,`$4'),`,'))dnl',
+ patsubst(`$2',ifelse(`$3',,;,`$3'),`,'))')
+
+ `setkeys_(string,keysequence,keysep,itemsep)
+ Invoke setkey_ on a sequence of terms.
+ Arg 2 is a sequence of terms separated by
+ arg3 (default ;) of the form
+ identifier:default value:N
+ containing up to 3 fields separated by arg 4
+ (default :). The separators may not appear
+ elsewhere in the terms.'
+define(`setkeys_',`Loopover_(`M4Z',
+ `setkey_(`$1',patsubst(M4Z,ifelse(`$4',,:,`$4'),`,'))dnl',
+ patsubst(`$2',ifelse(`$3',,;,`$3'),`,'))')
+
+ `s_box(text or other latex)
+ String with exact typeset dimensions:
Requires s_init(name), sinclude(filename.dim),
boxdims.sty, and processing twice. If there
are two or more args they are given to
@@ -873,29 +893,35 @@ ifelse(index(`$1',"),0,`substr(`$1',1,eval(len(`$1')-2))',`$1')}dnl
"ifelse(`$2',,,`,shift($@))') \
wid s_wd(,`textwid') ht s_ht(,`textht')+s_dp')')
- `r_text(text,degrees)
+ `r_text(degrees,text,at position)
(requires PSTricks, pgf, or svg)'
define(`r_text',`define(`m4txt',
-`ifelse(index(`$1',"),0,`substr(`$1',1,eval(len(`$1')-2))',`$1')')dnl
+`ifelse(index(`$2',"),0,`substr(`$2',1,eval(len(`$2')-2))',`$2')')dnl
ifelse(ifpstricks(T)`'ifpgf(T)`'ifsvg(T),T,
-`define(`m4rtang',`ifelse(`$2',,90,`$2')')dnl
-ifsvg(`svg_rot(m4rtang,"m4txt")')dnl
-ifpstricks(`"\rput[c]{m4rtang}(0,0){m4txt}"')dnl
-ifpgf(`"\pgftext[rotate=m4rtang]{m4txt}"')',"m4txt")')
+`define(`m4rtang',`ifelse(`$1',,90,`$1')')dnl
+ifsvg(`svg_rot(m4rtang,"m4txt",`$3')')dnl
+ifpstricks(`"\rput[c]{m4rtang}(0,0){m4txt}" `$3'')dnl
+ifpgf(`"\pgftext[rotate=m4rtang]{m4txt}" `$3'')',
+"m4txt")')
define(`text_ang',90)
- `Like s_box but text is rotated text_ang degrees
+ `rs_box([angle=degrees;] text or other latex)
+ Like s_box but text is rotated text_ang degrees
+ (default 90) unless the angle= key is given.
+ The key must be a decimal number.
(requires PSTricks or pgf)'
define(`rs_box',
`define(`m4_k',ifdef(`m4_k',incr(m4_k),1))dnl
ifelse(`$2',,,`sprintf(')"ifdef(`s_name',,`{\bf !!}')dnl
\defboxdim{s_name`'_`'m4_k}{dnl
-ifelse(index(`$1',"),0,`substr(`$1',1,eval(len(`$1')-2))',`$1')}dnl
-ifpstricks(`\rput[c]{text_ang}(0,0)')ifpgf(`\pgftext[rotate=text_ang]'){dnl
-ifelse(index(`$1',"),0,`substr(`$1',1,eval(len(`$1')-2))',`$1')}"dnl
+pushkey_(`$1',angle,text_ang,N)define(`rs_arg',patsubst(`$1',.*;))dnl
+ifelse(index(rs_arg,"),0,`substr(rs_arg,1,eval(len(rs_arg)-2))',rs_arg)}dnl
+ifpstricks(`\rput[c]{m4angle}(0,0)')ifpgf(`\pgftext[rotate=m4angle]'){dnl
+ifelse(index(rs_arg,"),0,`substr(rs_arg,1,eval(len(rs_arg)-2))',rs_arg)}"dnl
ifelse(`$2',,,`,shift($@),shift($@))') \
- wid s_wd(,textwid)*cosd(text_ang) + (s_ht(,textht)+s_dp)*sind(text_ang) \
- ht (s_ht(,textht)+s_dp)*cosd(text_ang)+s_wd(,textwid)*sind(text_ang)')
+ wid s_wd(,textwid)*cosd(m4angle) + (s_ht(,textht)+s_dp)*sind(m4angle) ht \
+ (s_ht(,textht)+s_dp)*cosd(m4angle) \
+ +s_wd(,textwid)*sind(m4angle)popdef(`m4angle')')
`Initialize string index: s_init(name)'
define(`s_init',`define(`s_name',`$1')')
@@ -1490,7 +1516,7 @@ define(`Cintersect',
define(`m4cls',`(m4cdx^2+m4cdy^2)')dnl
define(`m4cq',`((m4cls+m4Cr1^2-m4Cr2^2)/2)')dnl
(m4cq/m4cls between `$1' and `$3') ifinstr(`$5',R,-,+)\
- (vscal_(sqrt(max(0,m4cls*m4Cr1^2-m4cq^2))/m4cls,-m4cdy,m4cdx))')
+ (vscal_(sqrt(abs(m4cls*m4Cr1^2-m4cq^2))/m4cls,-m4cdy,m4cdx))')
define(`cintersect',`Cintersect($@)')
`LCintersect(Name of line,Centre,rad,[R])
@@ -1749,6 +1775,8 @@ define(`graystring',`rgbstring(`$1',`$1',`$1')')
`outlined string' or `shaded string'
(mpost,PSTricks,pdf,tikz-pgf,postscript,svg
only)'
+ `The 1: after rgb is a divisor for the values
+ (xcolor manual p 16)'
ifelse(
m4postprocessor,pstricks,`define(`rgbstring',`ifelse(`$2',,`"$1"',
`sprintf("{rgb,1:red,%7.5f;green,%7.5f;blue,%7.5f}",`$1',`$2',`$3')')')',
@@ -1768,7 +1796,6 @@ m4postprocessor,postscript,`define(`rgbstring',
[name],[D][F])
define colour for lines and text.
arg5 (svg only): D=draw, F=fill
- SVG values are 0 to 255
see also \usepackage{latexcolors} and
latexcolor.com'
define(`setrgb',`pushdef(`r_',`$1')pushdef(`g_',`$2')pushdef(`b_',`$3')dnl
@@ -1780,9 +1807,9 @@ ifelse(m4postprocessor,pstricks,
m4postprocessor,svg,`
command "<g " \
ifinstr(`$5',F,,
- `+ sprintf("stroke=\"rgb(%g,%g,%g)\" ",round_(r_),round_(g_),round_(b_))') \
+ `+ sprintf("stroke=\"rgb(%g,%g,%g)\" ",color255(r_,g_,b_))') \
ifinstr(`$5',D,,
- `+ sprintf("fill=\"rgb(%g,%g,%g)\"", round_(r_),round_(g_),round_(b_))') \
+ `+ sprintf("fill=\"rgb(%g,%g,%g)\"", color255(r_,g_,b_))') \
+ ">"',
m4postprocessor,pgf,`
command sprintf("\definecolor{m4cl_}{rgb}{%7.5f,%7.5f,%7.5f}%%",r_,g_,b_)
@@ -1832,7 +1859,7 @@ ifelse(m4postprocessor,pstricks,
shift(shift(shift($@)))
command "}%"',
m4postprocessor,svg,
- `setrgb(`$1',`$2',`$3',,ifsvg(F))
+ `setrgb(`$1',`$2',`$3',,F)
shift(shift(shift($@)))
resetrgb',
m4postprocessor,pgf,
diff --git a/graphics/circuit_macros/liblog.m4 b/graphics/circuit_macros/liblog.m4
index 3e0397b73a..f89e39b486 100644
--- a/graphics/circuit_macros/liblog.m4
+++ b/graphics/circuit_macros/liblog.m4
@@ -1,7 +1,7 @@
divert(-1)
liblog.m4 Logic gates
-* Circuit_macros Version 9.8, copyright (c) 2022 J. D. Aplevich under *
+* Circuit_macros Version 9.9, copyright (c) 2022 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
diff --git a/graphics/circuit_macros/mfpic.m4 b/graphics/circuit_macros/mfpic.m4
index 7776a7fdce..1670be9104 100644
--- a/graphics/circuit_macros/mfpic.m4
+++ b/graphics/circuit_macros/mfpic.m4
@@ -1,7 +1,7 @@
divert(-1)
mfpic.m4 Initialization for mfpic.
-* Circuit_macros Version 9.8, copyright (c) 2022 J. D. Aplevich under *
+* Circuit_macros Version 9.9, copyright (c) 2022 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
diff --git a/graphics/circuit_macros/mpost.m4 b/graphics/circuit_macros/mpost.m4
index 843b1b0b95..8e3acae6ec 100644
--- a/graphics/circuit_macros/mpost.m4
+++ b/graphics/circuit_macros/mpost.m4
@@ -1,7 +1,7 @@
divert(-1)
mpost.m4 Initialization for metapost.
-* Circuit_macros Version 9.8, copyright (c) 2022 J. D. Aplevich under *
+* Circuit_macros Version 9.9, copyright (c) 2022 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
diff --git a/graphics/circuit_macros/pgf.m4 b/graphics/circuit_macros/pgf.m4
index e794a15e3e..73dc439b94 100644
--- a/graphics/circuit_macros/pgf.m4
+++ b/graphics/circuit_macros/pgf.m4
@@ -1,7 +1,7 @@
divert(-1)
pgf.m4 Initialization for Tikz-pgf.
-* Circuit_macros Version 9.8, copyright (c) 2022 J. D. Aplevich under *
+* Circuit_macros Version 9.9, copyright (c) 2022 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
diff --git a/graphics/circuit_macros/postscript.m4 b/graphics/circuit_macros/postscript.m4
index 606cc96258..3b724e380a 100644
--- a/graphics/circuit_macros/postscript.m4
+++ b/graphics/circuit_macros/postscript.m4
@@ -1,7 +1,7 @@
divert(-1)
postscript.m4 Initialization for Postscript output.
-* Circuit_macros Version 9.8, copyright (c) 2022 J. D. Aplevich under *
+* Circuit_macros Version 9.9, copyright (c) 2022 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
diff --git a/graphics/circuit_macros/psfrag.m4 b/graphics/circuit_macros/psfrag.m4
index 5af564a316..78b117ac40 100644
--- a/graphics/circuit_macros/psfrag.m4
+++ b/graphics/circuit_macros/psfrag.m4
@@ -2,7 +2,7 @@ divert(-1)
psfrag.m4 Initialization for dpic -f processing:
Postscript with psfrag strings
-* Circuit_macros Version 9.8, copyright (c) 2022 J. D. Aplevich under *
+* Circuit_macros Version 9.9, copyright (c) 2022 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
diff --git a/graphics/circuit_macros/pstricks.m4 b/graphics/circuit_macros/pstricks.m4
index 728194721c..822bd94c83 100644
--- a/graphics/circuit_macros/pstricks.m4
+++ b/graphics/circuit_macros/pstricks.m4
@@ -1,7 +1,7 @@
divert(-1)
pstricks.m4 Initialization for PSTricks.
-* Circuit_macros Version 9.8, copyright (c) 2022 J. D. Aplevich under *
+* Circuit_macros Version 9.9, copyright (c) 2022 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
diff --git a/graphics/circuit_macros/svg.m4 b/graphics/circuit_macros/svg.m4
index dfa968891f..73f144594f 100644
--- a/graphics/circuit_macros/svg.m4
+++ b/graphics/circuit_macros/svg.m4
@@ -1,7 +1,7 @@
divert(-1)
svg.m4 Initialization for SVG output.
-* Circuit_macros Version 9.8, copyright (c) 2022 J. D. Aplevich under *
+* Circuit_macros Version 9.9, copyright (c) 2022 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
@@ -207,6 +207,7 @@ define(`svg_pound',`svg_symbol(&`#'35;)')
define(`svg_circ',`svg_symbol(&`#'710;)')
define(`svg_deg',`svg_symbol(&`#'176;)')
define(`svg_equiv',`svg_symbol(&`#'8801;)')
+define(`svg_tilde',`svg_symbol(&`#'126;)')
')
define(`svgcolor',`sprintf("rgb(%g,%g,%g)",\
@@ -242,7 +243,7 @@ define(`svg_rot_init',`
| sed -e \"s/x=\\"\([0-9.]*\)\\" y=\\"\([0-9.]*\)\\".*/\1 \2/\" dnl
> _file_.cor" )
if retcode != 0 then { print "
- Awk failure
+ Awk failure.
Awk and sed are required by svg_rot to rotate svg text.
" }
svgrot_k = 0
@@ -254,7 +255,7 @@ define(`svg_rot_init',`
svgrot_i = 0
ifdef(`svg_rot_',,`
-# `svg_rot(degrees,"text" [at position])
+# `svg_rot(degrees,"text",[at position])
# Rotate text degrees ccw
# Requires svg_rot_init(filename)
# which uses both awk and sed.
@@ -263,15 +264,36 @@ define(`svg_rot_init',`
if "$`'1" != "" then { svg_rang = -($`'1) } else { svg_rang = -90 }
if svgrot_k != 0 then { svgrot_i +=1
command sprintf("<g transform=\"rotate(%g %g %g)\">",svg_rang,\
- svg_rx[svgrot_i],svg_ry[svgrot_i]) }\
+ svg_rx[svgrot_i]+textht/2*sind(svg_rang),\
+ svg_ry[svgrot_i]+textht/2*(1-cosd(svg_rang))) }\
else { command sprintf("<g transform=\"rotate(%g)\">",svg_rang) }
-$`'2
+ if "$`'3"=="" then { $`'2 } \
+ else { $`'2 $`'3 - (sind(svg_rang),(cosd(svg_rang)-1))*textht/2 }
command "</g>" } }
define(`svg_rot_')
')
`# svg_rot'_init end
')
+ifelse(0,1,`
+# ifdef(`svg_rot_',,`
+## `svg_rot(degrees,"text" [at position])
+## Rotate text degrees ccw
+## Requires svg_rot_init(filename)
+## which uses both awk and sed.
+## The source must be processed twice by m4 and dpic.'
+# define svg_rot { if retcode != 0 then {$`'2} else {
+# if "$`'1" != "" then { svg_rang = -($`'1) } else { svg_rang = -90 }
+# if svgrot_k != 0 then { svgrot_i +=1
+# command sprintf("<g transform=\"rotate(%g %g %g)\">",svg_rang,\
+# svg_rx[svgrot_i],svg_ry[svgrot_i]) }\
+# else { command sprintf("<g transform=\"rotate(%g)\">",svg_rang) }
+#$`'2
+# command "</g>" } }
+# define(`svg_rot_')
+# ')
+')
+
# ---------------------------------------------------------------------------#
define(`thinlines_',`linethick = 0.4
diff --git a/graphics/circuit_macros/xfig.m4 b/graphics/circuit_macros/xfig.m4
index 04c998eb3c..40fef9bbbe 100644
--- a/graphics/circuit_macros/xfig.m4
+++ b/graphics/circuit_macros/xfig.m4
@@ -1,7 +1,7 @@
divert(-1)
xfig.m4 Initialization for xfig.
-* Circuit_macros Version 9.8, copyright (c) 2022 J. D. Aplevich under *
+* Circuit_macros Version 9.9, copyright (c) 2022 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
diff --git a/macros/latex/contrib/csassignments/csassignments.dtx b/macros/latex/contrib/csassignments/csassignments.dtx
index 1be6fcaf47..7c52fd94d7 100644
--- a/macros/latex/contrib/csassignments/csassignments.dtx
+++ b/macros/latex/contrib/csassignments/csassignments.dtx
@@ -30,7 +30,7 @@
%</driver>
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
-\ProvidesClass{csassignments}[2022/06/01 v1.0.0 Assignments Class for CS]
+\ProvidesClass{csassignments}[2022/07/28 v1.0.2 Assignments Class for CS]
% \end{macrocode}
%
%<*driver>
@@ -73,6 +73,7 @@
%
% \changes{v1.0.0}{2022/06/01}{Publish class with documentation}
% \changes{v1.0.1}{2022/06/07}{Rename class to not collide with existing assignments class}
+% \changes{v1.0.2}{2022/07/28}{Fix a bug where verb+\ClassWarning+ lacked the right number of arguments}
%
% \GetFileInfo{csassignments.cls}
%
@@ -82,7 +83,7 @@
% \maketitle
% \tableofcontents
%
-% \StopEventually{} ^^A
+% \StopEventually{} ^^A
%
% \section{Introduction}
%
@@ -279,8 +280,8 @@
\end{tabular}
\renewcommand{\arraystretch}{1}%
\end{table}
- }{\texttt{Compile again}\ClassWarning{Compile again to properly
- display grading table}}
+ }{\texttt{Compile again}\ClassWarning{csassignments}{Compile again to %
+ properly display grading table}}
}
% \end{macrocode}
% \end{macro}
diff --git a/macros/latex/contrib/csassignments/csassignments.pdf b/macros/latex/contrib/csassignments/csassignments.pdf
index 43b113f3b8..2f15269f66 100644
--- a/macros/latex/contrib/csassignments/csassignments.pdf
+++ b/macros/latex/contrib/csassignments/csassignments.pdf
Binary files differ
diff --git a/macros/latex/contrib/nicematrix/nicematrix-french.pdf b/macros/latex/contrib/nicematrix/nicematrix-french.pdf
index 9ab3697a79..00d091b585 100644
--- a/macros/latex/contrib/nicematrix/nicematrix-french.pdf
+++ b/macros/latex/contrib/nicematrix/nicematrix-french.pdf
Binary files differ
diff --git a/macros/latex/contrib/nicematrix/nicematrix-french.tex b/macros/latex/contrib/nicematrix/nicematrix-french.tex
index 55c66b32d1..c9c6eebe4d 100644
--- a/macros/latex/contrib/nicematrix/nicematrix-french.tex
+++ b/macros/latex/contrib/nicematrix/nicematrix-french.tex
@@ -15,6 +15,7 @@
\usepackage{enumitem}
\usepackage{siunitx}
\usepackage{verbatim}
+\usepackage{caption}
% We use \MakeShortVerb of shortvrb and not \DefineShortVerb of fancyvrb
% because we don't want the contents of short verbatim colored in gray
@@ -772,7 +773,7 @@ classiques.
Dans les environnements de \pkg{nicematrix}, les filets verticaux spécifiés par
\verb+|+ dans le préambule des environnements ne sont jamais coupés, même en cas
de ligne incomplète ou de double filet horizontal spécifié par |\hline\hline|
-(il n'y a pas besoin d'utiliser \pkg{hhline}).
+(il n'y a pas besoin d'utiliser l'extension \pkg{hhline}).
\medskip
\begin{BVerbatim}[baseline=c,boxwidth=10cm]
@@ -1342,9 +1343,8 @@ pointillés.\footnote{Néanmoins, l'utilisateur peut écraser ces définitions d
\end{BVerbatim}
\bigskip
-Dans les environnements de \pkg{nicematrix}, il est donc possible d'utiliser les
-commandes |\hdottedline| et |\cdottedline| pour tracer des filets horizontaux en
-pointillés.
+Il est donc possible d'utiliser les commandes |\hdottedline| et |\cdottedline|
+pour tracer des filets horizontaux en pointillés.
\medskip
\begin{BVerbatim}[baseline=c,boxwidth=9.5cm]
@@ -1352,7 +1352,7 @@ pointillés.
1 & 2 & 3 & 4 & 5 \\
~emphase#\hdottedline@
6 & 7 & 8 & 9 & 10 \\
- emphase#\cdottedline{1,4-5}@
+~emphase#\cdottedline{1,4-5}@
11 & 12 & 13 & 14 & 15
\end{pNiceMatrix}
\end{BVerbatim}
@@ -1447,12 +1447,9 @@ successives.\footnote{Si vous utilisez Overleaf, Overleaf effectue
\medskip
L'extension \pkg{nicematrix} fournit une clé |code-before| pour du code qui sera
-exécuté avant le tracé du tableau.
-
-\smallskip
-Une syntaxe alternative est proposée : on peut placer le contenu de ce
-|code-before| entre les mots-clés |\CodeBefore| et |\Body| juste au début de
-l'environnement.
+exécuté avant le tracé du tableau. Une syntaxe alternative est proposée : on
+peut placer le contenu de ce |code-before| entre les mots-clés |\CodeBefore| et
+|\Body| juste au début de l'environnement.
\begin{Verbatim}
\begin{pNiceArray}{~textsl#preamble@}
@@ -3322,10 +3319,36 @@ $\begin{pNiceMatrix}
\end{pNiceMatrix}$
-\section{Les notes dans les tableaux}
+\section{Les légendes et les notes dans les tableaux}
\label{s:notes}
+\subsection{La légendes des tableaux}
+
+\colorbox{yellow!50}{\bfseries Nouveau 6.12}\enskip L'environnement
+|{NiceTabular}| proposent des clés |caption|, |short-caption| et |label| à
+utiliser lorsque le tableau est inséré dans un environnment flottant
+(typiquement un environnement |{table}|).
+
+\smallskip
+L'intérêt d'utiliser cette clé |caption| plutôt que la commande classique
+|\caption| est que la légende, si elle longue, est justifiée à la largeur du
+tableau (sans avoir à utiliser l'extension \pkg{threeparttable} ou l'extension
+\pkg{floatrow}).
+
+\smallskip
+Par défaut, la légende est placée au-dessous du tableau. Pour avoir la légence
+placée au-dessus, il convient d'utiliser la clé |caption-above| dans
+|\NiceMatrixOptions|.
+
+\smallskip
+La clé |short-caption| correspond à l'argument optionnel de la commande
+classique |\caption| et la clé |label| correspond bien sûr à la commande |\label|.
+
+\smallskip
+Voir table \ref{t:tabularnote}, p.~\pageref{t:tabularnote} un exemple
+d'utilisation des clés |caption| et |label|.
+
\subsection{Les notes de pied de page}
\smallskip
@@ -3409,7 +3432,10 @@ Dupont & Chantal & 15 janvier 1998 \\
\begin{itemize}
\item La commande |\tabularnote| est en fait utilisable avant
l'environnement de \pkg{nicematrix}, le but étant de pouvoir l'utiliser sur le
-titre inséré par |\caption| dans un environnement |{table}| de LaTeX.
+titre inséré par |\caption| dans un environnement |{table}| de LaTeX (ou dans la
+commande |\captionof| de l'extension \pkg{caption}). Sans surprise, il est
+également possible de l'utiliser dans la légende rentrée avec la clé |caption|
+de l'environnement |{NiceTabular}|.
\item Si plusieurs commandes |\tabularnote{...}| se suivent \emph{sans aucun espace
entre elles}, les appels de notes correspondants sont composés ensemble,
@@ -3431,30 +3457,35 @@ des notes avant les notes numérotées.
\pkg{nicematrix}), la clé |notes/bottomrule| permet de faire tracer un
|\bottomrule| de \pkg{booktabs} \emph{après} les notes.
-\item \colorbox{yellow!50}{\textbf{Nouveau 6.8}}\enskip Lorsque plusieurs
-commandes |\tabularnote| sont utilisées avec le même argument, une seule note
-est insérée en fin de tableau (mais tous les labels sont marqués). Il est
-possible de désactiver cette fonctionnalité avec la clé
-|notes/detect-duplicates|
+\item Lorsque plusieurs commandes |\tabularnote| sont utilisées avec le même
+argument, une seule note est insérée en fin de tableau (mais tous les labels
+sont marqués). Il est possible de désactiver cette fonctionnalité avec la clé
+|notes/detect-duplicates|.\footnote{Pour des raisons techniques, il n'est pas
+ autorisé de mettre des |\tabularnote| avec exactement le même argument dans la
+ légende.}
\item Il est possible de référencer une note de tableau (avec la commande
|\label| placée après le |\tabularnote|).
\end{itemize}
%
Voir sur la table \ref{t:tabularnote}, p.~\pageref{t:tabularnote}, certaines de ces
-remarques illustrées. Cette table a été composée avec le code suivant.
+remarques illustrées. Cette table a été composée avec le code suivant
+(l'extension \pkg{caption} a été chargée dans ce document).
\begin{center}
\fvset{commandchars=\~\#\!}
\begin{Verbatim}[formatcom=\small\color{gray}]
\begin{table}
-\setlength{\belowcaptionskip}{1ex}
\centering
-\caption{Utilisation de \texttt{\textbackslash
- tabularnote}~emphase#\tabularnote{On peut mettre une note dans le titre.}!}
-\label{t:tabularnote}
+\NiceMatrixOptions{caption-above}
\begin{NiceTabular}{@{}llc@{}}%
- [~emphase#notes/bottomrule!, tabularnote = Un peu de texte avant les notes.]
+ [
+ caption = Un tableau dont la légende a été rentrée avec la clé \texttt{caption}
+ ~emphase#\tabularnote{On peut mettre une note dans la légende.}! ,
+ label = t:tabularnote ,
+ tabularnote = Un peu de texte avant les notes. ,
+ notes/bottomrule
+ ]
\toprule
Nom & Prénom & Durée de vie \\
\midrule
@@ -3471,14 +3502,17 @@ Wallis & John & 87 \\
\end{Verbatim}
\end{center}
-\begin{table}[hb]
-\setlength{\belowcaptionskip}{1ex}
+\begin{table}[hbt]
\centering
-\caption{Utilisation de \texttt{\textbackslash tabularnote}\tabularnote{On peut
- mettre une note dans le titre.}}
-\label{t:tabularnote}
+\NiceMatrixOptions{caption-above}
\begin{NiceTabular}{@{}llc@{}}%
- [notes/bottomrule, tabularnote = Un peu de texte avant les notes.]
+ [
+ caption = Un tableau dont la légende a été rentrée avec la clé \texttt{caption}
+ \tabularnote{On peut mettre une note dans la légende.} ,
+ label = t:tabularnote,
+ tabularnote = Un peu de texte avant les notes. ,
+ notes/bottomrule
+ ]
\toprule
Nom & Prénom & Durée de vie \\
\midrule
@@ -4637,7 +4671,7 @@ ne soit tracée.
On peut alors programmer cette commande |\crossbox| de la manière suivante, qui
-utilise explicitement la variable publique |\g_nicematrix_code_after_tl|.
+utilise explicitement la variable publique |\g_nicematrix_code_before_tl|.
\begin{scope}
@@ -4653,7 +4687,7 @@ utilise explicitement la variable publique |\g_nicematrix_code_after_tl|.
\NewDocumentCommand \crossbox { ! O { } }
{
- \tl_gput_right:Nx §emphase¤\g_nicematrix_code_after_tlμ
+ \tl_gput_right:Nx §emphase¤\g_nicematrix_code_before_tlμ
{
\__pantigny_crossbox:nnn
{ \int_use:c { c@iRow } }
@@ -4677,7 +4711,7 @@ utilise explicitement la variable publique |\g_nicematrix_code_after_tl|.
\NewDocumentCommand \crossbox { ! O { } }
{
- \tl_gput_right:Nx \g_nicematrix_code_after_tl
+ \tl_gput_right:Nx \g_nicematrix_code_before_tl
{
\__pantigny_crossbox:nnn
{ \int_use:c { c@iRow } }
@@ -4710,9 +4744,7 @@ mante & raie & poule
\section{Remarques techniques}
Première remarque : l'extension \pkg{nicematrix} doit être chargée après
-l'extension \pkg{underscore}. Si ce n'est pas le cas, une erreur est levée.
-
-
+l'extension \pkg{underscore}.
\subsection{Lignes diagonales}
diff --git a/macros/latex/contrib/nicematrix/nicematrix.dtx b/macros/latex/contrib/nicematrix/nicematrix.dtx
index 70db98bb3e..1f39dbe880 100644
--- a/macros/latex/contrib/nicematrix/nicematrix.dtx
+++ b/macros/latex/contrib/nicematrix/nicematrix.dtx
@@ -15,8 +15,8 @@
%
% \fi
% \iffalse
-\def\myfileversion{6.11}
-\def\myfiledate{2022/07/16}
+\def\myfileversion{6.12}
+\def\myfiledate{2022/07/28}
%
%
%<*batchfile>
@@ -56,6 +56,7 @@ version 2005/12/01 or later.
\usetikzlibrary{fit,patterns,arrows.meta,decorations.pathmorphing}
\usepackage{nicematrix}
\usepackage{siunitx}
+\usepackage{caption}
\usepackage{varwidth}
\usepackage[auto-lang=false]{lipsum}
@@ -806,7 +807,7 @@ version 2005/12/01 or later.
% In the environments of \pkg{nicematrix}, the vertical rules specified by
% \verb+|+ in the preambles of the environments are never broken, even by an
% incomplete row or by a double horizontal rule specified by |\hline\hline|
-% (there is no need to use \pkg{hhline}).
+% (there is no need to use the package~\pkg{hhline}).
%
% \bigskip
% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
@@ -1359,7 +1360,7 @@ version 2005/12/01 or later.
% 1 & 2 & 3 & 4 & 5 \\
% ~emphase#\hdottedline@
% 6 & 7 & 8 & 9 & 10 \\
-% emphase#\cdottedline{1,4-5}@
+% ~emphase#\cdottedline{1,4-5}@
% 11 & 12 & 13 & 14 & 15
% \end{pNiceMatrix}
% \end{BVerbatim}
@@ -3283,10 +3284,37 @@ version 2005/12/01 or later.
%
%
%
-% \section{The notes in the tabulars}
+% \section{Captions and notes in the tabulars}
%
% \label{s:notes}
%
+% \subsection{Caption of a tabular}
+%
+% \smallskip
+% \colorbox{yellow!50}{\bfseries New 6.12}\enskip The environment
+% |{NiceTabular}| provides the keys |caption|, |short-caption| and |label| which
+% may be used when the tabular is inserted in a floating environment (typically
+% the environment |{table}|).
+%
+% \smallskip
+% With the key |caption|, the caption, when it is long, is wrapped at the width
+% of the tabular (without the use of the package \pkg{threeparttable} or the
+% package \pkg{floatrow}).
+%
+% \smallskip
+% By default, the caption is composed below the tabular. With the key
+% |caption-above|, available in |\NiceMatrixOptions|, the caption will be
+% composed above de tabular.
+%
+% \smallskip
+% The key |short-caption| corresponds to the optional argument of the clasical
+% command |\caption| and the key |label| corresponds, of course, to the command
+% |\label|.
+%
+% \smallskip
+% See table \ref{t:tabularnote}, p.~\pageref{t:tabularnote} for an example of
+% use the keys |caption| and |label|.
+%
% \subsection{The footnotes}
%
% \smallskip
@@ -3296,8 +3324,6 @@ version 2005/12/01 or later.
% with the other notes of the document.
%
% \smallskip
-%
-% \smallskip
% If \pkg{nicematrix} is loaded with the option |footnote| (with
% |\usepackage[footnote]{nicematrix}| or with |\PassOptionsToPackage|), the
% package \pkg{footnote} is loaded (if it is not yet loaded) and it is used to
@@ -3388,13 +3414,17 @@ version 2005/12/01 or later.
%
% \item The command |\tabularnote| may be used \emph{before}
% the environment of \pkg{nicematrix}. Thus, it's possible to use it on the
-% title inserted by |\caption| in an environment |{table}| of LaTeX.
-%
-% \colorbox{yellow!50}{\textbf{New 6.8}}\enskip If several commands
-% |\tabularnote| are used in a tabular with the same argument, only one note is
-% inserted at the end of the tabular (but all the labels are composed, of
-% course). It's possible to control that feature with the key
-% |notes/detect-duplicates|.
+% title inserted by |\caption| in an environment |{table}| of LaTeX (or in a
+% command |\captionof| of the package \pkg{caption}). It's also possible, as
+% expected, to use the command |\tabularnote| in the caption provided by the
+% \emph{key} |caption| of the environment |{NiceTabaular}|.
+%
+% If several commands |\tabularnote| are used in a tabular with the same
+% argument, only one note is inserted at the end of the tabular (but all the
+% labels are composed, of course). It's possible to control that feature with
+% the key |notes/detect-duplicates|.\footnote{For technical reasons, the final
+% user is not allowed to put several commands |\tabularnote| with exactly the
+% same argument in the caption of the tabular.}
%
% \item It's possible to create a reference to a tabular note created by |\tabularnote|
% (with the usual command |\label| used after the |\tabularnote|).
@@ -3402,19 +3432,22 @@ version 2005/12/01 or later.
% %
% For an illustration of some of those remarks, see table
% \ref{t:tabularnote}, p.~\pageref{t:tabularnote}. This table has been composed
-% with the following code.
+% with the following code (the package \pkg{caption} has been loaded in this document).
%
% \begin{center}
% \fvset{commandchars=\~\#\!}
% \begin{Verbatim}[formatcom=\small\color{gray}]
% \begin{table}
-% \setlength{\belowcaptionskip}{1ex}
% \centering
-% \caption{Use of \texttt{\textbackslash tabularnote}~emphase#\tabularnote{It's possible!
-% ~emphase#to put a note in the caption.}}!
-% \label{t:tabularnote}
+% \NiceMatrixOptions{caption-above}
% \begin{NiceTabular}{@{}llc@{}
-% [~emphase#notes/bottomrule!, tabularnote = Some text before the notes.]
+% [
+% caption = A tabular whose caption has been specified by the key
+% \texttt{caption}~emphase#\tabularnote{It's possible to put a tabular note in the caption}! ,
+% label = t:tabularnote ,
+% tabularnote = Some text before the notes. ,
+% notes/bottomrule
+% ]
% \toprule
% Last name & First name & Length of life \\
% \midrule
@@ -3432,14 +3465,16 @@ version 2005/12/01 or later.
% \end{center}
%
%
-% \begin{table}[hb]
-% \setlength{\belowcaptionskip}{1ex}
+% \begin{table}[hbt]
% \centering
-% \caption{Use of \texttt{\textbackslash tabularnote}\tabularnote{It's possible
-% to put a note in the caption.}}
-% \label{t:tabularnote}
-% \begin{NiceTabular}{@{}llc@{}}[notes/bottomrule,
-% tabularnote = Some text before the notes.]
+% \NiceMatrixOptions{caption-above}
+% \begin{NiceTabular}{@{}llc@{}}[
+% caption = A tabular whose caption has been specified by the key
+% \texttt{caption}\tabularnote{It's possible to put a tabular note in the caption} ,
+% label = t:tabularnote ,
+% tabularnote = Some text before the notes. ,
+% notes/bottomrule
+% ]
% \toprule
% Last name & First name & Length of life \\
% \midrule
@@ -4572,7 +4607,7 @@ version 2005/12/01 or later.
% Tikz before the drawing.
%
% It's possible to program such command |\crossbox| as follows, explicitely
-% using the public variable |\g_nicematrix_code_after_tl|.
+% using the public variable |\g_nicematrix_code_before_tl|.
%
% \begin{scope}
% \fvset{commandchars=\§\¤\μ}
@@ -4587,7 +4622,7 @@ version 2005/12/01 or later.
%
% \NewDocumentCommand \crossbox { ! O { } }
% {
-% \tl_gput_right:Nx §emphase¤\g_nicematrix_code_after_tlμ
+% \tl_gput_right:Nx §emphase¤\g_nicematrix_code_before_tlμ
% {
% \__pantigny_crossbox:nnn
% { \int_use:c { c@iRow } }
@@ -4611,7 +4646,7 @@ version 2005/12/01 or later.
%
% \NewDocumentCommand \crossbox { ! O { } }
% {
-% \tl_gput_right:Nx \g_nicematrix_code_after_tl
+% \tl_gput_right:Nx \g_nicematrix_code_before_tl
% {
% \__pantigny_crossbox:nnn
% { \int_use:c { c@iRow } }
@@ -4642,7 +4677,7 @@ version 2005/12/01 or later.
%
% \section{Technical remarks}
%
-%
+% First remark: the package \pkg{underscore} must be loaded before \pkg{nicematrix}.
%
% \subsection{Diagonal lines}
%
@@ -5773,6 +5808,7 @@ version 2005/12/01 or later.
% \bigskip
% \begin{macrocode}
\cs_new_protected:Npn \@@_error:n { \msg_error:nn { nicematrix } }
+\cs_new_protected:Npn \@@_warning:n { \msg_warning:nn { nicematrix } }
\cs_new_protected:Npn \@@_error:nn { \msg_error:nnn { nicematrix } }
\cs_generate_variant:Nn \@@_error:nn { n x }
\cs_new_protected:Npn \@@_error:nnn { \msg_error:nnnn { nicematrix } }
@@ -5794,7 +5830,15 @@ version 2005/12/01 or later.
{ \msg_new:nnnn { nicematrix } { #1 } { #2 } { #3 } }
}
% \end{macrocode}
-%
+%
+% \bigskip
+% We also create a command which will genereate usually an error but only a
+% warning on Overleaf. The argument is given by currification.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_error_or_warning:n
+ { \bool_if:NTF \c_@@_messages_for_Overleaf_bool \@@_warning:n \@@_error:n }
+% \end{macrocode}
+%
% We try to detect whether the compilation is done on Overleaf. We use
% |\c_sys_jobname_str| because, with Overleaf, the value of |\c_sys_jobname_str|
% is always ``|output|''.
@@ -5807,6 +5851,23 @@ version 2005/12/01 or later.
% \begin{macrocode}
\cs_new_protected:Npn \@@_msg_redirect_name:nn
{ \msg_redirect_name:nnn { nicematrix } }
+\cs_new_protected:Npn \@@_gredirect_none:n #1
+ {
+ \group_begin:
+ \globaldefs = 1
+ \@@_msg_redirect_name:nn { #1 } { none }
+ \group_end:
+ }
+\cs_new_protected:Npn \@@_err_gredirect_none:n #1
+ {
+ \@@_error:n { #1 }
+ \@@_gredirect_none:n { #1 }
+ }
+\cs_new_protected:Npn \@@_warning_gredirect_none:n #1
+ {
+ \@@_warning:n { #1 }
+ \@@_gredirect_none:n { #1 }
+ }
% \end{macrocode}
%
%
@@ -5829,9 +5890,6 @@ version 2005/12/01 or later.
\@ifpackageloaded { varwidth }
{ \bool_const:Nn \c_@@_varwidth_loaded_bool { \c_true_bool } }
{ \bool_const:Nn \c_@@_varwidth_loaded_bool { \c_false_bool } }
- \@ifpackageloaded { arydshln }
- { \bool_const:Nn \c_@@_arydshln_loaded_bool { \c_true_bool } }
- { \bool_const:Nn \c_@@_arydshln_loaded_bool { \c_false_bool } }
\@ifpackageloaded { booktabs }
{ \bool_const:Nn \c_@@_booktabs_loaded_bool { \c_true_bool } }
{ \bool_const:Nn \c_@@_booktabs_loaded_bool { \c_false_bool } }
@@ -5841,7 +5899,9 @@ version 2005/12/01 or later.
\@ifpackageloaded { tabularx }
{ \bool_const:Nn \c_@@_tabularx_loaded_bool { \c_true_bool } }
{ \bool_const:Nn \c_@@_tabularx_loaded_bool { \c_false_bool } }
- { }
+ \@ifpackageloaded { floatrow }
+ { \bool_const:Nn \c_@@_floatrow_loaded_bool { \c_true_bool } }
+ { \bool_const:Nn \c_@@_floatrow_loaded_bool { \c_false_bool } }
\@ifpackageloaded { tikz }
{
% \end{macrocode}
@@ -6262,6 +6322,14 @@ version 2005/12/01 or later.
% \end{macrocode}
%
% \bigskip
+% If, in a tabular, there is a tabular note in a caption that must be composed
+% \emph{above} the tabular, we will store in |\l_@@_note_in_caption_int| the
+% number of notes in that caption. It will be stored in the |aux| file.
+% \begin{macrocode}
+\int_new:N \l_@@_note_in_caption_int
+% \end{macrocode}
+%
+% \bigskip
% The dimension |\l_@@_columns_width_dim| will be used when the options specify
% that all the columns must have the same width (but, if the key |columns-width|
% is used with the special value |auto|, the boolean
@@ -6413,6 +6481,10 @@ version 2005/12/01 or later.
% \begin{macrocode}
\bool_new:N \l_@@_X_column_bool
% \end{macrocode}
+%
+% \begin{macrocode}
+\bool_new:N \g_@@_caption_finished_bool
+% \end{macrocode}
%
% \bigskip
% We will write in |\g_@@_aux_tl| all the instructions that we have to write on
@@ -6645,7 +6717,13 @@ version 2005/12/01 or later.
\bool_new:N \g_@@_empty_cell_bool
% \end{macrocode}
%
-%
+% \bigskip
+% The following boolean will be used to deal with the commands |\tabularnote| in
+% the caption (command |\caption| or key |caption|).
+% \begin{macrocode}
+\bool_new:N \g_@@_second_composition_bool
+% \end{macrocode}
+%
% \bigskip
% The following dimensions will be used internally to compute the width of the
% potential ``first column'' and ``last column''.
@@ -6859,6 +6937,13 @@ version 2005/12/01 or later.
\bool_new:N \l_@@_dotted_bool
% \end{macrocode}
%
+% \bigskip
+% The following flag will be set to true during the composition of a caption
+% specified (by the key |caption|).
+% \begin{macrocode}
+\bool_new:N \l_@@_in_caption_bool
+% \end{macrocode}
+%
%
% \bigskip
% \textbf{Variables for the exterior rows and columns}\par\nobreak
@@ -6993,6 +7078,38 @@ version 2005/12/01 or later.
% \subsection*{The command \textbackslash tabularnote}
%
% \bigskip
+% Of course, it's possible to use |\tabularnote| in the main tabular. But there
+% is also the possibility to use that command in the caption of the tabular. And
+% the caption may be specified by two means:
+%
+% \begin{itemize}
+% \item The caption may of course be provided by the command |\caption| in a
+% floating environment. Of course, a command |\tabularnote| in that |\caption|
+% makes sens only if the |\caption| is \emph{before} the |{tabular}|.
+% \item It's also possible to use |\tabularnote| in the value of the key
+% |caption| of the |{NiceTabular}| when the key |caption-above| is in force.
+% However, in that case, one must remind that the caption is composed
+% \emph{after} the composition of the box which contains the main tabular
+% (that's mandatory since that caption must be wrapped with a line width equal
+% to the width ot the tabular). However, we want the labels of the successive
+% tabular notes in the logical order. That's why:
+% \begin{itemize}
+% \item The number of tabular notes present in the caption will be written on
+% the |aux| file and available in |\l_@@_note_in_caption_int|.
+% \item During the composition of the main tabular, the tabular notes will be
+% numbered from |\l_@@_note_in_caption_int|+1 and the notes will be stored in
+% |\g_@@_notes_seq|.
+% \item During the composition of the caption (value of |\l_@@_caption_tl|), the
+% tabular notes will be numbered from $1$ to |\l_@@_note_in_caption_int| and the
+% notes themselves will be stored in |\g_@@_notes_in_caption_seq|.
+% \item After the composition of the main tabular and after the composition of
+% the caption, the sequences |\g_@@_notes_in_caption_seq| and |\g_@@_notes_seq|
+% will be merged (in that order) and the notes will be composed.
+% \end{itemize}
+% \end{itemize}
+%
+%
+% \bigskip
% The LaTeX counter |tabularnote| will be used to count the tabular notes during
% the construction of the array (this counter won't be used during the
% composition of the notes at the end of the array). You use a LaTeX counter
@@ -7002,14 +7119,13 @@ version 2005/12/01 or later.
\newcounter { tabularnote }
% \end{macrocode}
%
-% \bigskip
-% We will store in the following sequence the tabular notes of a given array.
% \begin{macrocode}
-\seq_new:N \g_@@_tabularnotes_seq
+\seq_new:N \g_@@_notes_seq
+\seq_new:N \g_@@_notes_in_caption_seq
% \end{macrocode}
%
% \bigskip
-% However, before the actual tabular notes, it's possible to put a text
+% Before the actual tabular notes, it's possible to put a text
% specified by the key |tabularnote| of the environment. The token list
% |\l_@@_tabularnote_tl| corresponds to the value of that key.
% \begin{macrocode}
@@ -7017,12 +7133,11 @@ version 2005/12/01 or later.
% \end{macrocode}
%
% \bigskip
+% We prepare the tools for the formatting of the references of the footnotes (in
+% the tabular itself). There may have several references of footnote at the same
+% point and we have to take into account that point.
% \begin{macrocode}
\seq_new:N \l_@@_notes_labels_seq
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
\newcounter{nicematrix_draft}
\cs_new_protected:Npn \@@_notes_format:n #1
{
@@ -7052,7 +7167,7 @@ version 2005/12/01 or later.
%
% \bigskip
% We define |\thetabularnote| because it will be used by LaTeX if the user want
-% to reference a footnote which has been marked by a |\label|. The TeX group is
+% to reference a tabular which has been marked by a |\label|. The TeX group is
% for the case where the user has put an instruction such as |\color{red}| in
% |\@@_notes_style:n|.
% \begin{macrocode}
@@ -7073,7 +7188,10 @@ version 2005/12/01 or later.
\bool_if:nTF { ! \c_@@_enumitem_loaded_bool }
{
\NewDocumentCommand \tabularnote { m }
- { \@@_error:n { enumitem~not~loaded } }
+ {
+ \@@_error_or_warning:n { enumitem~not~loaded }
+ \@@_gredirect_none:n { enumitem~not~loaded }
+ }
}
{
% \end{macrocode}
@@ -7102,86 +7220,149 @@ version 2005/12/01 or later.
}
% \end{macrocode}
%
-% \medskip
-% The command |\tabularnote| is available in the whole document (and not only in
-% the environments of \pkg{nicematrix}) because we want it to be available in
-% the caption of a |{table}| (before the following |{NiceTabular}| or
-% |{NiceArray}|). That's also the reason why the variables |\c@tabularnote| and
-% |\g_@@_tabularnotes_seq| will be cleared at the end of the environment of
-% \pkg{nicematrix} (and not at the beginning).
-%
+% \bigskip
+% One must remind that we have allowed a |\tabular| in the caption and
+% that caption may also be found in the list of tables (|\listoftables|). We
+% want the command |\tabularnote| be no-op during the composition of that list.
+% That's why we program |\tabularnote| to be no-op excepted in a floating
+% environment or in an environment of \pkg{nicematrix}.
% \begin{macrocode}
\NewDocumentCommand \tabularnote { m }
{
- \bool_if:nTF { ! \g_@@_NiceArray_bool && \l_@@_in_env_bool }
- { \@@_error:n { tabularnote~forbidden } }
- {
+ \bool_if:nT { \cs_if_exist_p:N \@captype || \l_@@_in_env_bool }
+ {
+ \bool_if:nTF { ! \g_@@_NiceArray_bool && \l_@@_in_env_bool }
+ { \@@_error:n { tabularnote~forbidden } }
+ {
+ \bool_if:NTF \l_@@_in_caption_bool
+ { \@@_tabularnote_ii:n { #1 } }
+ { \@@_tabularnote_i:n { #1 } }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% For the version in normal conditions, that is to say not in the key |caption|.
+% \begin{macrocode}
+ \cs_new_protected:Npn \@@_tabularnote_i:n #1
+ {
% \end{macrocode}
% You have to see whether the argument of |\tabularnote| has yet been used as
% argument of another |\tabularnote| in the same tabular. In that case, there
% will be only one note (for both commands |\tabularnote|) at the end of the
% tabular. We search the argument of our command |\tabularnote| in the
-% |\g_@@_tabularnotes_seq|. The position in the sequence will be stored in
+% |\g_@@_notes_seq|. The position in the sequence will be stored in
% |\l_tmpa_int| (0 if the text is not in the sequence yet).
% \begin{macrocode}
- \int_zero:N \l_tmpa_int
- \bool_if:NT \l_@@_notes_detect_duplicates_bool
- {
- \seq_map_indexed_inline:Nn \g_@@_tabularnotes_seq
- {
- \tl_if_eq:nnT { #1 } { ##2 }
- { \int_set:Nn \l_tmpa_int { ##1 } \seq_map_break: }
- }
- }
- \int_compare:nNnTF \l_tmpa_int = 0
- {
- \stepcounter { tabularnote }
- \seq_put_right:Nx \l_@@_notes_labels_seq
- { \@@_notes_format:n { \int_use:c { c @ tabularnote } } }
- \seq_gput_right:Nn \g_@@_tabularnotes_seq { #1 }
- }
+ \int_zero:N \l_tmpa_int
+ \bool_if:NT \l_@@_notes_detect_duplicates_bool
+ {
+ \seq_map_indexed_inline:Nn \g_@@_notes_seq
{
- \seq_put_right:Nx \l_@@_notes_labels_seq
- { \@@_notes_format:n { \int_use:N \l_tmpa_int } }
+ \tl_if_eq:nnT { #1 } { ##2 }
+ { \int_set:Nn \l_tmpa_int { ##1 } \seq_map_break: }
}
- \peek_meaning:NF \tabularnote
- {
+ \int_compare:nNnF \l_tmpa_int = 0
+ { \int_add:Nn \l_tmpa_int \l_@@_note_in_caption_int }
+ }
+ \int_compare:nNnTF \l_tmpa_int = 0
+ {
+ \int_gincr:N \c@tabularnote
+ \seq_put_right:Nx \l_@@_notes_labels_seq
+ { \@@_notes_format:n { \int_use:c { c @ tabularnote } } }
+ \seq_gput_right:Nn \g_@@_notes_seq { #1 }
+ }
+ {
+ \seq_put_right:Nx \l_@@_notes_labels_seq
+ { \@@_notes_format:n { \int_use:N \l_tmpa_int } }
+ }
+ \peek_meaning:NF \tabularnote
+ {
% \end{macrocode}
% If the following token is \emph{not} a |\tabularnote|, we have finished the
% sequence of successive commands |\tabularnote| and we have to format the
% labels of these tabular notes (in the array). We compose those labels in a box
% |\l_tmpa_box| because we will do a special construction in order to have this
-% box in a overlapping position if we are at the end of a cell.
+% box in an overlapping position if we are at the end of a cell.
% \begin{macrocode}
- \hbox_set:Nn \l_tmpa_box
- {
+ \hbox_set:Nn \l_tmpa_box
+ {
% \end{macrocode}
% We remind that it is the command |\@@_notes_label_in_tabular:n| that will
-% (most of the time) put the labels in a |\textsuperscript|.
+% put the labels in a |\textsuperscript|.
% \begin{macrocode}
- \@@_notes_label_in_tabular:n
- {
- \seq_use:Nnnn
- \l_@@_notes_labels_seq { , } { , } { , }
- }
- }
+ \@@_notes_label_in_tabular:n
+ {
+ \seq_use:Nnnn
+ \l_@@_notes_labels_seq { , } { , } { , }
+ }
+ }
% \end{macrocode}
-% We use |\refstepcounter| in order to have the (last) tabular note referenceable
-% (with the standard command |\label|) and that's why we have to go back with a
-% decrementation of the counter |tabularnote| first.
+% We want the (last) tabular note referenceable (with the standard command |\label|).
% \begin{macrocode}
- \addtocounter { tabularnote } { -1 }
- \refstepcounter { tabularnote }
- \seq_clear:N \l_@@_notes_labels_seq
- \hbox_overlap_right:n { \box_use:N \l_tmpa_box }
+ \int_gsub:Nn \c@tabularnote { 1 }
+ \int_set_eq:NN \l_tmpa_int \c@tabularnote
+ \refstepcounter { tabularnote }
+ \int_compare:nNnT \l_tmpa_int = \c@tabularnote
+ { \int_gincr:N \c@tabularnote }
+ \seq_clear:N \l_@@_notes_labels_seq
+ \hbox_overlap_right:n { \box_use:N \l_tmpa_box }
% \end{macrocode}
% If the command |\tabularnote| is used exactly at the end of the cell, the
% |\unskip| (inserted by \pkg{array}?) will delete the skip we insert now
% and the label of the footnote will be composed in an overlapping position (by
% design).
% \begin{macrocode}
- \skip_horizontal:n { \box_wd:N \l_tmpa_box }
+ \skip_horizontal:n { \box_wd:N \l_tmpa_box }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% Now the version when the command is used in the key |caption|. The main
+% difficulty is that the argument of the command |\caption| is composed several
+% times. In order to know the number of commands |\tabularnote| in the caption,
+% we will consider that there should not be the same tabular note twice in the
+% caption (in the main tabular, it's possible). Once we have found a tabular
+% note which has yet been encoutered, we consider that you are in a new
+% composition of the argument of |\caption|. At that time, we store in
+% |\g_@@_nb_of_notes_int| the number of notes in the |\caption|.
+% \begin{macrocode}
+ \cs_new_protected:Npn \@@_tabularnote_ii:n #1
+ {
+ \int_gincr:N \c@tabularnote
+ \bool_if:NTF \g_@@_caption_finished_bool
+ {
+ \int_compare:nNnTF
+ \c@tabularnote > { \tl_count:N \g_@@_notes_in_caption_seq }
+ { \int_gset:Nn \c@tabularnote { 1 } }
+ \seq_if_in:NnF \g_@@_notes_in_caption_seq { #1 }
+ { \@@_fatal:n { Identical~notes~in~caption } }
+ }
+ {
+ \seq_if_in:NnTF \g_@@_notes_in_caption_seq { #1 }
+ {
+ \bool_gset_true:N \g_@@_caption_finished_bool
+ \int_gset:Nn \c@tabularnote { 1 }
}
+ { \seq_gput_right:Nn \g_@@_notes_in_caption_seq { #1 } }
+ }
+ \seq_put_right:Nx \l_@@_notes_labels_seq
+ { \@@_notes_format:n { \int_use:N \c@tabularnote } }
+ \peek_meaning:NF \tabularnote
+ {
+ \hbox_set:Nn \l_tmpa_box
+ {
+ \@@_notes_label_in_tabular:n
+ {
+ \seq_use:Nnnn
+ \l_@@_notes_labels_seq { , } { , } { , }
+ }
+ }
+ \seq_clear:N \l_@@_notes_labels_seq
+ \hbox_overlap_right:n { \box_use:N \l_tmpa_box }
+ \skip_horizontal:n { \box_wd:N \l_tmpa_box }
}
}
}
@@ -7261,6 +7442,24 @@ version 2005/12/01 or later.
% \bigskip
% \subsection*{The options}
%
+% The following parameter corresponds to the keys |caption|, |short-caption| and
+% |label| of the environment |{NiceTabular}|.
+% \begin{macrocode}
+\tl_new:N \l_@@_caption_tl
+\tl_new:N \l_@@_short_caption_tl
+\tl_new:N \l_@@_label_tl
+% \end{macrocode}
+%
+% \bigskip
+% The following parameter corresponds to the key |caption-above| of
+% |\NiceMatrixOptions|. When this paremeter is |true|, the captions of the
+% environments |{NiceTabular}|, specified with the key |caption| are put above
+% the tabular (and below elsewhere).
+% \begin{macrocode}
+\bool_new:N \l_@@_caption_above_bool
+% \end{macrocode}
+%
+% \bigskip
% By default, the commands |\cellcolor| and |\rowcolor| are available for the
% user in the cells of the tabular (the user may use the commands provided by
% |\colortbl|). However, if the key |colortbl-like| is used, these
@@ -7679,12 +7878,6 @@ version 2005/12/01 or later.
% \begin{macrocode}
\keys_define:nn { NiceMatrix / Env }
{
-% \end{macrocode}
-% The key |hvlines-except-corners| is now deprecated (use |hvlines| and
-% |corners| instead).
-% \begin{macrocode}
- hvlines-except-corners .code:n = \@@_fatal:n { hvlines-except-corners } ,
- hvlines-except-corners .default:n = { NW , SW , NE , SE } ,
corners .clist_set:N = \l_@@_corners_clist ,
corners .default:n = { NW , SW , NE , SE } ,
code-before .code:n =
@@ -7847,9 +8040,10 @@ version 2005/12/01 or later.
{
width .code:n = \dim_set:Nn \l_@@_width_dim { #1 } ,
width .value_required:n = true ,
- last-col .code:n = \tl_if_empty:nF { #1 }
- { \@@_error:n { last-col~non~empty~for~NiceMatrixOptions } }
- \int_zero:N \l_@@_last_col_int ,
+ last-col .code:n =
+ \tl_if_empty:nF { #1 }
+ { \@@_error:n { last-col~non~empty~for~NiceMatrixOptions } }
+ \int_zero:N \l_@@_last_col_int ,
small .bool_set:N = \l_@@_small_bool ,
small .value_forbidden:n = true ,
% \end{macrocode}
@@ -7883,7 +8077,7 @@ version 2005/12/01 or later.
%
% \bigskip
% Usually, an error is raised when the user tries to give the same name to two
-% distincts environments of \pkg{nicematrix} (theses names are global and not
+% distincts environments of \pkg{nicematrix} (these names are global and not
% local to the current TeX scope). However, the option |allow-duplicate-names|
% disables this feature.
% \begin{macrocode}
@@ -7897,6 +8091,8 @@ version 2005/12/01 or later.
matrix / columns-type .code:n =
\@@_set_preamble:Nn \l_@@_columns_type_tl { #1 },
matrix / columns-type .value_required:n = true ,
+ caption-above .bool_set:N = \l_@@_caption_above_bool ,
+ caption-above .default:n = true ,
unknown .code:n = \@@_error:n { Unknown~key~for~NiceMatrixOptions }
}
% \end{macrocode}
@@ -8006,6 +8202,12 @@ version 2005/12/01 or later.
notes / bottomrule .default:n = true ,
tabularnote .tl_set:N = \l_@@_tabularnote_tl ,
tabularnote .value_required:n = true ,
+ caption .tl_set:N = \l_@@_caption_tl ,
+ caption .value_required:n = true ,
+ short-caption .tl_set:N = \l_@@_short_caption_tl ,
+ short-caption .value_required:n = true ,
+ label .tl_set:N = \l_@@_label_tl ,
+ label .value_required:n = true ,
last-col .code:n = \tl_if_empty:nF {#1}
{ \@@_error:n { last-col~non~empty~for~NiceArray } }
\int_zero:N \l_@@_last_col_int ,
@@ -8027,12 +8229,11 @@ version 2005/12/01 or later.
\cs_new_protected:Npn \@@_cell_begin:w
{
% \end{macrocode}
-% The token list |\g_@@_post_action_cell_tl| will be set during the
-% composition of the box |\l_@@_cell_box| and will be used \emph{after} the
-% composition in order to modify that box (that's why it's called a
-% \emph{post-action}).
+% |\g_@@_cell_after_hook_tl| will be set during the composition of the box
+% |\l_@@_cell_box| and will be used \emph{after} the composition in order to
+% modify that box.
% \begin{macrocode}
- \tl_gclear:N \g_@@_post_action_cell_tl
+ \tl_gclear:N \g_@@_cell_after_hook_tl
% \end{macrocode}
% At the beginning of the cell, we link |\CodeAfter| to a command which do
% begin with |\\| (whereas the standard version of |\CodeAfter| does
@@ -8203,11 +8404,11 @@ version 2005/12/01 or later.
\@@_math_toggle_token:
\hbox_set_end:
% \end{macrocode}
-% The token list |\g_@@_post_action_cell_tl| is (potentially) set during the
+% The token list |\g_@@_cell_after_hook_tl| is (potentially) set during the
% composition of the box |\l_@@_cell_box| and is used now \emph{after} the
% composition in order to modify that box.
% \begin{macrocode}
- \g_@@_post_action_cell_tl
+ \g_@@_cell_after_hook_tl
\bool_if:NT \g_@@_rotate_bool \@@_rotate_cell_box:
\@@_adjust_size_box:
% \end{macrocode}
@@ -8739,6 +8940,23 @@ version 2005/12/01 or later.
\hook_gput_code:nnn { env / tabular / begin } { . }
{ \cs_set_eq:NN \multicolumn \@@_old_multicolumn }
% \end{macrocode}
+% If there is one or several commands |\tabularnote| in the caption specified
+% by the key |caption| and if that caption has to be composed above the tabular,
+% we have now that information because it has been written in the |aux| file at
+% a previous run. We use that information to start couting the tabular notes in
+% the main array at the right value (that remember that the caption will be
+% composed \emph{after} the array!).
+% \begin{macrocode}
+ \tl_if_exist:NT \l_@@_note_in_caption_tl
+ {
+ \tl_if_empty:NF \l_@@_note_in_caption_tl
+ {
+ \int_set_eq:NN \l_@@_note_in_caption_int
+ { \l_@@_note_in_caption_tl }
+ \int_gset:Nn \c@tabularnote { \l_@@_note_in_caption_tl }
+ }
+ }
+% \end{macrocode}
%
%
% The sequence |\g_@@_multicolumn_cells_seq| will contain the list of the cells
@@ -9114,6 +9332,7 @@ version 2005/12/01 or later.
}
% \end{macrocode}
%
+%
% \begin{macrocode}
\NewDocumentCommand \@@_CodeBefore_keys: { O { } }
{
@@ -9419,7 +9638,7 @@ version 2005/12/01 or later.
\bool_if:NT \l_@@_width_used_bool
{
\int_compare:nNnT \g_@@_total_X_weight_int = 0
- { \@@_error:n { width~without~X~columns } }
+ { \@@_error_or_warning:n { width~without~X~columns } }
}
% \end{macrocode}
%
@@ -9461,7 +9680,7 @@ version 2005/12/01 or later.
% \bigskip
% It the user has used the key |last-row| with a value, we control that the
% given value is correct (since we have just constructed the array, we know the
-% real number of rows of the array).
+% actual number of rows of the array).
% \begin{macrocode}
\int_compare:nNnT \l_@@_last_row_int > { -2 }
{
@@ -9624,13 +9843,7 @@ version 2005/12/01 or later.
\bool_if:NF \l_@@_Matrix_bool
{
\int_compare:nNnT \c@jCol < \g_@@_static_num_of_col_int
- {
- \@@_error:n { columns~not~used }
- \group_begin:
- \globaldefs = 1
- \@@_msg_redirect_name:nn { columns~not~used } { none }
- \group_end:
- }
+ { \@@_warning_gredirect_none:n { columns~not~used } }
}
\@@_after_array:
% \end{macrocode}
@@ -10238,10 +10451,10 @@ version 2005/12/01 or later.
\cs_new_protected:Npn \@@_center_cell_box:
{
% \end{macrocode}
-% By putting instructions in |\g_@@_post_action_cell_tl|, we require a
+% By putting instructions in |\g_@@_cell_after_hook_tl|, we require a
% post-action of the box |\l_@@_cell_box|.
% \begin{macrocode}
- \tl_gput_right:Nn \g_@@_post_action_cell_tl
+ \tl_gput_right:Nn \g_@@_cell_after_hook_tl
{
\int_compare:nNnT
{ \box_ht:N \l_@@_cell_box }
@@ -10281,7 +10494,7 @@ version 2005/12/01 or later.
\bool_if:NTF \c_@@_varwidth_loaded_bool
{ \@@_patch_preamble_iv_iv:nn { #2 } { varwidth } }
{
- \@@_error:n { varwidth~not~loaded }
+ \@@_error_or_warning:n { varwidth~not~loaded }
\@@_patch_preamble_iv_iv:nn { #2 } { minipage }
}
}
@@ -10543,7 +10756,7 @@ version 2005/12/01 or later.
\keys_set:nV { WithArrows / X-column } \l_tmpa_tl
\int_compare:nNnT \l_@@_weight_int < 0
{
- \@@_error:nx { negative~weight } { \int_use:N \l_@@_weight_int }
+ \@@_error_or_warning:n { negative~weight }
\int_set:Nn \l_@@_weight_int { - \l_@@_weight_int }
}
\int_gadd:Nn \g_@@_total_X_weight_int \l_@@_weight_int
@@ -10568,7 +10781,7 @@ version 2005/12/01 or later.
% \end{macrocode}
% The following code will nullify the box of the cell.
% \begin{macrocode}
- \tl_gput_right:Nn \g_@@_post_action_cell_tl
+ \tl_gput_right:Nn \g_@@_cell_after_hook_tl
{ \hbox_set:Nn \l_@@_cell_box { } }
% \end{macrocode}
% We put a |{minipage}| to give to the user the ability to put a command such as
@@ -10975,6 +11188,31 @@ version 2005/12/01 or later.
% notes (that means that a |\vtop{\hsize=...}| is not enough).
% \begin{macrocode}
\begin { minipage } [ t ] { \box_wd:N \l_@@_the_array_box }
+ \bool_if:NT \l_@@_caption_above_bool
+ {
+ \tl_if_empty:NF \l_@@_caption_tl
+ {
+% \end{macrocode}
+% \begin{macrocode}
+ \bool_set_false:N \g_@@_caption_finished_bool
+ \int_gzero:N \c@tabularnote
+ \@@_insert_caption:
+% \end{macrocode}
+% If there is one or several commands |\tabularnote| in the caption, we will
+% write in the |aux| file the number of such tabular notes.
+% \begin{macrocode}
+ \int_gset:Nn \c@tabularnote
+ { \seq_count:N \g_@@_notes_in_caption_seq }
+ \int_compare:nNnF \c@tabularnote = 0
+ {
+ \tl_gput_right:Nx \g_@@_aux_tl
+ {
+ \tl_set:Nn \exp_not:N \l_@@_note_in_caption_tl
+ { \int_eval:n { \c@tabularnote } }
+ }
+ }
+ }
+ }
% \end{macrocode}
% The |\hbox| avoids that the |pgfpicture| inside |\@@_draw_blocks| adds a extra
% vertical space before the notes.
@@ -10998,17 +11236,71 @@ version 2005/12/01 or later.
% (because |\ttabbox| de-activate |\stepcounter| because if compiles several
% twice its tabular).
% \begin{macrocode}
- \bool_lazy_or:nnT
- { ! \seq_if_empty_p:N \g_@@_tabularnotes_seq }
- { ! \tl_if_empty_p:V \l_@@_tabularnote_tl }
+ \bool_lazy_any:nT
+ {
+ { ! \seq_if_empty_p:N \g_@@_notes_seq }
+ { ! \seq_if_empty_p:N \g_@@_notes_in_caption_seq }
+ { ! \tl_if_empty_p:V \l_@@_tabularnote_tl }
+ }
\@@_insert_tabularnotes:
+ \cs_set_eq:NN \tabularnote \@@_tabularnote_error:n
+ \bool_if:NF \l_@@_caption_above_bool \@@_insert_caption:
\end { minipage }
}
% \end{macrocode}
%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_insert_caption:
+ {
+ \tl_if_empty:NF \l_@@_caption_tl
+ {
+ \cs_if_exist:NTF \@captype
+ { \@@_insert_caption_i: }
+ { \@@_error:n { caption~outside~float } }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_insert_caption_i:
+ {
+ \group_begin:
+% \end{macrocode}
+% The flag |\l_@@_in_caption_bool| affects only the behaviour of the command
+% |\tabularnote| when used in the caption.
+% \begin{macrocode}
+ \bool_set_true:N \l_@@_in_caption_bool
+% \end{macrocode}
+% The package \pkg{floatrow} does a redefinition of |\@makecaption| which will
+% extract the caption from the tabular. However, the old version of
+% |\@makecaption| has been stored by \pkg{floatrow} in |\FR@makecaption|. That's
+% why we restore the old version.
+% \begin{macrocode}
+ \bool_if:NT \c_@@_floatrow_loaded_bool
+ { \cs_set_eq:NN \@makecaption \FR@makecaption }
+ \tl_if_empty:NTF \l_@@_short_caption_tl
+ { \caption { \l_@@_caption_tl } }
+ { \caption [ \l_@@_short_caption_tl ] { \l_@@_caption_tl } }
+ \tl_if_empty:NF \l_@@_label_tl { \label { \l_@@_label_tl } }
+ \group_end:
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_tabularnote_error:n #1
+ {
+ \@@_error_or_warning:n { tabularnote~below~the~tabular }
+ \@@_gredirect_none:n { tabularnote~below~the~tabular }
+ }
+% \end{macrocode}
+%
% \begin{macrocode}
\cs_new_protected:Npn \@@_insert_tabularnotes:
{
+ \seq_gconcat:NNN \g_@@_notes_seq \g_@@_notes_in_caption_seq \g_@@_notes_seq
+ \int_set:Nn \c@tabularnote { \seq_count:N \g_@@_notes_seq }
\skip_vertical:N 0.65ex
% \end{macrocode}
% The TeX group is for potential specifications in the
@@ -11027,7 +11319,7 @@ version 2005/12/01 or later.
\bool_if:NTF \l_@@_notes_para_bool
{
\begin { tabularnotes* }
- \seq_map_inline:Nn \g_@@_tabularnotes_seq { \item ##1 } \strut
+ \seq_map_inline:Nn \g_@@_notes_seq { \item ##1 } \strut
\end { tabularnotes* }
% \end{macrocode}
% The following |\par| is mandatory for the event that the user has put
@@ -11037,7 +11329,7 @@ version 2005/12/01 or later.
}
{
\tabularnotes
- \seq_map_inline:Nn \g_@@_tabularnotes_seq { \item ##1 } \strut
+ \seq_map_inline:Nn \g_@@_notes_seq { \item ##1 } \strut
\endtabularnotes
}
}
@@ -11058,10 +11350,11 @@ version 2005/12/01 or later.
% \begin{macrocode}
{ \CT@arc@ \hrule height \heavyrulewidth }
}
- { \@@_error:n { bottomrule~without~booktabs } }
+ { \@@_error_or_warning:n { bottomrule~without~booktabs } }
}
\l_@@_notes_code_after_tl
- \seq_gclear:N \g_@@_tabularnotes_seq
+ \seq_gclear:N \g_@@_notes_seq
+ \seq_gclear:N \g_@@_notes_in_caption_seq
\int_gzero:N \c@tabularnote
}
% \end{macrocode}
@@ -11928,6 +12221,19 @@ version 2005/12/01 or later.
{ \dim_set_eq:NN \l_@@_width_dim \linewidth }
\str_gset:Nn \g_@@_name_env_str { NiceTabular }
\keys_set:nn { NiceMatrix / NiceTabular } { #1 , #3 }
+ \tl_if_empty:NF \l_@@_short_caption_tl
+ {
+ \tl_if_empty:NT \l_@@_caption_tl
+ {
+ \@@_error_or_warning:n { short-caption~without~caption }
+ \tl_set_eq:NN \l_@@_caption_tl \l_@@_short_caption_tl
+ }
+ }
+ \tl_if_empty:NF \l_@@_label_tl
+ {
+ \tl_if_empty:NT \l_@@_caption_tl
+ { \@@_error_or_warning:n { label~without~caption } }
+ }
\bool_set_true:N \l_@@_NiceTabular_bool
\NiceArray { #2 }
}
@@ -13331,7 +13637,6 @@ version 2005/12/01 or later.
% \end{itemize}
%
%
-%
% \begin{macrocode}
\cs_new_protected:Npn \@@_draw_line:
{
@@ -13339,11 +13644,6 @@ version 2005/12/01 or later.
\pgf@relevantforpicturesizefalse
\bool_lazy_or:nnTF
{ \tl_if_eq_p:NN \l_@@_xdots_line_style_tl \c_@@_standard_tl }
-% \end{macrocode}
-% The boolean |\l_@@_dotted_bool| is raised for the rules specified by either
-% |\hdottedline| or |:| (or the letter specified by |letter-for-dotted-lines|)
-% in the preamble of the array.
-% \begin{macrocode}
\l_@@_dotted_bool
\@@_draw_standard_dotted_line:
\@@_draw_unstandard_dotted_line:
@@ -14212,7 +14512,7 @@ version 2005/12/01 or later.
{
\tl_gput_right:Nx \g_@@_row_style_tl
{
- \tl_gput_right:Nn \exp_not:N \g_@@_post_action_cell_tl
+ \tl_gput_right:Nn \exp_not:N \g_@@_cell_after_hook_tl
{
\dim_set:Nn \l_@@_cell_space_top_limit_dim
{ \dim_use:N \l_tmpa_dim }
@@ -14226,7 +14526,7 @@ version 2005/12/01 or later.
{
\tl_gput_right:Nx \g_@@_row_style_tl
{
- \tl_gput_right:Nn \exp_not:N \g_@@_post_action_cell_tl
+ \tl_gput_right:Nn \exp_not:N \g_@@_cell_after_hook_tl
{
\dim_set:Nn \l_@@_cell_space_bottom_limit_dim
{ \dim_use:N \l_tmpb_dim }
@@ -14978,7 +15278,8 @@ version 2005/12/01 or later.
tikz .initial:n = ,
total-width .dim_set:N = \l_@@_rule_width_dim ,
total-width .value_required:n = true ,
- width .meta:n = { total-width = #1 }
+ width .meta:n = { total-width = #1 } ,
+ unknown .code:n = \@@_error:n { Unknow~key~for~RulesBis }
}
% \end{macrocode}
%
@@ -15096,7 +15397,6 @@ version 2005/12/01 or later.
% \begin{macrocode}
\cs_new_protected:Npn \@@_vline_ii:
{
- \bool_set_false:N \l_@@_dotted_bool
\keys_set:nV { NiceMatrix / RulesBis } \l_@@_other_keys_tl
\bool_if:NTF \l_@@_dotted_bool
\@@_vline_iv:
@@ -15352,7 +15652,7 @@ version 2005/12/01 or later.
% \begin{macrocode}
\cs_new_protected:Npn \@@_hline_ii:
{
- \bool_set_false:N \l_@@_dotted_bool
+ % \bool_set_false:N \l_@@_dotted_bool
\keys_set:nV { NiceMatrix / RulesBis } \l_@@_other_keys_tl
\bool_if:NTF \l_@@_dotted_bool
\@@_hline_iv:
@@ -15559,9 +15859,10 @@ version 2005/12/01 or later.
%
%
% \medskip
-% The command |\@@_Hline:| will be linked to |\Hline| in the environments of \pkg{nicematrix}.
+% The command |\@@_Hline:| will be linked to |\Hline| in the environments of
+% \pkg{nicematrix}.
% \begin{macrocode}
-\cs_set:Npn \@@_Hline: { \noalign { \ifnum 0 = `} \fi \@@_Hline_i:n { 1 } }
+\cs_set:Npn \@@_Hline: { \noalign \bgroup \@@_Hline_i:n { 1 } }
% \end{macrocode}
%
% \medskip
@@ -15571,11 +15872,11 @@ version 2005/12/01 or later.
\cs_set:Npn \@@_Hline_i:n #1
{
\peek_remove_spaces:n
- {
- \peek_meaning:NTF \Hline
- { \@@_Hline_ii:nn { #1 + 1 } }
- { \@@_Hline_iii:n { #1 } }
- }
+ {
+ \peek_meaning:NTF \Hline
+ { \@@_Hline_ii:nn { #1 + 1 } }
+ { \@@_Hline_iii:n { #1 } }
+ }
}
% \end{macrocode}
%
@@ -15584,22 +15885,30 @@ version 2005/12/01 or later.
% \end{macrocode}
%
% \begin{macrocode}
-\cs_set:Npn \@@_Hline_iii:n #1
+\cs_set:Npn \@@_Hline_iii:n #1
{
- \skip_vertical:n
- {
- \arrayrulewidth * ( #1 )
- + \doublerulesep * ( \int_max:nn 0 { #1 - 1 } )
- }
+ \peek_meaning:NTF [
+ { \@@_Hline_iv:nw { #1 } }
+ { \@@_Hline_iv:nw { #1 } [ ] }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_set:Npn \@@_Hline_iv:nw #1 [ #2 ]
+ {
+ \@@_compute_rule_width:n { multiplicity = #1 , #2 }
+ \skip_vertical:n { \l_@@_rule_width_dim }
\tl_gput_right:Nx \g_@@_internal_code_after_tl
{
\@@_hline:n
{
+ multiplicity = #1 ,
position = \int_eval:n { \c@iRow + 1 } ,
- multiplicity = #1
- }
+ total-width = \dim_use:N \l_@@_rule_width_dim ,
+ #2
+ }
}
- \ifnum 0 = `{ \fi }
+ \egroup
}
% \end{macrocode}
%
@@ -17107,10 +17416,7 @@ version 2005/12/01 or later.
{
\msg_error:nnnn { nicematrix } { Block~too~large~2 } { #1 } { #2 }
\@@_msg_redirect_name:nn { Block~too~large~2 } { none }
- \group_begin:
- \globaldefs = 1
\@@_msg_redirect_name:nn { columns~not~used } { none }
- \group_end:
}
{ \msg_error:nnnn { nicematrix } { Block~too~large~1 } { #1 } { #2 } }
}
@@ -17178,7 +17484,18 @@ version 2005/12/01 or later.
{ { #1 } { #2 } { #3 } { #4 } { \l_@@_block_name_str } }
}
% \end{macrocode}
-%
+%
+% \bigskip
+% We have a problem here: if the final user has used the keys |hlines| and
+% |color| together, the frame of the block is drawn with the color specified by
+% |color| but the key |hlines| is no-op.
+% \begin{macrocode}
+ \bool_lazy_and:nnT
+ { ! (\tl_if_empty_p:N \l_@@_draw_tl) }
+ { \l_@@_hlines_block_bool || \l_@@_vlines_block_bool }
+ { \@@_error:n { hlines~with~color } }
+% \end{macrocode}
+% \bigskip
% \begin{macrocode}
\tl_if_empty:NF \l_@@_draw_tl
{
@@ -17190,7 +17507,7 @@ version 2005/12/01 or later.
{ \int_use:N \l_@@_last_row_int - \int_use:N \l_@@_last_col_int }
}
\seq_gput_right:Nn \g_@@_pos_of_stroken_blocks_seq
- { { #1 } { #2 } { #3 } { #4 } }
+ { { #1 } { #2 } { #3 } { #4 } }
}
% \end{macrocode}
%
@@ -17858,17 +18175,8 @@ version 2005/12/01 or later.
% \bigskip
% \subsection*{Automatic arrays}
%
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_set_size:n #1-#2 \q_stop
- {
- \int_set:Nn \l_@@_nb_rows_int { #1 }
- \int_set:Nn \l_@@_nb_cols_int { #2 }
- }
-% \end{macrocode}
%
%
-% \bigskip
% We will extract the potential keys |columns-type|, |l|, |c|, |r| and pass
% the other keys to the environment |{NiceArrayWithDelims}|.
% \begin{macrocode}
@@ -17883,17 +18191,21 @@ version 2005/12/01 or later.
% \end{macrocode}
%
% \begin{macrocode}
-\NewDocumentCommand \AutoNiceMatrixWithDelims { m m O { } m O { } m ! O { } }
+\NewDocumentCommand \AutoNiceMatrixWithDelims
+ { m m O { } > { \SplitArgument { 1 } { - } } m O { } m ! O { } }
+ { \@@_auto_nice_matrix:nnnnnn { #1 } { #2 } #4 { #6 } { #3 , #5 , #7 } }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_auto_nice_matrix:nnnnnn #1 #2 #3 #4 #5 #6
{
- \int_zero_new:N \l_@@_nb_rows_int
- \int_zero_new:N \l_@@_nb_cols_int
- \@@_set_size:n #4 \q_stop
% \end{macrocode}
% The group is for the protection of the keys.
% \begin{macrocode}
\group_begin:
\bool_set_true:N \l_@@_Matrix_bool
- \keys_set_known:nnN { NiceMatrix / Auto } { #3, #5, #7 } \l_tmpa_tl
+ \keys_set_known:nnN { NiceMatrix / Auto } { #6 } \l_tmpa_tl
% \end{macrocode}
% We nullify the command |\@@_transform_preamble:| because we will provide a
% preamble which is yet transformed (by using |\l_@@_columns_type_tl| which is
@@ -17904,19 +18216,16 @@ version 2005/12/01 or later.
\use:x
{
\exp_not:N \begin { NiceArrayWithDelims } { #1 } { #2 }
- {
- * { \int_use:N \l_@@_nb_cols_int }
- { \exp_not:V \l_@@_columns_type_tl }
- }
+ { * { #4 } { \exp_not:V \l_@@_columns_type_tl } }
[ \exp_not:V \l_tmpa_tl ]
}
\int_compare:nNnT \l_@@_first_row_int = 0
{
\int_compare:nNnT \l_@@_first_col_int = 0 { & }
- \prg_replicate:nn { \l_@@_nb_cols_int - 1 } { & }
+ \prg_replicate:nn { #4 - 1 } { & }
\int_compare:nNnT \l_@@_last_col_int > { -1 } { & } \\
}
- \prg_replicate:nn \l_@@_nb_rows_int
+ \prg_replicate:nn { #3 }
{
\int_compare:nNnT \l_@@_first_col_int = 0 { & }
% \end{macrocode}
@@ -17925,13 +18234,13 @@ version 2005/12/01 or later.
% value of that |iRow| (since |iRow| is incremented in the first cell of the row
% of the |\halign|).
% \begin{macrocode}
- \prg_replicate:nn { \l_@@_nb_cols_int - 1 } { { } #6 & } #6
+ \prg_replicate:nn { #4 - 1 } { { } #5 & } #5
\int_compare:nNnT \l_@@_last_col_int > { -1 } { & } \\
}
\int_compare:nNnT \l_@@_last_row_int > { -2 }
{
\int_compare:nNnT \l_@@_first_col_int = 0 { & }
- \prg_replicate:nn { \l_@@_nb_cols_int - 1 } { & }
+ \prg_replicate:nn { #4 - 1 } { & }
\int_compare:nNnT \l_@@_last_col_int > { -1 } { & } \\
}
\end { NiceArrayWithDelims }
@@ -18170,7 +18479,8 @@ version 2005/12/01 or later.
% If this is really the end of the current environment (of \pkg{nicematrix}), we
% put back the command |\end| and its argument in the TeX flow.
% \begin{macrocode}
- \str_if_eq:eeTF \@currenvir { #1 } { \end { #1 } }
+ \str_if_eq:eeTF \@currenvir { #1 }
+ { \end { #1 } }
% \end{macrocode}
% If this is not the |\end| we are looking for, we put those tokens in
% |\g_nicematrix_code_after_tl| and we go on searching for the next command
@@ -19006,7 +19316,7 @@ version 2005/12/01 or later.
{
\pgfpoint
{ ( \l_@@_x_initial_dim + \l_@@_x_final_dim) / 2 }
- { \pgf@y + \l_@@_brace_yshift_dim }
+ { \pgf@y + \l_@@_brace_yshift_dim - 3 pt}
}
\pgfnode
{ rectangle }
@@ -19020,10 +19330,16 @@ version 2005/12/01 or later.
{
\hfil ## \hfil \crcr
\@@_math_toggle_token: #1 \@@_math_toggle_token: \cr
- \noalign { \skip_vertical:n { 4.5 pt } \nointerlineskip }
- \hbox_to_wd:nn
- { \l_@@_x_final_dim - \l_@@_x_initial_dim }
- { \downbracefill } \cr
+ \noalign { \skip_vertical:n { 3 pt } \nointerlineskip }
+ \c_math_toggle_token
+ \overbrace
+ {
+ \hbox_to_wd:nn
+ { \l_@@_x_final_dim - \l_@@_x_initial_dim }
+ { }
+ }
+ \c_math_toggle_token
+ \cr
}
\group_end:
}
@@ -19044,7 +19360,7 @@ version 2005/12/01 or later.
{
\pgfpoint
{ ( \l_@@_x_initial_dim + \l_@@_x_final_dim) / 2 }
- { \pgf@y - \l_@@_brace_yshift_dim }
+ { \pgf@y - \l_@@_brace_yshift_dim + 3 pt }
}
\pgfnode
{ rectangle }
@@ -19057,10 +19373,16 @@ version 2005/12/01 or later.
\halign
{
\hfil ## \hfil \crcr
- \hbox_to_wd:nn
- { \l_@@_x_final_dim - \l_@@_x_initial_dim }
- { \upbracefill } \cr
- \noalign { \skip_vertical:n { 4.5 pt } \nointerlineskip }
+ \c_math_toggle_token
+ \underbrace
+ {
+ \hbox_to_wd:nn
+ { \l_@@_x_final_dim - \l_@@_x_initial_dim }
+ { }
+ }
+ \c_math_toggle_token
+ \cr
+ \noalign { \skip_vertical:n { 3 pt } \nointerlineskip }
\@@_math_toggle_token: #1 \@@_math_toggle_token: \cr
}
}
@@ -19260,7 +19582,28 @@ version 2005/12/01 or later.
% |\c_@@_footnote_bool| in order to know if we have to insert an environment
% |{savenotes}|.
%
+% \bigskip
+% \subsection*{About the package underscore}
%
+%
+% \begin{macrocode}
+\bool_new:N \l_@@_underscore_loaded_bool
+\@ifpackageloaded { underscore }
+ { \bool_set_true:N \l_@@_underscore_loaded_bool }
+ { }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\hook_gput_code:nnn { begindocument } { . }
+ {
+ \bool_if:NF \l_@@_underscore_loaded_bool
+ {
+ \@ifpackageloaded { underscore }
+ { \@@_error:n { underscore~after~nicematrix } }
+ }
+ }
+% \end{macrocode}
+%
% \bigskip
% \subsection*{Error messages of the package}
%
@@ -19320,7 +19663,7 @@ version 2005/12/01 or later.
{
Negative~weight.\\
The~weight~of~the~'X'~columns~must~be~positive~and~you~have~used~
- the~value~'#1'.\\
+ the~value~'\int_use:N \l_@@_weight_int'.\\
The~absolute~value~will~be~used.
}
% \end{macrocode}
@@ -19377,16 +19720,7 @@ version 2005/12/01 or later.
}
% \end{macrocode}
%
-% \begin{macrocode}
-\@@_msg_new:nn { hvlines-except-corners }
- {
- Obsolete~key.\\
- The~key~'hvlines-except-corners'~is~now~obsolete.~You~should~instead~use~the~
- keys~'hvlines'~and~'corners'.\\
- This~error~is~fatal.
- }
-% \end{macrocode}
-%
+
%
% \begin{macrocode}
\@@_msg_new:nn { columns~not~used }
@@ -19435,6 +19769,24 @@ version 2005/12/01 or later.
}
% \end{macrocode}
%
+%
+% \begin{macrocode}
+\@@_msg_new:nn { caption~outside~float }
+ {
+ Key~caption~forbidden.\\
+ You~can't~use~the~key~'caption'~because~you~are~not~in~a~floating~
+ environment.~This~key~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { short-caption~without~caption }
+ {
+ You~should~not~use~the~key~'short-caption'~without~'caption'.~
+ However,~your~'short-caption'~will~be~used~as~'caption'.
+ }
+% \end{macrocode}
+%
% \begin{macrocode}
\@@_msg_new:nn { double~closing~delimiter }
{
@@ -19463,6 +19815,29 @@ version 2005/12/01 or later.
% \end{macrocode}
%
% \begin{macrocode}
+\@@_msg_new:nn { Identical~notes~in~caption }
+ {
+ Identical~tabular~notes.\\
+ You~can't~put~several~notes~with~the~same~content~in~
+ \token_to_str:N \caption\ (but~you~can~in~the~main~tabular).\\
+ If~you~go~on,~the~output~will~probably~be~erroneous.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { tabularnote~below~the~tabular }
+ {
+ \token_to_str:N \tabularnote\ forbidden\\
+ You~can't~use~\token_to_str:N \tabularnote\ in~the~caption~
+ of~your~tabular~because~the~caption~will~be~composed~below~
+ the~tabular.~If~you~want~the~caption~above~the~tabular~use~the~
+ key~'caption-above'~in~\token_to_str:N \NiceMatrixOptions.\\
+ Your~\token_to_str:N \tabularnote\ will~be~discarded~and~
+ no~similar~error~will~raised~in~this~document.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
\@@_msg_new:nn { Unknown~key~for~rules }
{
Unknown~key.\\
@@ -19476,29 +19851,37 @@ version 2005/12/01 or later.
{
Unknown~key.\\
The~key~'\l_keys_key_str'~is~unknown~in~a~'custom-line'.~
- It~will~be~ignored. \\
+ It~you~go~on,~you~will~probably~have~other~errors. \\
\c_@@_available_keys_str
}
{
The~available~keys~are~(in~alphabetic~order):~
+ ccommand,~
color,~
command,~
dotted,~
letter,~
multiplicity,~
sep-color,~
- tikz,~and~tota-width.
+ tikz,~and~total-width.
}
% \end{macrocode}
%
% \begin{macrocode}
-\@@_msg_new:nn { Unknown~key~for~xdots }
+\@@_msg_new:nnn { Unknown~key~for~xdots }
{
Unknown~key.\\
- As~for~now,~there~is~only~five~keys~available~here:~'color',~'inter',~
- 'line-style',~'radius',~
- and~'shorten'~(and~you~try~to~use~'\l_keys_key_str').~
- That~key~will~be~ignored.
+ The~key~'\l_keys_key_str'~is~unknown~for~a~command~for~drawing~dotted~rules.\\
+ \c_@@_available_keys_str
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~
+ 'color',~
+ 'inter',~
+ 'line-style',~
+ 'radius',~
+ 'shorten',~
+ 'shorten-end'~and~'shorten-start'.
}
% \end{macrocode}
%
@@ -19513,7 +19896,14 @@ version 2005/12/01 or later.
}
% \end{macrocode}
%
-%
+% \begin{macrocode}
+\@@_msg_new:nn { label~without~caption }
+ {
+ You~can't~use~the~key~'label'~in~your~'{NiceTabular}'~because~
+ you~have~not~used~the~key~'caption'.~The~key~'label'~will~be~ignored.
+ }
+% \end{macrocode}
+%
% \begin{macrocode}
\@@_msg_new:nn { Construct~too~large }
{
@@ -19525,6 +19915,17 @@ version 2005/12/01 or later.
% \end{macrocode}
%
% \begin{macrocode}
+\@@_msg_new:nn { underscore~after~nicematrix }
+ {
+ Problem~with~'underscore'.\\
+ The~package~'underscore'~should~be~loaded~before~'nicematrix'.~
+ You~can~go~on~but~you~won't~be~able~to~write~something~such~as:\\
+ '\token_to_str:N \Cdots\token_to_str:N _{n~\token_to_str:N \text{~times}}'.
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
\@@_msg_new:nn { ampersand~in~light-syntax }
{
Ampersand~forbidden.\\
@@ -19543,7 +19944,16 @@ version 2005/12/01 or later.
(set~by~the~key~'end-of-row').~This~error~is~fatal.
}
% \end{macrocode}
-%
+%
+% \begin{macrocode}
+\@@_msg_new:nn { hlines~with~color }
+ {
+ Incompatible~keys.\\
+ You~can't~use~the~keys~'hlines',~'vlines'~or~'hvlines'~for~a~
+ '\token_to_str:N \Block'~when~the~key~'color'~or~'draw'~is~used.\\
+ Your~key~will~be~discarded.
+ }
+% \end{macrocode}
%
% \begin{macrocode}
\@@_msg_new:nn { bad~value~for~baseline }
@@ -19594,8 +20004,7 @@ version 2005/12/01 or later.
% \begin{macrocode}
\@@_msg_new:nn { width~without~X~columns }
{
- No~X~column.\\
- You~have~used~the~key~'width'~but~you~have~put~no~'X'~column. \\
+ You~have~used~the~key~'width'~but~you~have~put~no~'X'~column.~
That~key~will~be~ignored.
}
% \end{macrocode}
@@ -19845,7 +20254,8 @@ version 2005/12/01 or later.
enumitem~not~loaded.\\
You~can't~use~the~command~\token_to_str:N\tabularnote\
~because~you~haven't~loaded~'enumitem'.\\
- This~command~will~be~ignored.
+ All~the~commands~\token_to_str:N\tabularnote\ will~be~
+ ignored~in~the~document.
}
% \end{macrocode}
%
@@ -19932,6 +20342,24 @@ version 2005/12/01 or later.
% \end{macrocode}
%
% \begin{macrocode}
+\@@_msg_new:nnn { Unknow~key~for~RulesBis }
+ {
+ Unkown~key.\\
+ Your~key~'\l_keys_key_str'~is~unknown~for~a~rule.\\
+ \c_@@_available_keys_str
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~
+ color,~
+ dotted,~
+ multiplicity,~
+ sep-color,~
+ tikz,~and~total-width.
+ }
+
+% \end{macrocode}
+%
+% \begin{macrocode}
\@@_msg_new:nnn { Unknown~key~for~Block }
{
Unknown~key.\\
@@ -20072,6 +20500,7 @@ version 2005/12/01 or later.
{
The~available~keys~are~(in~alphabetic~order):~
allow-duplicate-names,~
+ caption-above,~
cell-space-bottom-limit,~
cell-space-limits,~
cell-space-top-limit,~
@@ -20245,6 +20674,7 @@ version 2005/12/01 or later.
b,~
baseline,~
c,~
+ caption,~
cell-space-bottom-limit,~
cell-space-limits,~
cell-space-top-limit,~
@@ -20266,6 +20696,7 @@ version 2005/12/01 or later.
first-row,~
hlines,~
hvlines,~
+ label,~
last-col,~
last-row,~
left-margin,~
@@ -20278,6 +20709,7 @@ version 2005/12/01 or later.
respect-arraystretch,~
right-margin,~
rules~(with~the~subkeys~'color'~and~'width'),~
+ short-caption,~
t,~
tabularnote,~
vlines,~
@@ -20646,7 +21078,7 @@ version 2005/12/01 or later.
%
% \subsection*{Changes between versions 4.3 and 4.4}
%
-% New key |hvlines-except-corners|.
+% New key |hvlines-except-corners| (now deprecated).
%
% \subsection*{Changes between versions 4.4 and 5.0}
%
@@ -20902,14 +21334,22 @@ version 2005/12/01 or later.
%
% \subsection*{Changes between version 6.10 and 6.11}
%
-% New key |matrix/columns-type| to spcecify the type of columns of the matrices.
+% New key |matrix/columns-type| to specify the type of columns of the matrices.
%
-% New key |ccommand| in |custom-line| and new command |\cdotteline|.
+% New key |ccommand| in |custom-line| and new command |\cdottedline|.
%
% \subsection*{Changes between version 6.11 and 6.12}
%
-% \PrintIndex
+% New keys |caption|, |short-caption| and |label| in the environment
+% |{NiceTabular}|.
+%
+% In |{NiceTabular}|, a caption specified by the key |caption| is wrapped to the
+% width of the tabular.
%
+% Correction of a bug: it's now possible to use |\OverBrace| and |\UnderBrace|
+% with \pkg{unicode-math} (with XeLaTeX or LuaLaTeX).
+%
+% \newpage
% \tableofcontents
%
% \endinput
diff --git a/macros/latex/contrib/nicematrix/nicematrix.pdf b/macros/latex/contrib/nicematrix/nicematrix.pdf
index 2f3b8fe6d7..88d123b069 100644
--- a/macros/latex/contrib/nicematrix/nicematrix.pdf
+++ b/macros/latex/contrib/nicematrix/nicematrix.pdf
Binary files differ
diff --git a/macros/luatex/generic/lua-widow-control/CHANGELOG.md b/macros/luatex/generic/lua-widow-control/CHANGELOG.md
index 0314b88e6b..b6822129f5 100644
--- a/macros/luatex/generic/lua-widow-control/CHANGELOG.md
+++ b/macros/luatex/generic/lua-widow-control/CHANGELOG.md
@@ -9,7 +9,12 @@ Changelog
All notable changes to lua-widow-control will be listed here, in reverse chronological order. **Changes listed in bold** are important changes: they either remove options or commands, or may change the location of page breaks.
-## v2.2.0 (2022-06-17)
+## v2.2.1 (2022-07-28)
+
+- Fix crashes with recent LuaMetaTeX (ConTeXt MkXL)
+- No longer show "left parfill skip" warnings with ConTeXt LMTX/MkXL ([#7](https://github.com/gucci-on-fleek/lua-widow-control/issues/7))
+
+## [v2.2.0 (2022-06-17)](https://github.com/gucci-on-fleek/lua-widow-control/releases/tag/release-9a5deba53545adc5ab25a5caa0b8ebf4104843f9)
- Fix paragraphs not being properly saved for potential expansion. **May affect page breaks.**
- Add a new `draft` option ([#36](https://github.com/gucci-on-fleek/lua-widow-control/issues/36)).
diff --git a/macros/luatex/generic/lua-widow-control/README.md b/macros/luatex/generic/lua-widow-control/README.md
index 61e62cb59a..ff167352c6 100644
--- a/macros/luatex/generic/lua-widow-control/README.md
+++ b/macros/luatex/generic/lua-widow-control/README.md
@@ -48,4 +48,4 @@ Lua-widow-control is licensed under the [_Mozilla Public License_, version 2.0](
Please note that a compiled document is absolutely **not** considered to be an "Executable Form" as defined by the MPL. The use of lua-widow-control in a document does not place **any** obligations on the document's author or distributors. The MPL and CC-BY-SA licenses **only** apply to you if you distribute the lua-widow-control source code or documentation.
---
-_v2.2.0 (2022-06-17)_ <!--%%version %%dashdate-->
+_v2.2.1 (2022-07-28)_ <!--%%version %%dashdate-->
diff --git a/macros/luatex/generic/lua-widow-control/lua-widow-control-2022-02-22.sty b/macros/luatex/generic/lua-widow-control/lua-widow-control-2022-02-22.sty
index 7464563560..fc410085e3 100644
--- a/macros/luatex/generic/lua-widow-control/lua-widow-control-2022-02-22.sty
+++ b/macros/luatex/generic/lua-widow-control/lua-widow-control-2022-02-22.sty
@@ -12,8 +12,8 @@
% report a real version number here for debugging.
\PackageInfo{lua-widow-control}{%
Real version:
- 2022/06/17 %%slashdate
- v2.2.0 %%version
+ 2022/07/28 %%slashdate
+ v2.2.1 %%version
}
\PackageWarning{lua-widow-control}{%
diff --git a/macros/luatex/generic/lua-widow-control/lua-widow-control.lua b/macros/luatex/generic/lua-widow-control/lua-widow-control.lua
index 800faf5624..0f23f42592 100644
--- a/macros/luatex/generic/lua-widow-control/lua-widow-control.lua
+++ b/macros/luatex/generic/lua-widow-control/lua-widow-control.lua
@@ -194,8 +194,8 @@ elseif plain or latex or optex then
debug("Plain/LaTeX")
luatexbase.provides_module {
name = lwc.name,
- date = "2022/06/17", --%%slashdate
- version = "2.2.0", --%%version
+ date = "2022/07/28", --%%slashdate
+ version = "2.2.1", --%%version
description = [[
This module provides a LuaTeX-based solution to prevent
@@ -344,25 +344,19 @@ local function long_paragraph(head)
-- We can't modify the original paragraph
head = copy_list(head)
+ if lmtx then
+ tex.preparelinebreak(head)
+ end
+
-- Prevent ultra-short last lines (\TeX{}Book p. 104), except with narrow columns
-- Equivalent to \\parfillskip=0pt plus 0.8\\hsize
- local parfillskip
- if lmtx or last(head).id ~= glue_id then
- -- LMTX does not automatically add the \\parfillskip glue
- parfillskip = new_node("glue", "parfillskip")
- else
- parfillskip = last(head)
- end
+ local parfillskip = last(head)
if tex.hsize > min_col_width then
parfillskip[stretch_order] = 0
parfillskip.stretch = 0.8 * tex.hsize -- Last line must be at least 20% long
end
- if lmtx or last(head).id ~= glue_id then
- last(head).next = parfillskip
- end
-
-- Break the paragraph 1 line longer than natural
return linebreak(head, {
looseness = 1,
@@ -379,15 +373,8 @@ local function natural_paragraph(head)
-- We can't modify the original paragraph
head = copy_list(head)
- --[[ Contrary to the documentation, LMTX does not automatically add
- the \\parfillskip glue before `pre_linebreak_filter`, so we need
- to add it here so that our \\prevgraf comparisons are correct.
- ]]
if lmtx then
- parfillskip = new_node("glue", "parfillskip")
- parfillskip[stretch_order] = 1
- parfillskip.stretch = 1 -- 0pt plus 1fil
- last(head).next = parfillskip
+ tex.preparelinebreak(head)
end
-- Break the paragraph naturally to get \\prevgraf
diff --git a/macros/luatex/generic/lua-widow-control/lua-widow-control.opm b/macros/luatex/generic/lua-widow-control/lua-widow-control.opm
index ff26f856c5..d628a401e4 100644
--- a/macros/luatex/generic/lua-widow-control/lua-widow-control.opm
+++ b/macros/luatex/generic/lua-widow-control/lua-widow-control.opm
@@ -3,7 +3,7 @@
% SPDX-License-Identifier: MPL-2.0+
% SPDX-FileCopyrightText: 2022 Max Chernoff
-\_codedecl\lwcenable{lua-widow-control <v2.2.0>} %%version
+\_codedecl\lwcenable{lua-widow-control <v2.2.1>} %%version
\_namespace{lwc}
\_clubpenalty=1
diff --git a/macros/luatex/generic/lua-widow-control/lua-widow-control.pdf b/macros/luatex/generic/lua-widow-control/lua-widow-control.pdf
index 36b8db2908..0914f4a223 100644
--- a/macros/luatex/generic/lua-widow-control/lua-widow-control.pdf
+++ b/macros/luatex/generic/lua-widow-control/lua-widow-control.pdf
Binary files differ
diff --git a/macros/luatex/generic/lua-widow-control/lua-widow-control.sty b/macros/luatex/generic/lua-widow-control/lua-widow-control.sty
index 7d1be850b9..8b76863767 100644
--- a/macros/luatex/generic/lua-widow-control/lua-widow-control.sty
+++ b/macros/luatex/generic/lua-widow-control/lua-widow-control.sty
@@ -13,7 +13,7 @@
\DeclareRelease{}{0000-00-00}{lua-widow-control-2022-02-22.sty}
\DeclareRelease{v1.1.6}{2022-02-22}{lua-widow-control-2022-02-22.sty}
-\DeclareCurrentRelease{v2.2.0}{2022-06-17} %%version %%dashdate
+\DeclareCurrentRelease{v2.2.1}{2022-07-28} %%version %%dashdate
% If this version of LaTeX doesn't support command hooks, then we load
% the last v1.1.X version of the package.
@@ -23,8 +23,8 @@
\ProvidesExplPackage
{lua-widow-control}
- {2022/06/17} %%slashdate
- {v2.2.0} %%version
+ {2022/07/28} %%slashdate
+ {v2.2.1} %%version
{Use Lua to remove widows and orphans}
% Unconditional Package Loads
diff --git a/macros/luatex/generic/lua-widow-control/lua-widow-control.tex b/macros/luatex/generic/lua-widow-control/lua-widow-control.tex
index 2e1dcef902..45c9e288e4 100644
--- a/macros/luatex/generic/lua-widow-control/lua-widow-control.tex
+++ b/macros/luatex/generic/lua-widow-control/lua-widow-control.tex
@@ -3,7 +3,7 @@
% SPDX-License-Identifier: MPL-2.0+
% SPDX-FileCopyrightText: 2022 Max Chernoff
-\wlog{lua-widow-control v2.2.0} %%version
+\wlog{lua-widow-control v2.2.1} %%version
\ifx\directlua\undefined
\errmessage{%
diff --git a/macros/luatex/generic/lua-widow-control/lwc-manual.tex b/macros/luatex/generic/lua-widow-control/lwc-manual.tex
index c890238371..c22375e34c 100644
--- a/macros/luatex/generic/lua-widow-control/lwc-manual.tex
+++ b/macros/luatex/generic/lua-widow-control/lwc-manual.tex
@@ -64,7 +64,7 @@
\startdocument[
title=lua-widow-control,
author=Max Chernoff,
- version=2.2.0, %%version
+ version=2.2.1, %%version
github=https://github.com/gucci-on-fleek/lua-widow-control,
ctan=https://www.ctan.org/pkg/lua-widow-control,
]
@@ -390,7 +390,7 @@ Any others, though, you'll need to patch yourself.
\NC\NR
\stopTABLE
-The Plain~\TeX{}, \OpTeX, and \ConTeXt commands \emph{append} to the list of patched commands: they simply patch the provided commands while leaving the original patches in place. The \LaTeX{} option \emph{sets} the list of patched commands: it replaces the default list with the provided list.
+The Plain~\TeX{}, \OpTeX{}, and \ConTeXt{} commands \emph{append} to the list of patched commands: they simply patch the provided commands while leaving the original patches in place. The \LaTeX{} option \emph{sets} the list of patched commands: it replaces the default list with the provided list.
\subsection{\estretch/}
diff --git a/macros/luatex/generic/lua-widow-control/t-lua-widow-control.mkxl b/macros/luatex/generic/lua-widow-control/t-lua-widow-control.mkxl
index 5982533202..cc1932d8e1 100644
--- a/macros/luatex/generic/lua-widow-control/t-lua-widow-control.mkxl
+++ b/macros/luatex/generic/lua-widow-control/t-lua-widow-control.mkxl
@@ -1,10 +1,10 @@
%D \module
%D [ file=t-lua-widow-control,
-%D version=2.2.0, %%version
+%D version=2.2.1, %%version
%D title=lua-widow-control,
%D subtitle=\ConTeXt module for lua-widow-control,
%D author=Max Chernoff,
-%D date=2022-06-17, %%dashdate
+%D date=2022-07-28, %%dashdate
%D copyright=Max Chernoff,
%D license=MPL-2.0+,
%D url=https://github.com/gucci-on-fleek/lua-widow-control]
diff --git a/macros/luatex/generic/lua-widow-control/tb133chernoff-widows.pdf b/macros/luatex/generic/lua-widow-control/tb133chernoff-widows.pdf
index b506109496..344604fb46 100644
--- a/macros/luatex/generic/lua-widow-control/tb133chernoff-widows.pdf
+++ b/macros/luatex/generic/lua-widow-control/tb133chernoff-widows.pdf
Binary files differ
diff --git a/macros/xetex/latex/exam-zh/CHANGELOG.md b/macros/xetex/latex/exam-zh/CHANGELOG.md
new file mode 100644
index 0000000000..a8d56a3d52
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/CHANGELOG.md
@@ -0,0 +1,352 @@
+# Changelog
+
+此处记载了项目中所有值得留意的改动。
+
+格式参照 [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
+并且此项目遵守 [Semantic Versioning](https://semver.org/spec/v2.0.0.html)。
+
+
+## [0.1.13] - 2022-07-28
+
+### Changed
+
+- 优化 `question/combine-fillin` 的效果
+
+## [0.1.12] - 2022-07-27
+
+### Added
+
+- 增加 `\fillin*` 命令实现自动换行
+
+### Changed
+
+- `exam-zh-chinese` 模块改名为 `exam-zh-chinese-english`
+
+
+### Fixed
+
+- 修复 `chapter` 下的 `question` 的序号从0开始问题
+- 修复页脚 `lastpage` 前的空格自动化的问题
+
+
+
+## [0.1.12] - 2022-07-26
+
+### Added
+
+- 增加 `writingbox` 环境
+- 增加 `question/combine-fillin`, `question/combine-fillin-args`, `question/label-align` 键值
+- 增加密封线的范围值
+
+
+## [0.1.12] - 2022-07-25
+
+### Added
+
+- 增加第一层级 `enumerate` 的设置
+- 增加 `notice` 环境的键值 `label`, `label-format`, `top-sep`, `bottom-sep`
+
+### Changed
+
+- 给 `notice` 环境增加参数
+
+## [0.1.12] - 2022-07-24
+
+### Added
+
+- 增加密封线 `text-width`, `text-format`, `text-xscale`,`text-yscale`, `text-direction-vertical` 键值
+- 增加 `select` 环境的 `above` 和 `below` 键值
+- 增加 `sealline/scope` 同效键值 `sealline/type`
+- 增加脚注设置
+- 增加 `\subject` 的可选参数
+- 增加 `scoringbox/position` 键值
+- 增加 `material` 环境
+- 增加 `style/footnote-style` 键值
+
+### Changed
+
+- `foot-style` 改为 `foot-type`
+- 修改 `solution`, `choices` 的 `top-sep`, `bottom-sep` 的默认值
+
+
+### Fixed
+
+- 更正 `select/seperator` 为 `select/separator`
+- 修复 `question` 环境的 `index` 减一问题
+
+## [0.1.12] - 2022-07-23
+
+### Changed
+
+- 修改 `square` 键值名称
+- 将 `select` 环境的 `\item` 改为 `\sitem` 以兼容 `choices` 环境
+
+### Removed
+
+- 去掉 `sealline/text-align` 键值
+
+
+## [0.1.12] - 2022-07-22
+
+- 修复 `fullwidth-stop` 的失效问题
+
+## [0.1.11] - 2022-07-22
+
+### Added
+
+- 实现师生两版
+
+
+## [0.1.11] - 2022-07-21
+
+### Added
+
+- `\fillin` 不显示答案时增加 `counter` 类型的显示
+- `question/label` 增加基于 `TiKZ` 的带圈数字 `\tikzcirclednumber` 类型计数器
+- 增加 `select/show-mark` 键值控制 `select` 环境的 mark 显示
+- 增加 `fillin/no-answer-counter-label` 键值
+
+### Changed
+
+- `fillin/show-blacktriangle` 键值改为 `no-answer-type`
+- `questioncirclednumber` 改为 `circlednumber`
+- `\circlednumber` 命令增加 `\circlednumber*` 类型
+- 将 `question` 环境的上下方间距从 `\addvspace` 改为 `\vspace*`
+
+## [0.1.11] - 2022-07-20
+
+### Added
+
+- 增加 `question` 和 `problem` 环境的 `label` 键值
+- 增加 `solution` 环境的 `parbreak` 键值
+
+### Changed
+
+- 完善 `question/blank-type=hide` 的效果
+
+## [0.1.11] - 2022-07-19
+
+### Added
+
+- 增加手册 `choices` 环境方形和圆形 label 的示例
+- 增加 `solution` 不显示解答时的垂直空白 `blank-type` 和 `blank-sep` 键值
+- 增加 `solution` 的 `top-sep` 和 `bottom-sep` 键值
+- 增加 `fullwidth-stop` 键值
+
+### Changed
+
+- 更改 `solution` 环境接口
+- 修改 `change-frac-style`, `change-dfrac-style` 默认值为 `false`
+
+
+### Fixed
+
+- 修复 `missing \item` 问题(#I5HUUV)
+
+## [0.1.10] - 2022-07-19
+
+### Added
+
+- 新增 `exam-zh-chinese.sty` 模块
+- 新增 `select` 环境(#I5HG8K)
+- 新增 `lineto` 连线环境(#I5FXOX)
+
+## [0.1.10] - 2022-07-17
+
+### Added
+
+- 增加不同字体命令的效果展示
+- 增加 `\frac` 和 `\dfrac` 分子分母额外间距的控制(#I5H51B)
+
+## [0.1.9] - 2022-07-17
+
+### Added
+
+- 增加手册“符号”的部分
+
+## [0.1.9] - 2022-07-16
+
+### Added
+
+- 密封线增加 `first-and-last` 类型
+
+### Changed
+
+- 去掉 `\fillin[type=paren]` 的基线调整
+- 去掉 `\fillin[type=blank]` 的基线调整
+- 将 `example.tex` 改为 `example-single.tex` 和 `example-multiple.tex` 分别作为单份和多份试卷排版示例
+
+
+### Fixed
+
+- 修复 `solution` 环境的列表嵌套的空格问题
+- 修复 `a4paper` 无 `\chapter` 下的页面格式问题
+
+## [0.1.9] - 2022-07-15
+
+### Added
+
+- 增加 `\fillin` 的 `type/blank` 值
+- 增加 `\fillin` 的颜色控制
+- 增加 `\paren` 的 `type` 键值
+- 增加 `solution` 环境的 `text-color` 键值
+
+### Changed
+
+- 修改所有页面(目录除外)为统一的页眉页脚
+- 将 `answer-color` 拆成 `\fillin` 和 `\paren` 的颜色分别控制
+
+
+## [0.1.8] - 2022-07-14
+
+### Fixed
+
+- 修复了 `a3paper` 和 `foot-style=separate` 的目录页码问题
+
+
+## [0.1.8] - 2022-07-12
+
+### Fixed
+
+- 修复 `missing number` 问题
+- 修复“目录”二字重复问题
+
+## [0.1.7] - 2022-07-08
+
+### Added
+
+- 将文类改为 `ctexbook`,并修改 `\chapter` 样式(#I5G2QM)
+- 增加 `show-chapter` 键值控制 `\chapter` 的显示
+
+## [0.1.7] - 2022-07-08
+
+### Fixed
+
+- 去掉 `.str_set:N` 使得模版兼容 TeXLive 2021 (#I5G7X2)
+
+## [0.1.7] - 2022-07-07
+
+### Added
+
+- 增加 `exam-zh-symbols.sty` 模块绘制部分中国化的数学符号
+
+### Changed
+
+- 修改 `\complement` 的效果
+
+### Fixed
+
+- 修复 `a3paper` 的分数框问题(#I5FZWW)
+
+## [0.1.7] - 2022-07-06
+
+### Added
+
+- 增加 `\fillin` 的 `width` 键值
+
+## [0.1.6] - 2022-07-05
+
+### Added
+
+- `\fillin` 命令增加一个 `circle` 类型(#I5FMPP)
+
+### Changed
+
+- 将 `\paren` 和 `\fillin` 的答案控制单独分离
+
+
+## [0.1.6] - 2022-07-04
+
+### Added
+
+- 增加 `\examsquare` 方格命令
+- 增加 `step`、`method`、`case` 环境
+- 增加页脚内容定制接口 `page/foot-content`
+
+## [0.1.6] - 2022-07-03
+
+### Added
+
+- 增加标题的控制接口
+- 增加顶部的个人信息接口
+- 增加 `\warning` 命令
+- 增加草稿纸 `\draftpaper` 以及相关接口
+
+### Changed
+
+- 将 `\goodluck` 命令改为参数式
+
+
+## [0.1.5] - 2022-07-02
+
+### Added
+
+- 增加 `solution` 环境和 `score` 命令
+
+## [0.1.4] - 2022-06-27
+
+### Added
+
+- 基本完成用户手册的编写
+
+## [0.1.4] - 2022-06-24
+
+### Added
+
+- 给 `\fillin` 命令增加了可选参数接口
+- `choices` 环境增加 `index` 接口
+
+## [0.1.3] - 2022-06-22
+
+### Added
+
+- 增加密封线奇偶统一控制接口
+
+### Fixed
+
+- 修复密封线接口失效问题
+
+
+## [0.1.2] - 2022-06-16
+
+- 完成密封线的所有接口设计
+
+## [0.1.2] - 2022-06-15
+
+- 增加密封线
+
+
+## [0.1.2] - 2022-06-14
+
+### Added
+
+- 新增页面尺寸 `a4paper` 和 `a3paper` 的控制
+- 新增 `a3paper` 页面的“是否共用页脚”控制
+
+
+## [0.1.1] - 2022-06-09
+
+### Added
+
+- 新增 `question` 环境的 `top-sep` 和 `bottom-sep` 选项控制前后距离([#I4SLWN](https://gitee.com/zepinglee/exam-zh/issues/I4SLWN))。
+- 新增 `question` 环境的 `index` 选项设置题号([#I4SQLI](https://gitee.com/zepinglee/exam-zh/issues/I4SQLI))。
+- 新增 `question` 环境的 `answer-color` 选项控制答案颜色([#I4SW79](https://gitee.com/zepinglee/exam-zh/issues/I4SW79))。
+- 新增 `choices` 环境的 `label` 选项控制标签格式([#I4SXC1](https://gitee.com/zepinglee/exam-zh/issues/I4SXC1))。
+- 新增 `\circlednumber` 使用中文字体生成带圈数字。
+- 新增 `choices` 环境的 `label-align` 选项控制标签的对齐方式([#I4TDSA](https://gitee.com/zepinglee/exam-zh/issues/I4TDSA))。
+- 新增 `exam-zh-font` 模块,提供西文字体 `font` 和数学字体 `math-font` 选项([#I512EV](https://gitee.com/zepinglee/exam-zh/issues/I512EV))。
+- 新增 `fillin` 命令的 `type` 选项控制下划线和括号类型
+
+### Fixed
+
+- 答案的内容较高时调整深度([#I4SXC1](https://gitee.com/zepinglee/exam-zh/issues/I4SXC1))。
+
+## [v0.1.0] - 2022-02-04
+
+### Added
+
+- 在 Gitee 发布。
+
+[Unreleased]: https://gitee.com/zepinglee/exam-zh/compare/v0.1.0...HEAD
+[v0.1.0]: https://gitee.com/zepinglee/exam-zh/releases/v0.1.0
+[v0.1.1]: https://gitee.com/zepinglee/exam-zh/releases/v0.1.1
diff --git a/macros/xetex/latex/exam-zh/LICENSE b/macros/xetex/latex/exam-zh/LICENSE
new file mode 100644
index 0000000000..2244313901
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/LICENSE
@@ -0,0 +1,416 @@
+The LaTeX Project Public License
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+
+LPPL Version 1.3c 2008-05-04
+
+Copyright 1999 2002-2008 LaTeX3 Project
+ Everyone is allowed to distribute verbatim copies of this
+ license document, but modification of it is not allowed.
+
+
+PREAMBLE
+========
+
+The LaTeX Project Public License (LPPL) is the primary license under
+which the LaTeX kernel and the base LaTeX packages are distributed.
+
+You may use this license for any work of which you hold the copyright
+and which you wish to distribute. This license may be particularly
+suitable if your work is TeX-related (such as a LaTeX package), but
+it is written in such a way that you can use it even if your work is
+unrelated to TeX.
+
+The section `WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE',
+below, gives instructions, examples, and recommendations for authors
+who are considering distributing their works under this license.
+
+This license gives conditions under which a work may be distributed
+and modified, as well as conditions under which modified versions of
+that work may be distributed.
+
+We, the LaTeX3 Project, believe that the conditions below give you
+the freedom to make and distribute modified versions of your work
+that conform with whatever technical specifications you wish while
+maintaining the availability, integrity, and reliability of
+that work. If you do not see how to achieve your goal while
+meeting these conditions, then read the document `cfgguide.tex'
+and `modguide.tex' in the base LaTeX distribution for suggestions.
+
+
+DEFINITIONS
+===========
+
+In this license document the following terms are used:
+
+ `Work'
+ Any work being distributed under this License.
+
+ `Derived Work'
+ Any work that under any applicable law is derived from the Work.
+
+ `Modification'
+ Any procedure that produces a Derived Work under any applicable
+ law -- for example, the production of a file containing an
+ original file associated with the Work or a significant portion of
+ such a file, either verbatim or with modifications and/or
+ translated into another language.
+
+ `Modify'
+ To apply any procedure that produces a Derived Work under any
+ applicable law.
+
+ `Distribution'
+ Making copies of the Work available from one person to another, in
+ whole or in part. Distribution includes (but is not limited to)
+ making any electronic components of the Work accessible by
+ file transfer protocols such as FTP or HTTP or by shared file
+ systems such as Sun's Network File System (NFS).
+
+ `Compiled Work'
+ A version of the Work that has been processed into a form where it
+ is directly usable on a computer system. This processing may
+ include using installation facilities provided by the Work,
+ transformations of the Work, copying of components of the Work, or
+ other activities. Note that modification of any installation
+ facilities provided by the Work constitutes modification of the Work.
+
+ `Current Maintainer'
+ A person or persons nominated as such within the Work. If there is
+ no such explicit nomination then it is the `Copyright Holder' under
+ any applicable law.
+
+ `Base Interpreter'
+ A program or process that is normally needed for running or
+ interpreting a part or the whole of the Work.
+
+ A Base Interpreter may depend on external components but these
+ are not considered part of the Base Interpreter provided that each
+ external component clearly identifies itself whenever it is used
+ interactively. Unless explicitly specified when applying the
+ license to the Work, the only applicable Base Interpreter is a
+ `LaTeX-Format' or in the case of files belonging to the
+ `LaTeX-format' a program implementing the `TeX language'.
+
+
+
+CONDITIONS ON DISTRIBUTION AND MODIFICATION
+===========================================
+
+1. Activities other than distribution and/or modification of the Work
+are not covered by this license; they are outside its scope. In
+particular, the act of running the Work is not restricted and no
+requirements are made concerning any offers of support for the Work.
+
+2. You may distribute a complete, unmodified copy of the Work as you
+received it. Distribution of only part of the Work is considered
+modification of the Work, and no right to distribute such a Derived
+Work may be assumed under the terms of this clause.
+
+3. You may distribute a Compiled Work that has been generated from a
+complete, unmodified copy of the Work as distributed under Clause 2
+above, as long as that Compiled Work is distributed in such a way that
+the recipients may install the Compiled Work on their system exactly
+as it would have been installed if they generated a Compiled Work
+directly from the Work.
+
+4. If you are the Current Maintainer of the Work, you may, without
+restriction, modify the Work, thus creating a Derived Work. You may
+also distribute the Derived Work without restriction, including
+Compiled Works generated from the Derived Work. Derived Works
+distributed in this manner by the Current Maintainer are considered to
+be updated versions of the Work.
+
+5. If you are not the Current Maintainer of the Work, you may modify
+your copy of the Work, thus creating a Derived Work based on the Work,
+and compile this Derived Work, thus creating a Compiled Work based on
+the Derived Work.
+
+6. If you are not the Current Maintainer of the Work, you may
+distribute a Derived Work provided the following conditions are met
+for every component of the Work unless that component clearly states
+in the copyright notice that it is exempt from that condition. Only
+the Current Maintainer is allowed to add such statements of exemption
+to a component of the Work.
+
+ a. If a component of this Derived Work can be a direct replacement
+ for a component of the Work when that component is used with the
+ Base Interpreter, then, wherever this component of the Work
+ identifies itself to the user when used interactively with that
+ Base Interpreter, the replacement component of this Derived Work
+ clearly and unambiguously identifies itself as a modified version
+ of this component to the user when used interactively with that
+ Base Interpreter.
+
+ b. Every component of the Derived Work contains prominent notices
+ detailing the nature of the changes to that component, or a
+ prominent reference to another file that is distributed as part
+ of the Derived Work and that contains a complete and accurate log
+ of the changes.
+
+ c. No information in the Derived Work implies that any persons,
+ including (but not limited to) the authors of the original version
+ of the Work, provide any support, including (but not limited to)
+ the reporting and handling of errors, to recipients of the
+ Derived Work unless those persons have stated explicitly that
+ they do provide such support for the Derived Work.
+
+ d. You distribute at least one of the following with the Derived Work:
+
+ 1. A complete, unmodified copy of the Work;
+ if your distribution of a modified component is made by
+ offering access to copy the modified component from a
+ designated place, then offering equivalent access to copy
+ the Work from the same or some similar place meets this
+ condition, even though third parties are not compelled to
+ copy the Work along with the modified component;
+
+ 2. Information that is sufficient to obtain a complete,
+ unmodified copy of the Work.
+
+7. If you are not the Current Maintainer of the Work, you may
+distribute a Compiled Work generated from a Derived Work, as long as
+the Derived Work is distributed to all recipients of the Compiled
+Work, and as long as the conditions of Clause 6, above, are met with
+regard to the Derived Work.
+
+8. The conditions above are not intended to prohibit, and hence do not
+apply to, the modification, by any method, of any component so that it
+becomes identical to an updated version of that component of the Work as
+it is distributed by the Current Maintainer under Clause 4, above.
+
+9. Distribution of the Work or any Derived Work in an alternative
+format, where the Work or that Derived Work (in whole or in part) is
+then produced by applying some process to that format, does not relax or
+nullify any sections of this license as they pertain to the results of
+applying that process.
+
+10. a. A Derived Work may be distributed under a different license
+ provided that license itself honors the conditions listed in
+ Clause 6 above, in regard to the Work, though it does not have
+ to honor the rest of the conditions in this license.
+
+ b. If a Derived Work is distributed under a different license, that
+ Derived Work must provide sufficient documentation as part of
+ itself to allow each recipient of that Derived Work to honor the
+ restrictions in Clause 6 above, concerning changes from the Work.
+
+11. This license places no restrictions on works that are unrelated to
+the Work, nor does this license place any restrictions on aggregating
+such works with the Work by any means.
+
+12. Nothing in this license is intended to, or may be used to, prevent
+complete compliance by all parties with all applicable laws.
+
+
+NO WARRANTY
+===========
+
+There is no warranty for the Work. Except when otherwise stated in
+writing, the Copyright Holder provides the Work `as is', without
+warranty of any kind, either expressed or implied, including, but not
+limited to, the implied warranties of merchantability and fitness for a
+particular purpose. The entire risk as to the quality and performance
+of the Work is with you. Should the Work prove defective, you assume
+the cost of all necessary servicing, repair, or correction.
+
+In no event unless required by applicable law or agreed to in writing
+will The Copyright Holder, or any author named in the components of the
+Work, or any other party who may distribute and/or modify the Work as
+permitted above, be liable to you for damages, including any general,
+special, incidental or consequential damages arising out of any use of
+the Work or out of inability to use the Work (including, but not limited
+to, loss of data, data being rendered inaccurate, or losses sustained by
+anyone as a result of any failure of the Work to operate with any other
+programs), even if the Copyright Holder or said author or said other
+party has been advised of the possibility of such damages.
+
+
+MAINTENANCE OF THE WORK
+=======================
+
+The Work has the status `author-maintained' if the Copyright Holder
+explicitly and prominently states near the primary copyright notice in
+the Work that the Work can only be maintained by the Copyright Holder
+or simply that it is `author-maintained'.
+
+The Work has the status `maintained' if there is a Current Maintainer
+who has indicated in the Work that they are willing to receive error
+reports for the Work (for example, by supplying a valid e-mail
+address). It is not required for the Current Maintainer to acknowledge
+or act upon these error reports.
+
+The Work changes from status `maintained' to `unmaintained' if there
+is no Current Maintainer, or the person stated to be Current
+Maintainer of the work cannot be reached through the indicated means
+of communication for a period of six months, and there are no other
+significant signs of active maintenance.
+
+You can become the Current Maintainer of the Work by agreement with
+any existing Current Maintainer to take over this role.
+
+If the Work is unmaintained, you can become the Current Maintainer of
+the Work through the following steps:
+
+ 1. Make a reasonable attempt to trace the Current Maintainer (and
+ the Copyright Holder, if the two differ) through the means of
+ an Internet or similar search.
+
+ 2. If this search is successful, then enquire whether the Work
+ is still maintained.
+
+ a. If it is being maintained, then ask the Current Maintainer
+ to update their communication data within one month.
+
+ b. If the search is unsuccessful or no action to resume active
+ maintenance is taken by the Current Maintainer, then announce
+ within the pertinent community your intention to take over
+ maintenance. (If the Work is a LaTeX work, this could be
+ done, for example, by posting to comp.text.tex.)
+
+ 3a. If the Current Maintainer is reachable and agrees to pass
+ maintenance of the Work to you, then this takes effect
+ immediately upon announcement.
+
+ b. If the Current Maintainer is not reachable and the Copyright
+ Holder agrees that maintenance of the Work be passed to you,
+ then this takes effect immediately upon announcement.
+
+ 4. If you make an `intention announcement' as described in 2b. above
+ and after three months your intention is challenged neither by
+ the Current Maintainer nor by the Copyright Holder nor by other
+ people, then you may arrange for the Work to be changed so as
+ to name you as the (new) Current Maintainer.
+
+ 5. If the previously unreachable Current Maintainer becomes
+ reachable once more within three months of a change completed
+ under the terms of 3b) or 4), then that Current Maintainer must
+ become or remain the Current Maintainer upon request provided
+ they then update their communication data within one month.
+
+A change in the Current Maintainer does not, of itself, alter the fact
+that the Work is distributed under the LPPL license.
+
+If you become the Current Maintainer of the Work, you should
+immediately provide, within the Work, a prominent and unambiguous
+statement of your status as Current Maintainer. You should also
+announce your new status to the same pertinent community as
+in 2b) above.
+
+
+WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE
+======================================================
+
+This section contains important instructions, examples, and
+recommendations for authors who are considering distributing their
+works under this license. These authors are addressed as `you' in
+this section.
+
+Choosing This License or Another License
+----------------------------------------
+
+If for any part of your work you want or need to use *distribution*
+conditions that differ significantly from those in this license, then
+do not refer to this license anywhere in your work but, instead,
+distribute your work under a different license. You may use the text
+of this license as a model for your own license, but your license
+should not refer to the LPPL or otherwise give the impression that
+your work is distributed under the LPPL.
+
+The document `modguide.tex' in the base LaTeX distribution explains
+the motivation behind the conditions of this license. It explains,
+for example, why distributing LaTeX under the GNU General Public
+License (GPL) was considered inappropriate. Even if your work is
+unrelated to LaTeX, the discussion in `modguide.tex' may still be
+relevant, and authors intending to distribute their works under any
+license are encouraged to read it.
+
+A Recommendation on Modification Without Distribution
+-----------------------------------------------------
+
+It is wise never to modify a component of the Work, even for your own
+personal use, without also meeting the above conditions for
+distributing the modified component. While you might intend that such
+modifications will never be distributed, often this will happen by
+accident -- you may forget that you have modified that component; or
+it may not occur to you when allowing others to access the modified
+version that you are thus distributing it and violating the conditions
+of this license in ways that could have legal implications and, worse,
+cause problems for the community. It is therefore usually in your
+best interest to keep your copy of the Work identical with the public
+one. Many works provide ways to control the behavior of that work
+without altering any of its licensed components.
+
+How to Use This License
+-----------------------
+
+To use this license, place in each of the components of your work both
+an explicit copyright notice including your name and the year the work
+was authored and/or last substantially modified. Include also a
+statement that the distribution and/or modification of that
+component is constrained by the conditions in this license.
+
+Here is an example of such a notice and statement:
+
+ %% pig.dtx
+ %% Copyright 2005 M. Y. Name
+ %
+ % This work may be distributed and/or modified under the
+ % conditions of the LaTeX Project Public License, either version 1.3
+ % of this license or (at your option) any later version.
+ % The latest version of this license is in
+ % http://www.latex-project.org/lppl.txt
+ % and version 1.3 or later is part of all distributions of LaTeX
+ % version 2005/12/01 or later.
+ %
+ % This work has the LPPL maintenance status `maintained'.
+ %
+ % The Current Maintainer of this work is M. Y. Name.
+ %
+ % This work consists of the files pig.dtx and pig.ins
+ % and the derived file pig.sty.
+
+Given such a notice and statement in a file, the conditions
+given in this license document would apply, with the `Work' referring
+to the three files `pig.dtx', `pig.ins', and `pig.sty' (the last being
+generated from `pig.dtx' using `pig.ins'), the `Base Interpreter'
+referring to any `LaTeX-Format', and both `Copyright Holder' and
+`Current Maintainer' referring to the person `M. Y. Name'.
+
+If you do not want the Maintenance section of LPPL to apply to your
+Work, change `maintained' above into `author-maintained'.
+However, we recommend that you use `maintained', as the Maintenance
+section was added in order to ensure that your Work remains useful to
+the community even when you can no longer maintain and support it
+yourself.
+
+Derived Works That Are Not Replacements
+---------------------------------------
+
+Several clauses of the LPPL specify means to provide reliability and
+stability for the user community. They therefore concern themselves
+with the case that a Derived Work is intended to be used as a
+(compatible or incompatible) replacement of the original Work. If
+this is not the case (e.g., if a few lines of code are reused for a
+completely different task), then clauses 6b and 6d shall not apply.
+
+
+Important Recommendations
+-------------------------
+
+ Defining What Constitutes the Work
+
+ The LPPL requires that distributions of the Work contain all the
+ files of the Work. It is therefore important that you provide a
+ way for the licensee to determine which files constitute the Work.
+ This could, for example, be achieved by explicitly listing all the
+ files of the Work near the copyright notice of each file or by
+ using a line such as:
+
+ % This work consists of all files listed in manifest.txt.
+
+ in that place. In the absence of an unequivocal list it might be
+ impossible for the licensee to determine what is considered by you
+ to comprise the Work and, in such a case, the licensee would be
+ entitled to make reasonable conjectures as to which files comprise
+ the Work.
+
diff --git a/macros/xetex/latex/exam-zh/README.md b/macros/xetex/latex/exam-zh/README.md
new file mode 100644
index 0000000000..d3bd71fab2
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/README.md
@@ -0,0 +1,261 @@
+# exam-zh: LaTeX template for Chinese exam
+
+Provides a class exam-zh.cls and its several module packages like exam-zh-question.sty and exam-zh-choices.sty, where these module packages can be used individually.
+
+Although there are several excellent exam packages or classes uploaded before like exam and bhcexam , they don't fit the chinese style very well or they cannot be customized easily for chinese exam of all types like exams in primary school, junior high school, senior high school and even college. Those are the main reason why exam-zh was created.
+
+In exam-zh, you can
+
+- seperate the format and the content very well;
+- use choices environment to typeset choice items easily and automatically;
+- design the sealline easily;
+- use it in Windows, macOS and Linux;
+- ... (for more that you can do with it, please read the manual(in Chinese): `exam-zh-doc.pdf`
+
+
+Repository: https://gitee.com/zepinglee/exam-zh
+Author: Zeping Lee
+Maintainer: Kangwei Xia, Lijun Guo
+Issues and pull requests are welcome: [issues]( https://gitee.com/zepinglee/exam-zh/issues) and [pulls](https://gitee.com/zepinglee/exam-zh/pulls)
+
+# exam-zh:中国试卷 LaTeX 模板
+
+- 项目主页:<https://gitee.com/zepinglee/exam-zh>
+- 作者:Zeping Lee
+- 维护者:Kangwei Xia, Lijun Guo
+- 授权:[LaTeX Project Public License 1.3c](https://www.latex-project.org/lppl.txt)
+
+
+本项目提供了一个中国高考试卷样式的 LaTeX 模板,旨在帮助中小学教师更方便地使用 LaTeX。模板具有以下特性:
+
+1. 样式与内容尽可能分离;
+2. 选择题选项可以自动排版成合适的列数;
+3. 通过用户接口可以方便更改密封线样式;
+4. 在 Windows, macOS 和 Linux 跨平台编译。
+
+使用前请仔细阅读 [发行版](https://gitee.com/zepinglee/exam-zh/releases) 的用户手册 `exam-zh-doc.pdf`。
+
+## 示例(simple example)
+
+```latex
+\section{选择题:本题共 8 小题,每小题 5 分,共 40 分。}
+
+\begin{question}
+ 设集合 $A = \{x \mid -1 < x < 4\}$,$B = \{2, 3, 4, 5\}$,则 $A \cap B = $ \paren
+ \begin{choices}
+ \item $\{2\}$
+ \item $\{2, 3\}$
+ \item $\{3, 4\}$
+ \item $\{2, 3, 4\}$
+ \end{choices}
+\end{question}
+
+\section{填空题:本题共 4 小题,每小题 5 分,共 20 分。}
+
+\begin{question}
+ 已知函数 $f(x) = x^3 (a \cdot 2^x - 2^{-x})$ 是偶函数,则 $a = $ \fillin 。
+\end{question}
+
+\section{解答题:本题共 6 小题,共 70 分。解答应写出文字说明、证明过程或者演算步骤。}
+
+\begin{problem}[points = 12]
+ 已知函数 $f(x) = x (1 - \ln x)$。讨论 $f(x)$ 的单调性。
+ 设 $a$,$b$ 为两个不相等的正数,且 $b \ln a - a \ln b = a - b$,
+ 证明:$2 < \frac{1}{a} + \frac{1}{b} < \eu$。
+\end{problem}
+```
+
+
+## 使用方法
+
+下面简要叙述 `exam-zh` 的使用方法,**更多使用细节请阅读手册 `exam-zh-doc.pdf`。**
+### 西文和数学字体
+
+模板中可以设置西文和数学的字体。
+
+```tex
+\examsetup{
+ font = times,
+ math-font = xits,
+}
+```
+
+西文字体 `font` 有以下选项:
+- `newcm`(默认)New Computer Modern
+- `lm` Latin Modern
+- `times` Times New Roman
+- `termes` TeX Gyre Termes
+- `stix` STIX Two
+- `xits` XITS
+- `libertinus` Libertinus
+
+数学字体 `math-font` 有以下选项:
+- `newcm`(默认)New Computer Modern Math
+- `lm` Latin Modern Math
+- `termes` TeX Gyre Termes Math
+- `stix` STIX Two Math
+- `xits` XITS Math
+- `libertinus` Libertinus Math
+- `cambria` Cambria Math
+
+注意数学字体使用了 `unicode-math` 宏包进行配置。
+
+
+### 题目环境 `question` 和 `problem`
+
+选择题和填空题使用 `question` 环境,解答题使用 `problem` 环境。两者的内容对齐方式不同。
+
+`question` 和 `problem` 环境还接受一个可选参数,其中可以使用以下 key—value 进行设置。
+- `answer-color` 答案的颜色(默认:`black`)。
+- `index` 题号。
+- `points` 题目的分数(默认:`0`)。
+- `show-paren` 是否显示选择题的括号(默认 `false`)。
+- `show-points` 是否显示题目的分数(默认 `auto`:选择题和填空题默认 `false`,解答题默认 `true`)。
+- `show-answer` 是否显示答案(默认:`false`)。
+- `top-sep` 题目上方垂直方向的空白距离(默认:`.5em plus .5em minus .2em`)。
+- `bottom-sep` 题目下方垂直方向的空白距离,与 `top-sep` 不叠加(默认:`.5em plus .5em minus .2em`)。
+
+其中 `index`、`show-points`、`show-answer`、`top-sep` 和 `bottom-sep` 可以使用 `\examsetup` 命令的 `choices` 层级进行全局设置。比如设置同一层级的多个选项:
+```latex
+\examsetup{
+ choices = {
+ show-points = true,
+ show-answer = true,
+ },
+}
+```
+也可以用斜线“/”表示层级并设置单项。
+```latex
+\examsetup{
+ question/show-points = true,
+ question/show-answer = true,
+}
+```
+
+
+### 选择题的括号 `\paren` 和填空 `\fillin`
+
+`\paren` 和 `\fillin` 命令分别生成选择题的括号和填空题的横线。这两个命令还分别接受一个可选参数作为题目的答案,如 `\paren[B]` 或 `\fillin[foo]`。当 `show-answer = true` 时则将答案显示在其中。
+
+需要注意的是,如果 `\fillin` 的参数中含有不配对的中括号时会报错,如 `\fillin[$(−\infty, 1]$]`。这时需要使用大括号将内容保护起来:`\fillin[{$(−\infty, 1]$}]`。
+
+`\fillin` 提供了样式的切换(目前就是下划线和括号两种):
+```latex
+\examsetup{
+ fillin = {
+ type = paren % 括号风格
+ % type = line % 下划线风格
+ }
+}
+```
+也可以局部更改单个 `\fillin` 的样式:`\fill[type = paren][foo]`(有答案)或`\fill[type = paren][]`(无答案)
+
+
+### 选项环境 `choices`
+
+选择题的选项使用 `choices` 环境排版,可以自动根据内容的长度选择合适的列数并对齐。该环境的设计主要参考了 @xkwxdyy 的 [choices-l3](https://gitee.com/xkwxdyy/choices-l3) 和 [xchoices](https://gitee.com/xkwxdyy/xchoices) 项目。
+```latex
+\begin{choices}[label-pos = top-left]
+ \item $\{2\}$
+ \item $\{2, 3\}$
+ \item $\{3, 4\}$
+ \item $\{2, 3, 4\}$
+\end{choices}
+```
+其中的可选参数使用 key–value 的方式进行设置,除了 `label-pos` 外还包括以下选项。
+- `index` 第一个选项标签的计数器的数字值(默认为 `1`)。
+- `column-sep` 选项列之间的最小间隔(默认 `1em`)。
+- `columns` 强制按照该列数排版选项,如果为 0 则自动选择合适的列数(默认 `0`)。
+- `label-align`(可选:`left`, `center`, `right`;默认 `right`)标签内容的对齐方式。
+- `label` 标签的格式,类似 `enumitem` 可以在 `\Roman` 等命令后加 `*` 生成数字(默认 `\Alph*.`)。
+- `label-pos` 标签相对于选项内容的位置;`auto` 表示自动选择:如果内容高度超过两行时(通常是图片)标签位于左居中 `left`,否则位于左上角跟首行文字对齐(`top-left`)(可选:`auto`, `top-left`, `left`, `bottom`;默认 `auto`)。
+- `label-align` 标签内部的对齐方式。(可选:`left`, `center`, `right`;默认 `right`)
+- `label-sep` 标签与选项之间的距离(默认 `0.5em`)。
+- `label-width` 标签的宽度;如果宽度不足会自动调整为最长标签的宽度(默认 `0pt`)。
+- `max-columns` 选项的最大列数;排版选项时会优先尝试该列数,如果无法排下内容,依次将列数除以 2 并取整再进行尝试,直到可以排下全部选项(默认 `4`)。
+
+这些选项可以使用 `\examsetup` 命令的 `choices` 层级进行全局设置,类似 `question`。
+
+`exam-zh-choices` 模块还提供了 `\circlednumber` 命令调用中文字体生成带圈数字,该命令既可以接受 LaTeX2e 计数器的名字(如 `section`)作为参数,也可以接受数值表达式,比如 `\circlednumber{7}`,但仅限 0~50 的整数。而且有的字体可能没有提供 10 以上的字形,建议只对 10 以内的值使用。
+
+如果用户需要使用其他形式的数字作为 `choices` 的标签,需要使用 `\AddChoicesCounter` 命令将其添加进 `label` 选项的识别范围内(类似 `enumitem` 的 `\AddEnumerateCounter`)。它的格式是 `\AddChoicesCounter{⟨LaTeX command⟩}{⟨internal command⟩}{⟨widest label⟩}`,其中 `⟨LaTeX command⟩` 是在 `label` 选项中的形式,`⟨internal command⟩` 是内部的实现,`⟨widest label⟩` 是最宽的标签。比如带圈数字的添加方法:`\AddChoicesCounter{\circlednumber}{\__examzh_choices_circled_number:n}{1}`。
+
+
+### 解答环境 `solution` 和分数命令 `\score`
+
+```latex
+\begin{solution}
+ 函数的定义域为 $(0, +\infty)$,
+ 又 \[f^{\prime}(x) = 1 - \ln x-1 = -\ln x, \score{2}\]
+ 当 $x \in(0, 1)$ 时, $f^{\prime}(x) > 0$, 当 $x \in(1, +\infty)$ 时, $f^{\prime}(x) < 0$,
+ 故 $f(x)$ 的递增区间为 $(0,1)$, 递减区间为 $(1, +\infty)$.
+\end{solution}
+```
+用于解答题的解答环境,以及 `\score` 命令输出给分点,具体使用和相关键值请阅读手册。
+
+### 正体的数学常数
+
+按照国标,数学常数应使用正体。模板中提供了命令 `\eu` 和 `\iu` 分别表示自然对数的底“e”和虚数单位“i”。`\eu` 可以理解为 “e upright” 的缩写或者 “Euler's number” 的首字母,`\iu` 可以理解为 “i upright” 或 “imaginary unit” 的缩写,这样更方便记忆。圆周率“π”直接使用 `\uppi` 命令。
+
+
+### 密封线
+
+```latex
+ \examsetup{
+ sealline = {
+ show = true,
+ % scope = firstpage,
+ % scope = oddpage,
+ scope = everypage,
+ line-thickness = 1pt,
+ line-xshift = 8mm,
+ line-yshift = 0mm,
+ line-type = densely-dashed,
+ text = 密封线内不得答题,
+ text-xshift = 11mm,
+ text-yshift = 30mm,
+ circle-show = true,
+ circle-start = 0.07,
+ circle-end = 0.92,
+ circle-step = 3.5em,
+ circle-diameter = 3mm,
+ circle-xshift = 8mm,
+ odd-info-content = {
+ {\kaishu 姓名}:{\underline{\hspace*{8em}}},
+ {\kaishu 准考证号}:{\underline{\hspace*{8em}}},
+ {\kaishu 考场号}:{\underline{\hspace*{8em}}},
+ {\kaishu 座位号}:{\underline{\hspace*{8em}}},
+ },
+ odd-info-seperator = \hspace*{3em},
+ odd-info-align = center,
+ odd-info-xshift = 20mm,
+ odd-info-yshift = 0mm
+ }
+ }
+```
+
+具体密封线参数含义从参数名称基本可以知道,具体的可以看手册 `exam-zh-doc.pdf`。
+
+## 反馈
+
+欢迎反馈项目的问题或者改进建议。推荐使用发 issue 的形式,并且附上相关的代码和截图。
+
+
+
+## 使用授权
+
+本项目以 LaTeX Project Public License v1.3 协议发布。
+
+
+
+
+## 相关项目
+
+- Philip Hirschhorn, `exam`: <https://www.ctan.org/pkg/exam>
+- 鲍宏昌 `BHCexam`: <https://github.com/mathedu4all/bhcexam>
+- 吕荐瑞 `jnuexam`: <https://www.ctan.org/pkg/jnuexam>
+- @htharoldht `USTBExam`: <https://github.com/htharoldht/USTBExam>
+- 唐绍东 `GEEexam`: <https://github.com/shaodongtang/gaokao_exam>
+- 唐绍东 `CMC`: <https://github.com/shaodongtang/CMC>
+- @sd44 `DANexam`: <https://github.com/sd44/DANexam>
+- 胡振震 `simplexam`: <https://github.com/hushidong/simplexam>
diff --git a/macros/xetex/latex/exam-zh/doc/back/about-author.tex b/macros/xetex/latex/exam-zh/doc/back/about-author.tex
new file mode 100644
index 0000000000..0c37bb676c
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/doc/back/about-author.tex
@@ -0,0 +1,9 @@
+% !TeX root = ../exam-zh-doc.tex
+
+\section{关于模版作者和维护者}
+
+\href{https://github.com/zepinglee}{zepinglee} 开发了模版前期的大框架和主要功能(\file{exam-zh-choices.sty}、\file{exam-zh-question.sty}、\file{exam-zh-font.sty} 等)。
+
+\href{https://github.com/xkwxdyy}{xkwxdyy} 和 \href{https://github.com/ljguo1020}{ljguo} 为模版的后期维护者。
+
+非常感谢 \href{https://github.com/syvshc}{syvshc} 在开发中提供的帮助! \ No newline at end of file
diff --git a/macros/xetex/latex/exam-zh/doc/back/development.tex b/macros/xetex/latex/exam-zh/doc/back/development.tex
new file mode 100644
index 0000000000..a2ae5b6737
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/doc/back/development.tex
@@ -0,0 +1,14 @@
+% !TeX root = ../exam-zh-doc.tex
+
+\section{参与开发}
+
+\begin{itemize}
+ \item 如果您有任何改进意见或者功能需求,欢迎前往 \href{https://gitee.com/zepinglee/exam-zh/issues}{gitee 仓库 issues} 提交 issue
+ \item 欢迎 \cmd{fork} 本项目,提 \cmd{pr} 的形式参与开发
+ \item 建议阅读 \href{https://zhuanlan.zhihu.com/typography-and-latex/}{muzimuzhi} 写的 \href{https://gitee.com/ustctug/ustcthesis/wiki/%E5%8F%82%E4%B8%8E%E5%BC%80%E5%8F%91}{参与开发}
+ \item 参考阅读
+ \begin{itemize}
+ \item \href{https://www.zhihu.com/question/27017364/answer/34932199}{知乎:开发一个 LaTeX 宏包需要多少知识?}
+ \item \href{https://zhuanlan.zhihu.com/p/19669122}{The TeXbook 导读:从那头(多图杀猫的)狮子说起}
+ \end{itemize}
+\end{itemize} \ No newline at end of file
diff --git a/macros/xetex/latex/exam-zh/doc/back/main-changelog.tex b/macros/xetex/latex/exam-zh/doc/back/main-changelog.tex
new file mode 100644
index 0000000000..381bbf0b13
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/doc/back/main-changelog.tex
@@ -0,0 +1,10 @@
+% !TeX root = ../exam-zh-doc.tex
+
+\section{主要更新}
+
+\begin{itemize}
+ \item 2022.2 开发基本框架和主要功能(题干、选择题)
+ \item 2022.4 开发字体模块
+ \item 2022.6 开发密封线、草稿纸、评分框
+ \item 2022.7 增加语文英语题型
+\end{itemize} \ No newline at end of file
diff --git a/macros/xetex/latex/exam-zh/doc/back/package.tex b/macros/xetex/latex/exam-zh/doc/back/package.tex
new file mode 100644
index 0000000000..e4373420b6
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/doc/back/package.tex
@@ -0,0 +1,25 @@
+% !TeX root = ../exam-zh-doc.tex
+
+\section{宏包依赖情况}
+
+\begin{itemize}
+ \item \pkg{expl3}:提供 \LaTeX3 环境
+ \item \pkg{xparse}:自定义命令环境
+ \item \pkg{filehook}:给宏包打补丁
+ \item \cls{ctexbook}:\cls{exam-zh} 基于的文档类
+ \item \pkg{etoolbox}:补丁
+ \item \pkg{geometry}:页面设置
+ \item \pkg{fontspec}:字体设置
+ \item \pkg{xeCJK}、\pkg{xeCJKfntef}:中文相关
+ \item \pkg{fancyhdr}:页眉页脚
+ \item \pkg{lastpage}:总页数
+ \item \pkg{amsmath}、\pkg{unicode-math}:数学类宏包
+ \item \pkg{amsthm}:提供 \tn{qed} 相关
+ \item \pkg{enumitem}:列表
+ \item \pkg{tikz}、\pkg{tikzpagenodes}: \TikZ
+ \item \pkg{hyperref}:超链接
+ \item \pkg{zref-savepos}:记录。用于 \tn{score} 命令
+ \item \pkg{ulem}:下划线
+ \item \pkg{tcolorbox}:彩框
+ \item \pkg{varwidth}:“弹性”的 \env{minipage}
+\end{itemize} \ No newline at end of file
diff --git a/macros/xetex/latex/exam-zh/doc/body/cover.tex b/macros/xetex/latex/exam-zh/doc/body/cover.tex
new file mode 100644
index 0000000000..c04f88a1f2
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/doc/body/cover.tex
@@ -0,0 +1,21 @@
+% !TeX root = ../exam-zh-doc.tex
+
+\begin{abstract}
+ 本项目提供了一个中国高考试卷样式的 \LaTeX 模板,旨在帮助中小学教师更方便地使用 \LaTeX。模板具有以下特性:
+
+ \begin{enumerate}
+ \item 样式与内容尽可能分离;
+ \item 选择题选项可以自动排版成合适的列数;
+ \item 通过用户接口可以方便更改密封线样式;
+ \item 在 Windows, macOS 和 Linux 跨平台编译。
+ \end{enumerate}
+\end{abstract}
+
+
+\begin{tikzpicture}[remember picture, overlay]
+ \node[opacity = 0.1,rotate = 30] at ([shift={(0,0)}]current page text area.center){
+ \includegraphics[width=23cm]{firstpage.pdf}
+ };
+\end{tikzpicture}
+\thispagestyle{plain}
+\clearpage \ No newline at end of file
diff --git a/macros/xetex/latex/exam-zh/doc/body/installation.tex b/macros/xetex/latex/exam-zh/doc/body/installation.tex
new file mode 100644
index 0000000000..dc0ac80014
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/doc/body/installation.tex
@@ -0,0 +1,153 @@
+% !TeX root = ../exam-zh-doc.tex
+
+\section{安装}
+
+\subsection{获取 \cls{exam-zh}}
+
+目前模块还处于开发阶段,用户目前以「下载发行版」的方式获取最新版本的 \cls{exam-zh}:
+
+\begin{enumerate}
+ \item 进入项目主页(\href{https://gitee.com/zepinglee/exam-zh}{gitee 项目主页} (界面见图~\ref{figure:gitee项目主页} )
+ \item 在右侧一列有“发行版”(gitee),并且有一个标签图标并有“vx.x.x - 20xx-xx-xx”字样,表示最新的发行版版本和发布时间,点击即可查看相关信息(如果想查看历史所有发行版信息,可以点击“发行版”右侧的“全部”(gitee))。
+
+ 发行版中一般由以下信息构成(\href{https://gitee.com/zepinglee/exam-zh/releases}{gitee 发行版} 界面见图~\ref{figure:gitee发行版})
+ \begin{itemize}
+ \item 更新文件的特别说明。如果没有,则表明此次更新只需要更新 \file{exam-zh.cls} 文件至最新\footnote{“更新 \meta{文件} 至最新”目前表示在发行版中下载最新版本的模板,并用其中所需要更新的 \meta{文件} 去替换本地的旧 \meta{文件}} 即可
+ \item 更新日志。 主要为此次发行版与上次发行版的不同,一般为“Added”、“Changed”、“Fixed”等信息
+ \item 模版及用户手册下载链接(“下载”部分)。一般用户只需要点击 \file{exam-zh-vx.x.x.zip} 进行模版下载即可,而下面的 \file{Source code} 为项目的整个源码,包括手册的源码,测试文件等,如果感兴趣的用户可以下载进行查看(当然,如果会使用 \cmd{git} 的用户也可以将整个 \cls{exam-zh} 项目 \cmd{clone} 下来查看)
+ \end{itemize}
+ \item 点击 \file{exam-zh-vx.x.x.zip} 进行下载,在本地解压即可
+\end{enumerate}
+
+
+\begin{figure}[htbp]
+ \centering
+ \includegraphics[width = \textwidth]{gitee-main.png}
+ \caption{gitee 项目主页}
+ \label{figure:gitee项目主页}
+\end{figure}
+
+
+\begin{figure}[htbp]
+ \centering
+ \includegraphics[width = \textwidth]{gitee-release.png}
+ \caption{gitee 发行版}
+ \label{figure:gitee发行版}
+\end{figure}
+
+% % \subsubsection{标准安装}
+
+% % 如果没有特殊理由,始终建议您使用宏包管理器安装 \cls{exam-zh}。
+% % 例如在 \TeXLive{} 中,执行(可能需要管理员权限)
+% % \begin{shellexample}[morekeywords={tlmgr,install}]
+% % tlmgr install exam-zh
+% % \end{shellexample}
+% % 即可完成安装。
+
+% % 在 \TeXLive{} 和 \MiKTeX{} 中,您还可以通过图形界面进行安装,
+% % 此处不再赘述。
+
+% % \subsubsection{手动安装}
+
+% % 如果您需要从 CTAN 上自行下载并手动安装,较好的方法是使用 TDS
+% % 安装包:
+% % \begin{itemize}
+% % \item 从 CTAN 上下载 \cls{exam-zh} 的
+% % \href{http://mirror.ctan.org/install/macros/latex/contrib/exam-zh.tds.zip}{TDS 安装包};
+% % \item 按目录结构将 \file{exam-zh.tds.zip} 中的文件复制到 \TeX{}
+% % 发行版的本地 TDS 根目录;
+% % \item 执行 \bashcmd{mktexlsr} 刷新文件名数据库以完成安装。
+% % \end{itemize}
+% % %
+% % 您也可以从源代码直接生成模板(不推荐):
+% % \begin{itemize}
+% % \item 打开 \href{https://gitee.com/stone-zeng/exam-zh}{项目主页},
+% % 点击“Code”按钮,并选择“Download ZIP”,下载 \file{exam-zh-main.zip};
+% % 如果您的电脑中安装有 git 程序,也可通过以下命令直接克隆代码仓库:
+% % \begin{shellexample}[gobble=6,alsoletter={.},morekeywords={git,clone}]
+% % git clone https://gitee.com/stone-zeng/exam-zh.git
+% % \end{shellexample}
+% % \item 解压并进入到 \file{source} 文件夹,执行以下命令以生成
+% % 模板的各组件:
+% % \begin{shellexample}[gobble=6,morekeywords={xetex}]
+% % xetex exam-zh.dtx
+% % \end{shellexample}
+% % \item 将生成的文档类(\file{.cls})、宏包(\file{.sty})以及
+% % 参数配置文件(\file{.def})复制到 \TeX{} 发行版本地 TDS 树
+% % 的 \path{texmf-local/tex/latex/exam-zh/} 目录下,并执行
+% % \bashcmd{mktexlsr} 刷新文件名数据库,方可完成安装。
+% % \item 使用 \cls{exam-zh} 撰写论文时,您还需要从代码仓库下的
+% % \file{testfiles/support} 目录中复制 \file{fudan-name.pdf}
+% % 文件至工作目录,以确保封面中的校名图片可以正确显示。
+% % \end{itemize}
+
+% % \subsubsection{扁平化安装}
+
+% % 如果您不希望安装本模板,但需要立刻使用,也可以使用模板提供的安装脚本。
+% % 从 gitee 上获取代码仓库后,执行 \file{install-win.bat}(Windows 系统)
+% % 或 \file{install-linux.sh}(Linux 系统),所有需要的文件便会在
+% % \file{thesis} 文件夹中生成。
+
+
+\subsection{模板组成}
+
+本模板主要包含核心文档类、参考文献格式文件以及用户文档等几个部分,
+其具体组成见表~\ref{tab:exam-zh-main-components}。
+
+\begin{table}[htbp]
+ \caption{\cls{exam-zh} 的主要组成部分}
+ \label{tab:exam-zh-main-components}
+ \centering
+ \small
+ \begin{tblr}{
+ hline{1, 2, Z} = {1pt},
+ width = \textwidth,
+ colspec = {X[3,l]X[5.5,l]},
+ rows = {m}
+ }
+ \textbf{文件} & \textbf{功能说明} \\
+ \file{exam-zh-doc.pdf} & 用户手册(本文档) \\
+ \file{example-single.tex}、\file{example-multiple.tex} & 模板的主文件(同时也是示例文件),可据此为基础完成试卷编写 \\
+ \file{exam-zh.cls} & 模板文档类 \\
+ \file{exam-zh-choices.sty} & 模版的选择题模块宏包\\
+ \file{exam-zh-question.sty} & 模版的题干模块宏包\\
+ \file{exam-zh-font.sty} & 模版的字体模块宏包\\
+ \file{exam-zh-symbols.sty} & 模版的符号模块宏包\\
+ \file{exam-zh-chinese-english.sty} & 模版的语文英语模块宏包\\
+ \file{README.md} & 简要自述 \\
+ \file{CHANGELOG.md} & 模板更新日志 \\
+ \file{LICENSE} & 模版发布许可证
+ \end{tblr}
+\end{table}
+
+% \begin{table}[htbp]
+% \caption{\cls{exam-zh} 各目录的组成部分}
+% \label{tab:exam-zh-sub-components}
+% \centering
+% \small
+% \begin{tblr}{
+% hline{4,5,8,11,13} = {solid},
+% hline{1, 2, Z} = {1pt},
+% width = \textwidth,
+% colspec = {X[1,l]X[3,l]X[3,l]},
+% rows = {m},
+% cell{2}{1} = {r=2}{m},
+% cell{5}{1} = {r=3}{m},
+% cell{8}{1} = {r=3}{m},
+% cell{11}{1} = {r=2}{m},
+% }
+% \textbf{子目录} & \textbf{子目录中的文件} & \textbf{功能说明} \\
+% front & \file{abstract.tex} & 中英文摘要 \\
+% front & \file{notation.tex} & 符号表 \\
+% body & \file{chapter<number>.tex} & 正文的分文件 \\
+% back & \file{acknowledgements.tex} & 致谢 \\
+% back & \file{appendix.tex} & 附录 \\
+% back & \file{publications.tex} & 攻读学位期间取得的研究成果(博士)\\
+% logo & \file{ccnulogo.png} & “华中师范大学”字样 logo \\
+% logo & \file{masterlogo.png} & 硕士学位论文页眉 logo \\
+% logo & \file{doctorlogo.png} & 博士学位论文页眉 logo \\
+% copyright & \file{Originality_Copyright.pdf} & 本科学位论文原创性声明和使用授权说明 \\
+% copyright & \file{Originality_Copyright_master_doctor.pdf} & 硕博学位论文原创性声明和使用授权说明\\
+% figures & & 用户放置图片的目录\\
+% \end{tblr}
+% \end{table} \ No newline at end of file
diff --git a/macros/xetex/latex/exam-zh/doc/body/introduction.tex b/macros/xetex/latex/exam-zh/doc/body/introduction.tex
new file mode 100644
index 0000000000..e072c02f8b
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/doc/body/introduction.tex
@@ -0,0 +1,21 @@
+% !TeX root = ../exam-zh-doc.tex
+
+\section{介绍}
+
+试卷排版是中小学教师经常遇到的需求,目前在网上可以找到的试卷排版相关文类或宏包有:
+\begin{itemize}
+ \item Philip Hirschhorn:\href{https://www.ctan.org/pkg/exam}{exam}
+ \item 吕荐瑞:\href{https://www.ctan.org/pkg/jnuexam}{jnuexam}
+ \item 胡振震:\href{https://github.com/hushidong/simplexam}{simplexam}
+ \item 鲍宏昌:\href{https://github.com/mathedu4all/bhcexam}{BHCexam}
+ \item htharoldht:\href{https://github.com/htharoldht/USTBExam}{USTBExam}
+ \item 唐绍东:\href{https://github.com/shaodongtang/gaokao_exam}{GEEexam}
+ \item 唐绍东:\href{https://github.com/shaodongtang/CMC}{CMC}
+ \item sd44:\href{https://github.com/sd44/DANexam}{DANexam}
+\end{itemize}
+
+但是大部分没有经过系统设计以及后续进一步的维护,\href{https://www.ctan.org/pkg/exam}{exam} 大部分设置与国内习惯不同,调试配置起来增加用户的使用成本 \href{https://www.ctan.org/pkg/jnuexam}{jnuexam}、\href{https://github.com/shaodongtang/CMC}{CMC} 是比较“定制化”的,也无法顺利地进行迁移使用。
+
+但是上述前人所做的工作值得参考,比如 \cls{exam-zh} 的 A4 和 A3 页面切换就参考了 \href{https://www.ctan.org/pkg/jnuexam}{jnuexam} 项目。
+
+本模板将借鉴前辈经验,重新设计,并使用 \LaTeX3 编写,以适应 \TeX 技术发展潮流; 同时还将构建一套简洁的接口,方便用户使用。 \ No newline at end of file
diff --git a/macros/xetex/latex/exam-zh/doc/body/usage.tex b/macros/xetex/latex/exam-zh/doc/body/usage.tex
new file mode 100644
index 0000000000..264d618e53
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/doc/body/usage.tex
@@ -0,0 +1,2578 @@
+% !TeX root = ../exam-zh-doc.tex
+
+\section{使用说明}
+
+\subsection{基本用法}
+
+以下是一份简单的 \TeX{} 文档,它演示了 \cls{exam-zh} 的最基本用法:
+
+\begin{latexcode}[deletetexcs={\documentclass},
+ moretexcs={\chapter},morekeywords={\documentclass},
+ emph={[2]document}]
+ % main.tex
+ \documentclass{exam-zh}
+ \begin{document}
+ \section{Welcome to exam-zh!}
+ 你好,\LaTeX{}!
+ \end{document}
+\end{latexcode}
+
+
+按照~\ref{subsec:编译方式} 小节中的方式编译,您应当得到一篇 1 页的文档。
+
+
+\subsection{编译方式} \label{subsec:编译方式}
+
+本模板不支持 \pdfTeX{} 引擎,仅支持使用 \XeLaTeX{} 。为了生成正确的目录、脚注以及交叉引用,您至少需要连续编译两次。
+
+以下代码中,假设您的 \TeX{} 源文件名为 \file{example.tex}。请在命令行中执行
+\begin{shellcode}[morekeywords={xelatex}]
+ xelatex example
+\end{shellcode}
+
+
+\subsection{模板选项}
+
+所谓“模板选项”,指需要在引入文档类的时候指定的选项:
+\begin{latexcode}[deletetexcs={\documentclass},
+ morekeywords={\documentclass}]
+ \documentclass(*\oarg{模板选项}*){exam-zh}
+\end{latexcode}
+
+有些模板选项为布尔型,它们只能在 \opt{true} 和 \opt{false}
+中取值。对于这些选项,\kvopt{\meta{选项}}{true} 中的“|= true|”
+可以省略。
+
+\cls{exam-zh} 的模版选项接口与 \cls{ctexart} 相同,具体可 \cmd{texdoc ctex} 查阅 \pkg{ctex} 宏包文档。
+
+
+\subsection{命令和环境介绍}
+
+\subsubsection{正体的数学常数}
+
+\begin{function}{\eu}
+ 正体的自然对数的底“e”。
+\end{function}
+
+\begin{function}{\iu}
+ 正体的虚数单位“i”。
+\end{function}
+
+\tn{eu} 可以理解为 “e upright” 的缩写或者 “Euler's number” 的首字母,\tn{iu} 可以理解为 “i upright” 或 “imaginary unit” 的缩写,这样更方便记忆。
+
+\begin{latexexample}{\tn{eu} 和 \tn{iu} 的效果}
+ $\eu \quad \iu$
+\end{latexexample}
+
+
+\subsubsection{优化的命令环境}
+
+\cls{exam-zh} 对一些命令环境进行了优化,方便用户使用。
+
+\begin{function}{\vec}
+ \begin{ccnusyntax}[emph={[1]vec}]
+ \vec(*\marg{content}*)
+ \end{ccnusyntax}
+ 向量命令。当只有一个字符的时候默认加粗斜体,两个及两个以上字符则加箭头。
+\end{function}
+
+\begin{latexexample}{\tn{vec} 示例}
+ $\vec{a} \quad \vec{AB}$
+\end{latexexample}
+
+
+\subsubsection{中国化数学符号}
+
+中国的初高中教材中一些数学符号和 \LaTeX{} 默认的或者是 \pkg{amsmath} 等宏包提供的符号有差异,于是 \cls{exam-zh} 用 \TikZ 重新绘制了部分符号。
+
+\begin{function}{\parallelogram}
+ 平行四边形。$\parallelogram$
+\end{function}
+
+\begin{function}{\parallel,\nparallel}
+ 平行和不平行。$\parallel \, \nparallel$
+\end{function}
+
+\begin{function}{\paralleleq}
+ 平行且相等。$\paralleleq$
+ \examsetup{symbols/paralleleq-type = perpendicular}
+ \, $\paralleleq$。由~\ref{subsubsec:参数-中国化数学符号} 节的键值可以控制倾斜和垂直两个不同类型。
+\end{function}
+
+\begin{function}{\subset,\subset*}
+ 包含于(无横线)。|*| 表示不重定义。|\subset|: $\subset$, |\subset*|: $\subset*$
+\end{function}
+
+\begin{function}{\nsubset,\nsubset*}
+ 不包含于(无横线)。|*| 表示不重定义。|\nsubset|: $\nsubset$, |\nsubset*|: $\nsubset*$
+\end{function}
+
+\begin{function}{\subseteq,\subseteq*}
+ 包含于(有横线)。|*| 表示不重定义。|\subseteq|: $\subseteq$, |\subseteq*|: $\subseteq*$
+\end{function}
+
+\begin{function}{\nsubseteq,\nsubseteq*}
+ 不包含于(有横线)。|*| 表示不重定义。|\nsubseteq|: $\nsubseteq$, |\nsubseteq*|: $\nsubseteq*$
+\end{function}
+
+\begin{function}{\subsetneqq,\subsetneqq*}
+ 真子集。|*| 表示不重定义。|\subsetneqq|: $\subsetneqq$, |\subsetneqq*|: $\subsetneqq*$
+\end{function}
+
+\begin{function}{\nsubsetneqq}
+ 真子集的否定。|\nsubsetneqq|: $\nsubsetneqq$
+\end{function}
+
+\begin{function}{\supset,\supset*}
+ 反向包含于(无横线)。|*| 表示不重定义。|\supset|: $\supset$, |\supset*|: $\supset*$
+\end{function}
+
+\begin{function}{\nsupset,\nsupset*}
+ 反向不包含于(无横线)。|*| 表示不重定义。|\nsupset|: $\nsupset$, |\nsupset*|: $\nsupset*$
+\end{function}
+
+\begin{function}{\supseteq,\supseteq*}
+ 反向包含于(有横线)。|*| 表示不重定义。|\supseteq|: $\supseteq$, |\supseteq*|: $\supseteq*$
+\end{function}
+
+\begin{function}{\nsupseteq,\nsupseteq*}
+ 反向不包含于(有横线)。|*| 表示不重定义。|\nsupseteq|: $\nsupseteq$, |\nsupseteq*|: $\nsupseteq*$
+\end{function}
+
+\begin{function}{\supsetneqq,\supsetneqq*}
+ 反向真子集。|*| 表示不重定义。|\supsetneqq|: $\supsetneqq$, |\supsetneqq*|: $\supsetneqq*$
+\end{function}
+
+\begin{function}{\nsupsetneqq}
+ 反向真子集的否定。|\nsupsetneqq|: $\nsupsetneqq$
+\end{function}
+
+\begin{function}{\cap,\cap*}
+ 交集。|*| 表示不重定义。|\cap|: $\cap$, |\cap*|: $\cap*$。
+\end{function}
+
+\begin{function}{\cup,\cup*}
+ 并集。|*| 表示不重定义。|\cup|: $\cup$, |\cup*|: $\cup*$。
+\end{function}
+
+
+\begin{function}{\sim,\sim*}
+ 相似。|*| 表示不重定义。|\sim|: $\sim$, |\sim*|: $\sim*$。
+\end{function}
+
+
+\begin{function}{\nsim}
+ 不相似。|\nsim|: $\nsim$
+\end{function}
+
+\begin{function}{\cong,\cong*}
+ 全等。|*| 表示不重定义。|\cong|: $\cong$, |\cong*|: $\cong*$。
+\end{function}
+
+
+\begin{function}{\ncong}
+ 不全等。|\ncong|: $\ncong$
+\end{function}
+
+% \begin{function}{}
+
+% \end{function}
+
+% \begin{function}{}
+
+% \end{function}
+
+% \begin{function}{}
+% \begin{ccnusyntax}[emph={[1]}]
+
+% \end{ccnusyntax}
+% \end{function}
+
+
+% \subsubsection{中文字体}
+
+% 在语文试卷中可能需要不同的字体,比如楷体等,在 \cls{exam-zh} 中,不使用 \tn{kaiti} 等命令(一般会有报错),推荐使用 \tn{itshape} 等命令:
+% \begin{latexexample}{不同字体命令效果}
+% 测试 {\normalfont 测试}
+
+% 加粗 {\bfseries 测试}
+
+% 黑体 {\sffamily 测试}
+
+% 楷体 {\itshape 测试}
+% \end{latexexample}
+
+
+\subsubsection{抬头} \label{subsubsec:抬头}
+
+\begin{function}[added = 2022-07-03]{\information}
+ \begin{ccnusyntax}[emph={[1]information}]
+ \information(*\oarg{分隔符}*)
+ \end{ccnusyntax}
+ 水平的学生信息输入命令。\opt{分隔符} 默认为 |\quad|。使用示例:
+ \begin{latexcode}[gobble=4]
+ \information{
+ 姓名\underline{\hspace{6em}},
+ 座位号\underline{\hspace{15em}}
+ }
+ \end{latexcode}
+\end{function}
+
+\begin{function}[added = 2022-07-03]{\warning}
+ \begin{ccnusyntax}[emph={[1]warning}]
+ \warning(*\marg{警告}*)
+ \end{ccnusyntax}
+ 警告命令。居中、黑体。使用示例:
+ \begin{latexcode}[gobble=4]
+ \warning{(在此卷上答题无效)}
+ \end{latexcode}
+\end{function}
+
+\begin{function}[updated = 2022-07-03]{\secret}
+ \begin{ccnusyntax}[emph={[1]secret}]
+ \secret(*\oarg{格式命令}*)
+ \end{ccnusyntax}
+ “绝密 $\bigstar$ 启用前”。格式命令默认为 |\bfseries|。
+\end{function}
+
+\begin{function}[updated = 2022-07-03]{\goodluck}
+ \begin{ccnusyntax}[emph={[1]goodluck}]
+ \goodluck(*\oarg{祝福语}*)
+ \end{ccnusyntax}
+ 祝福语命令。祝福语默认为 |祝考试顺利|。
+\end{function}
+
+\begin{function}[updated = 2022-07-26]{notice 环境}
+ \begin{ccnusyntax}[emph={[2]notice}]
+ \begin{notice}(*\oarg{键值列表 1}\oarg{键值列表 2}*)
+ \item ...
+ \item ...
+ \end{notice}
+ \end{ccnusyntax}
+ 注意事项环境,是 \env{enumerate} 环境的包装,\meta{键值列表 2} 是传递给 \env{enumerate} 环境的可选参数。\meta{键值列表 1} 如下。
+\end{function}
+
+\begin{function}[added = 2022-07-26]{notice/label}
+ \begin{ccnusyntax}[emph={[1]label}]
+ label = (*\meta{label}*)
+ \end{ccnusyntax}
+ \env{notice} 环境的 \meta{label} 内容。默认为 |注意事项:|。
+\end{function}
+
+\begin{function}[added = 2022-07-26]{notice/label-format}
+ \begin{ccnusyntax}[emph={[1]label-format}]
+ label-format = (*\meta{format}*)
+ \end{ccnusyntax}
+ \env{notice} 环境的 \meta{label} 格式。默认为 |\sffamily \bfseries|。
+\end{function}
+
+\begin{function}[added = 2022-07-26]{notice/top-sep,notice/bottom-sep}
+ \begin{ccnusyntax}[emph={[1]top-sep,bottom-sep}]
+ top-sep = (*\meta{skip}*)
+ bottom-sep = (*\meta{skip}*)
+ \end{ccnusyntax}
+ \env{notice} 环境的上下方的弹性间距。默认均为 |.25em plus .25em minus .1em|。
+\end{function}
+
+
+\begin{function}{\title}
+ \begin{ccnusyntax}[emph={[1]title}]
+ \title(*\marg{标题}*)
+ \end{ccnusyntax}
+ 标题。在 \tn{maketitle} 前使用。参数控制见~\ref{subsubsec:参数-抬头} 节。
+\end{function}
+
+\begin{function}[updated = 2022-07-24]{\subject}
+ \begin{ccnusyntax}[emph={[1]subject}]
+ \subject(*\oarg{宽度}\marg{科目}*)
+ \end{ccnusyntax}
+ 科目。在 \tn{maketitle} 前使用。可以为空或不写。\meta{科目} 内容在 \meta{宽度} 盒子内均匀分散。\meta{宽度} 默认为 \meta{科目} 宽度。参数控制见~\ref{subsubsec:参数-抬头} 节。
+\end{function}
+
+\begin{function}{\maketitle}
+ \begin{ccnusyntax}[emph={[1]maketitle}]
+ \maketitle
+ \end{ccnusyntax}
+ 生成标题和科目。
+\end{function}
+
+
+\subsubsection{题干} \label{subsubsec:命令环境-题干}
+
+\begin{function}{question 环境}
+ \begin{ccnusyntax}[emph={[2]question}]
+ \begin{question}(*\oarg{键值列表}*)
+ <题干>
+ \end{question}
+ \end{ccnusyntax}
+ 选择题和填空题题干环境。
+\end{function}
+
+\begin{function}{problem 环境}
+ \begin{ccnusyntax}[emph={[2]problem}]
+ \begin{problem}(*\oarg{键值列表}*)
+ <题干>
+ \end{problem}
+ \end{ccnusyntax}
+ 解答题题干环境。
+\end{function}
+
+\cls{question} 和 \cls{problem} 环境的区别仅在于若 \kvopt{show-points}{true} (下面会介绍这个键值),则 \cls{question} 的题干会紧接在分数后而 \cls{problem} 的题干会在分数后新起一段后开始。
+
+\ExplSyntaxOn
+\keys_set:nn { exam-zh / question }
+ {
+ show-points = true
+ }
+\ExplSyntaxOff
+\begin{latexexample}{\cls{question} 和 \cls{problem} 环境的区别}
+ % \examsetup{
+ % question/show-points = true
+ % }
+ \begin{question}[points = 1]
+ 题干测试
+ \end{question}
+ \begin{problem}[points = 2]
+ 题干测试
+ \end{problem}
+\end{latexexample}
+
+
+\ExplSyntaxOn
+\keys_set:nn { exam-zh / question }
+ {
+ show-points = auto,
+ index = 0,
+ }
+\keys_set:nn { exam-zh / paren }
+ {
+ show-paren = true
+ }
+\ExplSyntaxOff
+\begin{function}{\paren}
+ \begin{ccnusyntax}[emph={[2]\paren}]
+ \paren(*\oarg{答案}*)
+ \end{ccnusyntax}
+ 括号。\meta{答案} 可以受下面介绍的 \cmd{show-answer} 键值控制隐藏。会自动到行末尾,若单行内容较长会自动到下一行末尾
+\end{function}
+
+
+\begin{latexexample}{\tn{paren} 的换行效果}
+ % \examsetup{
+ % paren/show-paren = true
+ % }
+ \begin{question}
+ 短题干选项 \paren
+ \end{question}
+ \begin{question}
+ 长长长长长长长长长长长长长长长长长长长长长长长长长长长题干选项 \paren
+ \end{question}
+\end{latexexample}
+
+
+\begin{function}[added = 2022-07-20]{\AddQuestionCounter}
+ \begin{ccnusyntax}[emph={[2]\AddQuestionCounter}]
+ \AddQuestionCounter(*\marg{LaTeX command}*)(*\marg{internal command}*)
+ \end{ccnusyntax}
+ 如果用户需要使用其它形式的数字作为 \env{question} 环境和 \env{problem} 的标签,需要使用 \tn{AddQuestionCounter} 命令将其添加进 \opt{label} 选项的识别范围内(类似 \pkg{enumitem} 宏包的 \tn{AddEnumerateCounter} )。其中 \meta{LaTeX command} 是在 \opt{label} 选项中的形式,\meta{internal command} 是内部的实现,\meta{widest label} 是最宽的标签。比如带圈数字的添加方法:
+ \begin{latexcode}[gobble=4]
+ \AddQuestionCounter{\circlednumber}{\__examzh_question_circled_number:n}
+ \end{latexcode}
+\end{function}
+
+
+
+\subsubsection{选择题} \label{subsubsec:命令环境-选择题}
+
+\begin{function}{choices 环境}
+ \begin{ccnusyntax}[emph={[2]choices}]
+ \begin{choices}(*\oarg{键值列表}*)
+ \item (*\meta{选项1}*)
+ \item (*\meta{选项2}*)
+ ...
+ \end{choices}
+ \end{ccnusyntax}
+ 选择题选项排版环境。\meta{键值列表} 见~\ref{subsubsec:参数-选择题}。
+\end{function}
+
+\begin{function}{\setchoices}
+ \begin{ccnusyntax}[emph={[2]\setchoices}]
+ \setchoices(*\marg{键值列表}*)
+ \end{ccnusyntax}
+ \env{choices} 环境的参数设置。和
+ \begin{latexcode}[gobble=4]
+ \examsetup{
+ choices = {
+ ...
+ }
+ }
+ \end{latexcode}
+ 效果相同。开发此命令原因是 \file{exam-zh-choices.sty} 是独立的模块,可以独立于 \cls{exam-zh} 外使用。
+\end{function}
+
+\begin{function}{\AddChoicesCounter}
+ \begin{ccnusyntax}[emph={[2]\AddChoicesCounter}]
+ \AddChoicesCounter(*\marg{LaTeX command}*)(*\marg{internal command}*)
+ \end{ccnusyntax}
+ 如果用户需要使用其它形式的数字作为 \env{choices} 环境的标签,需要使用 \tn{AddChoicesCounter} 命令将其添加进 \opt{label} 选项的识别范围内(类似 \pkg{enumitem} 宏包的 \tn{AddEnumerateCounter} )。其中 \meta{LaTeX command} 是在 \opt{label} 选项中的形式,\meta{internal command} 是内部的实现,\meta{widest label} 是最宽的标签。比如带圈数字的添加方法:
+ \begin{latexcode}[gobble=4]
+ \AddChoicesCounter{\circlednumber}{\__examzh_choices_circled_number:n}
+ \end{latexcode}
+\end{function}
+
+
+\begin{latexexample}{\tn{AddChoicesCounter} 使用示例}
+ \ExplSyntaxOn
+ \cs_new:Npn \test_counter:n #1
+ {
+ \int_set:Nn \l_tmpa_int { \int_eval:n { #1 + 1 } }
+ \int_use:N \l_tmpa_int
+ }
+ \AddChoicesCounter \test \test_counter:n
+ \ExplSyntaxOff
+ \begin{choices}[label = \test*]
+ \item 1
+ \item 2
+ \end{choices}
+\end{latexexample}
+
+
+\begin{function}[updated = 2022-07-21]{\circlednumber,\circlednumber*}
+ \begin{ccnusyntax}[emph={[2]\circlednumber,\circlednumber*}]
+ \circlednumber(*\meta{数字或计数器名字}*)
+ \circlednumber*(*\meta{数字或计数器名字}*)
+ \end{ccnusyntax}
+ 带圈数字命令。不带星号的基于字体开发,带星号的基于 \TikZ 开发。|\circlednumber| 仅接受 0~50 的输入值,而 |\circlednumber*| 无限制。
+ \begin{latexexample}{\tn{circlednumber} 的使用示例}
+ \circlednumber{1} \circlednumber{2}
+ \circlednumber*{1} \circlednumber*{2}
+ \circlednumber{page} \circlednumber{section}
+ \end{latexexample}
+\end{function}
+
+
+\subsubsection{填空题}
+
+\begin{function}[updated = 2022-07-27]{\fillin}
+ \begin{ccnusyntax}[emph={[2]\fillin}]
+ \fillin(*\oarg{键值列表}*)(*\oarg{答案}*)
+ \fillin*(*\oarg{键值列表}*)(*\oarg{答案}*)
+ \end{ccnusyntax}
+ 填空(下划线或括号)。\meta{答案} 可以受~\ref{subsubsec:参数-题干} 节的 \cmd{question/show-answer} 键值控制隐藏。\meta{键值列表} 见~\ref{subsubsec:参数-填空题} 节。\tn{fillin} 不可换行,但是会自动根据内容深度提升基线(比如排版分数不会“压线”);\tn{fillin*} 可以自动换行但是没有前者的功能,且 \tn{fillin*} 的换行功能只适用于 \kvopt{fillin/type}{line}、\kvopt{fillin/type}{paren} 和 \kvopt{fillin/type}{blank}。
+\end{function}
+
+注意,\tn{fillin} 命令经过处理,|\fillin[<1>]| 表示 |\fillin[<答案>]|(而不是通常定义两个可选参数命令,若只写一个的时候默认为第一个参数),而如果仅仅改变 \tn{fillin} 的类型(见下)而不输入答案,则需要使用 |\fillin[type=paren][]|。这样设计是考虑到:大部分时候都是无答案和输入答案两种情况,而单独改某一个 \tn{fillin} 的类型的情况很少,一般都是一些题目统一改,这个时候在需要修改的 \tn{fillin} 之前使用
+ \begin{latexcode}[gobble=4]
+ \examsetup{
+ fillin/type = paren
+ }
+ \end{latexcode}
+ 更改即可。如果后续需要换回来,则只需要使用
+ \begin{latexcode}[gobble=4]
+ \examsetup{
+ fillin/type = line
+ }
+ \end{latexcode}
+ 即可。
+
+需要注意的是,如果 \tn{fillin} 的参数重含有不配对的中括号时会报错,如 |\fillin[$(−\infty, 1]$]|。这时需要使用大括号将内容保护起来:|\fillin[{$(−\infty, 1]$}]|。
+
+
+\begin{function}[added = 2022-07-21]{\AddFillinCounter}
+ \begin{ccnusyntax}[emph={[1]\AddFillinCounter}]
+ \AddFillinCounter(*\marg{LaTeX command}*)(*\marg{internal command}*)
+ \end{ccnusyntax}
+ 如果用户需要使用其它形式的数字作为 \kvopt{fillin/no-answer-type}{counter} 下 \opt{counter} 的标签,需要使用 \tn{AddFillinCounter} 命令将其添加进 \opt{label} 选项的识别范围内(类似 \pkg{enumitem} 宏包的 \tn{AddEnumerateCounter} )。其中 \meta{LaTeX command} 是在 \opt{label} 选项中的形式,\meta{internal command} 是内部的实现,\meta{widest label} 是最宽的标签。比如带圈数字的添加方法:
+ \begin{latexcode}[gobble=4]
+ \AddFillinCounter{\circlednumber}{\__examzh_fillin_circled_number:n}
+ \end{latexcode}
+\end{function}
+
+
+\subsubsection{判断题}
+
+作为 \tn{paren} 和 \tn{fillin} 命令的应用可以实现判断题效果:
+\begingroup
+\examsetup{
+ question/index=0
+}
+\begin{latexexample}{\tn{paren} 和 \tn{fillin} 命令的应用:判断题}
+ \examsetup{
+ question/show-answer = true,
+ fillin/type = paren,
+ paren/show-paren = true
+ }
+ \newcommand{\true}{$\surd$}
+ \newcommand{\false}{$\times$}
+
+ \begin{question}
+ $1 + 1 = 2$ \paren[对]
+ \end{question}
+
+ \begin{question}
+ $1 + 1 = 3$ \fillin[错]
+ \end{question}
+
+ \begin{question}
+ $1 + 1 = 2$ \paren[\true]
+ \end{question}
+
+ \begin{question}
+ $1 + 1 = 3$ \fillin[\false]
+ \end{question}
+\end{latexexample}
+\endgroup
+
+由于使用“对错”还是“叉勾”因人而异,所以本模版没有固定,但结合上面的例子为用户提供一种“自定义”思路(基于 \tn{fillin} 为例):
+\ExplSyntaxOn
+\cs_undefine:N \true
+\cs_undefine:N \false
+\ExplSyntaxOff
+\examsetup{
+ question/index = 0
+}
+\begingroup
+\begin{latexexample}{填空题的自定义示例}
+\examsetup{
+ question/show-answer = true,
+ fillin/type = paren,
+ paren/show-paren = true
+}
+
+\newcommand{\true}{\fillin[$\surd$]}
+\newcommand{\false}{\fillin[$\times$]}
+
+\begin{question}
+ $1 + 1 = 2$ \true
+\end{question}
+
+\begin{question}
+ $1 + 1 = 3$ \false
+\end{question}
+\end{latexexample}
+\endgroup
+
+
+\subsubsection{解答题}
+
+\begin{function}[added = 2022-07-01, updated = 2022-07-19]{solution 环境}
+ \begin{ccnusyntax}[emph={[2]solution}]
+ \begin{solution}(*\oarg{键值列表}*)
+ ...
+ \end{solution}
+ \end{ccnusyntax}
+ 解答题解答环境。\meta{键值列表} 见~\ref{subsubsec:参数-解答题} 节。
+\end{function}
+
+
+下面所有和 \env{solution} 有关的示例都默认加载了
+\begin{latexcode}
+ \examsetup{solution/show-solution = true}
+\end{latexcode}
+
+\examsetup{
+ solution/show-solution=true
+}
+
+
+\begin{latexexample}{\env{solution} 环境示例}
+ \begin{solution}
+ 测试
+ \end{solution}
+\end{latexexample}
+
+\begin{function}[added = 2022-07-01]{\score}
+ \begin{ccnusyntax}[emph={[1]score}]
+ \score(*\marg{分数}*)
+ \end{ccnusyntax}
+ \env{solution} 环境中得分点的得分命令。若在行间公式使用,则需要编译两次产生虚线。
+\end{function}
+
+\begin{latexexample}{\tn{score} 命令示例}
+ \begin{solution}
+ 函数的定义域为 $(0, +\infty)$,
+ 又 \[f^{\prime}(x) = 1 - \ln x-1 = -\ln x, \score{2}\]
+ 当 $x \in(0, 1)$ 时, $f^{\prime}(x) > 0$, 当 $x \in(1, +\infty)$ 时, $f^{\prime}(x) < 0$.
+
+ 故 $f(x)$ 的递增区间为 $(0,1)$, \score{1} 递减区间为 $(1, +\infty)$. \score{1}
+ \end{solution}
+\end{latexexample}
+
+
+\subsubsection{几个列表环境}
+
+\begin{function}[added = 2022-07-04]{step 环境}
+ \begin{ccnusyntax}[emph={[2]step}]
+ \begin{step}
+ \item ...
+ \item ...
+ \end{step}
+ \end{ccnusyntax}
+ “步骤”列表环境。
+\end{function}
+
+\begin{function}[added = 2022-07-04]{method 环境}
+ \begin{ccnusyntax}[emph={[2]method}]
+ \begin{method}
+ \item ...
+ \item ...
+ \end{method}
+ \end{ccnusyntax}
+ “方法”列表环境。
+\end{function}
+
+\begin{function}[added = 2022-07-04]{case 环境}
+ \begin{ccnusyntax}[emph={[2]case}]
+ \begin{case}
+ \item ...
+ \item ...
+ \end{case}
+ \end{ccnusyntax}
+ “情形”列表环境。
+\end{function}
+
+上述三个列表环境的参数控制见~\ref{subsubsec:参数-列表环境}
+
+
+
+\subsubsection{草稿纸}
+
+\begin{function}[added = 2022-07-03]{\draftpaper}
+ \begin{ccnusyntax}[emph={[1]draftpaper}]
+ \draftpaper(*\oarg{参数列表}*)
+ \end{ccnusyntax}
+ 草稿纸命令。使用一次产生一页的草稿纸。参数列表见~\ref{subsubsec:参数-草稿纸}
+\end{function}
+
+
+\subsubsection{方格}
+
+在密封线或者 \tn{information} 命令所输出的个人信息中,可能会需要输出方格(如 2021 年数学高考原卷),于是开发了下面的 \tn{examsquare} 命令。
+
+\begin{function}[added = 2022-07-04]{\examsquare}
+ \begin{ccnusyntax}[emph={[1]examsquare}]
+ \examsquare(*\oarg{参数列表}\marg{方格个数}*)
+ \end{ccnusyntax}
+ 方格命令。参数列表见~\ref{subsubsec:参数-方格}
+\end{function}
+
+\subsubsection{评分框}
+
+\begin{function}[added = 2022-07-04]{\scoringbox,\scoringbox*}
+ \begin{ccnusyntax}[emph={[1]scoringbox}]
+ \scoringbox
+ \scoringbox*
+ \end{ccnusyntax}
+ 评分框命令。可单独使用。相关键值见~\ref{subsubsec:参数-评分框}
+\end{function}
+
+\begin{latexexample}{评分框示例}
+ \scoringbox \quad \scoringbox*
+\end{latexexample}
+
+
+\subsubsection{试卷合集}
+
+\cls{exam-zh} 不仅可以排版单份的试卷,也可以通过 \tn{chapter} 排版多份试卷,构成试卷合集。一般排版多份试卷会用到下面的命令:
+
+\begin{function}{\tableofcontents}
+ 目录
+\end{function}
+
+\begin{function}{\chapter}
+ 用于排一份的试卷标题。并可以用 \opt{page/show-chapter} 键值控制显示与否。
+\end{function}
+
+其余的见~\ref{subsubsec:抬头} 节。
+
+
+\subsubsection{选择标记题型}
+
+% 本节主要介绍 \file{exam-zh-chinese.sty} 模块中的命令环境的使用。要注意的是,此模块中大部分命令环境设计灵感和原因一般来自于语文学科,但是具体使用起来一般不限制于语文学科。
+
+\begin{function}[added = 2022-07-19,updated = 2022-07-23]{select 环境}
+ \begin{ccnusyntax}[emph={[2]select}]
+ \begin{select}(*\oarg{键值列表}*)
+ \sitem (*\meta{未标记的选项}*)
+ \sitem (*\meta{未标记的选项}*)
+ \sitem* (*\meta{标记的选项}*)
+ ...
+ \end{select}
+ \end{ccnusyntax}
+ 选择标记环境。\meta{键值列表} 见~\ref{subsubsec:参数-选择标记题型} 节。
+\end{function}
+
+\begin{latexexample}{\env{select} 环境的基本使用}
+ 折
+ \begin{select}
+ \sitem \pinyin{zhe2}
+ \sitem* \pinyin{she2}
+ \end{select}
+ 本
+
+ \begin{select}
+ \sitem* 疏
+ \sitem 蔬
+ \sitem 输
+ \end{select}
+ 远
+\end{latexexample}
+
+
+\subsubsection{连线题型}
+
+\begin{function}[added = 2022-07-19]{lineto 环境,\linelistset,\lineconnect}
+ \begin{ccnusyntax}[emph={[2]lineto,linelistset,lineconnect}]
+ \begin{lineto}(*\oarg{键值列表}*)
+ \linelistset(*\oarg{键值列表}\marg{list}*)
+ \linelistset(*\oarg{键值列表}\marg{list}*)
+ ...
+ \lineconnect(*\oarg{键值列表}\marg{list}*)
+ \lineconnect(*\oarg{键值列表}\marg{list}*)
+ ...
+ \end{lineto}
+ \end{ccnusyntax}
+ \env{lineto} 环境为连线环境,一个 \tn{linelistset} 命令设置一组内容,\tn{lineconnect} 连线。(\meta{list} 之间是西文逗号)
+ \begin{itemize}
+ \item \env{lineto} 环境: \meta{键值列表} 接口为 \env{tikzpicture} 环境的可选参数接口;
+ \item \tn{linelistset} 命令: \meta{键值列表} 见~\ref{subsubsec:参数-连线题型} 节;
+ \item \tn{lineconnect} 命令: \meta{键值列表} 接口为 \TikZ 的 \tn{draw} 命令的可选参数接口;\meta{list} 的格式为 |<name1>-<item num1>, <name2>-<item num2>, ...|,比如 |i-1, ii-3, iii-2| 等等(|<name>| 的含义见~\ref{subsubsec:参数-连线题型} 的 \opt{linto/name}),连接顺序为(以 |\lineconnect{i-1,ii-2,iii-3,iv-4}|为例):
+ \begin{itemize}
+ \item |i-1| 项的右侧与 |ii-2| 的左侧相连;
+ \item |ii-2| 项的右侧与 |iii-3| 的左侧相连;
+ \item |iii-3| 项的右侧与 |iv-4| 的左侧相连。
+ \end{itemize}
+ 若 \tn{lineconnect} 的 \meta{list} 的内容变多也是同理。
+ \end{itemize}
+\end{function}
+
+示例见~\ref{subsubsec:参数-连线题型}。
+
+
+
+\subsubsection{语文-材料文章}
+
+
+\begin{function}[added = 2022-07-24]{material 环境}
+ \begin{ccnusyntax}[emph={[2]material}]
+ \begin{material}(*\oarg{键值列表}*)
+ <content>
+ \end{material}
+ \end{ccnusyntax}
+ 语文的材料/文章环境。\oarg{键值列表} 见~\ref{subsubsec:参数-语文} 节。
+\end{function}
+
+\begin{latexexample}{\env{material} 环境示例}
+ \begin{material}[title = \LaTeX{} 入门, author = 夏大鱼羊, format = {\sffamily \zihao{-4}},source={(摘自《夏大鱼羊自传》) \\ 2022年}]
+ 劳仑衣普桑,认至将指点效则机,最你更枝。想板整月正进好志次回总般,段然取向使张规军证回,世市总李率英茄持伴。用阶千样响领交出,器程办管据家元写,名其直金团。
+ \end{material}
+\end{latexexample}
+
+
+\subsubsection{语文-古诗}
+
+
+\begin{function}[added = 2022-07-24,updated = 2022-07-26]{poem 环境}
+ \begin{ccnusyntax}[emph={[2]poem}]
+ \begin{poem}(*\oarg{键值列表}*)
+ <content>
+ \end{poem}
+ \end{ccnusyntax}
+ 语文古诗环境。整体居中。\meta{content} 内置于 \env{tabular} 环境,所以建议用 |\\| 分行,且每行距离不能过长。\meta{键值列表} 见~\ref{subsubsec:参数-语文} 节。
+\end{function}
+
+
+\begin{function}[added = 2022-07-24]{\zhu}
+ \begin{ccnusyntax}[emph={[2]zhu}]
+ \zhu(*\meta{注释}*)
+ \end{ccnusyntax}
+ 语文古诗环境的注释命令,只能在 \env{poem} 环境中使用。
+\end{function}
+
+\examsetup{
+ poem/format = \itshape
+}
+\begin{latexexample}{\env{poem} 环境示例}
+ \begin{poem}[author = 杨巨源, title = {寄江州白司马\zhu{江州白司马:即白居易。}}]
+ 江州司马平安否? 惠远东林住得无 \zhu{惠远:东晋高僧,居庐山东林寺。}? \\
+ 湓浦曾闻似衣带,庐峰见说胜香炉。\\
+ 题诗岁晏离鸿断,望阙天遥病鹤孤。\\
+ 莫谩拘牵雨花社\zhu{莫谩:不要。雨花社:指佛教讲经的集会。},青云依旧是前途。
+ \end{poem}
+\end{latexexample}
+
+
+\subsubsection{英语-作文框}
+
+\begin{function}[added = 2022-07-26]{writingbox 环境}
+ \begin{ccnusyntax}[emph={[2]writingbox}]
+ \begin{writingbox}(*\oarg{键值列表}*)
+ <content>
+ \end{writingbox}
+ \end{ccnusyntax}
+ 英语作文框环境。\meta{键值列表} 接入 \env{tcolorbox} 环境的可选参数。
+\end{function}
+
+\begin{latexexample}{\env{writingbox} 环境示例}
+ \begin{writingbox}[title = {Youth and me}]
+ \vspace*{4em}
+ \end{writingbox}
+\end{latexexample}
+
+\begin{latexexample}{\env{writingbox} 环境示例}
+ \begin{writingbox}
+ As the twins looked around them in disappointment, their father appeared.
+
+ \vspace*{4em}
+
+ The twins carried the breakfast upstairs and woke their mother up.
+
+ \vspace*{4em}
+ \end{writingbox}
+\end{latexexample}
+
+
+\subsubsection{师生两版} \label{subsubsec:命令环境-师生两版}
+
+\begin{function}[added = 2022-07-21]{\ExamPrintAnswerSet}
+ \begin{ccnusyntax}[emph={[1]ExamPrintAnswerSet}]
+ \ExamPrintAnswerSet(*\oarg{cmd list}\marg{key-val list}*)
+ \end{ccnusyntax}
+ 设置用户对于师生两版的第二个版本 PDF 的导言区设置(可以自由选择第二个版本的键值设置,自由度高)。其中 \meta{cmd list} 和 \meta{key-val list} 的内容均用西文逗号分隔。\emph{注意第二个版本的设置是本 \file{.tex} 文件的设置基础之后加上 \tn{ExamPrintAnswerSet} 生成的,所以键值的使用要注意。(比如本 \file{.tex} 文件中设置了 \kvopt{fillin/show-answer}{true},如果 \tn{ExamPrintAnswerSet} 不写 \kvopt{fillin/show-answer}{false} 的话,则还是按照 \kvopt{fillin/show-answer}{true} 的设置编译的)}
+ \begin{itemize}
+ \item \meta{key-val list}:list 的项为 |foo/bar| 形式,为本手册中介绍的键值,会通过 \tn{ExamPrintAnswer} 传递给 \tn{examsetup} 命令;
+ \item \meta{cmd list}:list 的项为一般的命令
+ \end{itemize}
+\end{function}
+
+示例如下:
+\begin{latexcode}
+ \ExamPrintAnswerSet[
+ \geometry{showframe}
+ ]{
+ page/size=a3paper,
+ solution/show-solution=true,
+ paren/show-paren=true,
+ paren/show-answer=true
+ }
+\end{latexcode}
+
+
+\begin{function}[added = 2022-07-21]{\ExamPrintAnswer}
+ \begin{ccnusyntax}[emph={[1]ExamPrintAnswer}]
+ \ExamPrintAnswer
+ \end{ccnusyntax}
+ 用于“生效” \tn{ExamPrintAnswerSet} 中的设置。可以在导言区使用,但是一般不需要用户单独使用(因为集成在师生两版的代码实现中)。
+\end{function}
+
+如何实现师生两版?在使用 \tn{ExamPrintAnswerSet} 设置完后,只需要通过编译方式的不同即可实现:
+\begin{itemize}
+ \item 正常编译
+\begin{shellcode}
+ xelatex <jobname>
+\end{shellcode}
+ \item 师生两版
+\begin{shellcode}
+ xelatex -shell-escape <jobname>
+\end{shellcode}
+
+\end{itemize}
+
+关于师生两版的键值设置见~\ref{subsubsec:参数-师生两版} 节。
+
+
+
+\subsection{参数设置}
+
+\begin{function}{\examsetup}
+ \begin{ccnusyntax}[morekeywords={\examsetup}]
+ \examsetup(*\marg{键值列表}*)
+ \end{ccnusyntax}
+ 本模板提供了一系列选项,可由您自行配置。载入文档类之后,以下所有选项均可通过统一的命令 \cs{examsetup} 来设置。
+\end{function}
+
+\cs{examsetup} 的参数是一组由(英文)逗号隔开的选项列表,列表中的
+选项通常是 \kvopt{\meta{key}}{\meta{value}} 的形式。部分选项的
+\meta{value} 可以省略。对于同一项,后面的设置将会覆盖前面的设置。
+在下文的说明中,将用\textbf{粗体}表示默认值。
+
+\cs{examsetup} 采用 \LaTeX3 风格的键值设置,支持不同类型以及多种
+层次的选项设定。键值列表中,“|=|”左右的空格不影响设置;但需注意,
+参数列表中\emph{不可以出现空行}。
+
+与模板选项相同,布尔型的参数可以省略 \kvopt{\meta{选项}}{true}
+中的“\kvopt{}{true}”。
+
+另有一些选项包含子选项,如 \opt{page} 和 \opt{choices} 等。它们可以
+按如下两种等价方式来设定:
+
+\begin{latexcode}[morekeywords={\examsetup},
+ emph={[1]page,size,choices,column-sep,label-pos,label-sep,max-columns}]
+ \examsetup{
+ page = {
+ size = a3paper
+ },
+ choices = {
+ column-sep = 1em,
+ label-pos = auto,
+ label-sep = 0.5em,
+ max-columns = 4
+ }
+ }
+\end{latexcode}
+
+或者
+
+\begin{latexcode}[morekeywords={\examsetup},
+ emph={[1]page,size,choices,column-sep,label-pos,label-sep,max-columns}]
+ \examsetup{
+ page/size = a3paper,
+ choices/column-sep = 1em,
+ choices/label-pos = auto,
+ choices/label-sep = 0.5em,
+ choices/max-columns = 4
+ }
+\end{latexcode}
+
+
+注意 “|/|” 的前后均不可以出现空白字符。
+
+
+\subsubsection{风格设置}
+
+\begin{function}[added = 2022-07-20]{style}
+ \begin{ccnusyntax}[emph={[1]style}]
+ style = (*\marg{键值列表}*)
+ style/(*\meta{key}*) = (*\meta{value}*)
+ \end{ccnusyntax}
+ 该选项包含许多子项目,具体内容见下。
+\end{function}
+
+\begin{function}[added = 2022-07-20]{style/fullwidth-stop}
+ \begin{ccnusyntax}[emph={[1]fullwidth-stop}]
+ fullwidth-stop = (*<(catcode)|false>*)
+ \end{ccnusyntax}
+ 是否将 |。| 映射为 |.|。\opt{catcode} 表示映射;\opt{false} 表示不映射。
+\end{function}
+
+\begin{function}[added = 2022-07-24]{style/footnote-style}
+ % 这里奇怪的东西是用来控制对齐的。ccnusyntax 会吃掉开头的几个空格,因此这里用 X 来占位。
+ \begin{ccnusyntax}[emph={[1]footnote-style}]
+ footnote-style = (*<plain|\\
+ XXXX\mbox{}~~~~~~~~~~~~~~~~~(libertinus)|libertinus*|libertinus-sans|\\
+ XXXX\mbox{}~~~~~~~~~~~~~~~~~pifont|pifont*|pifont-sans|pifont-sans*|\\
+ XXXX\mbox{}~~~~~~~~~~~~~~~~~xits|xits-sans|xits-sans*>*)
+ \end{ccnusyntax}
+ 设置脚注编号样式。西文字体设置会影响其默认取值。因此,要使得该选项生效,需将其放置在 \opt{font} 选项之后。带有 sans 的为相应的无衬线字体版本。带有 * 的为 阴文样式(即黑底白字)。
+\end{function}
+
+
+\subsubsection{师生两版} \label{subsubsec:参数-师生两版}
+
+\begin{function}[added = 2022-07-22]{style/student-version-suffix}
+ \begin{ccnusyntax}[emph={[1]student-version-suffix}]
+ student-version-suffix = (*\meta{suffix}*)
+ \end{ccnusyntax}
+ 师生两版的第二个版本的 PDF 名称的后缀。即第二个 PDF 的名称为 |<jobname><suffix>.pdf|。默认值为 |_student_version|。
+\end{function}
+
+\begin{function}[added = 2022-07-22]{style/student-version-cleanaux}
+ \begin{ccnusyntax}[emph={[1]student-version-cleanaux}]
+ student-version-cleanaux = (*\TTF*)
+ \end{ccnusyntax}
+ 师生两版的编译是否自动清除中途文件。
+\end{function}
+
+
+
+\subsubsection{中国化数学符号} \label{subsubsec:参数-中国化数学符号}
+
+
+\begin{function}{symbols}
+ \begin{ccnusyntax}[emph={[1]symbols}]
+ symbols = (*\marg{键值列表}*)
+ symbols/(*\meta{key}*) = (*\meta{value}*)
+ \end{ccnusyntax}
+ 该选项包含许多子项目,用于设置中国化符号。具体内容见下。
+\end{function}
+
+\begin{function}{symbols/paralleleq-type}
+ \begin{ccnusyntax}[emph={[1]paralleleq-type}]
+ paralleleq-type = (*<(slant)|perpendicular>*)
+ \end{ccnusyntax}
+ \tn{paralleleq} 命令的效果。\opt{slant} 表示上方的线是倾斜的;\opt{perpendicular} 表示上方的线是垂直的。
+\end{function}
+
+\begin{function}[added = 2022-07-17]{symbols/change-frac-style,symbols/change-dfrac-style}
+ \begin{ccnusyntax}[emph={[1]change-frac-style,change-dfrac-style}]
+ change-frac-style = (*<\TFF>*)
+ change-dfrac-style = (*<\TFF>*)
+ \end{ccnusyntax}
+ 是否重定义 \tn{frac} 命令和 \tn{dfrac} 命令。重定义后的 \tn{frac} 或 \tn{dfrac} 的分子分母两边会有额外间距。
+\end{function}
+
+\begin{function}[added = 2022-07-17]{symbols/frac-add,symbols/dfrac-add}
+ \begin{ccnusyntax}[emph={[1]frac-add,dfrac-add}]
+ frac-add = (*\meta{muskip}*)
+ dfrac-add = (*\meta{muskip}*)
+ \end{ccnusyntax}
+ 分别为 \kvopt{symbols/change-frac-style}{true} 和 \kvopt{symbols/change-dfrac-style}{true} 时,\tn{frac} 和 \tn{dfrac} 分子分母左右两边增加的额外间距,左右相同,默认为 |5mu|。
+\end{function}
+
+
+\subsubsection{页面设置}
+
+\begin{function}{page}
+ \begin{ccnusyntax}[emph={[1]page}]
+ page = (*\marg{键值列表}*)
+ page/(*\meta{key}*) = (*\meta{value}*)
+ \end{ccnusyntax}
+ 该选项包含许多子项目,用于设置页面设置。具体内容见下。
+\end{function}
+
+\begin{function}{page/size}
+ \begin{ccnusyntax}[emph={[1]size}]
+ size = (*<a3paper|(a4paper)>*)
+ \end{ccnusyntax}
+ 试卷尺寸。\opt{a4paper} 表示一页为 A4 纸大小;\opt{a3paper} 表示一页为 A3 纸大小,内容为连续两页 A4 拼接。此设置只能放在导言区。
+\end{function}
+
+\begin{function}[updated = 2022-07-24]{page/foot-type}
+ \begin{ccnusyntax}[emph={[1]foot-type}]
+ foot-type = (*<common|(separate)>*)
+ \end{ccnusyntax}
+ \kvopt{page/size}{a3paper} 时页脚的类型。\opt{common} 表示两页 A4 纸(即一页 A3 纸)共用一个页脚;\opt{separate} 表示两页 A4 纸各自有一个页脚。
+\end{function}
+
+\begin{function}[added = 2022-07-04]{page/foot-content}
+ \begin{ccnusyntax}[emph={[1]foot-content}]
+ foot-content = (*\meta{页脚格式}*)
+ \end{ccnusyntax}
+ 页脚内容设置。
+ \begin{itemize}
+ \item 若\meta{页脚格式} 中不含西文分号 |;|,则页脚内容为 \meta{页脚格式} 直接输出;
+ \item 若\meta{页脚格式} 中含一个西文分号 |;|,如 |foo;bar|,则页脚为 |foo<the page>bar|,即西文分号代替了页码的位置;
+ \item 若\meta{页脚格式} 中含两个西文分号 |;|,如 |foo;bar;baz|,则页脚为 |foo<the page>bar<total page>baz|,即第一个西文分号代替了页码的位置,第二个代替了总页码。
+ \end{itemize}
+\end{function}
+
+\begin{function}[added = 2022-07-04]{page/show-columnline}
+ \begin{ccnusyntax}[emph={[1]show-columnline}]
+ show-columnline = (*\TTF*)
+ \end{ccnusyntax}
+ \kvopt{page/size}{a3paper} 时是否显示两页 A4 之间的中间竖线。
+\end{function}
+
+\begin{function}[added = 2022-07-04]{page/columnline-width}
+ \begin{ccnusyntax}[emph={[1]columnline-width}]
+ columnline-width = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ \kvopt{page/show-columnline}{true} 时竖线的宽度。默认为 |0.4pt|。
+\end{function}
+
+
+\begin{function}[added = 2022-07-11]{page/show-chapter}
+ \begin{ccnusyntax}[emph={[1]show-chapter}]
+ show-chapter = (*\TTF*)
+ \end{ccnusyntax}
+ 是否显示 \tn{chapter} 的内容。\kvopt{show-chapter}{true} 表示 \tn{chapter} 的内容会正常出现以及录入目录并可以通过超链接跳转;\kvopt{show-chapter}{false} 表示 \tn{chapter} 的内容不出现但是会被录入目录并可以通过超链接跳转。
+\end{function}
+
+
+\subsubsection{密封线} \label{subsubsec:参数-密封线}
+
+\begin{function}{sealline}
+ \begin{ccnusyntax}[emph={[1]sealline}]
+ sealline = (*\marg{键值列表}*)
+ sealline/(*\meta{key}*) = (*\meta{value}*)
+ \end{ccnusyntax}
+ 该选项包含许多子项目,用于设置密封线。具体内容见下。
+\end{function}
+
+
+\begin{function}{sealline/show}
+ \begin{ccnusyntax}[emph={[1]show}]
+ show = (*\TFF*)
+ \end{ccnusyntax}
+ 是否显示密封线。
+\end{function}
+
+\begin{function}[updated = 2022-07-26]{sealline/scope,sealline/type}
+ \begin{ccnusyntax}[emph={[1]scope,type}]
+ scope = (*<firstpage|oddpage|(everypage)|first-and-last|mod-2|mod-3|mod-4|mod-6>*)
+ type = (*<firstpage|oddpage|(everypage)|first-and-last|mod-2|mod-3|mod-4|mod-6>*)
+ \end{ccnusyntax}
+ 密封线的作用范围。\opt{scope} 和 \opt{type} 同效。\opt{firstpage} 表示仅在第一页有密封线;\opt{oddpage} 表示仅有奇数页有密封线,在页面左侧;\opt{everypage} 表示每页都有密封线,奇数页密封线在页面左侧,偶数页密封线在页面右侧;\opt{first-and-last} 表示只有第一页和最后一页有;\opt{mod-x} 表示满足 $y \mod x \equiv 1$ 的页数 $y$ 中有密封线。
+\end{function}
+
+
+下面介绍密封线的具体细节参数控制。在此之前,先对参数进行说明,若为:
+\begin{latexcode}
+ foo = ...
+ odd-foo = ...
+ even-foo = ...
+\end{latexcode}
+
+则
+\begin{itemize}
+ \item \opt{foo} 表示统一控制奇偶页的密封线参数;
+ \item \opt{odd-foo} 表示控制奇数页的密封线参数;
+ \item \opt{even-foo} 表示控制偶数页的密封线参数。
+\end{itemize}
+
+若仅有
+\begin{latexcode}
+ odd-foo = ...
+\end{latexcode}
+
+则表示该参数仅作用于奇数页的密封线。
+
+关于下面出现的“水平”或“垂直”,不额外说明就默认是正常的参考系,即“左右”为“水平”、“上下”为“垂直”。
+
+
+\begin{function}{sealline/line-thickness,sealline/odd-line-thickness,sealline/even-line-thickness}
+ \begin{ccnusyntax}[emph={[1]line-thickness,odd-line-thickness,even-line-thickness}]
+ line-thickness = (*\meta{dimension}*)
+ odd-line-thickness = (*\meta{dimension}*)
+ even-line-thickness = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ 密封线的线厚度。
+\end{function}
+
+\begin{function}{sealline/line-xshift,sealline/odd-line-xshift,sealline/even-line-xshift}
+ \begin{ccnusyntax}[emph={[1]line-xshift,odd-line-xshift,even-line-xshift}]
+ line-xshift = (*\meta{dimension}*)
+ odd-line-xshift = (*\meta{dimension}*)
+ even-line-xshift = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ 密封线的水平偏移量。默认为 |8mm|。\meta{dimension} 为正值时,奇数页密封线往左偏移,偶数页密封线往右偏移。
+\end{function}
+
+\begin{function}{sealline/line-yshift,sealline/odd-line-yshift,sealline/even-line-yshift}
+ \begin{ccnusyntax}[emph={[1]line-yshift,odd-line-yshift,even-line-yshift}]
+ line-yshift = (*\meta{dimension}*)
+ odd-line-yshift = (*\meta{dimension}*)
+ even-line-yshift = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ 密封线的垂直伸缩量。默认为 |0mm|,奇偶页效果相同。\meta{dimension} 为正值时,密封线上下同时“往内缩 \meta{dimension} 长度”。0mm 的效果是密封线长度为版心高度。
+\end{function}
+
+\begin{function}{sealline/line-type,sealline/odd-line-type,sealline/even-line-type}
+ \begin{ccnusyntax}[emph={[1]line-type,odd-line-type,even-line-type}]
+ line-type = (*\meta{dimension}*)
+ odd-line-type = (*\meta{dimension}*)
+ even-line-type = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ 密封线的类型。参考了 \TikZ 的线类型,主要有以下几种,从名称可以看出几种线的类型和效果,这里就不做解释:
+\end{function}
+\begin{choices}[label = \circlednumber*]
+ \item solid
+ \item dotted
+ \item densely-dotted
+ \item loosely-dotted
+ \item dashed
+ \item densely-dashed
+ \item loosely-dashed
+ \item dash-dot
+ \item densely-dash-dot
+ \item loosely-dash-dot
+ \item dash-dot-dot
+ \item densely-dash-dot-dot
+ \item loosely-dash-dot-dot
+\end{choices}
+
+
+\begin{function}{sealline/text,sealline/odd-text,sealline/even-text}
+ \begin{ccnusyntax}[emph={[1]text,odd-text,even-text}]
+ text = (*\meta{content}*)
+ odd-text = (*\meta{content}*)
+ even-text = (*\meta{content}*)
+ \end{ccnusyntax}
+ 沿着密封线的文字,效果为均匀分散,类似于 \tn{makebox} 的 \cmd{s} 选项。默认值为 |密封线内不得答题|。\meta{content} 中不能有命令,字体设置要通过 \opt{sealline/text-format} 设置。
+\end{function}
+
+\begin{function}[added = 2022-07-24]{sealline/text-width,sealline/odd-text-width,sealline/even-text-width}
+ \begin{ccnusyntax}[emph={[1]text-width,odd-text-width,even-text-width}]
+ text-width = (*\meta{dimension}*)
+ odd-text-width = (*\meta{dimension}*)
+ even-text-width = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ 沿着密封线的文字的宽度(此时以试卷顺时针转 90 度为参考系)。默认值为 |0.8\textheight|。
+\end{function}
+
+
+\begin{function}[added = 2022-07-24]{sealline/text-format,sealline/odd-text-format,sealline/even-text-format}
+ \begin{ccnusyntax}[emph={[1]text-format,odd-text-format,even-text-format}]
+ text-format = (*\meta{font}*)
+ odd-text-format = (*\meta{font}*)
+ even-text-format = (*\meta{font}*)
+ \end{ccnusyntax}
+ 沿着密封线的文字的字体设置。可以是 \tn{zihao} 或颜色或字体设置等。默认为 |\zihao{4}\sffamily|。
+\end{function}
+
+
+\begin{function}{sealline/text-xshift,sealline/odd-text-xshift,sealline/even-text-xshift}
+ \begin{ccnusyntax}[emph={[1]text-xshift,odd-text-xshift,even-text-xshift}]
+ text-xshift = (*\meta{dimension}*)
+ odd-text-xshift = (*\meta{dimension}*)
+ even-text-xshift = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ 沿着密封线的文字的水平偏移量。默认为 |11mm|。\meta{dimension} 为正值时,奇数页文字往左偏移,偶数页文字往右偏移。
+\end{function}
+
+
+\begin{function}[updated = 2022-07-24]{sealline/text-yshift,sealline/odd-text-yshift,sealline/even-text-yshift}
+ \begin{ccnusyntax}[emph={[1]text-yshift,odd-text-yshift,even-text-yshift}]
+ text-yshift = (*\meta{dimension}*)
+ odd-text-yshift = (*\meta{dimension}*)
+ even-text-yshift = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ 沿着密封线的文字的垂直偏移量。默认为 |0pt|。\meta{dimension} 为正时,奇数页的文字往上移动,而偶数页有两种情况:
+ \begin{itemize}
+ \item \kvopt{sealline/text-direction-vertical}{true} 时,方向和奇数页相同(因为此时文字排版效果奇偶相同);
+ \item \kvopt{sealline/text-direction-vertical}{false} 时,方向和奇数页相反(因为此时文字排版效果奇偶相反);
+ \end{itemize}
+\end{function}
+
+
+\begin{function}[added = 2022-07-24]{sealline/text-xscale,sealline/odd-text-xscale,sealline/even-text-xscale}
+ \begin{ccnusyntax}[emph={[1]text-xscale,odd-text-xscale,even-text-xscale}]
+ text-xscale = (*\meta{float point}*)
+ odd-text-xscale = (*\meta{float point}*)
+ even-text-xscale = (*\meta{float point}*)
+ \end{ccnusyntax}
+ 沿着密封线的文字的水平放缩(以旋转试卷为参考系)。默认为 |1.0|。
+\end{function}
+
+\begin{function}[added = 2022-07-24]{sealline/text-yscale,sealline/odd-text-yscale,sealline/even-text-yscale}
+ \begin{ccnusyntax}[emph={[1]text-yscale,odd-text-yscale,even-text-yscale}]
+ text-yscale = (*\meta{float point}*)
+ odd-text-yscale = (*\meta{float point}*)
+ even-text-yscale = (*\meta{float point}*)
+ \end{ccnusyntax}
+ 沿着密封线的文字的垂直放缩(以旋转试卷为参考系)。默认为 |0.8|。
+\end{function}
+
+\begin{function}[added = 2022-07-24]{sealline/text-direction-vertical,sealline/odd-text-direction-vertical,sealline/even-text-direction-vertical}
+ \begin{ccnusyntax}[emph={[1]text-direction-vertical,odd-text-direction-vertical,even-text-direction-vertical}]
+ text-direction-vertical = (*\TFF*)
+ odd-text-direction-vertical = (*\TFF*)
+ even-text-direction-vertical = (*\TFF*)
+ \end{ccnusyntax}
+ 沿着密封线的文字是否垂直从上往下不旋转显示文字内容。\opt{true} 表示奇偶页均为从上往下显示文字,且文字不旋转;\opt{false} 表示奇数页逆时针转 90 度并从下往上(若以旋转试卷为参考,即为从左往右)显示文字内容,偶数页顺时针转 90 度并从上往下显示文字内容。
+\end{function}
+
+
+\begin{function}{sealline/circle-show,sealline/odd-circle-show,sealline/even-circle-show}
+ \begin{ccnusyntax}[emph={[1]circle-show,odd-circle-show,even-circle-show}]
+ circle-show = (*\TTF*)
+ odd-circle-show = (*\TTF*)
+ even-circle-show = (*\TTF*)
+ \end{ccnusyntax}
+ 密封线上的圆的显示与否。
+\end{function}
+
+\begin{function}{sealline/circle-start,sealline/odd-circle-start,sealline/even-circle-start,sealline/circle-end,sealline/odd-circle-end,sealline/even-circle-end}
+ \begin{ccnusyntax}[emph={[1]circle-start,odd-circle-start,even-circle-start,circle-end,odd-circle-end,even-circle-end}]
+ circle-start = (*\meta{float point}*)
+ odd-circle-start = (*\meta{float point}*)
+ even-circle-start = (*\meta{float point}*)
+ circle-end = (*\meta{float point}*)
+ odd-circle-end = (*\meta{float point}*)
+ even-circle-end = (*\meta{float point}*)
+ \end{ccnusyntax}
+ 密封线上的圈的起始点占线总场的比例,\meta{float point} 的范围为 $[0,1]$。分别默认为 |0.07| 和 |0.92| 。\opt{circle-start} 和 \opt{circle-end} 的值分别表示圆圈的起点和终点在线(以页面垂直的北到南方向为正方向)上的比例。
+\end{function}
+
+\begin{function}{sealline/circle-step,sealline/odd-circle-step,sealline/even-circle-step}
+ \begin{ccnusyntax}[emph={[1]circle-step,odd-circle-step,even-circle-step}]
+ circle-step = (*\meta{dimension}*)
+ odd-circle-step = (*\meta{dimension}*)
+ even-circle-step = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ 密封线上的两个圈之间的距离。默认为 |3.5em|。若倒数第二个圈加上 \opt{circle-step} 的值“超出了密封线的范围”,则最后一个圈并不会显示。
+\end{function}
+
+\begin{function}{sealline/circle-diameter,sealline/odd-circle-diameter,sealline/even-circle-diameter}
+ \begin{ccnusyntax}[emph={[1]circle-diameter,odd-circle-diameter,even-circle-diameter}]
+ circle-diameter = (*\meta{dimension}*)
+ odd-circle-diameter = (*\meta{dimension}*)
+ even-circle-diameter = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ 密封线上的圆的直径。默认为 |3mm|。
+\end{function}
+
+
+\begin{function}{sealline/circle-xshift,sealline/odd-circle-xshift,sealline/even-circle-xshift}
+ \begin{ccnusyntax}[emph={[1]circle-xshift,odd-circle-xshift,even-circle-xshift}]
+ circle-xshift = (*\meta{dimension}*)
+ odd-circle-xshift = (*\meta{dimension}*)
+ even-circle-xshift = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ 密封线上的圆的水平偏移量。默认为 |8mm|。
+\end{function}
+
+\begin{function}{sealline/odd-info-content}
+ \begin{ccnusyntax}[emph={[1]odd-info-content}]
+ odd-info-content = (*\marg{comma list}*)
+ \end{ccnusyntax}
+ 奇数页密封线旁的学生信息。输入内容需要用 |{}| 包起来并用西文逗号隔开。示例(也是默认)如下:
+ \begin{latexcode}[gobble=4]
+ \examsetup{
+ odd-info-content = {
+ {\kaishu 姓名}:{\underline{\hspace*{8em}}},
+ {\kaishu 准考证号}:{\underline{\hspace*{8em}}},
+ {\kaishu 考场号}:{\underline{\hspace*{8em}}},
+ {\kaishu 座位号}:{\underline{\hspace*{8em}}}
+ }
+ }
+ \end{latexcode}
+ 其中需要注意的是:由于接口沿用的是 \TikZ 的 \cmd{decoration} 的 \cmd{text} 接口,所以命令必须要用 |{}| 包起来(具体原因感兴趣的用户可以 \cmd{texdoc tikz} 自行查阅),如所示的 |{\underline{\hspace*{8em}}}|
+\end{function}
+
+
+\begin{function}{sealline/odd-info-separator}
+ \begin{ccnusyntax}[emph={[1]odd-info-separator}]
+ odd-info-separator = (*\meta{separator}*)
+ \end{ccnusyntax}
+ 奇数页密封线旁的学生信息的分隔符。即上方 \cmd{odd-info-content} 几个内容之间的分隔符,默认为 |\hspace*{3em}|,即用 |3em| 的空白分隔。一般为水平空白。
+\end{function}
+
+
+\begin{function}{sealline/odd-info-align}
+ \begin{ccnusyntax}[emph={[1]odd-info-align}]
+ odd-info-align = (*<left|(center)|right>*)
+ \end{ccnusyntax}
+ 奇数页密封线旁的学生信息的对齐方式。将试卷顺时针方向旋转 90 度视角后为参考(即此时密封线为水平线)。
+\end{function}
+
+\begin{function}{sealline/odd-info-xshift}
+ \begin{ccnusyntax}[emph={[1]odd-info-xshift}]
+ odd-info-xshift = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ 奇数页密封线旁的学生信息的水平偏移量。默认值为 |20mm|
+\end{function}
+
+\begin{function}{sealline/odd-info-yshift}
+ \begin{ccnusyntax}[emph={[1]odd-info-yshift}]
+ odd-info-yshift = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ 奇数页密封线旁的学生信息的垂直偏移量。默认值为 |0mm|,此时若 \kvopt{odd-info-align}{left} 则 \cmd{odd-info-content} 的左侧与版心底部对齐。
+\end{function}
+
+
+
+\subsubsection{方格} \label{subsubsec:参数-方格}
+
+\begin{function}{square}
+ \begin{ccnusyntax}[emph={[1]square}]
+ square = (*\marg{键值列表}*)
+ square/(*\meta{key}*) = (*\meta{value}*)
+ \end{ccnusyntax}
+ 该选项包含许多子项目,用于设置方格。具体内容见下。
+\end{function}
+
+\begin{function}[added = 2022-07-04,updated = 2022-07-23]{square/x-length}
+ \begin{ccnusyntax}[emph={[1]x-length}]
+ x-length = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ \tn{examsquare} 命令单位方形的长。默认为 |1.4em|。
+\end{function}
+
+\begin{function}[added = 2022-07-04,updated = 2022-07-23]{square/y-length}
+ \begin{ccnusyntax}[emph={[1]y}]
+ y-length = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ \tn{examsquare} 命令单位方形的宽。默认为 |1.2em|。
+\end{function}
+
+
+\begin{function}[added = 2022-07-04,updated = 2022-07-23]{square/baseline}
+ \begin{ccnusyntax}[emph={[1]baseline}]
+ baseline = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ \tn{examsquare} 命令的基线偏移。默认为 |3pt|。一般长宽有较大的改动的情况才会改此参数。
+\end{function}
+
+\begin{function}[added = 2022-07-04,updated = 2022-07-23]{square/linewidth}
+ \begin{ccnusyntax}[emph={[1]linewidth}]
+ linewidth = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ \tn{examsquare} 命令单位方形的线宽。默认为 |0.4pt|。
+\end{function}
+
+\begin{function}[added = 2022-07-04,updated = 2022-07-23]{square/xshift}
+ \begin{ccnusyntax}[emph={[1]xshift}]
+ xshift = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ \tn{examsquare} 命令必选参数大于 1 时,后面的方格相对于前面的水平偏移。默认和 \opt{linewidth} 的值相同,一般不需要自己修改。
+\end{function}
+
+
+\subsubsection{字体}
+
+
+\begin{function}{font}
+ \begin{ccnusyntax}[emph={[1]font}]
+ font = (*(newcm)|lm|times|termes|stix|xits|libertinus|none*)
+ \end{ccnusyntax}
+ 设置西文字体。具体配置见表~\ref{tab:font}。
+\end{function}
+
+\begin{function}{math-font}
+ \begin{ccnusyntax}[emph={[1]math-font}]
+ math-font = (*(newcm)|lm|termes|stix|xits|libertinus|cambria|none*)
+ \end{ccnusyntax}
+ 设置数学字体。具体配置见表~\ref{tab:math-font}。
+\end{function}
+
+
+\begin{table}[htbp]
+ \centering
+ \begin{threeparttable}
+ \caption{西文字体配置}
+ \label{tab:font}
+ \small
+ \begin{tabular}{ccccc}
+ \toprule
+ & \textbf{正文字体} & \textbf{无衬线字体} & \textbf{等宽字体}\\
+ \midrule
+ |newcm| & NewCM10 & NewCMSans10 & NewCMMono10 \\
+ |lm| & lmroman10 & lmsans10 & lmmonolt10 \\
+ |times| & Times New Roman & Arial & Courier New \\
+ |termes| & texgyretermes & texgyreheros & texgyrecursor \\
+ |stix| & STIXTwoText\tnote{a} & texgyreheros & texgyrecursor \\
+ |xits| & XITS\tnote{b} & texgyreheros & texgyrecursor \\
+ |libertinus| & LibertinusSerif\tnote{c} & LibertinusSans\tnote{d} & lmmonolt10 \\
+ \bottomrule
+ \end{tabular}
+ \begin{tablenotes}
+ \item[a] 或 STIX2Text
+ \item[b] 或 xits
+ \item[c] 或 libertinusserif
+ \item[d] 或 libertinussans
+ \end{tablenotes}
+ \end{threeparttable}
+\end{table}
+
+\begin{table}[htbp]
+ \centering
+ \begin{threeparttable}
+ \caption{数学字体配置}
+ \label{tab:math-font}
+ \small
+ \begin{tabular}{ccccc}
+ \toprule
+ & \textbf{mathfont} & \textbf{mathrm} & \textbf{mathsf} & \textbf{mathtt} \\
+ \midrule
+ |newcm| & NewCMMath-Book & NewCM10 & NewCMSans10 & NewCMMono10 \\
+ |lm| & latinmodern-math & lmroman10 & lmsans10 & lmmonolt10 \\
+ |stix| & STIXTwoMath-Regular\tnote{a} & & & \\
+ |xits| & XITSMath-Regular\tnote{b} & & & \\
+ |libertinus| & LibertinusMath-Regular\tnote{c} & & & \\
+ |cambria| & Cambria Math & & & \\
+ \bottomrule
+ \end{tabular}
+ \begin{tablenotes}
+ \item[a] 或 STIX2Math
+ \item[b] 或 xits-math
+ \item[c] 或 libertinusmath-regular
+ \end{tablenotes}
+ \end{threeparttable}
+\end{table}
+
+
+\subsubsection{抬头} \label{subsubsec:参数-抬头}
+
+\begin{function}{title}
+ \begin{ccnusyntax}[emph={[1]title}]
+ title = (*\marg{键值列表}*)
+ title/(*\meta{key}*) = (*\meta{value}*)
+ \end{ccnusyntax}
+ 该选项包含许多子项目,用于设置抬头。具体内容见下。
+\end{function}
+
+\begin{function}[added = 2022-07-03]{title/title-format}
+ \begin{ccnusyntax}[emph={[1]title-format}]
+ title-format = (*\meta{格式命令}*)
+ \end{ccnusyntax}
+ \tn{title} 的格式命令。默认为 |\Large|。
+\end{function}
+
+\begin{function}[added = 2022-07-03]{title/subject-format}
+ \begin{ccnusyntax}[emph={[1]subject-format}]
+ subject-format = (*\meta{格式命令}*)
+ \end{ccnusyntax}
+ \tn{subject} 的格式命令。默认为 |\sffamily \bfseries \huge|。
+\end{function}
+
+\begin{function}[added = 2022-07-03]{title/top-sep}
+ \begin{ccnusyntax}[emph={[1]top-sep}]
+ top-sep = (*\meta{弹性长度}*)
+ \end{ccnusyntax}
+ \tn{title} 和 \tn{subject} 的整体上方间距。默认为 |-.5em plus 0.3em minus 0.2em|。
+\end{function}
+
+\begin{function}[added = 2022-07-03]{title/bottom-sep}
+ \begin{ccnusyntax}[emph={[1]bottom-sep}]
+ bottom-sep = (*\meta{弹性长度}*)
+ \end{ccnusyntax}
+ \tn{title} 和 \tn{subject} 的整体下方间距。默认为 |0em plus 0.3em minus 0.2em|。
+\end{function}
+
+
+\subsubsection{题干} \label{subsubsec:参数-题干}
+
+\begin{function}{question}
+ \begin{ccnusyntax}[emph={[1]question}]
+ question = (*\marg{键值列表}*)
+ question/(*\meta{key}*) = (*\meta{value}*)
+ \end{ccnusyntax}
+ 该选项包含许多子项目,用于设置题干。具体内容见下。
+\end{function}
+
+
+\begin{function}[updated = 2022-07-05]{question/show-answer}
+ \begin{ccnusyntax}[emph={[1]show-answer}]
+ show-answer = (*\TFF*)
+ \end{ccnusyntax}
+ 统一控制 \tn{paren} 和 \tn{fillin} 中答案的显示与否。
+\end{function}
+
+
+\begin{function}{question/points}
+ \begin{ccnusyntax}[emph={[1]points}]
+ points = (*\meta{color}*)
+ \end{ccnusyntax}
+ \env{question} 和 \env{problem} 环境中的分数。出现在题号后,如果不满足格式或位置的,可以自己手动输入 |(xx 分)|。
+\end{function}
+
+
+\env{question} 和 \env{problem} 环境的参数大部分通过 \tn{examsetup} 和本节的参数控制,但也有一般在 \env{question} 和 \env{problem} 环境的 \oarg{键值列表} 中使用的,比如 \cmd{points}。(很容易理解,每道题的分值很有可能不尽相同,所以一般都是采用“个性化”,而不是 \tn{examsetup} 的“全局化”。除非是选择题和填空题这种一般每道题分数一样的)
+
+\begin{function}{question/show-points}
+ \begin{ccnusyntax}[emph={[1]show-points}]
+ show-points = (*true|(auto)|false*)
+ \end{ccnusyntax}
+ 控制 \env{question} 和 \env{problem} 环境中的分数的显示与否。\opt{auto} 表示 \env{question} 环境的分数不显示(比如选择、填空题,因为每道题一般分数相同),而 \env{problem} 环境的分数显示(比如解答题,每道题一般分数不同);\opt{true} 和 \opt{false} 分别表示 \env{question} 和 \env{problem} 环境中的分数全都显示和全都不显示。
+\end{function}
+
+\begin{function}{question/points-separate-par}
+ \begin{ccnusyntax}[emph={[1]points-separate-par}]
+ points-separate-par = (*\TFF*)
+ \end{ccnusyntax}
+ \env{question} 和 \env{problem} 环境中的分数是否单独成段。\env{question} 环境默认为 \opt{false},\env{problem} 环境默认为 \opt{true}。
+\end{function}
+
+
+\begin{function}{question/top-sep,question/bottom-sep}
+ \begin{ccnusyntax}[emph={[1]top-sep,bottom-sep}]
+ top-sep = (*\meta{skip}*)
+ bottom-sep = (*\meta{skip}*)
+ \end{ccnusyntax}
+ \env{question} 和 \env{problem} 环境的上下方的弹性间距。\opt{top-sep} 默认为 |.25em plus .25em minus .1em|;\opt{bottom-sep} 默认为 |0pt|。
+\end{function}
+
+
+\begin{function}{question/index}
+ \begin{ccnusyntax}[emph={[1]index}]
+ index = (*\meta{integer}*)
+ \end{ccnusyntax}
+ 手动设置 \env{question} 和 \env{problem} 环境的计数器值。一般用于两个环境的 \meta{键值列表} 中。
+\end{function}
+
+
+\begin{function}[added = 2022-07-20]{question/label}
+ \begin{ccnusyntax}[emph={[1]label}]
+ label = (*\meta{label}*)
+ \end{ccnusyntax}
+ \env{question} 和 \env{problem} 环境的标签的格式。默认值为 |\arabic*.|。\meta{label} 中可以使用的已定义的计数器样式主要有以下几种:
+\end{function}
+
+\begin{choices}[label = \circlednumber*]
+ \item arabic(阿拉伯数字)
+ \item alph(小写英文)
+ \item Alph(大写英文)
+ \item roman(小写罗马数字)
+ \item Roman(大写罗马数字)
+ \item circlednumber(基于字体的带圈数字)
+ \item tikzcirclednumber(\TikZ 绘制的带圈数字)
+\end{choices}
+
+
+还可以使用~\ref{subsubsec:命令环境-题干} 节的 \tn{AddQuestionCounter} 命令自定义计数器样式,使用方式和~\ref{subsubsec:命令环境-选择题} 节的 \tn{AddChoicesCounter} 命令一样。
+
+\begin{function}[added = 2022-07-26]{question/combine-fillin}
+ \begin{ccnusyntax}[emph={[1]combine-fillin}]
+ combine-fillin = (*\TFF*)
+ \end{ccnusyntax}
+ 是否将 \tn{fillin} 命令接入 \env{question} 环境。\opt{true} 表示 \tn{fillin} 会在 \env{question} 环境左侧。\kvopt{combine-fillin}{true} 下 \env{question} 和 \env{problem} 环境的缩进效果相同。
+\end{function}
+
+\begin{function}[added = 2022-07-26]{question/combine-fillin-args}
+ \begin{ccnusyntax}[emph={[1]combine-fillin-args}]
+ combine-fillin-args = (*\meta{\tn{fillin} 命令的参数}*)
+ \end{ccnusyntax}
+ \kvopt{combine-fillin}{true} 下 \tn{fillin} 接收的参数,和正常使用 \tn{fillin} 命令接收的参数相同。在此之前的 \opt{fillin/foo} 的相关键值会正常作用于接入 \env{question} 环境的 \tn{fillin}。
+\end{function}
+
+\examsetup{question/index=1}
+\begin{latexexample}{\opt{combine-fillin} 和 \opt{combine-fillin-args} 的使用示例}
+ \examsetup{
+ fillin/show-answer = true,
+ question/combine-fillin = true,
+ }
+ \begin{question}[combine-fillin-args = {[type = paren][A]}]
+ 设集合 $A = \{x \mid -1 < x < 4\}$,$B = \{2, 3, 4, 5\}$,则 $A \cap B = $
+ \end{question}
+\end{latexexample}
+\examsetup{
+ fillin/show-answer = false,
+ question/combine-fillin = false,
+}
+
+
+\subsubsection{选择题} \label{subsubsec:参数-选择题}
+
+\begin{function}{choices}
+ \begin{ccnusyntax}[emph={[1]choices}]
+ choices = (*\marg{键值列表}*)
+ choices/(*\meta{key}*) = (*\meta{value}*)
+ \end{ccnusyntax}
+ 该选项包含许多子项目,用于设置 \env{choices} 环境。具体内容见下,可以通过 \tn{examsetup} 进行统一处理,也可以用于 \env{choices} 环境的 \meta{键值列表} 针对某一 \env{choices} 环境调整。
+\end{function}
+
+\begin{function}{choices/index}
+ \begin{ccnusyntax}[emph={[1]index}]
+ index = (*\meta{integer}*)
+ \end{ccnusyntax}
+ 选项第一项 label 的计数器的起始值。
+\end{function}
+\begin{latexexample}{\opt{choices/index} 示例}
+ \begin{choices}
+ \item 1
+ \item 2
+ \item 3
+ \end{choices}
+
+ \begin{choices}[index = 2]
+ \item 1
+ \item 2
+ \item 3
+ \end{choices}
+\end{latexexample}
+
+
+\begin{function}{choices/column-sep}
+ \begin{ccnusyntax}[emph={[1]column-sep}]
+ column-sep = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ 选项列之间的最小间隔。默认为 |1em|。
+\end{function}
+
+
+\begin{function}{choices/columns}
+ \begin{ccnusyntax}[emph={[1]columns}]
+ columns = (*\meta{integer}*)
+ \end{ccnusyntax}
+ 强制按照该列数排版选项,如果为 0 则自动选择合适的列数。
+ % 手动设置 \env{choices} 环境排出的选项的列数,否则会根据选项内容自动计算。一般用于 \env{choices} 环境的 \meta{参数列表}。
+\end{function}
+
+
+\begin{function}{choices/label}
+ \begin{ccnusyntax}[emph={[1]label}]
+ label = (*\meta{label}*)
+ \end{ccnusyntax}
+ 标签的格式。默认值 |\Alph*.|。\meta{label} 中可以使用的已定义的计数器样式主要有以下几种:
+\end{function}
+
+\begin{choices}[label = \circlednumber*]
+ \item arabic(阿拉伯数字)
+ \item alph(小写英文)
+ \item Alph(大写英文)
+ \item roman(小写罗马数字)
+ \item Roman(大写罗马数字)
+ \item circlednumber(带圈数字)
+\end{choices}
+
+还可以使用~\ref{subsubsec:命令环境-选择题} 节的 \tn{AddChoicesCounter} 命令自定义计数器样式。
+
+使用方式为(以 \opt{arabic} 为例):\kvopt{label}{<pre>\textbackslash arabic*<post>}(类似 \pkg{enumitem} 宏包),其中 \meta{pre} 和 \meta{post} 表示计数器前后的内容,举例:
+\begin{latexexample}{\env{choices} 环境 label 的使用示例}
+ \begin{choices}
+ \item 第一项
+ \item 第二项
+ \item 第三项
+ \item 第四项
+ \end{choices}
+
+ \begin{choices}[label = \arabic*)]
+ \item 第一项
+ \item 第二项
+ \item 第三项
+ \item 第四项
+ \end{choices}
+\end{latexexample}
+
+如果想要隐藏或去掉 label 的话,可以使用 |label = {}|,但一般这个需求可能使用表格或其它方法会更好。
+
+如果是问卷,那么可能会有 label 是正方形或圆形的需求:
+\begin{latexexample}{label 为正方形}
+ \begin{choices}[label = $\square$]
+ \item 第一项
+ \item 第二项
+ \item 第三项
+ \item 第四项
+ \end{choices}
+\end{latexexample}
+
+\begin{latexexample}{label 为圆形}
+ \begin{choices}[label = \textbigcircle]
+ \item 第一项
+ \item 第二项
+ \item 第三项
+ \item 第四项
+ \end{choices}
+\end{latexexample}
+
+
+\begin{function}{choices/label-pos}
+ \begin{ccnusyntax}[emph={[1]label-pos}]
+ label-pos = (*<(auto)|top-left|left|bottom>*)
+ \end{ccnusyntax}
+ 标签相对于选项内容的位置。\opt{auto} 会根据内容高度来判断,当高度到达一定程度时会判断为插图,并将 label 放置于 内容 的 \opt{bottom} 位置;\opt{top-left} 表示在内容左侧并置于顶部;\opt{top-left} 表示在内容左侧并置于中间;\opt{top-left} 表示在内容底部;
+\end{function}
+
+
+\begin{function}{choices/label-align}
+ \begin{ccnusyntax}[emph={[1]label-align}]
+ label-align = (*left|center|(right)*)
+ \end{ccnusyntax}
+ 标签内部的对齐方式。
+\end{function}
+
+\begin{latexexample}{\opt{label-align} 的效果示例}
+ \begin{choices}[index = 8, label = \arabic*.]
+ \item 1
+ \item 2
+ \item 3
+ \item 4
+ \end{choices}
+ \begin{choices}[index = 8, label = \arabic*., label-align = left]
+ \item 1
+ \item 2
+ \item 3
+ \item 4
+ \end{choices}
+ \begin{choices}[index = 8, label = \arabic*., label-align = center]
+ \item 1
+ \item 2
+ \item 3
+ \item 4
+ \end{choices}
+\end{latexexample}
+
+
+\begin{function}{choices/label-sep}
+ \begin{ccnusyntax}[emph={[1]label-sep}]
+ label-sep = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ 标签与选项之间的距离。默认为 |0.5em|。
+\end{function}
+
+\begin{function}{choices/label-width}
+ \begin{ccnusyntax}[emph={[1]label-width}]
+ label-width = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ 标签的宽度。如果宽度不足会自动调整为最长标签的宽度。默认 |0pt|
+\end{function}
+
+\begin{function}{choices/max-columns}
+ \begin{ccnusyntax}[emph={[1]max-columns}]
+ max-columns = (*\meta{integer}*)
+ \end{ccnusyntax}
+ 选项的最大列数。排版选项时会优先尝试该列数,如果无法排下内容,依次将列数除以 2 并取整再进行尝试,直到可以排下全部选项。默认为 |4| 。
+\end{function}
+
+
+
+\begin{function}{paren}
+ \begin{ccnusyntax}[emph={[1]paren}]
+ paren = (*\marg{键值列表}*)
+ paren/(*\meta{key}*) = (*\meta{value}*)
+ \end{ccnusyntax}
+ 该选项包含一个子项目,用于设置 \tn{paren} 命令。具体内容见下。
+\end{function}
+
+\begin{function}[added = 2022-07-05]{paren/show-answer}
+ \begin{ccnusyntax}[emph={[1]show-answer}]
+ show-answer = (*\TFF*)
+ \end{ccnusyntax}
+ 控制 \tn{paren} 答案的显示与否。注意和 \opt{question/show-answer} 的先后顺序可能会影响结果。
+\end{function}
+
+\begin{function}[added = 2022-07-15]{paren/show-paren}
+ \begin{ccnusyntax}[emph={[1]show-paren}]
+ show-paren = (*\TFF*)
+ \end{ccnusyntax}
+ 是否显示 \tn{paren} 命令的括号。
+\end{function}
+
+\begin{function}[added = 2022-07-15]{paren/text-color}
+ \begin{ccnusyntax}[emph={[1]text-color}]
+ text-color = (*\meta{color}*)
+ \end{ccnusyntax}
+ 设置 \tn{paren} 中答案的颜色。
+\end{function}
+
+\begin{function}[added = 2022-07-15]{paren/type}
+ \begin{ccnusyntax}[emph={[1]text-color}]
+ type = (*<(hfill)|none>*)
+ \end{ccnusyntax}
+ \tn{paren} 产生的括号是否自动排到行尾。\opt{hfill} 表示自动根据行的长度排到行尾;\opt{none} 表示括号紧跟前面内容。
+\end{function}
+
+\examsetup{
+ question/index=0
+}
+
+\begin{latexexample}{\opt{paren/type} 效果展示}
+ \examsetup{
+ paren = {
+ show-paren = true
+ }
+ }
+ \begin{question}
+ 一共有 \paren 个苹果?
+ \begin{choices}
+ \item 1
+ \item 2
+ \item 3
+ \item 4
+ \end{choices}
+ \end{question}
+
+ \examsetup{
+ paren = {
+ type = none
+ }
+ }
+
+ \begin{question}
+ 一共有 \paren 个苹果?
+ \begin{choices}
+ \item 1
+ \item 2
+ \item 3
+ \item 4
+ \end{choices}
+ \end{question}
+\end{latexexample}
+
+(注:上面的例子中|)| 和 |个| 之间间距不正常是本手册的一个小 bug,\cls{exam-zh} 中使用是正常的)
+
+
+\begin{function}[added = 2022-07-26]{question/label-align}
+ \begin{ccnusyntax}[emph={[1]label-align}]
+ label-align = (*left|center|(right)*)
+ \end{ccnusyntax}
+ \env{question} 标签的对齐方式。
+\end{function}
+
+
+\subsubsection{填空题} \label{subsubsec:参数-填空题}
+
+
+\begin{function}{fillin}
+ \begin{ccnusyntax}[emph={[1]fillin}]
+ fillin = (*\marg{键值列表}*)
+ fillin/(*\meta{key}*) = (*\meta{value}*)
+ \end{ccnusyntax}
+ 该选项暂时包含一个子项目,用于设置填空命令 \tn{fillin} 的类型。具体内容见下。
+\end{function}
+
+\begin{function}[updated = 2022-07-15]{fillin/type}
+ \begin{ccnusyntax}[emph={[1]type}]
+ type = (*<(line)|paren|circle|rectangle|blank>*)
+ \end{ccnusyntax}
+ 填空命令 \tn{fillin} 的类型。\opt{line} 表示下划线;\opt{paren} 表示括号;\opt{rectangle} 表示外包一个矩形;\opt{circle} 表示外包一个圆,当内容变多时,圆会“拉伸开变成椭圆”;\opt{blank} 表示没有任何的“装饰”。
+\begin{latexexample}{\tn{fillin} 的三个类型以及参数使用方式}
+ 答案是 \fillin \fillin[]
+ \fillin[type = paren][]
+ \fillin[type = circle][]
+ \fillin[type = blank][]
+\end{latexexample}
+\end{function}
+
+
+\begin{function}[added = 2022-07-21]{fillin/no-answer-type}
+ \begin{ccnusyntax}[emph={[1]no-answer-type}]
+ no-answer-type = (*<(blacktriangle)|counter|none>*)
+ \end{ccnusyntax}
+ 填空命令 \tn{fillin} 在 \kvopt{show-answer}{false} 的情况下的显示情况:
+ \begin{itemize}
+ \item \opt{blacktriangle}:内容部分变成黑色三角形(即使已经输入了答案 |\fillin[foo]|)
+ \item \opt{counter}:内容部分变成计数器(每使用一次显示内容的数值加一),设计来源于英语学科的完形填空
+ \item \opt{none}:除了 \tn{fillin} 的 \opt{type} 相关的显示(比如下划线,括号)和一定的间距外不显示其它
+ \end{itemize}
+\end{function}
+
+\begin{function}[added = 2022-07-21]{fillin/no-answer-counter-index}
+ \begin{ccnusyntax}[emph={[1]no-answer-counter-index}]
+ no-answer-counter-index = (*\meta{integer}*)
+ \end{ccnusyntax}
+ 填空命令 \tn{fillin} 在 \kvopt{show-answer}{false} 和 \kvopt{no-answer-type}{counter} 下的计数器的非负整数值。默认为 |1|
+\end{function}
+
+\begin{function}[added = 2022-07-21]{fillin/no-answer-counter-label}
+ \begin{ccnusyntax}[emph={[1]no-answer-counter-label}]
+ no-answer-counter-label = (*\meta{label}*)
+ \end{ccnusyntax}
+ 填空命令 \tn{fillin} 在 \kvopt{show-answer}{false} 和 \kvopt{no-answer-type}{counter} 下的计数器的样式。默认为 |\arabic*|。\meta{label} 中可以使用的已定义的计数器样式主要有以下几种:
+\end{function}
+
+\begin{choices}[label = \circlednumber*]
+ \item arabic(阿拉伯数字)
+ \item alph(小写英文)
+ \item Alph(大写英文)
+ \item roman(小写罗马数字)
+ \item Roman(大写罗马数字)
+ \item circlednumber(基于字体的带圈数字)
+ \item tikzcirclednumber(\TikZ 绘制的带圈数字)
+\end{choices}
+
+
+
+\begin{function}[added = 2022-07-05]{fillin/show-answer}
+ \begin{ccnusyntax}[emph={[1]show-answer}]
+ show-answer = (*\TFF*)
+ \end{ccnusyntax}
+ 控制 \tn{fillin} 答案的显示与否。注意和 \opt{question/show-answer} 的先后顺序可能会影响结果。
+\end{function}
+
+\begin{function}[added = 2022-07-06]{fillin/width}
+ \begin{ccnusyntax}[emph={[1]width}]
+ width = (*<skip>*)
+ \end{ccnusyntax}
+ 控制 \kvopt{fillin/type}{line/paren/blank} 下 \tn{fillin} 不显示答案时的长度,可以为弹性长度,默认为 |3em plus 1em minus 1em|。
+\end{function}
+
+\begin{function}[added = 2022-07-15]{fillin/color}
+ \begin{ccnusyntax}[emph={[1]color}]
+ color = (*\meta{color}*)
+ \end{ccnusyntax}
+ 设置 \kvopt{fillin/type}{circle/rectangle} 类型的 \tn{fillin} 的边框颜色。
+\end{function}
+
+
+\begin{function}[added = 2022-07-15]{fillin/text-color}
+ \begin{ccnusyntax}[emph={[1]text-color}]
+ text-color = (*\meta{color}*)
+ \end{ccnusyntax}
+ 设置 \tn{fillin} 中答案的颜色。
+\end{function}
+
+
+\subsubsection{解答题} \label{subsubsec:参数-解答题}
+
+\begin{function}[added = 2022-07-01]{solution}
+ \begin{ccnusyntax}[emph={[1]solution}]
+ solution = (*\marg{键值列表}*)
+ solution/(*\meta{key}*) = (*\meta{value}*)
+ \end{ccnusyntax}
+ 该选项包含许多子项目,用于设置 \env{solution} 环境。具体内容见下,只能通过 \tn{examsetup} 进行处理。
+\end{function}
+
+
+\begin{function}[added = 2022-07-01]{solution/show-solution}
+ \begin{ccnusyntax}[emph={[1]show-solution}]
+ show-solution = (*\TTF*)
+ \end{ccnusyntax}
+ 是否显示解答环境 \env{solution} 的内容。
+\end{function}
+
+\begin{function}[added = 2022-07-20]{solution/parbreak}
+ \begin{ccnusyntax}[emph={[1]parbreak}]
+ parbreak = (*\TFF*)
+ \end{ccnusyntax}
+ \env{solution} 环境的内容是否在 |label| (默认为 |解答|)后新起一段开始。
+\end{function}
+
+\begin{function}[added = 2022-07-01]{solution/show-qed}
+ \begin{ccnusyntax}[emph={[1]show-qed}]
+ show-qed = (*\TTF*)
+ \end{ccnusyntax}
+ 是否显示 \env{solution} 环境结束的结束符号。
+\end{function}
+
+\begin{function}[added = 2022-07-02]{solution/qedsymbol}
+ \begin{ccnusyntax}[emph={[1]qedsymbol}]
+ qedsymbol = (*\meta{symbol}*)
+ \end{ccnusyntax}
+ \env{solution} 环境结束的结束符号。默认为 |$\square$|。可以为文字等。
+\end{function}
+
+\begin{latexexample}{\opt{qedsymbol} 示例}
+ \begin{solution}
+ 测试
+ \end{solution}
+ \examsetup{
+ solution = {
+ qedsymbol = \#
+ }
+ }
+ \begin{solution}
+ 测试
+ \end{solution}
+\end{latexexample}
+
+\begin{function}[added = 2022-07-01,updated = 2022-07-02]{solution/label-content}
+ \begin{ccnusyntax}[emph={[1]label-content}]
+ label-content = (*\meta{content}*)
+ \end{ccnusyntax}
+ \env{solution} 环境开头的标签内容。默认为 |解答|。若用于 \tn{examsetup} 则作用于之后的所有 \env{solution} 环境。
+\end{function}
+
+\begin{function}[added = 2022-07-01,updated = 2022-07-02]{solution/label-punct}
+ \begin{ccnusyntax}[emph={[1]label-punct}]
+ label-punct = (*\meta{punct}*)
+ \end{ccnusyntax}
+ \env{solution} 环境开头的标签内容后的标点。默认为空。若用于 \tn{examsetup} 则作用于之后的所有 \env{solution} 环境。
+\end{function}
+
+\begin{function}[added = 2022-07-02]{solution/score-pre-content}
+ \begin{ccnusyntax}[emph={[1]score-pre-content}]
+ score-pre-content = (*\meta{content}*)
+ \end{ccnusyntax}
+ \tn{score} 命令的前置内容。默认为空。
+\end{function}
+
+\begin{function}[added = 2022-07-02]{solution/score-post-content}
+ \begin{ccnusyntax}[emph={[1]score-post-content}]
+ score-post-content = (*\meta{content}*)
+ \end{ccnusyntax}
+ \tn{score} 命令的后置内容。默认为 |分|。
+\end{function}
+
+\begin{latexexample}{\opt{score-pre-content} 和 \opt{score-post-content} 示例}
+ \examsetup{
+ solution = {
+ score-pre-content = 这个点可以有,
+ score-post-content = 分的分数
+ }
+ }
+ \begin{solution}
+ 函数的定义域为 $(0, +\infty)$,
+ 又 \[f^{\prime}(x) = 1 - \ln x-1 = -\ln x, \score{2}\]
+ 当 $x \in(0, 1)$ 时, $f^{\prime}(x) > 0$, 当 $x \in(1, +\infty)$ 时, $f^{\prime}(x) < 0$,
+ 故 $f(x)$ 的递增区间为 $(0,1)$, 递减区间为 $(1, +\infty)$.
+ \end{solution}
+\end{latexexample}
+
+将 \opt{score-pre-content} 和 \opt{score-post-content} 设置为空就可以产生批注效果:
+\begin{latexexample}{\opt{score-pre-content} 和 \opt{score-post-content} 为空产生批注效果}
+ \examsetup{
+ solution = {score-pre-content = {}, score-post-content = {}}
+ }
+ \begin{solution}
+ 函数的定义域为 $(0, +\infty)$,
+ 又 \[f^{\prime}(x) = 1 - \ln x-1 = -\ln x, \score{这是关键点}\]
+ 当 $x \in(0, 1)$ 时, $f^{\prime}(x) > 0$, 当 $x \in(1, +\infty)$ 时, $f^{\prime}(x) < 0$,
+ 故 $f(x)$ 的递增区间为 $(0,1)$, 递减区间为 $(1, +\infty)$.
+ \end{solution}
+\end{latexexample}
+
+\begin{function}[added = 2022-07-02, updated = 2022-07-03]{solution/score-format}
+ \begin{ccnusyntax}[emph={[1]score-format}]
+ score-format = (*\meta{风格设置}*)
+ \end{ccnusyntax}
+ \tn{score} 命令的内容的风格设置,可以是颜色或字体字号命令等。默认为 |\color{red}|。
+\end{function}
+
+\examsetup{
+ solution = {
+ score-pre-content = {},
+ score-post-content = 分
+ }
+}
+\begin{latexexample}{\opt{score-format} 示例}
+ \examsetup{
+ solution = {
+ score-format = {\sffamily \huge \color{blue}}
+ }
+ }
+ \begin{solution}
+ 测试 \score{2}
+ \end{solution}
+\end{latexexample}
+
+\begin{function}[added = 2022-07-02]{solution/score-showleader}
+ \begin{ccnusyntax}[emph={[1]score-showleader}]
+ score-showleader = (*\TTF*)
+ \end{ccnusyntax}
+ \tn{score} 命令的引导线显示与否。
+\end{function}
+
+\begin{function}[added = 2022-07-15]{solution/text-color}
+ \begin{ccnusyntax}[emph={[1]text-color}]
+ text-color = (*\meta{color}*)
+ \end{ccnusyntax}
+ \env{solution} 环境内容的颜色。默认为 |black|。
+\end{function}
+
+\begin{function}[added = 2022-07-19]{solution/top-sep}
+ \begin{ccnusyntax}[emph={[1]top-sep}]
+ top-sep = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ \env{solution} 环境上方间距。默认为 |.5em plus .5em minus .2em|。
+\end{function}
+
+\begin{function}[added = 2022-07-19]{solution/bottom-sep}
+ \begin{ccnusyntax}[emph={[1]bottom-sep}]
+ bottom-sep = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ \env{solution} 环境下方间距。默认为 |.5em plus .5em minus .2em|。
+\end{function}
+
+\begin{function}[added = 2022-07-19]{solution/blank-type}
+ \begin{ccnusyntax}[emph={[1]blank-type}]
+ blank-type = (*<(none)|manual|hide>*)
+ \end{ccnusyntax}
+ \kvopt{solution/show-solution}{false} 的时候是否增加一段垂直空白。比如可以留白给学生答题。
+ \begin{itemize}
+ \item \opt{none}: 不增加;
+ \item \opt{manual}: 增加,增加的高度由 \opt{solution/blank-vsep} 控制;
+ \item \opt{hide}: 增加,增加的高度和 \env{solution} 的内容几乎相同(因为使用了 \env{tcolorbox} 环境达到 \opt{hide} 效果,环境前后间距会造成干扰,但可忽略);
+ \end{itemize}
+\end{function}
+
+\begin{function}[added = 2022-07-19]{solution/blank-vsep}
+ \begin{ccnusyntax}[emph={[1]blank-vsep}]
+ blank-vsep = (*\meta{skip}*)
+ \end{ccnusyntax}
+ \kvopt{solution/blank-type}{manual} 的时候增加的垂直空白长度,可以是弹性长度。默认为 |12ex plus 1ex minus 1ex|。
+\end{function}
+
+
+\subsubsection{几个列表环境} \label{subsubsec:参数-列表环境}
+
+\begin{function}[added = 2022-07-04]{list}
+ \begin{ccnusyntax}[emph={[1]list}]
+ list = (*\marg{键值列表}*)
+ list/(*\meta{key}*) = (*\meta{value}*)
+ \end{ccnusyntax}
+ 该选项包含许多子项目。用于设置 \env{step}、\env{method}、\env{case} 环境。仅通过 \tn{examsetup} 进行统一处理。具体内容见下。
+\end{function}
+
+\begin{function}[added = 2022-07-04]{list/step-name,list/method-name,list/case-name}
+ \begin{ccnusyntax}[emph={[1]step-name,method-name,case-name}]
+ step-name = (*\meta{step 环境 label 名}*)
+ method-name = (*\meta{method 环境 label 名}*)
+ case-name = (*\meta{case 环境 label 名}*)
+ \end{ccnusyntax}
+ 分别设置 \env{step}、\env{method}、\env{case} 环境的 label 名,分别默认为 |步骤|、|方法|、|情形|。
+\end{function}
+
+\begin{function}[added = 2022-07-04]{list/step-punct,list/method-punct,list/case-punct}
+ \begin{ccnusyntax}[emph={[1]step-punct,method-punct,case-punct}]
+ step-punct = (*\meta{step 环境 label 后的标点}*)
+ method-punct = (*\meta{method 环境 label 后的标点}*)
+ case-punct = (*\meta{case 环境 label 后的标点}*)
+ \end{ccnusyntax}
+ 分别设置 \env{step}、\env{method}、\env{case} 环境的 label 后的标点,分别默认为 |.|、|{}|(无标点)、|.|。
+\end{function}
+
+
+
+\subsubsection{草稿纸} \label{subsubsec:参数-草稿纸}
+
+\begin{function}[added = 2022-07-03]{draft}
+ \begin{ccnusyntax}[emph={[1]draft}]
+ draft = (*\marg{键值列表}*)
+ draft/(*\meta{key}*) = (*\meta{value}*)
+ \end{ccnusyntax}
+ 该选项包含许多子项目。用于设置 \tn{draftpaper} 命令。下面所述的键值,如果不额外说明,则表示可以通过 \tn{examsetup} 进行统一处理,也可以用 于 \tn{draftpaper} 命令的 \meta{键值列表} 针对某一 \tn{draftpaper} 命令调整。具体内容见下。
+\end{function}
+
+
+\begin{function}[added = 2022-07-03]{draft/watermark-size}
+ \begin{ccnusyntax}[emph={[1]watermark-size}]
+ watermark-size = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ \tn{draftpaper} 命令的“草稿纸”水印的尺寸。A4 尺寸下默认为 |100pt|,A3 尺寸下默认为 |180pt|。
+\end{function}
+
+\begin{function}[added = 2022-07-03]{draft/show-watermark}
+ \begin{ccnusyntax}[emph={[1]show-watermark}]
+ show-watermark = (*\TTF*)
+ \end{ccnusyntax}
+ 是否显示\tn{draftpaper} 命令的“草稿纸”水印。若为 \opt{true},最多需要编译两次即可得到水印。
+\end{function}
+
+
+\begin{function}[added = 2022-07-03]{draft/show-draft}
+ \begin{ccnusyntax}[emph={[1]show-draft}]
+ show-draft = (*<auto|(manual)>*)
+ \end{ccnusyntax}
+ 是否在文档最后自动添加两页的草稿纸。此键值只用于导言区的 \tn{examsetup} 命令。\opt{auto} 表示自动在末尾添加两页草稿纸,\opt{manual} 表示不在末尾添加草稿纸,如用户不需要草稿纸,或者是需要不止两页草稿纸的话,则需要改成 \opt{manual},后者需求则需要用户自己手动在文档末尾添加所需要的 \tn{draftpaper} 命令即可。注意,密封线的作用范围包括了草稿纸。根据经验看,试卷的草稿纸一般也有相应的密封线,所以暂时没有单独去掉草稿纸的密封线范围。但是可以实现一种效果:正文密封线正常,草稿纸页完全空白:
+ \begin{enumerate}
+ \item 先在导言区使用 \tn{examsetup} 用~\ref{subsubsec:参数-密封线} 节的 |sealline| 相应接口正常编译所需要的密封线
+ \item 在导言区加入 \kvopt{draft/show-draft}{auto},编译 \emph{一次},即可的到空白的草稿纸(编译两次就是正常按照 |draft| 相关参数和密封线一起编译所得到的草稿纸)
+ \item 若需要不止两张或者只需要一张空白页,则把上一步的“在导言区加入 \kvopt{draft/show-draft}{auto}” 改为在正文中添加相应数量的 \tn{draftpaper} 命令,并编译 \emph{一次} 即可。
+ \end{enumerate}
+\end{function}
+
+
+\subsubsection{评分框} \label{subsubsec:参数-评分框}
+
+\begin{function}[added = 2022-07-04]{scoringbox}
+ \begin{ccnusyntax}[emph={[1]scoringbox}]
+ scoringbox = (*\marg{键值列表}*)
+ scoringbox/(*\meta{key}*) = (*\meta{value}*)
+ \end{ccnusyntax}
+ 该选项包含一个子项目。用于设置评分框。仅可以通过 \tn{examsetup} 进行处理。
+\end{function}
+
+\begin{function}[added = 2022-07-04]{scoringbox/type}
+ \begin{ccnusyntax}[emph={[1]type}]
+ type = (*<onecolumn|twocolumn|(none)>*)
+ \end{ccnusyntax}
+ 该键值用于重定义 \tn{section} 命令,使得 \tn{scoringbox} 和 \tn{section} 结合起来。\opt{onecolumn} 表示单栏(即只有“得分”)的评分框和 \tn{section} 绑定,评分框置于左边;\opt{twocolumn} 表示双栏(即有“得分”和“评卷人”)的评分框和 \tn{section} 绑定,评分框置于左边;\opt{none} 表示不重定义 \tn{section} 命令,即不显示评分框。
+\end{function}
+
+
+\begin{function}[added = 2022-07-24]{scoringbox/position}
+ \begin{ccnusyntax}[emph={[1]position}]
+ position = (*<(left)|right>*)
+ \end{ccnusyntax}
+ \kvopt{scoringbox/type}{onecolumn} 或 \kvopt{scoringbox/type}{twocolumn} 时,评分框相对于 \tn{section} 的位置。\opt{left} 表示评分框在 \tn{section} 的左边; \opt{right} 表示评分框在 \tn{section} 的右边。
+\end{function}
+
+
+\subsubsection{选择标记题型} \label{subsubsec:参数-选择标记题型}
+
+\begin{function}[added = 2022-07-19]{select}
+ \begin{ccnusyntax}[emph={[1]chinese}]
+ select = (*\marg{键值列表}*)
+ select/(*\meta{key}*) = (*\meta{value}*)
+ \end{ccnusyntax}
+ 该选项包含一个子项目。用于设置 \env{select} 环境。
+\end{function}
+
+\begin{function}[added = 2022-07-19]{chinese/mark-symbol}
+ \begin{ccnusyntax}[emph={[1]mark-symbol}]
+ mark-symbol = (*\meta{symbol}*)
+ \end{ccnusyntax}
+ \env{select} 环境的标记符号。默认为 |$\checkmark$|。
+\end{function}
+
+\begin{latexexample}{\opt{mark-symbol} 使用示例}
+ \begin{select}[mark-symbol = {\textcolor{red}{$\times$}},show-mark = true]
+ \sitem 正确
+ \sitem* 错误
+ \sitem* 错误
+ \end{select}
+\end{latexexample}
+
+\begin{function}[added = 2022-07-21]{chinese/show-mark}
+ \begin{ccnusyntax}[emph={[1]show-mark}]
+ show-mark = (*\TFF*)
+ \end{ccnusyntax}
+ 是否显示 \env{select} 环境的标记符号。
+\end{function}
+
+\begin{function}[added = 2022-07-19, updated = 2022-07-24]{chinese/mark-position}
+ \begin{ccnusyntax}[emph={[1]mark-position}]
+ mark-position = (*top|above|below|bottom|left|(right)>*)
+ \end{ccnusyntax}
+ \env{select} 环境的标记符号相对于内容的位置。\opt{right} 表示 \opt{mark-symbol} 在内容的右侧,其余的含义同理。其中 \opt{top} 和 \opt{above} 等效,\opt{below} 和 \opt{bottom} 等效。
+\end{function}
+
+\begin{function}[added = 2022-07-19]{chinese/mark-xshift}
+ \begin{ccnusyntax}[emph={[1]mark-xshift}]
+ mark-xshift = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ \env{select} 环境的标记符号的水平偏移量。
+\end{function}
+
+\begin{function}[added = 2022-07-19]{chinese/mark-yshift}
+ \begin{ccnusyntax}[emph={[1]mark-yshift}]
+ mark-yshift = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ \env{select} 环境的标记符号的垂直偏移量。
+\end{function}
+
+\begin{function}[added = 2022-07-19]{chinese/separator}
+ \begin{ccnusyntax}[emph={[1]separator}]
+ separator = (*\meta{symbol}*)
+ \end{ccnusyntax}
+ \env{select} 环境内容的间隔符。
+\end{function}
+
+\begin{function}[added = 2022-07-19]{chinese/pre-content}
+ \begin{ccnusyntax}[emph={[1]pre-content}]
+ pre-content = (*\meta{content}*)
+ \end{ccnusyntax}
+ \env{select} 环境的内容 \emph{前} 的内容。
+\end{function}
+
+\begin{function}[added = 2022-07-19]{chinese/post-content}
+ \begin{ccnusyntax}[emph={[1]post-content}]
+ post-content = (*\meta{content}*)
+ \end{ccnusyntax}
+ \env{select} 环境的内容 \emph{后} 的内容。
+\end{function}
+
+
+\begin{latexexample}{\env{select}相关键值的综合使用}
+ 折
+ \begin{select}[pre-content = {[}, post-content = {\}}, mark-symbol = {\tiny $\triangle$}, separator = {, },mark-position = bottom, show-mark=true]
+ \sitem \pinyin{zhe1}
+ \sitem \pinyin{zhe2}
+ \sitem \pinyin{zhe3}
+ \sitem \pinyin{zhe4}
+ \sitem \pinyin{she1}
+ \sitem* \pinyin{she2}
+ \sitem \pinyin{she3}
+ \sitem \pinyin{she4}
+ \end{select}
+ 本
+\end{latexexample}
+
+
+
+\subsubsection{连线题型} \label{subsubsec:参数-连线题型}
+
+\begin{function}[updated = 2022-07-19]{lineto}
+ \begin{ccnusyntax}[emph={[1]lineto}]
+ lineto = (*\marg{键值列表}*)
+ lineto/(*\meta{key}*) = (*\meta{value}*)
+ \end{ccnusyntax}
+ 该选项包含一个子项目。用于设置 \env{lineto} 环境。
+\end{function}
+
+\begin{function}{lineto/xsep}
+ \begin{ccnusyntax}[emph={[1]xsep}]
+ xsep = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ 设置 \env{lineto} 环境两列之间的距离。默认为 |0.25\linewidth|。只在 \tn{examsetup} 中设置。
+\end{function}
+
+\begin{function}{lineto/ysep}
+ \begin{ccnusyntax}[emph={[1]ysep}]
+ ysep = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ 设置 \env{lineto} 环境两行之间的距离。默认为 |1cm|。只在 \tn{examsetup} 中设置。
+\end{function}
+
+\begin{function}{lineto/name}
+ \begin{ccnusyntax}[emph={[1]name}]
+ name = (*\meta{dimension}*)
+ \end{ccnusyntax}
+ \env{lineto} 环境中 \tn{linelistset} 命令设置的一组的名称。只在 \tn{lineconnect} 的 \oarg{键值列表} 中设置。默认为小写罗马数字,即第一次使用 \tn{lineconnect} 则该组数据的名称为 |i-*|,第二次使用的该组数据名称为 |ii-*|,其中 |*| 为该项在 \tn{linelistset} 的必选参数的列表的第几项(阿拉伯数字),比如 |i-1|,|ii-3|。
+\end{function}
+
+
+\begin{latexexample}{\opt{lineto/name} 的效果及 \env{lineto} 环境使用示例}
+ \begin{lineto}
+ \linelistset{apple, banana, key}
+ \linelistset{香蕉, 钥匙, 苹果}
+ \lineconnect{i-1,ii-3}
+ \lineconnect{i-2,ii-1}
+ \lineconnect{i-3,ii-2}
+ \end{lineto}
+
+ \begin{lineto}
+ \linelistset[name = a]{apple, banana, key}
+ \linelistset[name = b]{香蕉, 钥匙, 苹果}
+ \linelistset[name = c]{黄色, 红色,银色}
+ \lineconnect{a-1,b-3,c-2}
+ \lineconnect{a-2,b-1,c-1}
+ \lineconnect{a-3,b-2,c-3}
+ \end{lineto}
+\end{latexexample}
+
+
+\subsubsection{语文相关} \label{subsubsec:参数-语文}
+
+\begin{function}[updated = 2022-07-24]{material}
+ \begin{ccnusyntax}[emph={[1]material}]
+ material = (*\marg{键值列表}*)
+ material/(*\meta{key}*) = (*\meta{value}*)
+ \end{ccnusyntax}
+ 该选项包含多个子项目。用于设置 \env{material} 环境。可以在 \tn{examsetup} 中使用,也可以在 \env{material} 环境的可选参数中使用。
+\end{function}
+
+
+\begin{function}[updated = 2022-07-24]{material/title}
+ \begin{ccnusyntax}[emph={[1]title}]
+ title = (*\meta{标题}*)
+ \end{ccnusyntax}
+ \env{material} 环境的上方标题的 \emph{内容}。可以为空或不写。
+\end{function}
+
+\begin{function}[updated = 2022-07-24]{material/title-format}
+ \begin{ccnusyntax}[emph={[1]title-format}]
+ title-format = (*\meta{格式}*)
+ \end{ccnusyntax}
+ \env{material} 环境的上方标题的 \emph{格式}。默认为 |\zihao{4}|。
+\end{function}
+
+\begin{function}[updated = 2022-07-24]{material/author}
+ \begin{ccnusyntax}[emph={[1]author}]
+ author = (*\meta{作者}*)
+ \end{ccnusyntax}
+ \env{material} 环境的上方作者的 \emph{作者名}。可以为空或不写。
+\end{function}
+
+\begin{function}[updated = 2022-07-24]{material/author-format}
+ \begin{ccnusyntax}[emph={[1]author-format}]
+ author-format = (*\meta{格式}*)
+ \end{ccnusyntax}
+ \env{material} 环境的上方作者的 \emph{格式}。默认为 |\small|。
+\end{function}
+
+\begin{function}[updated = 2022-07-24]{material/title-author-sep}
+ \begin{ccnusyntax}[emph={[1]title-author-sep}]
+ title-author-sep = (*\meta{弹性长度}*)
+ \end{ccnusyntax}
+ \env{material} 环境的上方标题和作者之间的距离。默认为 |2em|。
+\end{function}
+
+
+\begin{function}[updated = 2022-07-24]{material/format}
+ \begin{ccnusyntax}[emph={[1]format}]
+ format = (*\meta{格式}*)
+ \end{ccnusyntax}
+ \env{material} 环境内容的格式。默认为 |\kaishu|。
+\end{function}
+
+\begin{function}[updated = 2022-07-24]{material/source}
+ \begin{ccnusyntax}[emph={[1]source}]
+ source = (*\meta{来源出处}*)
+ \end{ccnusyntax}
+ \env{material} 环境下方的来源出处。会新起一行并右对齐。
+\end{function}
+
+\begin{function}[updated = 2022-07-24]{material/source-format}
+ \begin{ccnusyntax}[emph={[1]source-format}]
+ source-format = (*\meta{格式}*)
+ \end{ccnusyntax}
+ \env{material} 环境下方的来源出处的格式。
+\end{function}
+
+\begin{function}[added = 2022-07-24]{material/top-sep}
+ \begin{ccnusyntax}[emph={[1]top-sep}]
+ top-sep = (*\meta{弹性长度}*)
+ \end{ccnusyntax}
+ \env{material} 环境和标题(如果有)的整体上方间距。默认为 |0pt|。
+\end{function}
+
+\begin{function}[added = 2022-07-24]{material/bottom-sep}
+ \begin{ccnusyntax}[emph={[1]bottom-sep}]
+ bottom-sep = (*\meta{弹性长度}*)
+ \end{ccnusyntax}
+ \env{material} 环境的下方间距。默认为 |0pt|。
+\end{function}
+
+\begin{function}[added = 2022-07-24]{material/title-material-sep}
+ \begin{ccnusyntax}[emph={[1]title-material-sep}]
+ title-material-sep = (*\meta{弹性长度}*)
+ \end{ccnusyntax}
+ \env{material} 环境和标题(如果有)的间距。默认为 |0pt|。
+\end{function}
+
+
+\begin{function}[updated = 2022-07-24]{poem}
+ \begin{ccnusyntax}[emph={[1]material}]
+ poem = (*\marg{键值列表}*)
+ poem/(*\meta{key}*) = (*\meta{value}*)
+ \end{ccnusyntax}
+ 该选项包含多个子项目。用于设置 \env{poem} 环境。可以在 \tn{examsetup} 中使用,也可以在 \env{poem} 环境的可选参数中使用。
+\end{function}
+
+\begin{function}[updated = 2022-07-24]{poem/title}
+ \begin{ccnusyntax}[emph={[1]title}]
+ title = (*\meta{标题}*)
+ \end{ccnusyntax}
+ \env{poem} 环境的上方标题的 \emph{内容}。可以为空或不写。
+\end{function}
+
+\begin{function}[updated = 2022-07-24]{poem/title-format}
+ \begin{ccnusyntax}[emph={[1]title-format}]
+ title-format = (*\meta{格式}*)
+ \end{ccnusyntax}
+ \env{poem} 环境的上方标题的 \emph{格式}。默认为 |\zihao{5}|。
+\end{function}
+
+\begin{function}[updated = 2022-07-24]{poem/author}
+ \begin{ccnusyntax}[emph={[1]author}]
+ author = (*\meta{作者}*)
+ \end{ccnusyntax}
+ \env{poem} 环境的上方作者的 \emph{作者名}。可以为空或不写。
+\end{function}
+
+\begin{function}[updated = 2022-07-24]{poem/author-format}
+ \begin{ccnusyntax}[emph={[1]author-format}]
+ author-format = (*\meta{格式}*)
+ \end{ccnusyntax}
+ \env{poem} 环境的上方作者的 \emph{格式}。默认为 |\small|。
+\end{function}
+
+\begin{function}[updated = 2022-07-24]{poem/title-author-sep}
+ \begin{ccnusyntax}[emph={[1]title-author-sep}]
+ title-author-sep = (*\meta{弹性长度}*)
+ \end{ccnusyntax}
+ \env{poem} 环境的上方标题和作者之间的距离。默认为 |2em|。
+\end{function}
+
+
+\begin{function}[added = 2022-07-24]{poem/format}
+ \begin{ccnusyntax}[emph={[1]format}]
+ format = (*\meta{格式}*)
+ \end{ccnusyntax}
+ \env{poem} 环境内容的格式。默认为 |\kaishu|。
+\end{function}
+
+\begin{function}[added = 2022-07-26]{poem/align}
+ \begin{ccnusyntax}[emph={[1]align}]
+ align = (*<(l)|c|r>*)
+ \end{ccnusyntax}
+ \env{poem} 环境内容的对齐方式。\opt{l} 表示左对齐;\opt{c} 表示居中对齐;\opt{r} 表示右对齐。
+\end{function}
+
+\begin{function}[added = 2022-07-24]{poem/top-sep}
+ \begin{ccnusyntax}[emph={[1]top-sep}]
+ top-sep = (*\meta{弹性长度}*)
+ \end{ccnusyntax}
+ \env{poem} 环境和标题(如果有)的整体上方间距。默认为 |0pt|。
+\end{function}
+
+\begin{function}[added = 2022-07-24]{poem/bottom-sep}
+ \begin{ccnusyntax}[emph={[1]bottom-sep}]
+ bottom-sep = (*\meta{弹性长度}*)
+ \end{ccnusyntax}
+ \env{poem} 环境的下方间距。默认为 |0pt|。
+\end{function}
+
+\begin{function}[added = 2022-07-24]{poem/title-poem-sep}
+ \begin{ccnusyntax}[emph={[1]title-poem-sep}]
+ title-poem-sep = (*\meta{弹性长度}*)
+ \end{ccnusyntax}
+ \env{poem} 环境和标题(如果有)的间距。默认为 |0pt|。
+\end{function}
+
+\begin{function}[added = 2022-07-25]{poem/type}
+ \begin{ccnusyntax}[emph={[1]type}]
+ type = (*<minipage|(chinese)>*)
+ \end{ccnusyntax}
+ \env{poem} 环境的类型(主要体现在页脚)。\opt{minipage} 表示 \env{poem} 环境的页脚是基于 \env{minipage} 环境形成的,脚注上方有横线,且两条脚注之间是分行的;\opt{chinese} 表示脚注不分行,连着显示,且最前方有 |[注]| 字(设计来源于“2021 年普通高等学校招生全国统一考试”语文真题卷)。
+\end{function}
+
+\begin{function}[added = 2022-07-26]{poem/zhu-circlednumber-base}
+ \begin{ccnusyntax}[emph={[1]zhu-circlednumber-base}]
+ zhu-circlednumber-base = (*<tikz|(font)>*)
+ \end{ccnusyntax}
+ 在 \kvopt{poem/type}{chinese} 键值下,\tn{zhu} 的带圈数字的源。\opt{tikz} 表示此时带圈数字基于 \TikZ,\opt{font} 表示此时带圈数字基于字体。
+\end{function} \ No newline at end of file
diff --git a/macros/xetex/latex/exam-zh/doc/exam-zh-doc-setup.tex b/macros/xetex/latex/exam-zh/doc/exam-zh-doc-setup.tex
new file mode 100644
index 0000000000..19b2ed0661
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/doc/exam-zh-doc-setup.tex
@@ -0,0 +1,65 @@
+\usepackage{xeCJKfntef, xpinyin}
+\usepackage{graphicx}
+\usepackage{tabularray}
+\usepackage{../exam-zh-choices}
+\usepackage{../exam-zh-question}
+\usepackage{../exam-zh-symbols}
+\usepackage{../exam-zh-chinese-english}
+
+\ExplSyntaxOn
+\NewDocumentCommand \examsetup { m }
+ { \keys_set:nn { exam-zh } {#1} }
+\ExplSyntaxOff
+% \usepackage[
+% backend = biber,
+% style = gb7714-2015
+% ]{biblatex}
+% \addbibresource{exam-zh.bib}
+\graphicspath{{figures}}
+
+\hypersetup{
+ pdftitle = {exam-zh: 高考试卷 LaTeX 模板},
+ pdfauthor = {夏康玮}
+}
+% 全角标点放在引号中,需要改成半角式,否则间距过大,不好看
+\def\FSID{“{\xeCJKsetup{PunctStyle=banjiao}。}”} % U+3002
+\def\FSFW{“{\xeCJKsetup{PunctStyle=banjiao}.}”} % U+FF0E
+\def\COFW{“{\xeCJKsetup{PunctStyle=banjiao}:}”} % U+FF1A
+\def\SCFW{“{\xeCJKsetup{PunctStyle=banjiao};}”} % U+FF1B
+
+
+\title{\textcolor{MaterialIndigo800}{%
+ \textbf{exam-zh: 高考试卷 \LaTeX \xpinyin[font=\sffamily,format=\color{MaterialIndigo800}]{模}{mu2}板}}}
+\author{李泽平,夏康玮,郭李军}
+\date{2022/07/28\quad v0.1.13%
+ \thanks{%
+ \url{https://gitee.com/zepinglee/exam-zh}
+ }
+}
+
+\ExplSyntaxOn
+\NewDocumentCommand \eu { } { \mathrm{ e } }
+\NewDocumentCommand \iu { } { \mathrm{ i } }
+\NewDocumentCommand { \scoringbox } { s }
+ {
+ \IfBooleanTF {#1}
+ { \__examzh_scoringbox_onecolumn: }
+ { \__examzh_scoringbox_twocolumn: }
+ }
+\cs_new_protected:Nn \__examzh_scoringbox_twocolumn:
+ {
+ \begin{tabular}{|c|c|}
+ \hline
+ 得分 & \rule{3em}{0pt}\rule[-0.7em]{0pt}{2em} \\\hline
+ 阅卷人 & \rule{3em}{0pt}\rule[-0.7em]{0pt}{2em} \\\hline
+ \end{tabular}
+ }
+\cs_new_protected:Nn \__examzh_scoringbox_onecolumn:
+ {
+ \begin{tabular}{|c|}
+ \hline
+ 得分\rule[-0.7em]{0pt}{2em} \\\hline
+ \rule[-0.7em]{0pt}{2em} \\\hline
+ \end{tabular}
+ }
+\ExplSyntaxOff \ No newline at end of file
diff --git a/macros/xetex/latex/exam-zh/doc/exam-zh-doc.pdf b/macros/xetex/latex/exam-zh/doc/exam-zh-doc.pdf
new file mode 100644
index 0000000000..e3cd445997
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/doc/exam-zh-doc.pdf
Binary files differ
diff --git a/macros/xetex/latex/exam-zh/doc/exam-zh-doc.tex b/macros/xetex/latex/exam-zh/doc/exam-zh-doc.tex
new file mode 100644
index 0000000000..956a94c3df
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/doc/exam-zh-doc.tex
@@ -0,0 +1,87 @@
+\documentclass{xdyydoc}
+\input{exam-zh-doc-setup.tex}
+\usepackage{amssymb}
+
+\begin{document}
+
+% 封面的页边距
+
+\newgeometry{
+ left = 2.2 in,
+ right = 1.25 in,
+ top = 1.25 in,
+ bottom = 1.00 in
+}
+
+\maketitle
+
+\input{./body/cover.tex}
+
+
+% 用户手册的页边距
+
+\newgeometry{
+ left = 1.75 in,
+ right = 0.80 in,
+ top = 1.25 in,
+ bottom = 1.00 in
+}
+
+\tableofcontents
+
+
+% 介绍
+\input{./body/introduction.tex}
+% 安装
+\input{./body/installation.tex}
+
+% \clearpage
+% 使用
+\input{./body/usage.tex}
+
+
+% 宏包依赖情况
+\input{./back/package.tex}
+% 主要更新
+\input{./back/main-changelog.tex}
+
+% 参与开发
+\input{./back/development.tex}
+
+
+% 关于作者
+\input{./back/about-author.tex}
+
+
+
+\section{\cls{exam-zh}:TODO}
+
+\begin{itemize}
+ \item 增加试卷范例(语文,英语)
+ \item 答案控制
+ \begin{itemize}
+ \item 选择题
+ \begin{itemize}
+ \item 题目下方
+ \item 括号内
+ \item 最后:列表形式、表格形式
+ \end{itemize}
+ \item 填空题
+ \begin{itemize}
+ \item 题目下方
+ \item 划线内
+ \item 最后
+ \end{itemize}
+ \item 解答题
+ \begin{itemize}
+ \item 题目下方
+ \item 移动到最后
+ \end{itemize}
+ \end{itemize}
+ \item 选择题答案标记
+ \item 图文排版(参考 xkwxdyy 的 \pkg{text-figure} 宏包和 qinglee 的 \pkg{wrapstuff} 宏包)
+ \item 测试兼容性
+\end{itemize}
+
+
+\end{document} \ No newline at end of file
diff --git a/macros/xetex/latex/exam-zh/doc/figures/firstpage.pdf b/macros/xetex/latex/exam-zh/doc/figures/firstpage.pdf
new file mode 100644
index 0000000000..43f80e7dcc
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/doc/figures/firstpage.pdf
Binary files differ
diff --git a/macros/xetex/latex/exam-zh/doc/figures/gitee-main.png b/macros/xetex/latex/exam-zh/doc/figures/gitee-main.png
new file mode 100644
index 0000000000..388dfaa66d
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/doc/figures/gitee-main.png
Binary files differ
diff --git a/macros/xetex/latex/exam-zh/doc/figures/gitee-release.png b/macros/xetex/latex/exam-zh/doc/figures/gitee-release.png
new file mode 100644
index 0000000000..79ac0b13a7
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/doc/figures/gitee-release.png
Binary files differ
diff --git a/macros/xetex/latex/exam-zh/doc/xdyydoc.cls b/macros/xetex/latex/exam-zh/doc/xdyydoc.cls
new file mode 100644
index 0000000000..cce615933d
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/doc/xdyydoc.cls
@@ -0,0 +1,1145 @@
+\NeedsTeXFormat{LaTeX2e}[2020/10/01]
+\ProvidesExplClass{xdyydoc}
+ {2022-04-26}{0.1a}{Documentation class for CCNUthesis}
+\@namedef{ver@thumbpdf.sty}{9999/99/99}
+\LoadClass[a4paper, full]{l3doc}
+\RequirePackage[heading, sub3section, fontset=none]{ctex}
+\RequirePackage{%
+ caption,
+ geometry,
+ graphicx,
+ listings,
+ makecell,
+ siunitx,
+ tabularx,
+ threeparttable,
+ unicode-math,
+ xcolor,
+ ninecolors,
+ xcolor-material,
+ xunicode,
+ zref-base,
+ tikz,
+ tikzpagenodes,
+ tcolorbox,
+ accsupp, % PDF accessibility support
+ MnSymbol,
+ lstautogobble
+}
+\tcbuselibrary{listings}
+\tcbuselibrary{hooks, skins, xparse, breakable}
+% \tcbuselibrary{hooks, minted, skins, xparse, breakable}
+\definecolor{main}{HTML}{5989cf} % setting main color to be used
+\definecolor{sub}{HTML}{cde4ff} % setting sub color to be used
+\def\macro@code{%
+ \topsep \MacrocodeTopsep
+ \@beginparpenalty \predisplaypenalty
+ \partopsep \z@skip
+ \trivlist \parskip \z@ \item[]%
+ \MacroFont
+ \leftskip\@totalleftmargin \advance\leftskip\MacroIndent
+ \rightskip\z@ \parindent\z@ \parfillskip\@flushglue
+ \blank@linefalse \def\par{\ifblank@line
+ \leavevmode\fi
+ \blank@linetrue\@@par
+ \penalty\interlinepenalty}
+ \obeylines
+ \let\do\do@noligs \verbatim@nolig@list
+ \let\do\@makeother \dospecials
+ \global\@newlistfalse
+ \global\@minipagefalse
+ \init@crossref}
+\ExplSyntaxOn
+\tl_new:N \l__fdudoc_tmpa_tl
+\tl_new:N \l__fdudoc_tmpb_tl
+\cs_new_protected:Npn \__fdudoc_patch_cmd:Nnn #1#2#3
+ {
+ \ctex_patch_cmd_once:NnnnTF #1 { } {#2} {#3}
+ { } { \ctex_patch_failure:N #1 }
+ }
+\cs_new_protected:Npn \__fdudoc_preto_cmd:Nn #1#2
+ {
+ \ctex_preto_cmd:NnnTF #1 { } {#2}
+ { } { \ctex_patch_failure:N #1 }
+ }
+\cs_new_protected:Npn \__fdudoc_appto_cmd:Nn #1#2
+ {
+ \ctex_appto_cmd:NnnTF #1 { } {#2}
+ { } { \ctex_patch_failure:N #1 }
+ }
+\cs_set_protected_nopar:Npn \xmacro@code
+ { \__fdudoc_marco_code:w }
+\cs_set_protected_nopar:Npn \sxmacro@code
+ {
+ \fontspec_print_visible_spaces:
+ \xmacro@code
+ }
+\cs_new_protected_nopar:Npn \__fdudoc_marco_code:w
+ {
+ \ifcodeline@index
+ \__fdudoc_marco_code_every_par:n { \__fdudoc_code_line_no: }
+ \else:
+ \__fdudoc_marco_code_every_par:n { }
+ \fi:
+ \__fdudoc_make_finish_tag:x { \@currenvir }
+ \__fdudoc_macro_code_start:w
+ }
+\cs_new_protected:Npn \__fdudoc_marco_code_every_par:n #1
+ {
+ \everypar
+ {
+ \everypar {#1}
+ \if@inlabel
+ \global \@inlabelfalse \@noparlistfalse
+ \llap { \box \@labels \hskip \leftskip }
+ \fi
+ #1
+ }
+ }
+\group_begin:
+ \int_set:Nn \tex_endlinechar:D { -1 }
+ \use:n
+ {
+ \char_set_catcode_active:n { 32 }
+ \tl_const:Nn \c__fdudoc_active_space_tl
+ }
+ { }
+\group_end:
+\group_begin:
+ \char_set_catcode_active:n { 13 }
+ \cs_new_protected:Npx \__fdudoc_make_finish_tag:n #1
+ {
+ \tl_set:Nn \exp_not:N \l__fdudoc_macro_code_finish_tl
+ {
+ \c_percent_str
+ \prg_replicate:nn { 4 }
+ { \exp_not:o { \c__fdudoc_active_space_tl } }
+ \exp_not:o { \active@escape@char } end
+ \c_left_brace_str #1 \c_right_brace_str
+ \exp_not:N ^^M
+ }
+ }
+ \cs_generate_variant:Nn \__fdudoc_make_finish_tag:n { x }
+ \cs_new_protected:Npn \__fdudoc_macro_code_start:w #1
+ {
+ \str_if_eq:nnTF {#1} { ^^M }
+ { \__fdudoc_macro_code_read_line:w }
+ { \__fdudoc_macro_code_read_line:w #1 }
+ }
+ \cs_new_protected:Npn \__fdudoc_macro_code_read_line:w #1 ^^M
+ {
+ \tl_set:Nn \l__fdudoc_macro_code_line_tl { #1 ^^M }
+ \tl_if_eq:NNTF
+ \l__fdudoc_macro_code_line_tl \l__fdudoc_macro_code_finish_tl
+ { \exp_args:Nx \end { \@currenvir } }
+ {
+ \__fdudoc_macro_code_process_line:
+ \__fdudoc_macro_code_read_line:w
+ }
+ }
+ \cs_new_protected:Npn \__fdudoc_swap_cr:
+ {
+ \exp_after:wN
+ \__fdudoc_swap_cr_aux:w \l__fdudoc_macro_code_line_tl
+ }
+ \cs_new_protected:Npn \__fdudoc_swap_cr_aux:w #1 ^^M
+ {
+ \group_insert_after:N ^^M
+ \tl_set:Nn \l__fdudoc_macro_code_line_tl {#1}
+ }
+ \tl_const:Nn \c__fdudoc_active_cr_tl { ^^M }
+\group_end:
+\tl_new:N \l__fdudoc_macro_code_line_tl
+\tl_new:N \l__fdudoc_macro_code_finish_tl
+\tl_new:N \g__fdudoc_macro_code_verbatim_stop_tl
+\cs_new_protected_nopar:Npn \__fdudoc_process_normal_line:
+ {
+ \str_case_e:nnF
+ { \str_head:N \l__fdudoc_macro_code_line_tl }
+ {
+ { \c_percent_str }
+ {
+ \__fdudoc_check_angle:x
+ { \tl_tail:N \l__fdudoc_macro_code_line_tl }
+ }
+ { \c_hash_str }
+ { \__fdudoc_output_comment_line: }
+ }
+ { \__fdudoc_output_line: }
+ }
+\cs_new_protected_nopar:Npn \__fdudoc_process_verbatim_line:
+ {
+ \tl_if_eq:NNTF \l__fdudoc_macro_code_line_tl
+ \g__fdudoc_macro_code_verbatim_stop_tl
+ {
+ \tl_gclear:N \g__fdudoc_macro_code_verbatim_stop_tl
+ \cs_gset_eq:NN \__fdudoc_macro_code_process_line:
+ \__fdudoc_process_normal_line:
+ \__fdudoc_output_module:nn
+ { \color { verb@guard } }
+ {
+ \__fdudoc_swap_cr:
+ \__fdudoc_module_pop:n { \l__fdudoc_macro_code_line_tl }
+ }
+ }
+ { \tl_use:N \l__fdudoc_macro_code_line_tl }
+ }
+\cs_new_eq:NN \__fdudoc_macro_code_process_line:
+ \__fdudoc_process_normal_line:
+\DeclareDocumentCommand \CheckModules { }
+ {
+ \cs_set_eq:NN \__fdudoc_macro_code_process_line:
+ \__fdudoc_process_normal_line:
+ }
+\DeclareDocumentCommand \DontCheckModules { }
+ {
+ \cs_set_eq:NN \__fdudoc_macro_code_process_line:
+ \__fdudoc_output_line:
+ }
+\cs_new_protected:Npn \__fdudoc_check_angle:n #1
+ {
+ \str_if_eq:eeTF { \str_head:n {#1} } { < }
+ { \__fdudoc_check_module:x { \tl_tail:n {#1} } }
+ { \__fdudoc_output_comment_line: }
+ }
+\cs_generate_variant:Nn \__fdudoc_check_angle:n { x }
+\cs_new_protected:Npn \__fdudoc_check_module:n #1
+ {
+ \str_case_e:nnF { \str_head:n {#1} }
+ {
+ { * } { \__fdudoc_module_star:w }
+ { / } { \__fdudoc_module_slash:w }
+ { @ } { \__fdudoc_module_at:w }
+ { < } { \__fdudoc_module_verb:w }
+ }
+ { \__fdudoc_module_pm:w }
+ #1 \q_stop
+ }
+\cs_generate_variant:Nn \__fdudoc_check_module:n { x }
+\group_begin:
+ \char_set_catcode_active:N \>
+ \cs_new_protected:Npn \__fdudoc_module_star:w #1 > #2 \q_stop
+ {
+ \tl_set:Nn \l__fdudoc_tmpa_tl {#2}
+ \tl_if_eq:NNTF \l__fdudoc_tmpa_tl \c__fdudoc_active_cr_tl
+ {
+ \__fdudoc_output_module:nn
+ { \__fdudoc_star_color: }
+ {
+ \__fdudoc_module_push:n
+ { \__fdudoc_module_angle:n {#1} }
+ }
+ }
+ {
+ \__fdudoc_output_module_left:nn
+ { \__fdudoc_star_color: }
+ {
+ \__fdudoc_module_push:n
+ { \__fdudoc_module_angle:n {#1} }
+ }
+ }
+ \__fdudoc_output_line:n {#2}
+ }
+ \cs_new_protected:Npn \__fdudoc_module_slash:w #1 > #2 \q_stop
+ {
+ \tl_set:Nn \l__fdudoc_tmpa_tl {#2}
+ \tl_if_eq:NNTF \l__fdudoc_tmpa_tl \c__fdudoc_active_cr_tl
+ {
+ \__fdudoc_output_module:nn
+ { \__fdudoc_slash_color: }
+ {
+ \__fdudoc_module_pop:n
+ { \__fdudoc_module_angle:n {#1} }
+ }
+ }
+ {
+ \__fdudoc_output_module_left:nn
+ { \__fdudoc_slash_color: }
+ {
+ \__fdudoc_module_pop:n
+ { \__fdudoc_module_angle:n {#1} }
+ }
+ }
+ \__fdudoc_output_line:n {#2}
+ }
+ \cs_new_protected:Npn \__fdudoc_module_at:w @ @ = #1 > #2 \q_stop
+ {
+ \__fdudoc_output_module:nn
+ { \color { at@guard } }
+ { \__fdudoc_module_angle:n { @ @ = #1 } }
+ \tl_gset:Nn \g__codedoc_module_name_tl {#1}
+ \__fdudoc_output_line:n {#2}
+ }
+ \cs_new_protected:Npn \__fdudoc_module_verb:w #1 \q_stop
+ {
+ \cs_gset_eq:NN \__fdudoc_macro_code_process_line:
+ \__fdudoc_process_verbatim_line:
+ \tl_gset:Nx \g__fdudoc_macro_code_verbatim_stop_tl
+ { \c_percent_str \tl_tail:n {#1} }
+ \__fdudoc_output_module:nn
+ { \color { verb@guard } }
+ {
+ \__fdudoc_swap_cr:
+ \__fdudoc_module_push:n { \l__fdudoc_macro_code_line_tl }
+ }
+ }
+ \cs_new_protected:Npn \__fdudoc_module_pm:w #1 > #2 \q_stop
+ {
+ \__fdudoc_output_module_left:nn
+ { \__fdudoc_pm_color: }
+ { \__fdudoc_module_angle:n {#1} }
+ \__fdudoc_output_line:n {#2}
+ }
+\group_end:
+\cs_new_protected:Npn \__fdudoc_output_line:n #1
+ {
+ \tl_set:Nn \l__fdudoc_macro_code_line_tl {#1}
+ \tl_if_eq:NNTF
+ \l__fdudoc_macro_code_line_tl \c__fdudoc_active_cr_tl
+ { \tl_use:N \l__fdudoc_macro_code_line_tl }
+ {
+ \str_if_eq:eeTF
+ { \str_head:N \l__fdudoc_macro_code_line_tl } { \c_percent_str }
+ { \__fdudoc_output_comment_line: } { \__fdudoc_output_line: }
+ }
+ }
+\cs_new_protected_nopar:Npn \__fdudoc_output_line:
+ {
+ \tex_noindent:D
+ \__fdudoc_replace_at_at:N \l__fdudoc_macro_code_line_tl
+ \tl_use:N \l__fdudoc_macro_code_line_tl
+ }
+\cs_new_protected:Npn \__fdudoc_output_comment_line:
+ {
+ \tex_noindent:D
+ \group_begin:
+ \__fdudoc_swap_cr:
+ \color { code@gray } \slshape \__fdudoc_output_line:
+ \group_end:
+ }
+\cs_new_protected:Npn \__fdudoc_replace_at_at:N #1
+ {
+ \tl_if_empty:NF \g__codedoc_module_name_tl
+ { \__fdudoc_replace_at_at_aux:No #1 \g__codedoc_module_name_tl }
+ }
+\cs_new_protected:Npn \__fdudoc_replace_at_at_aux:Nn #1#2
+ {
+ \tl_replace_all:Nnn #1 { _ @ @ } { _ _ #2 }
+ \tl_replace_all:Nnn #1 { @ @ } { _ _ #2 }
+ }
+\cs_generate_variant:Nn \__fdudoc_replace_at_at_aux:Nn { No }
+\cs_new_protected_nopar:Npn \__fdudoc_module_push:n
+ { \__fdudoc_module_push_aux:on { \int_use:N \c@HD@hypercount } }
+\cs_new_protected:Npn \__fdudoc_module_push_aux:nn #1
+ {
+ \seq_gpush:Nn \g__fdudoc_module_dest_seq {#1}
+ \hypersetup { hidelinks }
+ \exp_args:Nx \hdclindex
+ { \zref@extractdefault { HD.#1 } { guard@end } { 1 } } { }
+ }
+\cs_generate_variant:Nn \__fdudoc_module_push_aux:nn { on }
+\cs_new_protected_nopar:Npn \__fdudoc_module_pop:n
+ {
+ \seq_gpop:NNTF \g__fdudoc_module_dest_seq \l__fdudoc_tmpa_tl
+ { \__fdudoc_module_pop_aux:on { \l__fdudoc_tmpa_tl } }
+ { \BOOM \use:n }
+ }
+\cs_new_protected:Npn \__fdudoc_module_pop_aux:nn #1
+ {
+ \zref@labelbylist { HD.#1 } { fdudoc }
+ \hypersetup { hidelinks }
+ \hdclindex {#1} { }
+ }
+\cs_generate_variant:Nn \__fdudoc_module_pop_aux:nn { on }
+\seq_new:N \g__fdudoc_module_dest_seq
+\zref@newlist { fdudoc }
+\zref@newprop { guard@end } [ 1 ]
+ { \int_eval:n { \c@HD@hypercount - 1 } }
+\zref@addprop { fdudoc } { guard@end }
+\cs_set_protected:Npn \MacroFont
+ {
+ \linespread { 1.05 }
+ \small \ttfamily \mdseries \upshape
+ \__fdudoc_verb_addon:
+ }
+\cs_new_protected:Npn \__fdudoc_output_module:nn #1#2
+ {
+ \tex_noindent:D
+ \group_begin:
+ #1
+ \footnotesize \normalfont \sffamily #2
+ \group_end:
+ }
+\cs_new_protected:Npn \__fdudoc_output_module_left:nn #1#2
+ {
+ \tex_noindent:D
+ \hbox_overlap_left:n
+ {
+ \__fdudoc_output_module:nn {#1} {#2}
+ \skip_horizontal:n { \leftskip + \smallskipamount }
+ }
+ }
+\cs_new_protected_nopar:Npn \__fdudoc_star_color:
+ {
+ \seq_gpop:NNTF \g__fdudoc_star_color_seq \current@color
+ { \set@color }
+ { \__fdudoc_select_color: }
+ \seq_gpush:No \g__fdudoc_slash_color_seq { \current@color }
+ }
+\cs_new_protected_nopar:Npn \__fdudoc_slash_color:
+ {
+ \seq_gpop:NNTF \g__fdudoc_slash_color_seq \current@color
+ {
+ \set@color
+ \seq_gpush:No \g__fdudoc_star_color_seq { \current@color }
+ }
+ { \BOOM }
+ }
+\cs_new_protected_nopar:Npn \__fdudoc_pm_color:
+ {
+ \seq_get:NNTF \g__fdudoc_star_color_seq \current@color
+ { \set@color }
+ {
+ \__fdudoc_select_color:
+ \seq_gpush:No \g__fdudoc_star_color_seq { \current@color }
+ }
+ }
+\seq_new:N \g__fdudoc_star_color_seq
+\seq_new:N \g__fdudoc_slash_color_seq
+\cs_new_protected_nopar:Npn \__fdudoc_select_color:
+ { \color { guard@series!!+ } }
+\definecolorseries { guard@series }
+ { cmyk } { last } { blue } { purple }
+\resetcolorseries [ 3 ] { guard@series }
+\definecolor { verb@guard } { named } { MaterialLime600 }
+\definecolor { at@guard } { named } { MaterialPink }
+\definecolor { code@gray } { named } { MaterialGrey }
+\cs_new_protected:Npn \__fdudoc_module_angle:n #1
+ { < #1 > }
+\cs_new_protected_nopar:Npn \__fdudoc_code_line_no:
+ {
+ \int_gincr:N \c@CodelineNo
+ \hbox_overlap_left:n
+ {
+ \hbox_to_wd:nn
+ { \MacroIndent }
+ {
+ \HD@target
+ \tex_hss:D \__fdudoc_code_line_no_style:
+ \theCodelineNo \enspace
+ }
+ \tex_kern:D \@totalleftmargin
+ }
+ }
+\tl_set:Nn \theCodelineNo { \arabic { CodelineNo } }
+\cs_new_protected_nopar:Npn \__fdudoc_code_line_no_style:
+ { \color { code@gray } \normalfont \sffamily \tiny }
+\cs_set_protected:Npn \HD@SetMacroIndent #1
+ {
+ \group_begin:
+ \settowidth \MacroIndent
+ {
+ \__fdudoc_code_line_no_style:
+ \prg_replicate:nn { \tl_count:n {#1} } { 0 }
+ \enspace
+ }
+ \dim_gset_eq:NN \MacroIndent \MacroIndent
+ \group_end:
+ }
+\sys_if_engine_xetex:TF
+ {
+ \cs_set_eq:NN \__fdudoc_verb_addon: \xeCJKVerbAddon
+ \cs_set:Nn \__fdudoc_plain_punct_style:
+ { \xeCJKsetup { PunctStyle = plain } }
+ \cs_set:Nn \__fdudoc_disable_ecglue:
+ { \xeCJKsetup { CJKecglue } }
+ \__fdudoc_appto_cmd:Nn \meta@font@select
+ { \mode_if_inner:T { \__fdudoc_disable_ecglue: } }
+ }
+ {
+ \cs_set_eq:NN \__fdudoc_verb_addon: \prg_do_nothing:
+ \cs_set_eq:NN \__fdudoc_plain_punct_style: \prg_do_nothing:
+ \cs_set:Nn \__fdudoc_disable_ecglue:
+ { \ltjsetparameter { autoxspacing = false } }
+ \__fdudoc_appto_cmd:Nn \meta@font@select
+ { \__fdudoc_disable_ecglue: }
+ }
+\BeforeBeginEnvironment { function }
+ { \par \nointerlineskip }
+\AtEndEnvironment { function }
+ {
+ \par
+ \cs_gset:Nx \__fdudoc_fix_previous_depth:
+ { \prevdepth = \the \prevdepth \space }
+ }
+\AfterEndEnvironment { function }
+ { \__fdudoc_fix_previous_depth: }
+\AtBeginEnvironment { syntax }
+ {
+ \linespread { 1.2 }
+ \__fdudoc_plain_punct_style:
+ \__fdudoc_disable_ecglue:
+ }
+\AtBeginEnvironment { ccnusyntax }
+ {
+ \cs_set:Npn \lparen { \textup { ( } }
+ \cs_set:Npn \rparen { \textup { ) } }
+ \char_set_catcode_active:N |
+ \char_set_catcode_active:N <
+ \char_set_catcode_active:N (
+ \char_set_active_eq:NN | \orbar
+ \char_set_active_eq:NN < \syntaxopt@aux
+ \char_set_active_eq:NN ( \defaultval@aux
+ }
+\cs_new_eq:NN \__fdudoc_ltx_changes:nnn \changes@
+\cs_set_protected:Npn \changes@ #1#2
+ {
+ \__fdudoc_save_version_date:nn {#1} {#2}
+ \__fdudoc_ltx_changes:nnn {#1} {#2}
+ }
+\prop_new:N \g__fdudoc_version_date_prop
+\cs_new_protected:Npn \__fdudoc_save_version_date:nn #1#2
+ {
+ \prop_get:NnNTF \g__fdudoc_version_date_prop
+ {#1} \l__fdudoc_tmpa_tl
+ {
+ \exp_after:wN
+ \__fdudoc_save_version_date_aux:nnnn \l__fdudoc_tmpa_tl
+ {#2} {#1}
+ }
+ { \__fdudoc_save_version_date_aux:nnn {#1} {#2} {#2} }
+ }
+\cs_new_protected:Npn \__fdudoc_save_version_date_aux:nnnn #1#2#3#4
+ {
+ \__fdudoc_if_date_later:nnTF {#1} {#3}
+ { \__fdudoc_save_version_date_aux:nnn {#4} {#3} {#2} }
+ {
+ \__fdudoc_if_date_later:nnT {#3} {#2}
+ { \__fdudoc_save_version_date_aux:nnn {#4} {#1} {#3} }
+ }
+ }
+\cs_new_protected:Npn \__fdudoc_save_version_date_aux:nnn #1#2#3
+ { \prop_gput:Nnn \g__fdudoc_version_date_prop {#1} { {#2} {#3} } }
+\prg_new_conditional:Npnn \__fdudoc_if_date_later:nn #1#2 { TF, T }
+ {
+ \if_int_compare:w
+ \__fdudoc_parse_date:w #1 / / / 0 \q_stop >
+ \__fdudoc_parse_date:w #2 / / / 0 \q_stop \exp_stop_f:
+ \prg_return_true:
+ \else:
+ \prg_return_false:
+ \fi:
+ }
+\cs_new:Npn \__fdudoc_parse_date:w #1/#2/#3/ #4 \q_stop
+ { #1#2#3 }
+\cs_new_protected:Npn \CTEX@versionitem #1 \efill
+ {
+ \@idxitem
+ \prop_get:NnNTF \g__fdudoc_version_date_prop
+ {#1} \l__fdudoc_tmpa_tl
+ {
+ \exp_after:wN
+ \__fdudoc_print_version_date:nnn \l__fdudoc_tmpa_tl
+ {#1}
+ }
+ { \BOOM }
+ }
+\cs_new_protected:Npn \__fdudoc_print_version_date:nnn #1#2#3
+ {
+ \noindent
+ \Hy@raisedlink { \belowpdfbookmark {#3} { HD.#3 } }
+ \textbf {#3} \hfill
+ \hbox:n
+ {
+ \footnotesize
+ \str_if_eq:nnTF {#1} {#2}
+ { ( #1 ) } { ( #1 ~ -- ~ #2 ) }
+ }
+ \par \nopagebreak
+ }
+\ctex_patch_cmd:Nnn \HDorg@theglossary
+ { \let \item \@idxitem }
+ { \let \item \CTEX@versionitem }
+\ctex_patch_cmd:Nnn \@wrglossary
+ { hdpindex }
+ {
+ \ifnum \c@HD@hypercount = \z@
+ hdpindex
+ \else
+ hdclindex { \the \c@HD@hypercount }
+ \fi
+ }
+\ctex_patch_cmd:Nnn \@addtocurcol
+ { \vskip \intextsep }
+ {
+ \edef \save@first@penalty { \the \lastpenalty } \unpenalty
+ \ifnum \lastpenalty = \@M
+ \unpenalty
+ \else
+ \penalty \save@first@penalty \relax
+ \fi
+ \ifnum \outputpenalty < -\@Mii
+ \addvspace\intextsep
+ \vskip\parskip
+ \else
+ \addvspace\intextsep
+ \fi
+ }
+\ctex_patch_cmd:Nnn \@addtocurcol
+ {
+ \vskip \intextsep
+ \ifnum \outputpenalty < -\@Mii
+ \vskip -\parskip
+ \fi
+ }
+ {
+ \ifnum \outputpenalty < -\@Mii
+ \aftergroup \vskip \aftergroup \intextsep
+ \aftergroup \nointerlineskip
+ \else
+ \vskip \intextsep
+ \fi
+ }
+\ctex_patch_cmd:Nnn \@getpen { \@M } { \@Mi }
+\ctex_patch_cmd:Nnn \l@section { 2.5em } { 1.5em }
+\ctex_patch_cmd:Nnn \l@subsection { 2.5em } { 1.5em }
+\__fdudoc_preto_cmd:Nn \@thehead
+ { \cs_set_eq:cN { MakeUppercase \space } \@iden }
+\ctex_patch_cmd:Nnn \HDorg@thebibliography
+ { \section* } { \section }
+\cs_set_eq:NN \thebibliography \HDorg@thebibliography
+\__fdudoc_appto_cmd:Nn \GlossaryParms
+ {
+ \raggedcolumns
+ \cs_set_eq:NN \Hy@writebookmark \HDorg@writebookmark
+ \cs_set:Npn \@idxitem { \par \hangindent 2em }
+ \cs_set:Npn \subitem { \@idxitem \hspace* { 1em } }
+ \cs_set:Npn \subsubitem { \@idxitem \hspace* { 2em } }
+ }
+\ctex_patch_cmd:Nnn \HoLogo@LaTeXe
+ { \hbox { \HOLOGO@MathSetup 2 $ _{ \textstyle \varepsilon } $ } }
+ {
+ \hbox
+ {
+ \mathsurround 0pt \relax
+ 2
+ \if b \expandafter \@car \f@series \@nil
+ $ _{ \textstyle \symbf { \varepsilon } } $
+ \else
+ $ _{ \textstyle \varepsilon } $
+ \fi
+ }
+ }
+\ctex_patch_cmd:Nnn \SpecialMainEnvIndex
+ { (environment) } { ~ 环境 }
+\ctex_patch_cmd:Nnn \SpecialMainEnvIndex
+ { environments: } { 环境: }
+\ctex_patch_cmd:Nnn \HDorg@SpecialEnvIndex
+ { (environment) } { ~ 环境 }
+\ctex_patch_cmd:Nnn \HDorg@SpecialEnvIndex
+ { environments: } { 环境: }
+\cs_set_eq:NN \list \__codedoc_oldlist:nn
+\__fdudoc_patch_cmd:Nnn \__codedoc_function_descr_start:w
+ { \noindent }
+ { \skip_vertical:n { -\parskip } \noindent }
+\__fdudoc_preto_cmd:Nn \__codedoc_function_assemble:
+ {
+ \box_if_empty:NTF \g__codedoc_syntax_box
+ { \skip_zero:N \medskipamount }
+ { \skip_add:Nn \medskipamount { \parskip } }
+ }
+\__fdudoc_patch_cmd:Nnn \__codedoc_typeset_functions:
+ { \small \ttfamily } { \footnotesize \ttfamily }
+\__fdudoc_preto_cmd:Nn \__codedoc_typeset_functions:
+ { \MacroFont }
+\__fdudoc_patch_cmd:Nnn \__codedoc_macro_init:
+ { \hbox:n } { \MacroFont \hbox:n }
+\__fdudoc_patch_cmd:Nnn \__codedoc_macro_dump:
+ { \hbox_unpack_drop:N } { \MacroFont \hbox_unpack_drop:N }
+\__fdudoc_patch_cmd:Nnn \__codedoc_meta_original:n
+ { \ensuremath \langle } { \textlangle }
+\__fdudoc_patch_cmd:Nnn \__codedoc_meta_original:n
+ { \ensuremath \rangle } { \textrangle }
+\cs_set_eq:NN \__codedoc_macro_end_style:n \use_none:n
+\cs_set_protected:Npn \__codedoc_typeset_TF:
+ {
+ \group_begin:
+ \exp_args:No \__codedoc_if_macro_internal:nT \l__codedoc_tmpa_tl
+ { \color [ gray ] { 0.5 } }
+ \itshape TF
+ \makebox [ 0 pt ] [ r ]
+ {
+ \color { red }
+ \underline { \phantom { \itshape TF } \kern -0.1 em }
+ }
+ \group_end:
+ }
+\cs_set_protected:Npn \__codedoc_macro_typeset_one:nN #1#2
+ {
+ \vbox_set:Nn \l__codedoc_macro_box
+ {
+ \MacroFont
+ \vbox_unpack_drop:N \l__codedoc_macro_box
+ \hbox_set:Nn \l_tmpa_box
+ { \__codedoc_print_macroname:nN {#1} #2 }
+ \dim_set:Nn \l_tmpa_dim
+ { \marginparwidth - \labelsep - \marginparsep }
+ \dim_compare:nNnT { \box_wd:N \l_tmpa_box } > \l_tmpa_dim
+ {
+ \box_resize_to_wd_and_ht:Nnn \l_tmpa_box
+ { \l_tmpa_dim } { \box_ht:N \l_tmpa_box }
+ }
+ \hbox_overlap_left:n
+ {
+ \box_use:N \l_tmpa_box
+ \skip_horizontal:n { \marginparsep - \labelsep }
+ }
+ }
+ \int_incr:N \l__codedoc_macro_int
+ }
+\cs_set_protected:Npn \__codedoc_print_macroname:nN #1#2
+ {
+ \strut
+ \__codedoc_get_hyper_target:xN
+ {
+ \exp_not:n {#1}
+ \bool_if:NT #2 { \tl_to_str:n {TF} }
+ }
+ \l__codedoc_tmpa_tl
+ \cs_if_exist:cTF { r@ \l__codedoc_tmpa_tl }
+ { \exp_args:NNo \label@hyperref [ \l__codedoc_tmpa_tl ] }
+ { \use:n }
+ {
+ \tl_set:Nn \l__codedoc_tmpa_tl {#1}
+ \tl_replace_all:Non \l__codedoc_tmpa_tl
+ { \c_catcode_other_space_tl }
+ { \fontspec_visible_space: }
+ \__codedoc_macroname_prefix:o \l__codedoc_tmpa_tl
+ \__codedoc_macroname_suffix:N #2
+ }
+ }
+\cs_set_protected:Npn \__codedoc_special_index_module:nnnnN #1#2#3#4#5
+ {
+ \use:x
+ {
+ \exp_not:n { \__codedoc_special_index_aux:nnnnnnn {#1} {#2} }
+ \tl_if_empty:nTF {#3}
+ { { } { } { } { } }
+ {
+ \str_if_eq:eeTF {#3} { TeX }
+ {
+ { TeX~ and~ LaTeX2e }
+ { \string \TeX{}~ 和~ \string \LaTeXe{} }
+ }
+ { {#3} { \string \pkg {#3} } }
+ \bool_if:NTF #5
+ { { commands~ internal } { ~ 内部命令: } }
+ { { commands } { ~ 命令: } }
+ }
+ }
+ {#4}
+ }
+\cs_new_protected:Npn \__codedoc_special_index_aux:nnnnnnn #1#2#3#4#5#6#7
+ {
+ \tl_set:Nn \l__codedoc_index_escaped_key_tl {#1}
+ \__codedoc_quote_special_char:N \l__codedoc_index_escaped_key_tl
+ \__codedoc_special_index_set:Nn
+ \l__codedoc_index_escaped_macro_tl {#2}
+ \str_if_eq:onTF { \@currenvir } { macrocode }
+ { \codeline@wrindex }
+ {
+ \str_case:nnF {#7}
+ {
+ { main } { \codeline@wrindex }
+ { usage } { \index }
+ }
+ { \HD@target \index }
+ }
+ {
+ \tl_if_empty:nF { #3 #4 #5 #6 }
+ { #3 #5 \actualchar #4 #6 \levelchar }
+ \l__codedoc_index_escaped_key_tl
+ \actualchar
+ {
+ \token_to_str:N \verbatim@font \c_space_tl
+ \l__codedoc_index_escaped_macro_tl
+ }
+ \encapchar
+ hdclindex { \the \c@HD@hypercount } {#7}
+ }
+ }
+\DeclareDocumentCommand \StopSpecialIndexModule { }
+ {
+ \cs_set_eq:NN
+ \__codedoc_special_index_module:nnnnN \use_none:nnnnn
+ }
+\tl_map_inline:nn { \actualchar \encapchar \levelchar }
+ { \exp_args:Nx \DoNotIndex { \bslash \tl_to_str:N #1 } }
+\RenewDocumentCommand \meta { m }
+ {
+ \group_begin:
+ \sys_if_engine_xetex:T { \xeCJKsetup { CJKecglue = { } } }
+ \__codedoc_meta:n {#1}
+ \group_end:
+ }
+\msg_redirect_name:nnn { l3doc } { foreign-internal } { log }
+\msg_redirect_name:nnn { l3doc } { print-changes-howto } { log }
+\msg_redirect_name:nnn { l3doc } { print-index-howto } { log }
+\ExplSyntaxOff
+\AtBeginDocument{%
+ \addtocontents{toc}{\StopSpecialIndexModule}}
+\pdfstringdefDisableCommands{%
+ \let\path\meta
+ \let\opt\@firstofone}
+\let\@multitoc@starttoc\@starttoc
+\renewcommand*\@starttoc[1]{%
+ \begin{multicols}{2}%
+ \@multitoc@starttoc{#1}%
+ \end{multicols}}
+\renewcommand\@makefntext[1]{\parindent 0em\noindent\@makefnmark~#1}
+\IndexPrologue{%
+ \section{\indexname}%
+ \textit{意大利体的数字表示对应索引项出现的页码;
+ 带下划线的数字表示定义对应索引项的代码行号;
+ 其他则表示使用对应索引项的代码行号。}}
+\def\IndexLayout{%
+ \newgeometry{%
+ left = 0.85 in,
+ right = 0.85 in,
+ top = 1.25 in,
+ bottom = 1.00 in}%
+ \setlength\IndexMin{0.5\textheight}%
+ \ctexset{section/numbering=false}%
+ \StopSpecialIndexModule}
+\def\indexname{代码索引}
+\GlossaryPrologue{\section{\glossaryname}}
+\def\glossaryname{修订记录}
+\setmainfont{LibertinusSerif}[%
+ Extension = .otf,
+ UprightFont = *-Regular,
+ BoldFont = *-Bold,
+ ItalicFont = *-Italic,
+ BoldItalicFont = *-BoldItalic,
+ Scale = 1.1]
+\setsansfont{IBMPlexSansCondensed}[%
+ Extension = .otf,
+ UprightFont = *-Regular,
+ BoldFont = *-Bold,
+ ItalicFont = *-Italic,
+ BoldItalicFont = *-BoldItalic]
+% \setmonofont{Iosevka Slab}[%
+% UprightFont = * Light,
+% BoldFont = * Semibold,
+% ItalicFont = * Light Oblique,
+% BoldItalicFont = * Semibold Oblique,
+% Scale = MatchLowercase]
+\setmonofont{cmun}[%
+ Extension = .otf,
+ UprightFont = *btl,
+ BoldFont = *tb,
+ ItalicFont = *bto,
+ BoldItalicFont = *tx,
+ HyphenChar = None]
+\setmathfont{LibertinusMath-Regular.otf}
+\setmathfont {NewCMMath-Book}
+ [
+ Extension = .otf,
+ StylisticSet = 1,
+ range = { \subsetneqq, \supsetneqq, \checkmark} ,
+ ]
+\setCJKmainfont{Source Han Serif SC}[%
+ ItalicFont = FZKai-Z03,
+ CharacterWidth = Full]
+\setCJKsansfont{Source Han Sans SC}[%
+ ItalicFont = *,
+ CharacterWidth = Full]
+\setCJKmonofont{Source Han Sans SC}[%
+ UprightFont = * Normal,
+ BoldFont = * Bold,
+ AutoFakeSlant = 0.1763, % = tan(10 deg)
+ Scale = 0.8903,
+ CharacterWidth = Full]
+\ctexset{%
+ section/name = {第,节},
+ section/format+ = \raggedright,
+ paragraph/runin = false,
+ paragraph/numbering = false,
+ punct = kaiming}
+\xeCJKsetwidth{·}{0.5em}
+\setcounter{secnumdepth}{4}
+\setcounter{tocdepth}{3}
+\pagestyle{plain}
+\sisetup{%
+ inter-unit-product = \ensuremath{{}\cdot{}},
+ range-phrase = {--},
+ uncertainty-mode = separate}
+\hypersetup{%
+ bookmarksdepth = 4,
+ bookmarksnumbered = true,
+ colorlinks = true,
+ citecolor = MaterialGreen,
+ linkcolor = MaterialPink,
+ urlcolor = MaterialIndigo}
+\captionsetup{labelsep=quad, font+=bf}
+\newcolumntype{C}{>{\centering\arraybackslash}X}
+\setlist{noitemsep, topsep=\smallskipamount}
+\setlist[1]{labelindent=\parindent}
+\setlist[enumerate]{leftmargin=*}
+\setlist[itemize]{leftmargin=*}
+\newlist{optdesc}{description}{3}
+\setlist[optdesc]{%
+ font = \mdseries\small\ttfamily,
+ align = right,
+ listparindent = \parindent,
+ labelsep = \marginparsep,
+ labelindent = -\marginparsep,
+ leftmargin = *}
+\renewlist{tablenotes}{description}{1}
+\setlist[tablenotes]{%
+ format = \normalfont\itshape\tnote@item,
+ labelwidth = 0.5em,
+ itemindent = 0pt,
+ rightmargin = \tabcolsep,
+ leftmargin = \the\dimexpr\tabcolsep+1em\relax,
+ after = \@noparlisttrue}
+\AtBeginEnvironment{tablenotes}{%
+ \setlength\parindent{2\ccwd}%
+ \normalfont\footnotesize}
+\AtBeginEnvironment{threeparttable}{%
+ \stepcounter{tpt@id}%
+ \edef\curr@tpt@id{tpt@\arabic{tpt@id}}}
+\newcounter{tpt@id}
+\def\tnote@item#1{%
+ \Hy@raisedlink{\hyper@anchor{\curr@tpt@id-#1}}#1}
+\def\TPTtagStyle#1{\textit{\hyperlink{\curr@tpt@id-#1}{#1}}}
+\def\UrlAlphabet{%
+ \do\a\do\b\do\c\do\d\do\e\do\f\do\g\do\h\do\i\do\j%
+ \do\k\do\l\do\m\do\n\do\o\do\p\do\q\do\r\do\s\do\t%
+ \do\u\do\v\do\w\do\x\do\y\do\z\do\A\do\B\do\C\do\D%
+ \do\E\do\F\do\G\do\H\do\I\do\J\do\K\do\L\do\M\do\N%
+ \do\O\do\P\do\Q\do\R\do\S\do\T\do\U\do\V\do\W\do\X%
+ \do\Y\do\Z}
+\def\UrlDigits{%
+ \do\1\do\2\do\3\do\4\do\5\do\6\do\7\do\8\do\9\do\0}
+\g@addto@macro\UrlBreaks{\UrlOrds}
+\g@addto@macro\UrlBreaks{\UrlAlphabet}
+\g@addto@macro\UrlBreaks{\UrlDigits}
+\DoNotIndex{\begin,\end,
+ \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,
+ \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,
+ \0,\1,\2,\3,\4,\5,\6,\7,\8,\9}
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\newcommand*\exptarget{\Hy@raisedlink{\hypertarget{expstar}{}}}
+\newcommand*\rexptarget{\Hy@raisedlink{\hypertarget{rexpstar}{}}}
+\newcommand*\expstar{\hyperlink{expstar}{$^^^^263b$}}
+\newcommand*\rexpstar{\hyperlink{rexpstar}{$^^^^263a$}}
+\ExplSyntaxOn
+\cs_set_eq:NN \__codedoc_typeset_exp: \expstar
+\cs_set_eq:NN \__codedoc_typeset_rexp: \rexpstar
+\ExplSyntaxOff
+\renewcommand*\marg[1]{\{\meta{#1}\}}
+\renewcommand*\oarg[1]{[\meta{#1}]}
+\renewcommand*\parg[1]{(\meta{#1})}
+\DeclareDocumentCommand\opt{m}{\texttt{#1}}
+\DeclareDocumentCommand\kvopt{mm}
+ {\texttt{#1\breakablethinspace=\breakablethinspace#2}}
+\def\breakablethinspace{\hskip 0.16667em\relax}
+\def\syntaxopt#1{\textit{#1}}
+\def\defaultval#1{\textbf{\textup{#1}}}
+\def\syntaxopt@aux#1>{\syntaxopt{#1}}
+\def\defaultval@aux#1){\defaultval{#1}}
+\def\orbar{\textup{\textbar}}
+\def\TF{true\orbar false}
+\def\TTF{\defaultval{true}\orbar false}
+\def\TFF{true\orbar\defaultval{false}}
+\DeclareDocumentEnvironment{arguments}{}
+ {\enumerate[%
+ label={\texttt{\#\arabic*:~}}, labelsep=0pt, nolistsep]}%
+ {\endenumerate}
+\def\TeX{\hologo{TeX}}
+\def\LaTeX{\hologo{LaTeX}}
+\def\LaTeXe{\hologo{LaTeXe}}
+\def\pdfTeX{\hologo{pdfTeX}}
+\def\pdfLaTeX{\hologo{pdfLaTeX}}
+\def\XeTeX{\hologo{XeTeX}}
+\def\XeLaTeX{\hologo{XeLaTeX}}
+\def\LuaTeX{\hologo{LuaTeX}}
+\def\LuaLaTeX{\hologo{LuaLaTeX}}
+\def\AmSLaTeX{\hologo{AmSLaTeX}}
+\def\TeXLive{\TeX\ Live}
+\def\MiKTeX{\hologo{MiKTeX}}
+\def\BibTeX{\hologo{BibTeX}}
+\def\BibTeX{\hologo{BibTeX}}
+\def\biber{\hologo{biber}}
+\def\TikZ{Ti\emph{k}Z}
+\renewcommand*\env[1]{\textbf{\texttt{#1}}}
+\newcommand*\bashcmd[1]{\texttt{#1}}
+\lst@CCPutMacro\lst@ProcessOther {"2D}{\lst@ttfamily{-{}}{-{}}}
+\@empty\z@\@empty
+\lstdefinestyle{style@base}
+ {
+ basewidth = 0.5 em,
+ gobble = 2,
+ lineskip = 2 pt,
+ frame = l,
+ framerule = 1 pt,
+ framesep = 3 pt,
+ escapeinside = {(*}{*)},
+ basicstyle = \small\ttfamily\color{MaterialGrey900},
+ keywordstyle = \bfseries\color{MaterialIndigo},
+ commentstyle = \itshape\color{MaterialGrey600},
+ stringstyle = \color{MaterialRed},
+ backgroundcolor = \color{MaterialGrey50}
+ }
+\lstdefinestyle{style@shell}
+ {
+ style = style@base,
+ rulecolor = \color{MaterialPink},
+ language = bash,
+ alsoletter = {-},
+ emphstyle = \color{MaterialGreen800}
+ }
+\lstdefinestyle{style@latex}
+ {
+ style = style@base,
+ rulecolor = \color{MaterialIndigo},
+ language = [LaTeX]TeX,
+ alsoletter = {*, -},
+ texcsstyle = *\color{MaterialDeepOrange},
+ emphstyle = [1]\color{MaterialGreen800},
+ emphstyle = [2]\color{MaterialTeal}
+ }
+\lstdefinestyle{style@syntax}
+ {
+ basewidth = 0.5 em,
+ gobble = 4,
+ escapeinside = {(*}{*)},
+ language = [LaTeX]TeX,
+ alsoletter = {*, -},
+ basicstyle = \footnotesize\ttfamily\color{MaterialGrey900},
+ keywordstyle = \bfseries\color{MaterialIndigo},
+ commentstyle = \itshape\color{MaterialGrey600},
+ texcsstyle = *\color{MaterialDeepOrange},
+ emphstyle = [1]\color{MaterialGreen800},
+ emphstyle = [2]\color{MaterialTeal}
+ }
+\lstnewenvironment{shellcode}[1][]{%
+ \lstset{style=style@shell, #1}}{}
+\lstnewenvironment{latexcode}[1][]{%
+ \lstset{style=style@latex, breaklines = true, #1}}{}
+\lstnewenvironment{ccnusyntax}[1][]{%
+ \lstset{style=style@syntax, #1}\vspace{-1.8ex}}{}
+\lstdefinelanguage{mylatex}{
+ language={[LaTeX]TeX},
+ texcsstyle =*\color{azure4}\bfseries,
+ keywordstyle=\color{green5}\bfseries,
+ morekeywords={document},
+ autogobble = true,
+ morecomment = [l][\color{gray6}\itshape]{\%},
+}
+
+\newtcblisting{latexexample}[2][]{%
+ % breakable,
+ skin = bicolor,
+ colbacklower = white,
+ fonttitle = \ttfamily,
+ boxrule = 1pt,
+ toprule = 1pt, % top rule weight
+ bottomrule = 1pt, % bottom rule weight
+ left = 2mm,
+ parbox = false,
+ before upper = \indent,
+ title = {#2},
+ #1,
+ listing options = {
+ language = mylatex,
+ % style = tcblatex,
+ numbers = left,
+ % numberfirstline=true,
+ stepnumber=1,
+ numbersep =0pt,
+ numberstyle=\tiny\color{red!75!black},
+ basicstyle = \small\ttfamily,
+ breaklines,
+ % breakatwhitespace,
+ prebreak = {\mbox{$ \rhookswarrow $}},
+ postbreak = {\mbox{$ \lhookrightarrow $\quad}},
+ breakindent = 10pt,
+ autogobble = true,
+ }
+}
+
+
+
+% make line numbers unable to be selected
+% ref: https://liam.page/2013/11/04/LaTeX-listings-copy/
+\ExplSyntaxOn
+\newcommand\emptyaccsupp[1]{
+ \BeginAccSupp{ActualText={}} #1 \EndAccSupp{}
+}
+
+\renewcommand\theFancyVerbLine{
+ \emptyaccsupp{
+ \textcolor[rgb]{0.5, 0.5, 1.0}{
+ \scriptsize\arabic{FancyVerbLine}
+ }
+ }
+}
+\ExplSyntaxOff
+
+
+% option "minted options app" has been added to tcolorbox,
+% "hooks" library since v4.21, see
+% https://github.com/T-F-S/tcolorbox/issues/73
+% \makeatletter
+% \tcbset{
+% % see tcbminted.code.tex, def of "minted options"
+% % minted options/.store in=\kvtcb@minted@options,
+% minted options app/.code=\appto\kvtcb@minted@options{,#1}
+% }
+% \makeatother
+
+% define new option
+\fvset{gobble=0}
+\tcbset{
+ example options/.style={
+ skin=bicolor,
+ colbacklower=white,
+ fonttitle=\sffamily,
+ % minted options app={
+ % % line numbers
+ % linenos,
+ % numberfirstline=true,
+ % stepnumber=1,
+ % numbersep=5pt,
+ % % break point
+ % breakbefore=\\,
+ % }
+ },
+ example title/.style 2 args={
+ title=Example\ifblank{#1}{}{ #1}\ifblank{#2}{}{: #2}
+ }
+}
+
+
+% % new env: example
+% % #1 - <kv list>, tcb-listing options
+% % #2 - <token list>, title
+% \NewTCBListing[auto counter]{latexexample}{ O{} m }{
+% example options,
+% example title={\thetcbcounter}{#2},
+% #1
+% }
+
+% % new env: example*
+% % like example, except that it is un-numbered
+% \NewTCBListing{latexexample*}{ O{} m }{
+% example options,
+% example title={}{#2},
+% #1
+% }
+% %%
diff --git a/macros/xetex/latex/exam-zh/examples/example-multiple.pdf b/macros/xetex/latex/exam-zh/examples/example-multiple.pdf
new file mode 100644
index 0000000000..c60c53e81e
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/examples/example-multiple.pdf
Binary files differ
diff --git a/macros/xetex/latex/exam-zh/examples/example-multiple.tex b/macros/xetex/latex/exam-zh/examples/example-multiple.tex
new file mode 100644
index 0000000000..7f8b695026
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/examples/example-multiple.tex
@@ -0,0 +1,671 @@
+% !TeX encoding = UTF-8
+% !TeX program = xelatex
+% !TeX spellcheck = en_US
+
+
+\documentclass{exam-zh}
+\usepackage{siunitx}
+
+\examsetup{
+ page = {
+ size = a3paper,
+ show-columnline = false
+ },
+ style/fullwidth-stop = catcode,
+ fillin/no-answer-type = none,
+ sealline = {
+ show = true,
+ scope = mod-2,
+ circle-show = false,
+ line-type = solid,
+ odd-info-content = {
+ {\heiti \zihao{4}姓名} {\underline{\hspace*{8em}}},
+ {\heiti \zihao{4}准考证号} {\examsquare{9}},
+ {\heiti \zihao{4}考场号} {\examsquare{2}},
+ {\heiti \zihao{4}座位号} {\examsquare{2}},
+ },
+ odd-info-xshift = 12mm,
+ text = {此卷只装订不密封},
+ text-width = 0.98\textheight,
+ text-format = \zihao{-3}\sffamily,
+ text-xshift = 20mm
+ },
+ square = {
+ x-length = 1.8em,
+ y-length = 1.6em
+ }
+}
+
+
+% 行内公式统一按照行间的样式
+\everymath{\displaystyle}
+
+\title{2021 年普通高等学校招生全国统一考试}
+
+\subject{数学(理科)}
+
+
+\begin{document}
+
+\tableofcontents
+
+\chapter{2021 年普通高等学校招生全国统一考试}
+
+% \information{
+% 姓名\underline{\hspace{6em}},
+% 座位号\underline{\hspace{15em}}
+% }
+% \warning{(在此卷上答题无效)}
+
+\secret
+
+\maketitle
+
+本试卷共 4 页,22 题。全卷满分 150 分。考试用时 120 分钟。
+
+\goodluck
+
+\begin{notice}
+ \item 答题前,先将自己的姓名、准考证号、考场号、座位号填写在试卷和答题卡上,
+ 并将准考证号条形码粘贴在答题卡上的指定位置。
+ \item 选择题的作答:每小题选出答案后,用 2B 铅笔把答题卡上对应题目的答案标号涂黑。
+ 写在试卷、草稿纸和答题卡上的非答题区域均无效。
+ \item 填空题和解答题的作答:用黑色签字笔直接答在答题卡上对应的答题区域内。
+ 写在试卷、草稿纸和答题卡上的非答题区域均无效。
+ \item 考试结束后,请将本试卷和答题卡一并上交。
+\end{notice}
+
+
+
+\section{%
+ 选择题:本题共 8 小题,每小题 5 分,共 40 分。
+ 在每小题给出的四个选项中,只有一项是符合题目要求的。
+}
+
+% 1.
+\begin{question}[points = 2]
+ 设集合 $A = \{x \mid -1 < x < 4\}$,$B = \{2, 3, 4, 5\}$,则 $A \cap B = $ \paren[B]
+
+ \begin{choices}
+ \item $\{2\}$
+ \item $\{2, 3\}$
+ \item $\{3, 4\}$
+ \item $\{2, 3, 4\}$
+ \end{choices}
+\end{question}
+
+% 2.
+\begin{question}
+ 已知 $z = 2 - \iu$,则 $z (\bar{z} + \iu) = $ \paren
+ \begin{choices}
+ \item $6 - 2\iu$
+ \item $2 - 2\iu$
+ \item $6 + 2\iu$
+ \item $4 + 2\iu$
+ \end{choices}
+\end{question}
+
+% 3.
+\begin{question}
+ 已知圆锥的底面半径为 $\sqrt{2}$,其侧面展开图为一个半圆,则该圆锥的母线长为 \paren
+ \begin{choices}
+ \item $2$
+ \item $2 \sqrt{2}$
+ \item $4$
+ \item $4 \sqrt{2}$
+ \end{choices}
+\end{question}
+
+% 4.
+\begin{question}
+ 下列区间中,函数 $f(x) = 7 \sin \left( x - \frac{\uppi}{6} \right)$ 的单调递增区间是 \paren
+ \begin{choices}
+ \item $\left( 0 , \frac{\uppi}{2} \right)$
+ \item $\left( \frac{\uppi}{2} , \uppi \right)$
+ \item $\left( \uppi , \frac{3\uppi}{2} \right)$
+ \item $\left( \frac{3\uppi}{2}, 2\uppi \right)$
+ \end{choices}
+\end{question}
+
+% 5.
+\begin{question}
+ 已知 $F_1$,$F_2$ 是椭圆 $C \colon \frac{x^2}{9} + \frac{y^2}{4} = 1$ 的两个焦点,
+ 点 $M$ 在 $C$ 上,则 $|M F_1| \cdot |M F_2|$ 的最大值为 \paren
+ \begin{choices}
+ \item $13$
+ \item $12$
+ \item $9$
+ \item $6$
+ \end{choices}
+\end{question}
+
+% 6.
+\begin{question}
+ 若 $\tan\theta = -2$,则 $\frac{\sin\theta (1 + \sin 2\theta)}{\sin\theta + \cos\theta} = $ \paren
+ \begin{choices}
+ \item $-\frac{6}{5}$
+ \item $-\frac{2}{5}$
+ \item $\frac{2}{5}$
+ \item $\frac{6}{5}$
+ \end{choices}
+\end{question}
+
+% 7.
+\begin{question}
+ 若过点 $(a, b)$ 可作曲线 $y = \eu^x$ 的两条切线,则 \paren
+ \begin{choices}
+ \item $\eu^b < a$
+ \item $\eu^a < b$
+ \item $0 < a < \eu^b$
+ \item $0 < b < \eu^a$
+ \end{choices}
+\end{question}
+
+% 8.
+\begin{question}
+ 有 $6$ 个相同的球,分别标有数字 $1$,$2$,$3$,$4$,$5$,$6$,从中有放回地随机取两次,每次取 $1$ 个球,
+ 甲表示事件“第一次去出的球的数字是 $1$”,
+ 乙表示事件“第二次取出的球的数字是 $2$”,
+ 丙表示事件“两次取出的球的数字之和是 $8$”,
+ 丁表示事件“两次取出的球的数字之和是 $7$”,则 \paren
+ \begin{choices}
+ \item 甲与丙相互独立
+ \item 甲与丁相互独立
+ \item 乙与丙相互独立
+ \item 丙与丁相互独立
+ \end{choices}
+\end{question}
+
+
+
+\section{%
+ 选择题:本题共 4 小题,每小题 5 分,共 20 分。
+ 在每小题给出的选项中,有多项符合题目要求的。
+ 全部选对的得 5 分,部分选择的得 2 分,有选错的得 0 分。
+}
+
+% 9.
+\begin{question}
+ 有一组样本数据 $x_1, x_2, \dots, x_n$,由 这组数据的到新样本数据 $y_1, y_2, \dots, y_n$,
+ 其中 $y_i = x_i + c$($i = 1, 2, \dots, n$) 为非零常数,则 \paren
+ \begin{choices}
+ \item 两组样本数据的样本平均数相同
+ \item 两组样本数据的样本中位数相同
+ \item 两组样本数据的样本标准差相同
+ \item 两组样本数据的样本极差相同
+ \end{choices}
+\end{question}
+
+% 10.
+\begin{question}
+ 已知 $O$ 为坐标原点,点
+ $P_1(\cos\alpha, \sin\alpha)$,
+ $P_2(\cos\beta , -\sin\alpha)$,
+ $P_3(\cos(\alpha + \beta), \sin(\alpha + \beta))$,
+ $A(1, 0)$ \paren
+ \begin{choices}
+ \item $|\overrightarrow{OP_1}| = |\overrightarrow{OP_2}|$
+ \item $|\overrightarrow{AP_1}| = |\overrightarrow{AP_2}|$
+ \item $\overrightarrow{OA} \cdot \overrightarrow{OP_3}
+ = \overrightarrow{OP_1} \cdot \overrightarrow{OP_2}$
+ \item $\overrightarrow{OA} \cdot \overrightarrow{OP_1}
+ = \overrightarrow{OP_2} \cdot \overrightarrow{OP_3}$
+ \end{choices}
+\end{question}
+
+% 11.
+\begin{question}
+ 已知点 $P$ 在圆 $(x - 5)^2 + (y - 5)^2 = 16$ 上,点 $A(4, 0)$,$B(0, 2)$,则 \paren
+ \begin{choices}
+ \item 点 $P$ 到直线 $AB$ 的距离小于 $10$
+ \item 点 $P$ 到直线 $AB$ 的距离大于 $2$
+ \item 点 $\angle PBA$ 最小时,$|PB| = 3 \sqrt{2}$
+ \item 点 $\angle PBA$ 最大时,$|PB| = 3 \sqrt{2}$
+ \end{choices}
+\end{question}
+
+% 12.
+\begin{question}
+ 在正三棱柱 $ABC$-$A_1 B_1 C_1$ 中,$AB = A A_1 = 1$,点 $P$ 满足
+ $\overrightarrow{BP} = \lambda \overrightarrow{BC} + \mu \overrightarrow{BB_1}$,
+ 其中 $\lambda \in [0, 1]$,$\mu \in [0, 1]$,则 \paren
+ \begin{choices}
+ \item 当 $\lambda = 1$ 时,$\triangle A B_1 P$ 的周长为定值
+ \item 当 $\mu = 1$ 时,三棱锥 $P$-$A_1 B C$ 的体积为定值
+ \item 当 $\lambda = \frac{1}{2}$ 时,有且仅有一个点 $P$,使得 $A_1 P \perp BP$
+ \item 当 $\mu = \frac{1}{2}$ 时,有且仅有一个点 $P$,使得 $A_1 B \perp \text{平面} A B_1 P$
+ \end{choices}
+\end{question}
+
+
+
+\section{填空题:本题共 4 小题,每小题 5 分,共 20 分。}
+
+% 13.
+\begin{question}
+ 已知函数 $f(x) = x^3 (a \cdot 2^x - 2^{-x})$ 是偶函数,则 $a = $ \fillin[$1$] 。
+\end{question}
+
+% 14.
+\begin{question}
+ 已知 $O$ 为坐标原点,抛物线 $C \colon y^2 = 2px$($p > 0$)的焦点为 $F$,
+ $P$ 为 $C$ 上一点,$PF$ 与 $x$ 轴垂直,$Q$ 为 $x$ 轴上一点,且 $PQ \perp OP$,
+ 若 $|FQ| = 6$,则 $C$ 的准线方程为 \fillin[$\dfrac{1}{3}$] 。
+\end{question}
+
+% 15.
+\begin{question}
+ 函数 $f(x) = |2x - 1| - 2 \ln x$ 的最小值为 \fillin[width = 4em][] 。
+\end{question}
+
+% 16.
+\begin{question}
+ 某校学生在研究民间剪纸艺术时,发现剪纸时经常会沿纸的某条对称轴把纸对折。
+ 规格为 \qtyproduct{20 x 12}{dm} 的长方形纸,对折 $1$ 次共可以得到
+ \qtyproduct{10 x 12}{dm}, \qtyproduct{20 x 6}{dm} 两种规格的图形,
+ 它们的面积之和 $S_1 = \qty{240}{dm^2}$,
+ 对折 $2$ 次共可以得到 \qtyproduct{5 x 12}{dm},\qtyproduct{10 x 6}{dm},
+ \qtyproduct{20 x 3}{dm} 三种规格的图形,它们的面积之和 $S_2 = \qty{240}{dm^2}$,
+ 以此类推。则对折 $4$ 次共可以得到不同规格图形的种数为 \fillin ;
+ 如果对折 $n$ 次,那么 $\sum_{k=1}^n S_k = $ \fillin \unit{dm^2}。
+\end{question}
+
+
+
+\section{解答题:本题共 6 小题,共 70 分。解答应写出文字说明、证明过程或者演算步骤。}
+
+% 17.
+\begin{problem}[points = 10]
+ 已知数列 $\{a_n\}$ 满足 $a_1 = 1$,$a_{n+1} =
+ \begin{cases}
+ a_n + 1, \quad \text{$n$ 为奇数,} \\
+ a_n + 2, \quad \text{$n$ 为偶数。}
+ \end{cases}$
+ \begin{enumerate}
+ \item 记 $b_n = a_{2n}$,写出 $b_1$,$b_2$,并求数列 $\{b_n\}$ 的通项公式;
+ \item 求 $\{a_n\}$ 的前 $20$ 项和。
+ \end{enumerate}
+\end{problem}
+
+% 18.
+\begin{problem}[points = 12]
+ 某学校组织“一带一路”知识竞赛,有 A,B 两类问题。
+ 每位参加比赛的同学现在两类问题中选择一类并从中随机抽取一个问题回答,
+ 若回答错误则该同学比赛结束;
+ 若回答正确则从另一类问题中再随机抽取一个问题回答,无论回答正确与否,该同学比赛结束。
+ A 类问题中的每个问题回答正确的 $20$ 分,否则得 $0$ 分;
+ B 类问题中的每个问题回答正确的 $80$ 分,否则得 $0$ 分。
+
+ 已知小明能正确回答 A 类问题的概率为 $0.8$,能正确回答 B 类问题的概率为 $0.6$,
+ 且能正确回答问题的概率与回答次序无关。
+ \begin{enumerate}
+ \item 若小明先回答 A 类问题,记 $X$ 为小明的累计得分,求 $X$ 的分布列;
+ \item 为使累计得分的期望最大,小明应选择先回答哪类问题?并说明理由。
+ \end{enumerate}
+\end{problem}
+
+% 19.
+\begin{problem}[points = 12]
+ 记 $\triangle ABC$ 的内角 $A$,$B$,$C$ 的对边分别为 $a$,$b$,$c$。
+ 已知 $b^2 = ac$,点 $D$ 在边 $AC$ 上,$BD \sin\angle ABC = a \sin C$。
+ \nopagebreak
+ \begin{enumerate}
+ \item 证明:$BD = b$;
+ \item 若 $AD = 2 DC$,求 $\cos\angle ABC$。
+ \end{enumerate}
+\end{problem}
+
+% 20.
+\begin{problem}[points = 12]
+ 如图,在三棱锥 $A$-$BCD$ 中,$\text{平面} ABD \perp \text{平面} BCD$,
+ $AB = AD$,$O$ 为 $BD$ 的重点。
+ \begin{enumerate}
+ \item 证明:$OA \perp CD$;
+ \item 若 $\triangle OCD$ 是变长为 $1$ 的等边三角形,点 $E$ 在棱 $AD$ 上,
+ $DE = 2 EA$,且二面角 $E$-$BC$-$D$ 的大小为 \ang{45},
+ 求三棱锥 $A$-$BCD$ 的体积。
+ \end{enumerate}
+\end{problem}
+
+% 21.
+\begin{problem}[points = 12]
+ 在平面直角坐标系 $xOy$ 中,已知点 $F_1 (-\sqrt{17}, 0)$,$F_2 (\sqrt{17}, 0)$,
+ 点 $M$ 满足 $|M F_1| - |M F_2| = 2$。记 $M$ 的轨迹为 $C$。
+ \begin{enumerate}
+ \item 求 $C$ 的方程;
+ \item 设点 $T$ 在直线 $x = \frac{1}{2}$ 上,过 $T$ 的两条直线分别交 $C$ 于 $A$,
+ $B$ 亮点和 $P$,$Q$ 亮点,且 $|TA| \cdot |TB| = |TP| \cdot |TQ|$,
+ 求直线 $AB$ 的斜率与直线 $PQ$ 的斜率之和。
+ \end{enumerate}
+\end{problem}
+
+% 22.
+\begin{problem}[points = 12]
+ 已知函数 $f(x) = x (1 - \ln x)$。
+ \begin{enumerate}
+ \item 讨论 $f(x)$ 的单调性;
+ \item 设 $a$,$b$ 为两个不相等的正数,且 $b \ln a - a \ln b = a - b$,
+ 证明:$2 < \frac{1}{a} + \frac{1}{b} < \eu$。
+ \end{enumerate}
+\end{problem}
+
+\begin{solution}
+ 函数的定义域为 $(0, +\infty)$,
+ 又 \[f^{\prime}(x) = 1 - \ln x-1 = -\ln x, \score{2}\]
+ 当 $x \in(0, 1)$ 时, $f^{\prime}(x) > 0$, 当 $x \in(1, +\infty)$ 时, $f^{\prime}(x) < 0$,
+ 故 $f(x)$ 的递增区间为 $(0,1)$, 递减区间为 $(1, +\infty)$.
+\end{solution}
+
+
+
+\chapter{2023 年普通高等学校招生全国统一考试}
+
+% \information{
+% 姓名\underline{\hspace{6em}},
+% 座位号\underline{\hspace{15em}}
+% }
+% \warning{(在此卷上答题无效)}
+
+\secret
+
+\title{2023 年普通高等学校招生全国统一考试}
+
+\subject{数学(理科)}
+
+\maketitle
+
+本试卷共 4 页,22 题。全卷满分 150 分。考试用时 120 分钟。
+
+\goodluck
+
+\begin{notice}
+ \item 答题前,先将自己的姓名、准考证号、考场号、座位号填写在试卷和答题卡上,
+ 并将准考证号条形码粘贴在答题卡上的指定位置。
+ \item 选择题的作答:每小题选出答案后,用 2B 铅笔把答题卡上对应题目的答案标号涂黑。
+ 写在试卷、草稿纸和答题卡上的非答题区域均无效。
+ \item 填空题和解答题的作答:用黑色签字笔直接答在答题卡上对应的答题区域内。
+ 写在试卷、草稿纸和答题卡上的非答题区域均无效。
+ \item 考试结束后,请将本试卷和答题卡一并上交。
+\end{notice}
+
+
+
+\section{%
+ 选择题:本题共 8 小题,每小题 5 分,共 40 分。
+ 在每小题给出的四个选项中,只有一项是符合题目要求的。
+}
+
+% 1.
+\begin{question}[points = 2]
+ 设集合 $A = \{x \mid -1 < x < 4\}$,$B = \{2, 3, 4, 5\}$,则 $A \cap B = $ \paren[B]
+
+ \begin{choices}
+ \item $\{2\}$
+ \item $\{2, 3\}$
+ \item $\{3, 4\}$
+ \item $\{2, 3, 4\}$
+ \end{choices}
+\end{question}
+
+% 2.
+\begin{question}
+ 已知 $z = 2 - \iu$,则 $z (\bar{z} + \iu) = $ \paren
+ \begin{choices}
+ \item $6 - 2\iu$
+ \item $2 - 2\iu$
+ \item $6 + 2\iu$
+ \item $4 + 2\iu$
+ \end{choices}
+\end{question}
+
+% 3.
+\begin{question}
+ 已知圆锥的底面半径为 $\sqrt{2}$,其侧面展开图为一个半圆,则该圆锥的母线长为 \paren
+ \begin{choices}
+ \item $2$
+ \item $2 \sqrt{2}$
+ \item $4$
+ \item $4 \sqrt{2}$
+ \end{choices}
+\end{question}
+
+% 4.
+\begin{question}
+ 下列区间中,函数 $f(x) = 7 \sin \left( x - \frac{\uppi}{6} \right)$ 的单调递增区间是 \paren
+ \begin{choices}
+ \item $\left( 0 , \frac{\uppi}{2} \right)$
+ \item $\left( \frac{\uppi}{2} , \uppi \right)$
+ \item $\left( \uppi , \frac{3\uppi}{2} \right)$
+ \item $\left( \frac{3\uppi}{2}, 2\uppi \right)$
+ \end{choices}
+\end{question}
+
+% 5.
+\begin{question}
+ 已知 $F_1$,$F_2$ 是椭圆 $C \colon \frac{x^2}{9} + \frac{y^2}{4} = 1$ 的两个焦点,
+ 点 $M$ 在 $C$ 上,则 $|M F_1| \cdot |M F_2|$ 的最大值为 \paren
+ \begin{choices}
+ \item $13$
+ \item $12$
+ \item $9$
+ \item $6$
+ \end{choices}
+\end{question}
+
+% 6.
+\begin{question}
+ 若 $\tan\theta = -2$,则 $\frac{\sin\theta (1 + \sin 2\theta)}{\sin\theta + \cos\theta} = $ \paren
+ \begin{choices}
+ \item $-\frac{6}{5}$
+ \item $-\frac{2}{5}$
+ \item $\frac{2}{5}$
+ \item $\frac{6}{5}$
+ \end{choices}
+\end{question}
+
+% 7.
+\begin{question}
+ 若过点 $(a, b)$ 可作曲线 $y = \eu^x$ 的两条切线,则 \paren
+ \begin{choices}
+ \item $\eu^b < a$
+ \item $\eu^a < b$
+ \item $0 < a < \eu^b$
+ \item $0 < b < \eu^a$
+ \end{choices}
+\end{question}
+
+% 8.
+\begin{question}
+ 有 $6$ 个相同的球,分别标有数字 $1$,$2$,$3$,$4$,$5$,$6$,从中有放回地随机取两次,每次取 $1$ 个球,
+ 甲表示事件“第一次去出的球的数字是 $1$”,
+ 乙表示事件“第二次取出的球的数字是 $2$”,
+ 丙表示事件“两次取出的球的数字之和是 $8$”,
+ 丁表示事件“两次取出的球的数字之和是 $7$”,则 \paren
+ \begin{choices}
+ \item 甲与丙相互独立
+ \item 甲与丁相互独立
+ \item 乙与丙相互独立
+ \item 丙与丁相互独立
+ \end{choices}
+\end{question}
+
+
+
+\section{%
+ 选择题:本题共 4 小题,每小题 5 分,共 20 分。
+ 在每小题给出的选项中,有多项符合题目要求的。
+ 全部选对的得 5 分,部分选择的得 2 分,有选错的得 0 分。
+}
+
+% 9.
+\begin{question}
+ 有一组样本数据 $x_1, x_2, \dots, x_n$,由 这组数据的到新样本数据 $y_1, y_2, \dots, y_n$,
+ 其中 $y_i = x_i + c$($i = 1, 2, \dots, n$) 为非零常数,则 \paren
+ \begin{choices}
+ \item 两组样本数据的样本平均数相同
+ \item 两组样本数据的样本中位数相同
+ \item 两组样本数据的样本标准差相同
+ \item 两组样本数据的样本极差相同
+ \end{choices}
+\end{question}
+
+% 10.
+\begin{question}
+ 已知 $O$ 为坐标原点,点
+ $P_1(\cos\alpha, \sin\alpha)$,
+ $P_2(\cos\beta , -\sin\alpha)$,
+ $P_3(\cos(\alpha + \beta), \sin(\alpha + \beta))$,
+ $A(1, 0)$ \paren
+ \begin{choices}
+ \item $|\overrightarrow{OP_1}| = |\overrightarrow{OP_2}|$
+ \item $|\overrightarrow{AP_1}| = |\overrightarrow{AP_2}|$
+ \item $\overrightarrow{OA} \cdot \overrightarrow{OP_3}
+ = \overrightarrow{OP_1} \cdot \overrightarrow{OP_2}$
+ \item $\overrightarrow{OA} \cdot \overrightarrow{OP_1}
+ = \overrightarrow{OP_2} \cdot \overrightarrow{OP_3}$
+ \end{choices}
+\end{question}
+
+% 11.
+\begin{question}
+ 已知点 $P$ 在圆 $(x - 5)^2 + (y - 5)^2 = 16$ 上,点 $A(4, 0)$,$B(0, 2)$,则 \paren
+ \begin{choices}
+ \item 点 $P$ 到直线 $AB$ 的距离小于 $10$
+ \item 点 $P$ 到直线 $AB$ 的距离大于 $2$
+ \item 点 $\angle PBA$ 最小时,$|PB| = 3 \sqrt{2}$
+ \item 点 $\angle PBA$ 最大时,$|PB| = 3 \sqrt{2}$
+ \end{choices}
+\end{question}
+
+% 12.
+\begin{question}
+ 在正三棱柱 $ABC$-$A_1 B_1 C_1$ 中,$AB = A A_1 = 1$,点 $P$ 满足
+ $\overrightarrow{BP} = \lambda \overrightarrow{BC} + \mu \overrightarrow{BB_1}$,
+ 其中 $\lambda \in [0, 1]$,$\mu \in [0, 1]$,则 \paren
+ \begin{choices}
+ \item 当 $\lambda = 1$ 时,$\triangle A B_1 P$ 的周长为定值
+ \item 当 $\mu = 1$ 时,三棱锥 $P$-$A_1 B C$ 的体积为定值
+ \item 当 $\lambda = \frac{1}{2}$ 时,有且仅有一个点 $P$,使得 $A_1 P \perp BP$
+ \item 当 $\mu = \frac{1}{2}$ 时,有且仅有一个点 $P$,使得 $A_1 B \perp \text{平面} A B_1 P$
+ \end{choices}
+\end{question}
+
+
+
+\section{填空题:本题共 4 小题,每小题 5 分,共 20 分。}
+
+% 13.
+\begin{question}
+ 已知函数 $f(x) = x^3 (a \cdot 2^x - 2^{-x})$ 是偶函数,则 $a = $ \fillin[$1$] 。
+\end{question}
+
+% 14.
+\begin{question}
+ 已知 $O$ 为坐标原点,抛物线 $C \colon y^2 = 2px$($p > 0$)的焦点为 $F$,
+ $P$ 为 $C$ 上一点,$PF$ 与 $x$ 轴垂直,$Q$ 为 $x$ 轴上一点,且 $PQ \perp OP$,
+ 若 $|FQ| = 6$,则 $C$ 的准线方程为 \fillin[$\dfrac{1}{3}$] 。
+\end{question}
+
+% 15.
+\begin{question}
+ 函数 $f(x) = |2x - 1| - 2 \ln x$ 的最小值为 \fillin[width = 4em][] 。
+\end{question}
+
+% 16.
+\begin{question}
+ 某校学生在研究民间剪纸艺术时,发现剪纸时经常会沿纸的某条对称轴把纸对折。
+ 规格为 \qtyproduct{20 x 12}{dm} 的长方形纸,对折 $1$ 次共可以得到
+ \qtyproduct{10 x 12}{dm}, \qtyproduct{20 x 6}{dm} 两种规格的图形,
+ 它们的面积之和 $S_1 = \qty{240}{dm^2}$,
+ 对折 $2$ 次共可以得到 \qtyproduct{5 x 12}{dm},\qtyproduct{10 x 6}{dm},
+ \qtyproduct{20 x 3}{dm} 三种规格的图形,它们的面积之和 $S_2 = \qty{240}{dm^2}$,
+ 以此类推。则对折 $4$ 次共可以得到不同规格图形的种数为 \fillin ;
+ 如果对折 $n$ 次,那么 $\sum_{k=1}^n S_k = $ \fillin \unit{dm^2}。
+\end{question}
+
+
+
+\section{解答题:本题共 6 小题,共 70 分。解答应写出文字说明、证明过程或者演算步骤。}
+
+% 17.
+\begin{problem}[points = 10]
+ 已知数列 $\{a_n\}$ 满足 $a_1 = 1$,$a_{n+1} =
+ \begin{cases}
+ a_n + 1, \quad \text{$n$ 为奇数,} \\
+ a_n + 2, \quad \text{$n$ 为偶数。}
+ \end{cases}$
+ \begin{enumerate}
+ \item 记 $b_n = a_{2n}$,写出 $b_1$,$b_2$,并求数列 $\{b_n\}$ 的通项公式;
+ \item 求 $\{a_n\}$ 的前 $20$ 项和。
+ \end{enumerate}
+\end{problem}
+
+% 18.
+\begin{problem}[points = 12]
+ 某学校组织“一带一路”知识竞赛,有 A,B 两类问题。
+ 每位参加比赛的同学现在两类问题中选择一类并从中随机抽取一个问题回答,
+ 若回答错误则该同学比赛结束;
+ 若回答正确则从另一类问题中再随机抽取一个问题回答,无论回答正确与否,该同学比赛结束。
+ A 类问题中的每个问题回答正确的 $20$ 分,否则得 $0$ 分;
+ B 类问题中的每个问题回答正确的 $80$ 分,否则得 $0$ 分。
+
+ 已知小明能正确回答 A 类问题的概率为 $0.8$,能正确回答 B 类问题的概率为 $0.6$,
+ 且能正确回答问题的概率与回答次序无关。
+ \begin{enumerate}
+ \item 若小明先回答 A 类问题,记 $X$ 为小明的累计得分,求 $X$ 的分布列;
+ \item 为使累计得分的期望最大,小明应选择先回答哪类问题?并说明理由。
+ \end{enumerate}
+\end{problem}
+
+% 19.
+\begin{problem}[points = 12]
+ 记 $\triangle ABC$ 的内角 $A$,$B$,$C$ 的对边分别为 $a$,$b$,$c$。
+ 已知 $b^2 = ac$,点 $D$ 在边 $AC$ 上,$BD \sin\angle ABC = a \sin C$。
+ \nopagebreak
+ \begin{enumerate}
+ \item 证明:$BD = b$;
+ \item 若 $AD = 2 DC$,求 $\cos\angle ABC$。
+ \end{enumerate}
+\end{problem}
+
+% 20.
+\begin{problem}[points = 12]
+ 如图,在三棱锥 $A$-$BCD$ 中,$\text{平面} ABD \perp \text{平面} BCD$,
+ $AB = AD$,$O$ 为 $BD$ 的重点。
+ \begin{enumerate}
+ \item 证明:$OA \perp CD$;
+ \item 若 $\triangle OCD$ 是变长为 $1$ 的等边三角形,点 $E$ 在棱 $AD$ 上,
+ $DE = 2 EA$,且二面角 $E$-$BC$-$D$ 的大小为 \ang{45},
+ 求三棱锥 $A$-$BCD$ 的体积。
+ \end{enumerate}
+\end{problem}
+
+% 21.
+\begin{problem}[points = 12]
+ 在平面直角坐标系 $xOy$ 中,已知点 $F_1 (-\sqrt{17}, 0)$,$F_2 (\sqrt{17}, 0)$,
+ 点 $M$ 满足 $|M F_1| - |M F_2| = 2$。记 $M$ 的轨迹为 $C$。
+ \begin{enumerate}
+ \item 求 $C$ 的方程;
+ \item 设点 $T$ 在直线 $x = \frac{1}{2}$ 上,过 $T$ 的两条直线分别交 $C$ 于 $A$,
+ $B$ 亮点和 $P$,$Q$ 亮点,且 $|TA| \cdot |TB| = |TP| \cdot |TQ|$,
+ 求直线 $AB$ 的斜率与直线 $PQ$ 的斜率之和。
+ \end{enumerate}
+\end{problem}
+
+% 22.
+\begin{problem}[points = 12]
+ 已知函数 $f(x) = x (1 - \ln x)$。
+ \begin{enumerate}
+ \item 讨论 $f(x)$ 的单调性;
+ \item 设 $a$,$b$ 为两个不相等的正数,且 $b \ln a - a \ln b = a - b$,
+ 证明:$2 < \frac{1}{a} + \frac{1}{b} < \eu$。
+ \end{enumerate}
+\end{problem}
+
+\begin{solution}
+ 函数的定义域为 $(0, +\infty)$,
+ 又 \[f^{\prime}(x) = 1 - \ln x-1 = -\ln x, \score{2}\]
+ 当 $x \in(0, 1)$ 时, $f^{\prime}(x) > 0$, 当 $x \in(1, +\infty)$ 时, $f^{\prime}(x) < 0$,
+ 故 $f(x)$ 的递增区间为 $(0,1)$, 递减区间为 $(1, +\infty)$.
+\end{solution}
+\end{document}
diff --git a/macros/xetex/latex/exam-zh/examples/example-single.pdf b/macros/xetex/latex/exam-zh/examples/example-single.pdf
new file mode 100644
index 0000000000..e5ed1a8d33
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/examples/example-single.pdf
Binary files differ
diff --git a/macros/xetex/latex/exam-zh/examples/example-single.tex b/macros/xetex/latex/exam-zh/examples/example-single.tex
new file mode 100644
index 0000000000..04206986cd
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/examples/example-single.tex
@@ -0,0 +1,337 @@
+\documentclass{exam-zh}
+\usepackage{siunitx}
+
+\examsetup{
+ page/size=a4paper,
+ paren/show-paren=true,
+ paren/show-answer=true,
+ fillin/show-answer=true,
+ solution/show-solution=true,
+}
+
+\ExamPrintAnswerSet{
+ sealline/show=true,
+ page/size=a3paper,
+ paren/show-answer=false,
+ fillin/show-answer=false,
+ solution/show-solution=false,
+}
+
+
+\everymath{\displaystyle}
+
+\title{2021 年普通高等学校招生全国统一考试}
+
+\subject{数学(理科)}
+
+
+
+\begin{document}
+
+\information{
+ 姓名\underline{\hspace{6em}},
+ 座位号\underline{\hspace{15em}}
+}
+\warning{(在此卷上答题无效)}
+
+\secret
+
+\maketitle
+
+本试卷共 4 页,22 题。全卷满分 150 分。考试用时 120 分钟。
+
+\goodluck
+
+\begin{notice}
+ \item 答题前,先将自己的姓名、准考证号、考场号、座位号填写在试卷和答题卡上,
+ 并将准考证号条形码粘贴在答题卡上的指定位置。
+ \item 选择题的作答:每小题选出答案后,用 2B 铅笔把答题卡上对应题目的答案标号涂黑。
+ 写在试卷、草稿纸和答题卡上的非答题区域均无效。
+ \item 填空题和解答题的作答:用黑色签字笔直接答在答题卡上对应的答题区域内。
+ 写在试卷、草稿纸和答题卡上的非答题区域均无效。
+ \item 考试结束后,请将本试卷和答题卡一并上交。
+\end{notice}
+
+
+
+\section{%
+ 选择题:本题共 8 小题,每小题 5 分,共 40 分。
+ 在每小题给出的四个选项中,只有一项是符合题目要求的。
+}
+
+% 1.
+\begin{question}[points = 2]
+ 设集合 $A = \{x \mid -1 < x < 4\}$,$B = \{2, 3, 4, 5\}$,则 $A \cap B = $ \paren[B]
+
+ \begin{choices}
+ \item $\{2\}$
+ \item $\{2, 3\}$
+ \item $\{3, 4\}$
+ \item $\{2, 3, 4\}$
+ \end{choices}
+\end{question}
+
+% 2.
+\begin{question}
+ 已知 $z = 2 - \iu$,则 $z (\bar{z} + \iu) = $ \paren
+ \begin{choices}
+ \item $6 - 2\iu$
+ \item $2 - 2\iu$
+ \item $6 + 2\iu$
+ \item $4 + 2\iu$
+ \end{choices}
+\end{question}
+
+% 3.
+\begin{question}
+ 已知圆锥的底面半径为 $\sqrt{2}$,其侧面展开图为一个半圆,则该圆锥的母线长为 \paren
+ \begin{choices}
+ \item $2$
+ \item $2 \sqrt{2}$
+ \item $4$
+ \item $4 \sqrt{2}$
+ \end{choices}
+\end{question}
+
+% 4.
+\begin{question}
+ 下列区间中,函数 $f(x) = 7 \sin \left( x - \frac{\uppi}{6} \right)$ 的单调递增区间是 \paren
+ \begin{choices}
+ \item $\left( 0 , \frac{\uppi}{2} \right)$
+ \item $\left( \frac{\uppi}{2} , \uppi \right)$
+ \item $\left( \uppi , \frac{3\uppi}{2} \right)$
+ \item $\left( \frac{3\uppi}{2}, 2\uppi \right)$
+ \end{choices}
+\end{question}
+
+% 5.
+\begin{question}
+ 已知 $F_1$,$F_2$ 是椭圆 $C \colon \frac{x^2}{9} + \frac{y^2}{4} = 1$ 的两个焦点,
+ 点 $M$ 在 $C$ 上,则 $|M F_1| \cdot |M F_2|$ 的最大值为 \paren
+ \begin{choices}
+ \item $13$
+ \item $12$
+ \item $9$
+ \item $6$
+ \end{choices}
+\end{question}
+
+% 6.
+\begin{question}
+ 若 $\tan\theta = -2$,则 $\frac{\sin\theta (1 + \sin 2\theta)}{\sin\theta + \cos\theta} = $ \paren
+ \begin{choices}
+ \item $-\frac{6}{5}$
+ \item $-\frac{2}{5}$
+ \item $\frac{2}{5}$
+ \item $\frac{6}{5}$
+ \end{choices}
+\end{question}
+
+% 7.
+\begin{question}
+ 若过点 $(a, b)$ 可作曲线 $y = \eu^x$ 的两条切线,则 \paren
+ \begin{choices}
+ \item $\eu^b < a$
+ \item $\eu^a < b$
+ \item $0 < a < \eu^b$
+ \item $0 < b < \eu^a$
+ \end{choices}
+\end{question}
+
+% 8.
+\begin{question}
+ 有 $6$ 个相同的球,分别标有数字 $1$,$2$,$3$,$4$,$5$,$6$,从中有放回地随机取两次,每次取 $1$ 个球,
+ 甲表示事件“第一次去出的球的数字是 $1$”,
+ 乙表示事件“第二次取出的球的数字是 $2$”,
+ 丙表示事件“两次取出的球的数字之和是 $8$”,
+ 丁表示事件“两次取出的球的数字之和是 $7$”,则 \paren
+ \begin{choices}
+ \item 甲与丙相互独立
+ \item 甲与丁相互独立
+ \item 乙与丙相互独立
+ \item 丙与丁相互独立
+ \end{choices}
+\end{question}
+
+
+
+\section{%
+ 选择题:本题共 4 小题,每小题 5 分,共 20 分。
+ 在每小题给出的选项中,有多项符合题目要求的。
+ 全部选对的得 5 分,部分选择的得 2 分,有选错的得 0 分。
+}
+
+% 9.
+\begin{question}
+ 有一组样本数据 $x_1, x_2, \dots, x_n$,由 这组数据的到新样本数据 $y_1, y_2, \dots, y_n$,
+ 其中 $y_i = x_i + c$($i = 1, 2, \dots, n$) 为非零常数,则 \paren
+ \begin{choices}
+ \item 两组样本数据的样本平均数相同
+ \item 两组样本数据的样本中位数相同
+ \item 两组样本数据的样本标准差相同
+ \item 两组样本数据的样本极差相同
+ \end{choices}
+\end{question}
+
+% 10.
+\begin{question}
+ 已知 $O$ 为坐标原点,点
+ $P_1(\cos\alpha, \sin\alpha)$,
+ $P_2(\cos\beta , -\sin\alpha)$,
+ $P_3(\cos(\alpha + \beta), \sin(\alpha + \beta))$,
+ $A(1, 0)$ \paren
+ \begin{choices}
+ \item $|\overrightarrow{OP_1}| = |\overrightarrow{OP_2}|$
+ \item $|\overrightarrow{AP_1}| = |\overrightarrow{AP_2}|$
+ \item $\overrightarrow{OA} \cdot \overrightarrow{OP_3}
+ = \overrightarrow{OP_1} \cdot \overrightarrow{OP_2}$
+ \item $\overrightarrow{OA} \cdot \overrightarrow{OP_1}
+ = \overrightarrow{OP_2} \cdot \overrightarrow{OP_3}$
+ \end{choices}
+\end{question}
+
+% 11.
+\begin{question}
+ 已知点 $P$ 在圆 $(x - 5)^2 + (y - 5)^2 = 16$ 上,点 $A(4, 0)$,$B(0, 2)$,则 \paren
+ \begin{choices}
+ \item 点 $P$ 到直线 $AB$ 的距离小于 $10$
+ \item 点 $P$ 到直线 $AB$ 的距离大于 $2$
+ \item 点 $\angle PBA$ 最小时,$|PB| = 3 \sqrt{2}$
+ \item 点 $\angle PBA$ 最大时,$|PB| = 3 \sqrt{2}$
+ \end{choices}
+\end{question}
+
+% 12.
+\begin{question}
+ 在正三棱柱 $ABC$-$A_1 B_1 C_1$ 中,$AB = A A_1 = 1$,点 $P$ 满足
+ $\overrightarrow{BP} = \lambda \overrightarrow{BC} + \mu \overrightarrow{BB_1}$,
+ 其中 $\lambda \in [0, 1]$,$\mu \in [0, 1]$,则 \paren
+ \begin{choices}
+ \item 当 $\lambda = 1$ 时,$\triangle A B_1 P$ 的周长为定值
+ \item 当 $\mu = 1$ 时,三棱锥 $P$-$A_1 B C$ 的体积为定值
+ \item 当 $\lambda = \frac{1}{2}$ 时,有且仅有一个点 $P$,使得 $A_1 P \perp BP$
+ \item 当 $\mu = \frac{1}{2}$ 时,有且仅有一个点 $P$,使得 $A_1 B \perp \text{平面} A B_1 P$
+ \end{choices}
+\end{question}
+
+
+
+\section{填空题:本题共 4 小题,每小题 5 分,共 20 分。}
+
+% 13.
+\begin{question}
+ 已知函数 $f(x) = x^3 (a \cdot 2^x - 2^{-x})$ 是偶函数,则 $a = $ \fillin[$1$] 。
+\end{question}
+
+% 14.
+\begin{question}
+ 已知 $O$ 为坐标原点,抛物线 $C \colon y^2 = 2px$($p > 0$)的焦点为 $F$,
+ $P$ 为 $C$ 上一点,$PF$ 与 $x$ 轴垂直,$Q$ 为 $x$ 轴上一点,且 $PQ \perp OP$,
+ 若 $|FQ| = 6$,则 $C$ 的准线方程为 \fillin[$\dfrac{1}{3}$] 。
+\end{question}
+
+% 15.
+\begin{question}
+ 函数 $f(x) = |2x - 1| - 2 \ln x$ 的最小值为 \fillin[width = 4em][] 。
+\end{question}
+
+% 16.
+\begin{question}
+ 某校学生在研究民间剪纸艺术时,发现剪纸时经常会沿纸的某条对称轴把纸对折。
+ 规格为 \qtyproduct{20 x 12}{dm} 的长方形纸,对折 $1$ 次共可以得到
+ \qtyproduct{10 x 12}{dm}, \qtyproduct{20 x 6}{dm} 两种规格的图形,
+ 它们的面积之和 $S_1 = \qty{240}{dm^2}$,
+ 对折 $2$ 次共可以得到 \qtyproduct{5 x 12}{dm},\qtyproduct{10 x 6}{dm},
+ \qtyproduct{20 x 3}{dm} 三种规格的图形,它们的面积之和 $S_2 = \qty{240}{dm^2}$,
+ 以此类推。则对折 $4$ 次共可以得到不同规格图形的种数为 \fillin ;
+ 如果对折 $n$ 次,那么 $\sum_{k=1}^n S_k = $ \fillin \unit{dm^2}。
+\end{question}
+
+
+
+\section{解答题:本题共 6 小题,共 70 分。解答应写出文字说明、证明过程或者演算步骤。}
+
+% 17.
+\begin{problem}[points = 10]
+ 已知数列 $\{a_n\}$ 满足 $a_1 = 1$,$a_{n+1} =
+ \begin{cases}
+ a_n + 1, \quad \text{$n$ 为奇数,} \\
+ a_n + 2, \quad \text{$n$ 为偶数。}
+ \end{cases}$
+ \begin{enumerate}
+ \item 记 $b_n = a_{2n}$,写出 $b_1$,$b_2$,并求数列 $\{b_n\}$ 的通项公式;
+ \item 求 $\{a_n\}$ 的前 $20$ 项和。
+ \end{enumerate}
+\end{problem}
+
+% 18.
+\begin{problem}[points = 12]
+ 某学校组织“一带一路”知识竞赛,有 A,B 两类问题。
+ 每位参加比赛的同学现在两类问题中选择一类并从中随机抽取一个问题回答,
+ 若回答错误则该同学比赛结束;
+ 若回答正确则从另一类问题中再随机抽取一个问题回答,无论回答正确与否,该同学比赛结束。
+ A 类问题中的每个问题回答正确的 $20$ 分,否则得 $0$ 分;
+ B 类问题中的每个问题回答正确的 $80$ 分,否则得 $0$ 分。
+
+ 已知小明能正确回答 A 类问题的概率为 $0.8$,能正确回答 B 类问题的概率为 $0.6$,
+ 且能正确回答问题的概率与回答次序无关。
+ \begin{enumerate}
+ \item 若小明先回答 A 类问题,记 $X$ 为小明的累计得分,求 $X$ 的分布列;
+ \item 为使累计得分的期望最大,小明应选择先回答哪类问题?并说明理由。
+ \end{enumerate}
+\end{problem}
+
+% 19.
+\begin{problem}[points = 12]
+ 记 $\triangle ABC$ 的内角 $A$,$B$,$C$ 的对边分别为 $a$,$b$,$c$。
+ 已知 $b^2 = ac$,点 $D$ 在边 $AC$ 上,$BD \sin\angle ABC = a \sin C$。
+ \nopagebreak
+ \begin{enumerate}
+ \item 证明:$BD = b$;
+ \item 若 $AD = 2 DC$,求 $\cos\angle ABC$。
+ \end{enumerate}
+\end{problem}
+
+% 20.
+\begin{problem}[points = 12]
+ 如图,在三棱锥 $A$-$BCD$ 中,$\text{平面} ABD \perp \text{平面} BCD$,
+ $AB = AD$,$O$ 为 $BD$ 的重点。
+ \begin{enumerate}
+ \item 证明:$OA \perp CD$;
+ \item 若 $\triangle OCD$ 是变长为 $1$ 的等边三角形,点 $E$ 在棱 $AD$ 上,
+ $DE = 2 EA$,且二面角 $E$-$BC$-$D$ 的大小为 \ang{45},
+ 求三棱锥 $A$-$BCD$ 的体积。
+ \end{enumerate}
+\end{problem}
+
+% 21.
+\begin{problem}[points = 12]
+ 在平面直角坐标系 $xOy$ 中,已知点 $F_1 (-\sqrt{17}, 0)$,$F_2 (\sqrt{17}, 0)$,
+ 点 $M$ 满足 $|M F_1| - |M F_2| = 2$。记 $M$ 的轨迹为 $C$。
+ \begin{enumerate}
+ \item 求 $C$ 的方程;
+ \item 设点 $T$ 在直线 $x = \frac{1}{2}$ 上,过 $T$ 的两条直线分别交 $C$ 于 $A$,
+ $B$ 亮点和 $P$,$Q$ 亮点,且 $|TA| \cdot |TB| = |TP| \cdot |TQ|$,
+ 求直线 $AB$ 的斜率与直线 $PQ$ 的斜率之和。
+ \end{enumerate}
+\end{problem}
+
+% 22.
+\begin{problem}[points = 12]
+ 已知函数 $f(x) = x (1 - \ln x)$。
+ \begin{enumerate}
+ \item 讨论 $f(x)$ 的单调性;
+ \item 设 $a$,$b$ 为两个不相等的正数,且 $b \ln a - a \ln b = a - b$,
+ 证明:$2 < \frac{1}{a} + \frac{1}{b} < \eu$。
+ \end{enumerate}
+\end{problem}
+
+\begin{solution}
+ 函数的定义域为 $(0, +\infty)$,
+ 又 \[f^{\prime}(x) = 1 - \ln x-1 = -\ln x, \score{2}\]
+ 当 $x \in(0, 1)$ 时, $f^{\prime}(x) > 0$, 当 $x \in(1, +\infty)$ 时, $f^{\prime}(x) < 0$,
+ 故 $f(x)$ 的递增区间为 $(0,1)$, 递减区间为 $(1, +\infty)$.
+\end{solution}
+
+
+\end{document} \ No newline at end of file
diff --git a/macros/xetex/latex/exam-zh/examples/example-single_student_version.pdf b/macros/xetex/latex/exam-zh/examples/example-single_student_version.pdf
new file mode 100644
index 0000000000..ffcc32d9f5
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/examples/example-single_student_version.pdf
Binary files differ
diff --git a/macros/xetex/latex/exam-zh/tex/exam-zh-chinese-english.sty b/macros/xetex/latex/exam-zh/tex/exam-zh-chinese-english.sty
new file mode 100644
index 0000000000..b27dfab271
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/tex/exam-zh-chinese-english.sty
@@ -0,0 +1,665 @@
+%
+% Copyright (c) 2022 Kangwei Xia, Lijun Guo
+% Released under the LaTeX Project Public License v1.3c License.
+% Repository: https://gitee.com/zepinglee/exam-zh
+%
+
+\NeedsTeXFormat{LaTeX2e}
+
+\RequirePackage{expl3}
+
+\ProvidesExplPackage {exam-zh-chinese-english} {2022-07-28} {v0.1.13}
+ {exam-zh chinese and english module}
+
+\PassOptionsToPackage { tcolorbox } { most }
+\RequirePackage { tcolorbox }
+\RequirePackage { varwidth }
+
+\keys_define:nn { exam-zh }
+ { select .meta:nn = { exam-zh / select } {#1} }
+
+
+% 选择环境 select
+\str_new:N \l__examzh_select_mark_position_str % mark 的方位
+
+\keys_define:nn { exam-zh / select }
+ {
+ mark-symbol .tl_set:N = \l__examzh_select_mark_symbol_tl,
+ mark-position .code:n =
+ {
+ \str_set:Nn \l__examzh_select_mark_position_str {#1}
+ },
+ mark-xshift .dim_set:N = \l__examzh_select_mark_xshift_dim,
+ mark-yshift .dim_set:N = \l__examzh_select_mark_yshift_dim,
+ separator .tl_set:N = \l__examzh_select_separator_tl,
+ pre-content .tl_set:N = \l__examzh_select_pre_content_tl,
+ post-content .tl_set:N = \l__examzh_select_post_content_tl,
+ show-mark .bool_set:N = \l__examzh_select_show_mark_bool
+ }
+\keys_set:nn { exam-zh / select }
+ {
+ mark-symbol = $\checkmark$,
+ mark-position = right,
+ mark-xshift = 0pt,
+ mark-yshift = 0pt,
+ separator = \hspace{1em},
+ pre-content = (,
+ post-content = ),
+ show-mark = false
+ }
+
+\seq_new:N \l__examzh_select_seq % 储存输入的内容
+
+\NewDocumentEnvironment { select } { O{ } +b }
+ {
+ % 可选参数
+ \keys_set:nn { exam-zh / select } {#1}
+ }
+ {
+ % 检测 mark-position 的输入
+ \__examzh_chinese_select_coffin_position_test:
+ % 对输入用 \item 进行分割
+ \seq_set_split:Nnn \l__examzh_select_seq { \sitem } {#2}
+ \seq_if_empty:NF \l__examzh_select_seq
+ { \seq_pop_left:NN \l__examzh_select_seq \l_tmpa_tl }
+ % 将内容和 mark 符号存入 coffin 并拼接输出
+ \__examzh_chinese_select_coffin_set_print:N
+ \l__examzh_select_seq
+ }
+\cs_new:Npn \__examzh_chinese_select_coffin_set_print:N #1
+% #1:\l__examzh_select_seq
+ {
+ % 前置内容
+ \l__examzh_select_pre_content_tl
+ % 主体部分
+ \seq_map_indexed_inline:Nn #1
+ % ##1: index
+ % ##2: content
+ {
+ % coffin 的声明
+ \__examzh_chinese_select_coffin_new:n {##1}
+ % 看 seq 的项是否开头是 *,是的话去掉 * 和空格存到 content coffin 并且在 mark coffin 里加入 mark,不是的话就只存到 content coffin
+ \__examzh_chinese_select_coffin_set:nn {##1} {##2}
+ \bool_if:NT \l__examzh_select_show_mark_bool
+ {
+ % 拼接 content coffin 和 mark coffin
+ \__examzh_chinese_select_coffin_join:n {##1}
+ }
+ % 输出 content coffin
+ \__examzh_chinese_select_coffin_typeset:n {##1}
+ }
+ % 后置内容
+ \l__examzh_select_post_content_tl
+ }
+\cs_new:Npn \__examzh_chinese_select_coffin_new:n #1
+ {
+ % 检测是否存在,没有的话就 new 一个
+ \coffin_if_exist:cF { l__examzh_select_content_ \int_to_roman:n {#1} _ coffin }
+ { \coffin_new:c { l__examzh_select_content_ \int_to_roman:n {#1} _ coffin } }
+ \coffin_if_exist:cF { l__examzh_select_mark_ \int_to_roman:n {#1} _ coffin }
+ { \coffin_new:c { l__examzh_select_mark_ \int_to_roman:n {#1} _ coffin } }
+ }
+\cs_new:Npn \__examzh_chinese_select_coffin_set:nn #1#2
+% #1: index
+% #2: content
+ {
+ \tl_if_head_eq_meaning:nNTF {#2} *
+ {
+ % 将去掉 * 号后的内容保存进 \l_tmpa_tl
+ \tl_set:Nx \l_tmpa_tl { \tl_tail:n {#2} }
+ % 去掉 * 和内容之间的空格
+ \tl_trim_spaces:N \l_tmpa_tl
+ % 将处理后的内容存到 content coffin 里
+ \hcoffin_set:cn { l__examzh_select_content_ \int_to_roman:n {#1} _ coffin }
+ { \l_tmpa_tl }
+ % 将 marksymbol 存到对应的第 #1 个 mark coffin 里
+ \hcoffin_set:cn { l__examzh_select_mark_ \int_to_roman:n {#1} _ coffin }
+ { \l__examzh_select_mark_symbol_tl }
+ }
+ {
+ % 不带 * 的直接存 coffin
+ \hcoffin_set:cn { l__examzh_select_content_ \int_to_roman:n {#1} _ coffin }
+ {#2}
+ }
+ }
+\msg_new:nnn { exam-zh / chinese } { select-no-mark-position }
+ {
+ There~is~no~position~named~#1 .\\
+ Please~read~the~manual~carefully.
+ }
+\cs_new:Npn \__examzh_chinese_select_coffin_position_test:
+ {
+ \str_case:VnF \l__examzh_select_mark_position_str
+ {
+ { top } { }
+ { above } { }
+ { bottom } { }
+ { below } { }
+ { left } { }
+ { right } { }
+ }
+ {
+ \msg_error:nnx { exam-zh / chinese } { select-no-mark-position } { \l__examzh_select_mark_position_str }
+ }
+ }
+\cs_new:Npn \__examzh_chinese_select_coffin_join:n #1
+% #1: index
+ {
+ \use:c { __examzh_chinese_select_coffin_join_ \l__examzh_select_mark_position_str :n } {#1}
+ }
+\cs_new:Npn \__examzh_chinese_select_coffin_join_top:n #1
+ {
+ \coffin_join:cnncnnnn
+ { l__examzh_select_content_ \int_to_roman:n {#1} _ coffin }
+ { hc } { t }
+ { l__examzh_select_mark_ \int_to_roman:n {#1} _ coffin }
+ { hc } { b }
+ { \l__examzh_select_mark_xshift_dim }
+ { \l__examzh_select_mark_yshift_dim + 2pt }
+ }
+\cs_set_eq:NN
+ \__examzh_chinese_select_coffin_join_above:n
+ \__examzh_chinese_select_coffin_join_top:n
+\cs_new:Npn \__examzh_chinese_select_coffin_join_bottom:n #1
+ {
+ \coffin_join:cnncnnnn
+ { l__examzh_select_content_ \int_to_roman:n {#1} _ coffin }
+ { hc } { H }
+ { l__examzh_select_mark_ \int_to_roman:n {#1} _ coffin }
+ { hc } { t }
+ { \l__examzh_select_mark_xshift_dim }
+ { \l__examzh_select_mark_yshift_dim - 2pt }
+ }
+\cs_set_eq:NN
+ \__examzh_chinese_select_coffin_join_below:n
+ \__examzh_chinese_select_coffin_join_bottom:n
+\cs_new:Npn \__examzh_chinese_select_coffin_join_left:n #1
+ {
+ \coffin_join:cnncnnnn
+ { l__examzh_select_content_ \int_to_roman:n {#1} _ coffin }
+ { l } { H }
+ { l__examzh_select_mark_ \int_to_roman:n {#1} _ coffin }
+ { r } { H }
+ { \l__examzh_select_mark_xshift_dim }
+ { \l__examzh_select_mark_yshift_dim }
+ }
+\cs_new:Npn \__examzh_chinese_select_coffin_join_right:n #1
+ {
+ \coffin_join:cnncnnnn
+ { l__examzh_select_content_ \int_to_roman:n {#1} _ coffin }
+ { r } { H }
+ { l__examzh_select_mark_ \int_to_roman:n {#1} _ coffin }
+ { l } { H }
+ { \l__examzh_select_mark_xshift_dim }
+ { \l__examzh_select_mark_yshift_dim }
+ }
+\cs_new:Npn \__examzh_chinese_select_coffin_typeset:n #1
+ {
+ \int_compare:nNnTF {#1} = {1}
+ {
+ \coffin_typeset:cnnnn
+ { l__examzh_select_content_ \int_to_roman:n {#1} _ coffin }
+ {l} {H} {0pt} {0pt}
+ }
+ {
+ \l__examzh_select_separator_tl
+ \coffin_typeset:cnnnn
+ { l__examzh_select_content_ \int_to_roman:n {#1} _ coffin }
+ {l} {H} {0pt} {0pt}
+ }
+ }
+
+
+% 连线题 lineto
+\clist_clear_new:N \l__examzh_lineto_list_set_clist
+\int_zero_new:N \l__examzh_lineto_node_index_int
+
+\keys_define:nn { exam-zh }
+ { lineto .meta:nn = { exam-zh / lineto } {#1} }
+
+\keys_define:nn { exam-zh / lineto }
+ {
+ xsep .dim_set:N = \l__examzh_lineto_node_xsep_dim,
+ ysep .dim_set:N = \l__examzh_lineto_node_ysep_dim,
+ name .tl_set:N = \l__examzh_lineto_name_tl,
+ list-style .tl_set:N = \l__examzh_lineto_list_style_tl
+ }
+\keys_set:nn { exam-zh / lineto }
+ {
+ xsep = .25\linewidth,
+ ysep = 1cm,
+ name = \int_to_roman:n { \l__examzh_lineto_node_index_int }
+ }
+
+
+\NewDocumentEnvironment { lineto } { O{ } }
+ {
+ \begin{center}
+ \begin{tikzpicture}[#1]
+ }
+ {
+ \end{tikzpicture}
+ \end{center}
+ }
+
+
+\NewDocumentCommand { \linelistset } { O{} m }
+ {
+ \int_incr:N \l__examzh_lineto_node_index_int
+ \group_begin:
+ \keys_set:nn { exam-zh / lineto } {#1}
+ \clist_set:Nn \l__examzh_lineto_list_set_clist {#2}
+ \int_step_inline:nnn {1}
+ { \clist_count:N \l__examzh_lineto_list_set_clist }
+ {
+ \use:x
+ {
+ \exp_not:N \node
+ [
+ name = \l__examzh_lineto_name_tl - ##1,
+ \l__examzh_lineto_list_style_tl
+ ]
+ at
+ (
+ \l__examzh_lineto_node_index_int * \l__examzh_lineto_node_xsep_dim,
+ - \int_eval:n { ##1 - 1 } * \l__examzh_lineto_node_ysep_dim
+ )
+ { \clist_item:Nn \l__examzh_lineto_list_set_clist {##1} };
+ }
+ }
+ \group_end:
+ }
+
+\NewDocumentCommand { \lineconnect }{ O{} +m }
+ {
+ \clist_set:Nn \l_tmpa_clist {#2}
+ \int_step_inline:nn { \clist_count:N \l_tmpa_clist - 1 }
+ {
+ \use:x
+ {
+ \exp_not:N \draw
+ [line~cap = round, #1]
+ ( \clist_item:Nn \l_tmpa_clist {##1} .east )
+ --
+ ( \clist_item:Nn \l_tmpa_clist { ##1 + 1 } .west );
+ }
+ }
+ }
+
+
+% 语文的文章 材料
+\keys_define:nn { exam-zh / material }
+ {
+ title .tl_set:N = \l__examzh_material_title_content_tl,
+ title-format .tl_set:N = \l__examzh_material_title_format_tl,
+ title-material-sep .skip_set:N = \l__examzh_material_title_material_sep_skip,
+ format .tl_set:N = \l__examzh_material_format_tl,
+ top-sep .skip_set:N = \l__examzh_material_top_sep_skip,
+ bottom-sep .skip_set:N = \l__examzh_material_bottom_sep_skip,
+ author .tl_set:N = \l__examzh_material_author_content_tl,
+ author-format .tl_set:N = \l__examzh_material_author_format_tl,
+ title-author-sep .skip_set:N = \l__examzh_material_title_author_sep_skip,
+ source .tl_set:N = \l__examzh_material_source_content_tl,
+ source-format .tl_set:N = \l__examzh_material_source_format_tl,
+ }
+
+\keys_set:nn { exam-zh / material }
+ {
+ title-format = \zihao{4},
+ author-format = \small,
+ format = \kaishu,
+ title-author-sep = 2em,
+ top-sep = 0pt,
+ bottom-sep = 0pt,
+ title-material-sep = 0pt,
+ }
+
+\NewDocumentEnvironment { material } { O{ } +b }
+ {
+ \par
+ \keys_set:nn { exam-zh / material } {#1}
+ \addvspace { \l__examzh_material_top_sep_skip }
+ \__examzh_material_title_author_type:
+ \group_begin:
+ \l__examzh_material_format_tl
+ #2
+ \group_end:
+ }
+ {
+ \tl_if_empty:NF \l__examzh_material_source_content_tl
+ {
+ \par
+ \group_begin:
+ \hfill
+ \begin{varwidth}{\textwidth}
+ \raggedleft
+ \l__examzh_material_source_format_tl
+ \l__examzh_material_source_content_tl
+ \end{varwidth}
+ \group_end:
+ }
+ \par
+ \addvspace { \l__examzh_material_bottom_sep_skip }
+ \par
+ }
+
+\cs_new:Npn \__examzh_material_title_author_type:
+ {
+ \tl_if_empty:NF \l__examzh_material_title_content_tl
+ {
+ \noindent \hfill
+ \group_begin:
+ \l__examzh_material_title_format_tl
+ \l__examzh_material_title_content_tl
+ \group_end:
+ \tl_if_empty:NF \l__examzh_material_author_content_tl
+ {
+ \hspace { \l__examzh_material_title_author_sep_skip }
+ \group_begin:
+ \l__examzh_material_author_format_tl
+ \l__examzh_material_author_content_tl
+ \group_end:
+ }
+ \hfill \null
+ \par
+ \addvspace { \l__examzh_material_title_material_sep_skip }
+ }
+ }
+
+
+% 古诗
+\bool_new:N \l__examzh_poem_type_minipage_bool
+\bool_set_true:N \l__examzh_poem_type_minipage_bool
+\int_new:N \l__examzh_poem_zhu_index_int
+\seq_new:N \g__examzh_poem_zhu_store_seq
+\str_new:N \l__examzh_poem_zhu_circlednumber_base_str
+
+\keys_define:nn { exam-zh / poem }
+ {
+ title .tl_set:N = \l__examzh_poem_title_content_tl,
+ title-format .tl_set:N = \l__examzh_poem_title_format_tl,
+ title-poem-sep .skip_set:N = \l__examzh_poem_title_poem_sep_skip,
+ format .tl_set:N = \l__examzh_poem_format_tl,
+ top-sep .skip_set:N = \l__examzh_poem_top_sep_skip,
+ bottom-sep .skip_set:N = \l__examzh_poem_bottom_sep_skip,
+ author .tl_set:N = \l__examzh_poem_author_content_tl,
+ author-format .tl_set:N = \l__examzh_poem_author_format_tl,
+ title-author-sep .skip_set:N = \l__examzh_poem_title_author_sep_skip,
+ type .choice:,
+ type / minipage .code:n = { \bool_set_true:N \l__examzh_poem_type_minipage_bool },
+ type / chinese .code:n = { \bool_set_false:N \l__examzh_poem_type_minipage_bool },
+ align .choices:nn =
+ { l , c , r }
+ { \tl_set:Nx \l__examzh_poem_align_tl { \l_keys_choice_tl } },
+ zhu-circlednumber-base .choices:nn =
+ { tikz, font }
+ { \str_set:Nx \l__examzh_poem_zhu_circlednumber_base_str { \l_keys_choice_tl } }
+ }
+
+\keys_set:nn { exam-zh / poem }
+ {
+ title-format = \zihao{5},
+ author-format = \small,
+ format = \kaishu,
+ title-author-sep = 2em,
+ top-sep = 0pt,
+ bottom-sep = 0pt,
+ title-poem-sep = 0.25\baselineskip,
+ type = chinese,
+ align = l,
+ zhu-circlednumber-base = font
+ }
+
+\NewDocumentEnvironment { poem } { O{ } +b }
+ {
+ \par
+ \keys_set:nn { exam-zh / poem } {#1}
+ \addvspace { \l__examzh_poem_top_sep_skip }
+ \__examzh_poem_begin:
+ \__examzh_poem_title_author_type:
+ \group_begin:
+ \l__examzh_poem_format_tl
+ \use:x
+ {
+ \exp_not:N \tabular
+ { \l__examzh_poem_align_tl }
+ }
+ #2
+ \endtabular
+ \group_end:
+ }
+ {
+ \__examzh_poem_end:
+ \par
+ \addvspace { \l__examzh_poem_bottom_sep_skip }
+ \par
+ }
+\cs_new:Npn \__examzh_poem_title_author_type:
+ {
+ \tl_if_empty:NF \l__examzh_poem_title_content_tl
+ {
+ % \noindent \hfill
+ \group_begin:
+ \l__examzh_poem_title_format_tl
+ \l__examzh_poem_title_content_tl
+ \group_end:
+ \tl_if_empty:NF \l__examzh_poem_author_content_tl
+ {
+ \hspace { \l__examzh_poem_title_author_sep_skip }
+ \group_begin:
+ \l__examzh_poem_author_format_tl
+ \l__examzh_poem_author_content_tl
+ \group_end:
+ }
+ % \hfill \null
+ \par
+ \addvspace { \l__examzh_poem_title_poem_sep_skip }
+ }
+ }
+\cs_new:Npn \__examzh_poem_begin:
+ {
+ \bool_if:NTF \l__examzh_poem_type_minipage_bool
+ {
+ \noindent
+ \minipage { \linewidth }
+ \cs_set:Npn \thempfootnote { \examzh_footnote_number:N \c@mpfootnote}
+ \center
+ }
+ {
+ \int_zero:N \l__examzh_poem_zhu_index_int
+ \seq_clear:N \g__examzh_poem_zhu_store_seq
+ \center
+ }
+ }
+\cs_new:Npn \__examzh_poem_end:
+ {
+ \bool_if:NTF \l__examzh_poem_type_minipage_bool
+ {
+ \endcenter
+ \endminipage
+ }
+ {
+ \endcenter
+ \vspace*{-0.7em}
+ \small
+ \begin{description}[leftmargin = 2em]
+ \item[{[注]}]
+ \seq_map_indexed_inline:Nn \g__examzh_poem_zhu_store_seq
+ % ##1: index
+ % ##2: content
+ {
+ \__examzh_chinese_circled_number:n {##1} ~ ##2
+ }
+ \end{description}
+ }
+ }
+
+
+\NewDocumentCommand { \zhu } { o m }
+ {
+ \bool_if:NTF \l__examzh_poem_type_minipage_bool
+ {
+ \footnote {#2}
+ }
+ {
+ \IfNoValueF {#1}
+ {
+ \int_gset:Nn \l__examzh_poem_zhu_index_int {#1 - 1}
+ }
+ \__examzh_poem_type_chinese_zhu:n {#2}
+ }
+ }
+
+\cs_new:Npn \__examzh_poem_type_chinese_zhu:n #1
+ {
+ \int_gincr:N \l__examzh_poem_zhu_index_int
+ \int_set_eq:NN \l_tmpa_int \l__examzh_poem_zhu_index_int
+ \unskip
+ % 输出符号
+ \textsuperscript
+ { \__examzh_chinese_circled_number:n { \l__examzh_poem_zhu_index_int } }
+ % 将参数存起来
+ \seq_gput_right:Nx \g__examzh_poem_zhu_store_seq
+ { #1 }
+ }
+
+\cs_new:Npn \__examzh_chinese_circled_number:n #1
+ {
+ \str_case:Vn \l__examzh_poem_zhu_circlednumber_base_str
+ {
+ { tikz } { \__examzh_chinese_tikz_circled_number:n {#1} }
+ { font } { \__examzh_chinese_tikz_circled_number:n {#1} }
+ }
+ }
+% 基于字体的带圈数字
+\cs_new:Npn \__examzh_chinese_font_circled_number:n #1
+ {
+ \int_set:Nn \l_tmpa_int {#1}
+ \int_compare:nNnTF { \l_tmpa_int } = { 0 }
+ { \int_set:Nn \l_tmpa_int { "24EA } }
+ {
+ \int_compare:nNnTF { \l_tmpa_int } < { 21 }
+ { \int_add:Nn \l_tmpa_int { "245F } }
+ {
+ \int_compare:nNnTF { \l_tmpa_int } < { 36 }
+ { \int_add:Nn \l_tmpa_int { "3250 } }
+ {
+ \int_compare:nNnTF { \l_tmpa_int } < { 51 }
+ { \int_add:Nn \l_tmpa_int { "32B0 } }
+ {
+ \msg_error:nnn { exam-zh / poem }
+ { invalid-circled-number } { \int_use:N \l_tmpa_int }
+ }
+ }
+ }
+ }
+ \group_begin:
+ \CJKfamily+ { }
+ \symbol { \l_tmpa_int }
+ \group_end:
+ }
+
+\msg_new:nnn { exam-zh / poem } { invalid-circled-number }
+ { Invalid~ circled~ number~ #1. }
+
+% tikz 绘制带圈数字
+\fp_new:N \l__examzh_chinese_tikz_circled_number_xscale_fp % 水平压缩系数
+\fp_new:N \l__examzh_chinese_tikz_circled_number_yscale_fp % 垂直压缩系数
+\dim_new:N \l__examzh_chinese_tikz_circled_number_total_hegiht_dim % 数字的总高度
+\dim_new:N \l__examzh_chinese_tikz_circled_number_radius_dim % 半径
+
+\cs_new:Npn \__examzh_chinese_tikz_circled_number_aux:n #1
+ {
+ % 根据数字大小设置压缩系数
+ \fp_set:Nn \l__examzh_chinese_tikz_circled_number_xscale_fp
+ {
+ \int_compare:nNnTF {#1} < { 10 }
+ { 0.9 }
+ {
+ \int_compare:nNnTF {#1} < { 100 }
+ { 0.7 }
+ { 0.5 }
+ }
+ }
+ \fp_set:Nn \l__examzh_chinese_tikz_circled_number_yscale_fp
+ {
+ \int_compare:nNnTF {#1} < { 10 }
+ { 0.9 }
+ {
+ \int_compare:nNnTF {#1} < { 100 }
+ { 0.8 }
+ { 0.6 }
+ }
+ }
+ % 获取数字的高度
+ \hbox_set:Nn \l_tmpa_box {#1}
+ \dim_set:Nn \l__examzh_chinese_tikz_circled_number_total_hegiht_dim
+ { \box_ht:N \l_tmpa_box + \box_dp:N \l_tmpa_box }
+ % 设置圆的半径
+ \dim_set:Nn \l__examzh_chinese_tikz_circled_number_radius_dim
+ { \dim_eval:n { \l__examzh_chinese_tikz_circled_number_total_hegiht_dim / 2 + 0.34 ex } }
+ % 绘制
+ \tikz [ baseline ]
+ {
+ \node
+ [ inner~sep = 0pt, outer~sep = 0pt ]
+ at (0, \dim_use:N \l__examzh_chinese_tikz_circled_number_total_hegiht_dim / 2 )
+ {
+ \hbox_set:Nn \l_tmpa_box
+ {
+ \int_compare:nNnTF {#1} > {9}
+ { \textbf {#1} }
+ {#1}
+ }
+ \makebox[0.35em][c]
+ {
+ % \scalebox { \fp_use:N \l__examzh_chinese_tikz_circled_number_xscale_fp }
+ % [ \fp_use:N \l__examzh_chinese_tikz_circled_number_yscale_fp ]
+ \box_scale:Nnn \l_tmpa_box
+ { \fp_use:N \l__examzh_chinese_tikz_circled_number_xscale_fp }
+ { \fp_use:N \l__examzh_chinese_tikz_circled_number_yscale_fp }
+ \box_use_drop:N \l_tmpa_box
+ }
+ };
+ \draw (0, \l__examzh_chinese_tikz_circled_number_total_hegiht_dim / 2 )
+ circle ( \l__examzh_chinese_tikz_circled_number_radius_dim );
+ }
+ }
+\cs_new:Npn \__examzh_chinese_tikz_circled_number:n #1
+ {
+ \__examzh_chinese_tikz_circled_number_aux:n { \int_eval:n {#1} }
+ }
+
+
+% 作文框
+\NewDocumentEnvironment { writingbox } { O{ } +b }
+ {
+ \begin{tcolorbox}
+ [
+ % 直角
+ sharp~corners = all,
+ % 颜色
+ colback = white,
+ colbacktitle = white,
+ % colframe = white,
+ coltitle = black,
+ % 边框粗细
+ boxrule = 1pt,
+ titlerule = 0pt,
+ % 间距
+ toptitle = 4pt,
+ % 字体
+ fonttitle = \centering,
+ % 首行缩进
+ parbox = false,
+ before~upper = \indent,
+ % 跨页
+ breakable,
+ enhanced~jigsaw,
+ #1
+ ]
+ #2
+ }
+ {
+ \end{tcolorbox}
+ } \ No newline at end of file
diff --git a/macros/xetex/latex/exam-zh/tex/exam-zh-choices.sty b/macros/xetex/latex/exam-zh/tex/exam-zh-choices.sty
new file mode 100644
index 0000000000..6eccb24867
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/tex/exam-zh-choices.sty
@@ -0,0 +1,555 @@
+%
+% Copyright (c) 2022 Zeping Lee
+% Released under the LaTeX Project Public License v1.3c License.
+% Repository: https://gitee.com/zepinglee/exam-zh
+%
+
+\NeedsTeXFormat{LaTeX2e}
+
+\RequirePackage{expl3}
+\RequirePackage{xparse}
+
+\ProvidesExplPackage {exam-zh-choices} {2022-07-28} {v0.1.13}
+ {exam-zh choices module}
+
+\dim_new:N \l__examzh_choices_column_sep_dim
+\int_new:N \l__examzh_choices_columns_int
+\tl_new:N \l__examzh_choices_label_tl
+\tl_new:N \l__examzh_choices_label_pos_tl
+\tl_new:N \l__examzh_choices_label_align_tl
+\dim_new:N \l__examzh_choices_label_sep_dim
+\dim_new:N \l__examzh_choices_label_width_dim
+\int_new:N \l__examzh_choices_max_columns_int
+
+\keys_define:nn { exam-zh }
+ { choices .meta:nn = { exam-zh / choices } {#1} }
+
+\keys_define:nn { exam-zh / choices }
+ {
+ column-sep .dim_set:N = \l__examzh_choices_column_sep_dim ,
+ columns .int_set:N = \l__examzh_choices_columns_int ,
+ label .tl_set:N = \l__examzh_choices_label_tl ,
+ label-pos .choices:nn =
+ { auto , top-left , left , bottom }
+ { \tl_set_eq:NN \l__examzh_choices_label_pos_tl \l_keys_choice_tl } ,
+ label-align .tl_set:N = \l__examzh_choices_label_align_tl ,
+ label-sep .dim_set:N = \l__examzh_choices_label_sep_dim ,
+ label-width .dim_set:N = \l__examzh_choices_label_width_dim ,
+ max-columns .int_set:N = \l__examzh_choices_max_columns_int ,
+ index .int_set:N = \l__examzh_choices_item_index_int
+ }
+
+\keys_set:nn { exam-zh / choices }
+ {
+ column-sep = 1em ,
+ columns = 0 ,
+ label = \Alph*. ,
+ label-pos = auto ,
+ label-align = right ,
+ label-sep = .5em ,
+ label-width = 0pt ,
+ max-columns = 4 ,
+ index = 1,
+ }
+
+\NewDocumentCommand \setchoices { m }
+ { \keys_set:nn { exam-zh / choices } {#1} }
+
+
+\tl_new:N \l__examzh_choices_counters_tl
+
+\NewDocumentCommand \AddChoicesCounter { m m }
+ % #1: \Alph(用户接口)
+ % #2: \@Alph(具体实现的命令或函数(开发层))
+ {
+ % TODO 这一步的作用是什么,为什么要把函数放在 tl 变量里而不是直接在某处使用?
+ % 猜测:put_right 而不是 set,是为了保证操作 label 的输入值前
+ % 几个函数都被 set
+ \tl_put_right:Nn \l__examzh_choices_counters_tl
+ { \__examzh_choices_process_counter:NN #1 #2 }
+ \cs_set_eq:cN { __examzh_choices_save_ \cs_to_str:N #1 : } #2
+ \cs_set_eq:cN { __examzh_choices_save_ \cs_to_str:N #2 : } #2
+ }
+
+\AddChoicesCounter \arabic \@arabic
+\AddChoicesCounter \alph \@alph
+\AddChoicesCounter \Alph \@Alph
+\AddChoicesCounter \roman \@roman
+\AddChoicesCounter \Roman \@Roman
+
+
+\dim_new:N \l__examzh_choices_total_width_dim
+\seq_new:N \l__examzh_choices_seq
+
+\NewDocumentEnvironment { choices } { O { } +b }
+ {
+ \par \nopagebreak
+ % 严格禁止孤行和寡行
+ \int_set:Nn \clubpenalty { 10000 }
+ \int_set:Nn \widowpenalty { 10000 }
+ % 尽量避免在选项中间换行
+ \int_set:Nn \interlinepenalty { 301 }
+ \noindent
+ \dim_set_eq:NN \l__examzh_choices_total_width_dim \linewidth
+ \int_zero:N \l__examzh_choices_columns_int
+ \dim_zero:N \l__examzh_choices_label_width_dim
+ \keys_set:nn { exam-zh / choices } {#1}
+ }
+ {
+ % 用 \item 分割选项
+ \seq_set_split:Nnn \l__examzh_choices_seq { \item } {#2}
+ % 把第一个空项去掉
+ \seq_if_empty:NF \l__examzh_choices_seq
+ { \seq_pop_left:NN \l__examzh_choices_seq \l_tmpa_tl }
+ % 收集正确的选项
+ \__examzh_choices_collect_correct_choices:N
+ \l__examzh_choices_seq
+ % 计算标签和选项内容的最大自然宽度
+ \__examzh_choices_calc_max_width:N \l__examzh_choices_seq
+ % label-pos = auto 时自动选择标签位置
+ \__examzh_choices_set_auto_label_pos:
+ % 如果用户没有声明列数,计算合适的列数
+ % 「学习点」从默认值是否被改变来测试用户是否输入
+ % 用户没有输入的话就采用自动计算列数
+ \int_compare:nNnT { \l__examzh_choices_columns_int } < {1}
+ { \__examzh_choices_calc_columns: }
+ % 计算每个选项内容的宽度 \l__examzh_choices_item_width_dim
+ \__examzh_choices_calc_item_width:
+ % 输出选项
+ \__examzh_print_choices:N \l__examzh_choices_seq
+ % 输出正确选项
+ \__examzh_print_correctchoice:
+ }
+
+% 用来存正确选项的序号(entry)
+\seq_new:N \l__examzh_choices_correct_choices_label_seq
+% 用来存正确选项的内容
+\seq_new:N \l__examzh_choices_correct_choices_item_seq
+
+% 收集正确的选项,保存在 \l__examzh_choices_correct_choices_seq
+\cs_new:Npn \__examzh_choices_collect_correct_choices:N #1
+ % #1: \l__examzh_choices_seq
+ {
+ \seq_clear:N \l__examzh_choices_correct_choices_label_seq
+ \seq_clear:N \l__examzh_choices_correct_choices_item_seq
+ \seq_clear:N \l_tmpa_seq
+ \seq_map_indexed_inline:Nn #1
+ {
+ % ##1: 选项序号
+ % ##2: 选项内容
+ % 如果分割后,第一个字符是 * 的,表明这是一个正确选项
+ %(即用 \item* 来标记正确答案)
+ \tl_if_head_eq_meaning:nNTF {##2} *
+ {
+ \seq_put_right:Nn \l__examzh_choices_correct_choices_label_seq
+ { \__examzh_choices_correct_choices_label_transfrom:n {##1} }
+ % 将去掉 * 号后的内容保存进 \l_tmpa_tl
+ \tl_set:Nx \l_tmpa_tl { \tl_tail:n {##2} }
+ % 去掉 * 和内容之间的空格
+ \tl_trim_spaces:N \l_tmpa_tl
+ \seq_put_right:NV \l__examzh_choices_correct_choices_item_seq
+ \l_tmpa_tl
+ \seq_put_right:NV \l_tmpa_seq \l_tmpa_tl
+ }
+ {
+ \seq_put_right:Nn \l_tmpa_seq { ##2 }
+ }
+ }
+ \seq_set_eq:NN #1 \l_tmpa_seq
+ }
+
+% 根据 label 的样式 \l__examzh_choices_label_tl 转化正确选项的样式
+\cs_new:Npn \__examzh_choices_correct_choices_label_transfrom:n #1
+ {
+ \group_begin:
+ \int_set:Nn \l__examzh_choices_index_int {#1}
+ % 定义计数器转换函数(如 \Alph 等)
+ \l__examzh_choices_counters_tl
+ % 输出
+ \l__examzh_choices_label_tl
+ \group_end:
+ }
+% 输出正确的选项
+\cs_new:Nn \__examzh_print_correctchoice:
+ {
+ \seq_if_empty:NF \l__examzh_choices_correct_choices_item_seq
+ {
+ \par
+ 参考答案:
+ \seq_use:Nn \l__examzh_choices_correct_choices_label_seq {,~}
+ }
+ }
+
+
+\dim_new:N \l__examzh_choices_item_width_dim
+\dim_new:N \l__examzh_choices_item_min_height_dim
+
+% 计算标签和选项内容的最大宽度,
+% 分别保存到 \l__examzh_choices_label_width_dim 和 \l__examzh_choices_item_width_dim
+% #1: \l__examzh_choices_seq
+\cs_new:Npn \__examzh_choices_calc_max_width:N #1
+ {
+ % 下面这两个的想法是 xchoices 项目可以优化学习的地方
+ % 因为 xchoices 是把变量先设置为第一项的参数,然后让后面的和前面的比
+ % 这里相当于把“设置为第一项的参数”这一步,用默认的“端点量”来代替
+ % 比如取最大的,就和 0 比,这样的话其实也会产生变量会变成第一项的参数的结果
+ % 但是两者性质不同,此处处理让 第一项 「没有特殊性」
+ % 后面的计算最小高度的也是如此
+ \dim_zero:N \l__examzh_choices_item_width_dim
+ \dim_set_eq:NN \l__examzh_choices_item_min_height_dim \c_max_dim
+ \seq_map_indexed_inline:Nn #1
+ {
+ % -- 标签 --
+ % 把标签整体放进 \l_tmpa_box
+ \hbox_set:Nn \l_tmpa_box { \__examzh_choices_the_label:n {##1} }
+ % 测量宽度
+ \dim_set:Nn \l_tmpa_dim { \box_wd:N \l_tmpa_box }
+ % 与当前最大值比较,最后效果是 \l__examzh_choices_label_width_dim 储存了所有标签中宽度最大的标签的宽度值
+ \dim_compare:nNnT
+ { \l_tmpa_dim } > { \l__examzh_choices_label_width_dim }
+ { \dim_set_eq:NN \l__examzh_choices_label_width_dim \l_tmpa_dim }
+ % -- 选项内容 --
+ % 把内容放进 \l_tmpa_box 中
+ \hbox_set:Nn \l_tmpa_box {##2}
+ % 测量宽度
+ \dim_set:Nn \l_tmpa_dim { \box_wd:N \l_tmpa_box }
+ % 与当前最大值比较,最后效果是 \l__examzh_choices_item_width_dim 储存了所有选项内容中宽度最大的内容的宽度值
+ \dim_compare:nNnT
+ { \l_tmpa_dim } > { \l__examzh_choices_item_width_dim }
+ {
+ \dim_set_eq:NN \l__examzh_choices_item_width_dim
+ \l_tmpa_dim
+ }
+ % -- 找到最小高度 --
+ % 把内容高度储存到 \l_tmpb_dim
+ \dim_set:Nn \l_tmpb_dim { \box_ht:N \l_tmpa_box }
+ % 与当前最小值比较,最后效果是 \l__examzh_choices_item_min_height_dim 储存了所有内容中高度最小的内容的高度值
+ \dim_compare:nNnT
+ { \l_tmpb_dim } < { \l__examzh_choices_item_min_height_dim }
+ { \dim_set_eq:NN \l__examzh_choices_item_min_height_dim \l_tmpb_dim }
+ \box_clear:N \l_tmpa_box
+ }
+ }
+
+% TODO 没看懂怎么实现的
+\int_new:N \l__examzh_choices_index_int
+
+% \Alph* 形式生成正确的标签
+\cs_new:Npn \__examzh_choices_the_label:n #1
+ {
+ \group_begin:
+ \int_set:Nn \l__examzh_choices_index_int
+ {
+ \int_eval:n
+ {
+ \l__examzh_choices_item_index_int + #1 - 1
+ }
+ }
+ \l__examzh_choices_counters_tl
+ \l__examzh_choices_label_tl
+ \group_end:
+ }
+
+\cs_new:Npn \__examzh_choices_process_counter:NN #1#2
+ % #1: \Alph
+ % #2: \@Alph
+ {
+ % 用户可以同时使用 #1 和 #2 两个函数(命令)作为 label 的操作函数
+ % #1 的内核原理函数是 #2
+ \cs_set:Npn #1 { \__examzh_choices_process_counter_aux:Nn #2 }
+ \cs_set:Npn #2 { \__examzh_choices_process_counter_aux:Nn #2 }
+ }
+
+\cs_new:Npn \__examzh_choices_process_counter_aux:Nn #1#2
+ % #1: \@Alph
+ {
+ \tl_if_eq:nnTF {#2} { * }
+ {
+ % 如果是 \alph* 类型的,效果为 \alph{ \l__examzh_choices_index_int }
+ \use:c { __examzh_choices_save_ \cs_to_str:N #1 : }
+ { \l__examzh_choices_index_int }
+ }
+ {
+ % 否则就是 \alph{...} 效果
+ \use:c { __examzh_choices_save_ \cs_to_str:N #1 : } {#2}
+ }
+ }
+
+
+% 超过这一高度阈值的选项视为插图模式
+% 注意使用 tl
+% TODO 为何要使用 tl 而不用 dim ?
+\tl_new:N \l__examzh_choices_figure_mode_threshold_tl
+\tl_set:Nn \l__examzh_choices_figure_mode_threshold_tl { 2 \baselineskip }
+
+\cs_new:Npn \__examzh_choices_set_auto_label_pos:
+ {
+ \tl_if_eq:NnT \l__examzh_choices_label_pos_tl { auto }
+ {
+ % 若最小高度超过阈值,推测其中包含插图,将标签位置改为左居中
+ \dim_compare:nNnTF
+ { \l__examzh_choices_item_min_height_dim } >
+ { \l__examzh_choices_figure_mode_threshold_tl }
+ { \tl_set:Nn \l__examzh_choices_label_pos_tl { left } }
+ { \tl_set:Nn \l__examzh_choices_label_pos_tl { top-left } }
+ }
+ }
+
+
+\int_new:N \l__examzh_tmp_int
+
+% 计算选项的合适列数,存到 \l__examzh_choices_columns_int
+\cs_new:Npn \__examzh_choices_calc_columns:
+ {
+ % 若标签不在底部,将 label-width 和 label-sep 加到 \l__examzh_choices_item_width_dim 里面
+ \tl_if_eq:NnF \l__examzh_choices_label_pos_tl { bottom }
+ {
+ \dim_add:Nn \l__examzh_choices_item_width_dim
+ { \l__examzh_choices_label_width_dim + \l__examzh_choices_label_sep_dim }
+ }
+ % [总宽度 / 最大的选项宽度] = 列数
+ % 这个计算出来是作为「算出来的、可以排的最大列数」
+ % 将要和下面的手动(或者默认的)最大列数进行比较,来确定最后排多少列
+ \int_set:Nn \l__examzh_choices_columns_int
+ {
+ \int_div_truncate:nn
+ { \l__examzh_choices_total_width_dim + \l__examzh_choices_column_sep_dim }
+ { \l__examzh_choices_item_width_dim + \l__examzh_choices_column_sep_dim }
+ }
+ % 如果上面的计算算出来是 0 的话,就设置为 1
+ \int_compare:nNnTF { \l__examzh_choices_columns_int } = {0}
+ { \int_set:Nn \l__examzh_choices_columns_int {1} }
+ % 从允许的最大列数开始,每次除以 2,直到行宽允许排下
+ % 比如设置了最大列数是 4 , 但是算出来可以排 5
+ % 那么就会将 [4 / 2] = 2 < 5 作为列数
+ \int_set_eq:NN \l__examzh_tmp_int \l__examzh_choices_max_columns_int
+ \int_while_do:nNnn
+ { \l__examzh_tmp_int } > { \l__examzh_choices_columns_int }
+ {
+ \int_set:Nn \l__examzh_tmp_int
+ { \int_div_truncate:nn { \l__examzh_tmp_int } {2} }
+ }
+ \int_set_eq:NN \l__examzh_choices_columns_int \l__examzh_tmp_int
+ }
+
+
+% 计算选项的最终宽度,保存到 \l__examzh_choices_item_width_dim
+\cs_new:Npn \__examzh_choices_calc_item_width:
+ {
+ \dim_set:Nn \l__examzh_choices_item_width_dim
+ {
+ % TODO 不是很理解这里的算法
+ ( \l__examzh_choices_total_width_dim
+ - \l__examzh_choices_columns_int \l__examzh_choices_column_sep_dim
+ + \l__examzh_choices_column_sep_dim
+ ) / \l__examzh_choices_columns_int
+ }
+ % 若标签不在底部,将 label-width 和 label-sep 算进来
+ % TODO 算进来?那怎么还是 sub?
+ \tl_if_eq:NnF \l__examzh_choices_label_pos_tl { bottom }
+ {
+ \dim_sub:Nn \l__examzh_choices_item_width_dim
+ { \l__examzh_choices_label_width_dim + \l__examzh_choices_label_sep_dim }
+ }
+ }
+
+
+\int_new:N \l__examzh_choices_current_col_int
+
+% #1: \l__examzh_choices_seq
+\cs_new:Npn \__examzh_print_choices:N #1
+ {
+ \int_zero:N \l__examzh_choices_current_col_int
+ \seq_map_indexed_inline:Nn \l__examzh_choices_seq
+ {
+ \int_incr:N \l__examzh_choices_current_col_int
+ % 当前列号重置为 1
+ \int_compare:nNnT
+ { \l__examzh_choices_current_col_int } > { \l__examzh_choices_columns_int }
+ {
+ % \par \noindent
+ \newline
+ \int_set:Nn \l__examzh_choices_current_col_int {1}
+ }
+ % TODO 为什么 > 1 才加呢? 这样的话第 1 列和第 2 列之间就没有这个间距?
+ \int_compare:nNnT { \l__examzh_choices_current_col_int } > {1}
+ {
+ \skip_horizontal:N \l__examzh_choices_column_sep_dim
+ % 增加一点弹性
+ \skip_horizontal:n {0pt plus 1pt minus 1pt}
+ }
+ \__examzh_print_single_choice:nn {##1} {##2}
+ }
+ \par
+ }
+
+
+\coffin_new:N \l__examzh_choices_item_coffin
+\coffin_new:N \l__examzh_choices_label_coffin
+
+\cs_new:Npn \__examzh_print_single_choice:nn #1#2
+ {
+ % 选项标签
+ \__examzh_choices_make_label_coffin:n {#1}
+ % 选项内容
+ \__examzh_choices_make_item_coffin:n {#2}
+ % 合并选项的标签和内容
+ \str_case:Vn \l__examzh_choices_label_pos_tl
+ {
+ { top-left }
+ {
+ \coffin_join:NnnNnnnn
+ \l__examzh_choices_item_coffin {l} {H}
+ \l__examzh_choices_label_coffin {r} {H}
+ { - \l__examzh_choices_label_sep_dim }
+ { 0pt }
+ }
+ { left }
+ {
+ \coffin_join:NnnNnnnn
+ \l__examzh_choices_item_coffin {l} {vc}
+ \l__examzh_choices_label_coffin {r} {vc}
+ { - \l__examzh_choices_label_sep_dim }
+ { 0pt }
+ }
+ { bottom }
+ {
+ \coffin_join:NnnNnnnn
+ \l__examzh_choices_item_coffin {hc} {b}
+ \l__examzh_choices_label_coffin {hc} {t}
+ { 0pt }
+ % { - \l__examzh_choices_label_sep_dim }
+ { 0pt }
+ }
+ }
+ % 输出合并后
+ \coffin_typeset:Nnnnn \l__examzh_choices_item_coffin {l} {H} {0pt} {0pt}
+ \coffin_clear:N \l__examzh_choices_item_coffin
+ \coffin_clear:N \l__examzh_choices_label_coffin
+ }
+
+% 将标签内容存入 coffin
+\cs_new:Npn \__examzh_choices_make_label_coffin:n #1
+ {
+ \hcoffin_set:Nn \l__examzh_choices_label_coffin
+ {
+ \hbox_to_wd:nn { \l__examzh_choices_label_width_dim }
+ { \__examzh_choices_make_label:n {#1} \strut }
+ }
+ }
+
+\cs_new:Npn \__examzh_choices_make_label:n #1
+ {
+ \str_case:Vn \l__examzh_choices_label_align_tl
+ {
+ { left } { \rlap { \__examzh_choices_the_label:n {#1} } \hss }
+ { center } { \hss \clap { \__examzh_choices_the_label:n {#1} } \hss }
+ { right } { \hss \llap { \__examzh_choices_the_label:n {#1} } }
+ }
+ }
+
+\bool_new:N \l__examzh_choices_figure_mode_bool
+
+% 将选项内容存入 coffin
+\cs_new:Npn \__examzh_choices_make_item_coffin:n #1
+ {
+ \hcoffin_set:Nn \l__examzh_choices_item_coffin
+ {
+ % 优先尝试使用 hbox,这是因为在 \vcoffin_set 外部能保留原来的 \linewidth 和
+ % \textwidth,方便用户在 \includegraphics 中使用
+ \hbox_set:Nn \l_tmpa_box {#1}
+ % 若盒子的自然高度大于 2 行,且深度为 0pt,设置为插图模式
+ \bool_lazy_and:nnT
+ {
+ \dim_compare_p:nNn { \box_ht:N \l_tmpa_box } >
+ { \l__examzh_choices_figure_mode_threshold_tl }
+ }
+ { \dim_compare_p:nNn { \box_dp:N \l_tmpa_box } < { 1pt } }
+ { \bool_set_true:N \l__examzh_choices_figure_mode_bool }
+ \vcoffin_set:Nnn \l_tmpa_coffin
+ { \l__examzh_choices_item_width_dim }
+ {
+ \dim_set_eq:NN \parskip \c_zero_dim
+ \dim_set_eq:NN \parindent \listparindent
+ \noindent
+ % \strut
+ % 若标签在底部,将图片居中对齐。
+ \tl_if_eq:NnT \l__examzh_choices_label_pos_tl { bottom }
+ { \centering }
+ \dim_compare:nNnTF
+ { \box_wd:N \l_tmpa_box } > { \l__examzh_choices_item_width_dim }
+ { #1 }
+ { \box_use_drop:N \l_tmpa_box }
+ % 使用 \strut 将行距撑开,防止跟下一行选项的间距过小
+ \mode_if_horizontal:T { \strut }
+ }
+ \dim_set:Nn \l_tmpa_dim { \coffin_ht:N \l_tmpa_coffin }
+ \bool_if:NT \l__examzh_choices_figure_mode_bool
+ {
+ \coffin_set_horizontal_pole:Nnn \l_tmpa_coffin {T}
+ { \l_tmpa_dim - 0.7 \baselineskip }
+ }
+ \coffin_typeset:Nnnnn \l_tmpa_coffin {l} {T} {0pt} {0pt}
+ \coffin_clear:N \l_tmpa_coffin
+ }
+ }
+
+
+% 使用中文字体直接输出 unicode 带圈数字
+% \circlednumber 的参数既可以接受 LaTeX2e 的 <counter>,也可以直接接受 <intexpr>。
+% \NewDocumentCommand \circlednumber { m }
+% {
+% \int_if_exist:cTF { c@ #1 }
+% { \int_set_eq:Nc \l_tmpa_int { c@#1 } }
+% { \int_set:Nn \l_tmpa_int { #1 } }
+% \exp_args:Nx \__examzh_choices_circled_number:n { \int_use:N \l_tmpa_int }
+% }
+
+\cs_new:Npn \__examzh_choices_circled_number:n #1
+ {
+ \int_set:Nn \l_tmpa_int {#1}
+ \int_compare:nNnTF { \l_tmpa_int } = { 0 }
+ { \int_set:Nn \l_tmpa_int { "24EA } }
+ {
+ \int_compare:nNnTF { \l_tmpa_int } < { 21 }
+ { \int_add:Nn \l_tmpa_int { "245F } }
+ {
+ \int_compare:nNnTF { \l_tmpa_int } < { 36 }
+ { \int_add:Nn \l_tmpa_int { "3250 } }
+ {
+ \int_compare:nNnTF { \l_tmpa_int } < { 51 }
+ { \int_add:Nn \l_tmpa_int { "32B0 } }
+ {
+ \msg_error:nnn { exam-zh / choices }
+ { invalid-circled-number } { \int_use:N \l_tmpa_int }
+ }
+ }
+ }
+ }
+ \group_begin:
+ % TODO 为何要用 \CJKfamily+ { }
+ % xeCJK 宏包文档:当 \CJKfamily+ 参数为空时,则使用当前的 CJK 字体族。
+ \CJKfamily+ { }
+ \symbol { \l_tmpa_int }
+ \group_end:
+ }
+
+\msg_new:nnn { exam-zh / choices } { invalid-circled-number }
+ { Invalid~ circled~ number~ #1. }
+
+\AddChoicesCounter \circlednumber \__examzh_choices_circled_number:n
+
+
+% TODO 答案控制
+
+% 选择题答案控制
+% - 直接在后面显示
+% - 在括号内显示
+% - 手动输入
+% - 能否通过写中途文件方式使得答案可以出现在前面的括号内
+% - 统一移动到最后
+% - 也是 choices 的形式
+% - 表格形式
+
+% 答案确定
+% 通过 \item 是否带 * 判断,有的话则标记为正确答案 \ No newline at end of file
diff --git a/macros/xetex/latex/exam-zh/tex/exam-zh-font.sty b/macros/xetex/latex/exam-zh/tex/exam-zh-font.sty
new file mode 100644
index 0000000000..15b173c9ef
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/tex/exam-zh-font.sty
@@ -0,0 +1,580 @@
+%
+% Copyright (c) 2022 Zeping Lee
+% Released under the LaTeX Project Public License v1.3c License.
+% Repository: https://gitee.com/zepinglee/exam-zh
+%
+
+\NeedsTeXFormat{LaTeX2e}
+
+\RequirePackage{expl3}
+\RequirePackage{xparse}
+
+\ProvidesExplPackage {exam-zh-font} {2022-07-28} {v0.1.13}
+ {exam-zh font module}
+
+\RequirePackage { unicode-math }
+\RequirePackage { filehook }
+
+\tl_new:N \g__examzh_font_font_tl
+\tl_new:N \g__examzh_font_math_font_tl
+
+\keys_define:nn { exam-zh }
+ {
+ font .choices:nn =
+ {
+ newcm ,
+ lm ,
+ times ,
+ termes ,
+ stix,
+ xits ,
+ libertinus ,
+ % newtx ,
+ none
+ }
+ {
+ \tl_gset_eq:NN \g__examzh_font_font_tl \l_keys_choice_tl
+ \use:c { examzh_font_set_font_ \g__examzh_font_font_tl : }
+ } ,
+ math-font .choices:nn =
+ {
+ newcm ,
+ lm ,
+ termes ,
+ stix,
+ xits ,
+ libertinus ,
+ cambria ,
+ % newtx ,
+ none
+ }
+ {
+ \tl_gset_eq:NN \g__examzh_font_math_font_tl \l_keys_choice_tl
+ \use:c { examzh_font_set_math_font_ \g__examzh_font_math_font_tl : }
+ } ,
+ }
+
+
+% New Computer Modern
+\cs_new:Npn \examzh_font_set_font_newcm:
+ {
+ \setmainfont { NewCM10 }
+ [
+ Extension = .otf ,
+ UprightFont = *-Book ,
+ BoldFont = *-Bold ,
+ ItalicFont = *-BookItalic ,
+ BoldItalicFont = *-BoldItalic ,
+ ]
+ \setsansfont { NewCMSans10 }
+ [
+ Extension = .otf ,
+ UprightFont = *-Book ,
+ BoldFont = *-Bold ,
+ ItalicFont = *-BookOblique ,
+ BoldItalicFont = *-BoldOblique ,
+ ]
+ \setmonofont { NewCMMono10 }
+ [
+ Extension = .otf ,
+ UprightFont = *-Book ,
+ ItalicFont = *-BookItalic ,
+ BoldFont = *-Bold ,
+ BoldItalicFont = *-BoldOblique ,
+ ]
+ }
+
+
+% Latin Modern
+\cs_new:Npn \examzh_font_set_font_lm:
+ {
+ \setmainfont { lmroman10 }
+ [
+ Extension = .otf ,
+ UprightFont = *-regular ,
+ BoldFont = *-bold ,
+ ItalicFont = *-italic ,
+ BoldItalicFont = *-bolditalic ,
+ ]
+ \setsansfont { lmsans10 }
+ [
+ Extension = .otf ,
+ UprightFont = *-regular ,
+ BoldFont = *-bold ,
+ ItalicFont = *-oblique ,
+ BoldItalicFont = *-boldoblique ,
+ ]
+ \setmonofont { lmmonolt10 }
+ [
+ Extension = .otf ,
+ UprightFont = *-regular ,
+ BoldFont = *-bold ,
+ ItalicFont = *-oblique ,
+ BoldItalicFont = *-boldoblique ,
+ ]
+ }
+
+
+% Times New Roman + Arial
+\cs_new:Npn \examzh_font_set_font_times:
+ {
+ \setmainfont { Times~ New~ Roman }
+ \setsansfont { Arial } [ Scale = MatchLowercase ]
+ \setmonofont { Courier~ New } [ Scale = MatchLowercase ]
+ }
+
+
+% TeX Gyre Termes
+\cs_new:Npn \examzh_font_set_font_termes:
+ {
+ \setmainfont { texgyretermes }
+ [
+ Extension = .otf ,
+ UprightFont = *-regular ,
+ BoldFont = *-bold ,
+ ItalicFont = *-italic ,
+ BoldItalicFont = *-bolditalic ,
+ ]
+ \examzh_font_set_tex_gyre_sans_mono:
+ }
+
+\cs_new:Npn \examzh_font_set_tex_gyre_sans_mono:
+ {
+ \setsansfont { texgyreheros }
+ [
+ Extension = .otf ,
+ UprightFont = *-regular ,
+ BoldFont = *-bold ,
+ ItalicFont = *-italic ,
+ BoldItalicFont = *-bolditalic ,
+ Scale = MatchLowercase ,
+ ]
+ \setmonofont { texgyrecursor }
+ [
+ Extension = .otf ,
+ UprightFont = *-regular ,
+ BoldFont = *-bold ,
+ ItalicFont = *-italic ,
+ BoldItalicFont = *-bolditalic ,
+ Scale = MatchLowercase ,
+ Ligatures = CommonOff ,
+ ]
+ }
+
+
+% STIX Two 字体。
+% STIX 文件名在 v2.10 2020-12-19 从
+% \file{STIX2Text-Regular.otf}、\file{STIX2Math.otf} 分别改为
+% \file{STIXTwoText-Regular.otf}、\file{STIXTwoMath-Regular.otf}。
+\tl_new:N \g__examzh_font_font_family_stix_tl
+\tl_new:N \g__examzh_font_font_name_stix_math_tl
+\cs_new:Npn \examzh_font_set_stix_names:
+ {
+ \tl_if_empty:NT \g__examzh_font_font_family_stix_tl
+ {
+ \fontspec_font_if_exist:nTF { STIXTwoText-Regular.otf }
+ {
+ \tl_gset:Nn \g__examzh_font_font_family_stix_tl { STIXTwoText }
+ \tl_gset:Nn \g__examzh_font_font_name_stix_math_tl { STIXTwoMath-Regular }
+ }
+ {
+ \tl_gset:Nn \g__examzh_font_font_family_stix_tl { STIX2Text }
+ \tl_gset:Nn \g__examzh_font_font_name_stix_math_tl { STIX2Math }
+ }
+ }
+ }
+
+\cs_new:Npn \examzh_font_set_font_stix:
+ {
+ \examzh_font_set_stix_names:
+ \setmainfont { \g__examzh_font_font_family_stix_tl }
+ [
+ Extension = .otf ,
+ UprightFont = *-Regular ,
+ BoldFont = *-Bold ,
+ ItalicFont = *-Italic ,
+ BoldItalicFont = *-BoldItalic ,
+ ]
+ \examzh_font_set_tex_gyre_sans_mono:
+ }
+
+
+% XITS 字体。
+% XITS 的文件名在 v1.109 2018-09-30
+% 从 \file{xits-regular.otf}、\file{xits-math.otf} 分别改为
+% \file{XITS-Regular.otf}、\file{XITSMath-Regular.otf}。
+\tl_new:N \g__examzh_font_font_family_xits_tl
+\tl_new:N \g__examzh_font_font_style_xits_rm_tl
+\tl_new:N \g__examzh_font_font_style_xits_bf_tl
+\tl_new:N \g__examzh_font_font_style_xits_it_tl
+\tl_new:N \g__examzh_font_font_style_xits_bfit_tl
+\tl_new:N \g__examzh_font_font_name_xits_math_tl
+
+\cs_new:Npn \examzh_font_set_xits_names:
+ {
+ \tl_if_empty:NT \g__examzh_font_font_family_xits_tl
+ {
+ \fontspec_font_if_exist:nTF { XITSMath-Regular.otf }
+ {
+ \tl_gset:Nn \g__examzh_font_font_family_xits_tl { XITS }
+ \tl_gset:Nn \g__examzh_font_font_style_xits_rm_tl { Regular }
+ \tl_gset:Nn \g__examzh_font_font_style_xits_bf_tl { Bold }
+ \tl_gset:Nn \g__examzh_font_font_style_xits_it_tl { Italic }
+ \tl_gset:Nn \g__examzh_font_font_style_xits_bfit_tl { BoldItalic }
+ \tl_gset:Nn \g__examzh_font_font_name_xits_math_tl { XITSMath-Regular }
+ }
+ {
+ \tl_gset:Nn \g__examzh_font_font_family_xits_tl { xits }
+ \tl_gset:Nn \g__examzh_font_font_style_xits_rm_tl { regular }
+ \tl_gset:Nn \g__examzh_font_font_style_xits_bf_tl { bold }
+ \tl_gset:Nn \g__examzh_font_font_style_xits_it_tl { italic }
+ \tl_gset:Nn \g__examzh_font_font_style_xits_bfit_tl { bolditalic }
+ \tl_gset:Nn \g__examzh_font_font_name_xits_math_tl { xits-math }
+ }
+ }
+ }
+
+\cs_new:Npn \examzh_font_set_font_xits:
+ {
+ \examzh_font_set_xits_names:
+ \setmainfont { \g__examzh_font_font_family_xits_tl }
+ [
+ Extension = .otf ,
+ UprightFont = *-\g__examzh_font_font_style_xits_rm_tl ,
+ BoldFont = *-\g__examzh_font_font_style_xits_bf_tl ,
+ ItalicFont = *-\g__examzh_font_font_style_xits_it_tl ,
+ BoldItalicFont = *-\g__examzh_font_font_style_xits_bfit_tl ,
+ ]
+ \examzh_font_set_tex_gyre_sans_mono:
+ }
+
+
+% Libertinus 的文件名在 v6.7 2019-04-03 从小写改为驼峰式,
+% 在大小写敏感的平台上需要进行判断。
+\tl_new:N \g__examzh_font_font_family_libertinus_serif_tl
+\tl_new:N \g__examzh_font_font_family_libertinus_sans_tl
+\tl_new:N \g__examzh_font_font_style_libertinus_rm_tl
+\tl_new:N \g__examzh_font_font_style_libertinus_bf_tl
+\tl_new:N \g__examzh_font_font_style_libertinus_it_tl
+\tl_new:N \g__examzh_font_font_style_libertinus_bfit_tl
+\tl_new:N \g__examzh_font_font_name_libertinus_math_tl
+
+\cs_new:Npn \examzh_font_set_libertinus_names:
+ {
+ \tl_if_empty:NT \g__examzh_font_font_family_libertinus_serif_tl
+ {
+ \fontspec_font_if_exist:nTF { LibertinusSerif-Regular.otf }
+ {
+ \tl_gset:Nn \g__examzh_font_font_family_libertinus_serif_tl { LibertinusSerif }
+ \tl_gset:Nn \g__examzh_font_font_family_libertinus_sans_tl { LibertinusSans }
+ \tl_gset:Nn \g__examzh_font_font_style_libertinus_rm_tl { Regular }
+ \tl_gset:Nn \g__examzh_font_font_style_libertinus_bf_tl { Bold }
+ \tl_gset:Nn \g__examzh_font_font_style_libertinus_it_tl { Italic }
+ \tl_gset:Nn \g__examzh_font_font_style_libertinus_bfit_tl { BoldItalic }
+ \tl_gset:Nn \g__examzh_font_font_name_libertinus_math_tl { LibertinusMath-Regular }
+ }
+ {
+ \tl_gset:Nn \g__examzh_font_font_family_libertinus_serif_tl { libertinusserif }
+ \tl_gset:Nn \g__examzh_font_font_family_libertinus_sans_tl { libertinussans }
+ \tl_gset:Nn \g__examzh_font_font_style_libertinus_rm_tl { regular }
+ \tl_gset:Nn \g__examzh_font_font_style_libertinus_bf_tl { bold }
+ \tl_gset:Nn \g__examzh_font_font_style_libertinus_it_tl { italic }
+ \tl_gset:Nn \g__examzh_font_font_style_libertinus_bfit_tl { bolditalic }
+ \tl_gset:Nn \g__examzh_font_font_name_libertinus_math_tl { libertinusmath-regular }
+ }
+ }
+ }
+
+\cs_new:Npn \examzh_font_set_font_libertinus:
+ {
+ \examzh_font_set_libertinus_names:
+ \setmainfont { \g__examzh_font_font_family_libertinus_serif_tl }
+ [
+ Extension = .otf ,
+ UprightFont = *-\g__examzh_font_font_style_libertinus_rm_tl ,
+ BoldFont = *-\g__examzh_font_font_style_libertinus_bf_tl ,
+ ItalicFont = *-\g__examzh_font_font_style_libertinus_it_tl ,
+ BoldItalicFont = *-\g__examzh_font_font_style_libertinus_bfit_tl ,
+ ]
+ \setsansfont { \g__examzh_font_font_family_libertinus_sans_tl }
+ [
+ Extension = .otf ,
+ UprightFont = *-\g__examzh_font_font_style_libertinus_rm_tl ,
+ BoldFont = *-\g__examzh_font_font_style_libertinus_bf_tl ,
+ ItalicFont = *-\g__examzh_font_font_style_libertinus_it_tl ,
+ ]
+ \setmonofont { lmmonolt10 }
+ [
+ Extension = .otf ,
+ UprightFont = *-regular ,
+ BoldFont = *-bold ,
+ ItalicFont = *-oblique ,
+ BoldItalicFont = *-boldoblique ,
+ ]
+ }
+
+
+% 数学字体
+
+% 按照国标样式配置 unicode-math
+
+\tl_new:N \l__examzh_save_leq_tl
+\tl_new:N \l__examzh_save_geq_tl
+
+\AtEndOfPackageFile* { unicode-math }
+ {
+ \unimathsetup
+ {
+ math-style = ISO ,
+ bold-style = ISO ,
+ partial = upright ,
+ }
+ \AtBeginDocument
+ {
+ \tl_set_eq:NN \leq \l__examzh_save_leq_tl
+ \tl_set_eq:NN \geq \l__examzh_save_geq_tl
+ \tl_set_eq:NN \leq \leqslant
+ \tl_set_eq:NN \geq \geqslant
+ }
+ \cs_set_protected:Npn \mathellipsis { \mathinner { \unicodecdots } }
+ }
+
+
+% 数学符号样式
+
+% \tl_new:N \l__examzh_font_uppercase_greek_tl
+% \tl_new:N \l__examzh_font_leq_style_tl
+\tl_new:N \l__examzh_font_integral_style_tl
+% \bool_new:N \l__examzh_font_integral_limits_bool
+% \tl_new:N \l__examzh_font_partial_style_tl
+% \tl_new:N \l__examzh_font_math_ellipsis_tl
+% \tl_new:N \l__examzh_font_real_part_tl
+
+\tl_set:Nn \l__examzh_font_integral_style_tl { upright }
+
+% \keys_define:nn { exam-zh }
+% {
+% math-style .choices:nn =
+% { GB , ISO , TeX }
+% { \exp_args:NV \examzh_font_set_math_style:n \l_keys_choice_tl } ,
+% uppercase-greek .choices:nn =
+% { italic , upright }
+% { \tl_set_eq:NN \l__examzh_font_uppercase_greek_tl \l_keys_choice_tl } ,
+% less-than-or-equal .choices:nn =
+% { slanted , horizontal }
+% { \tl_set_eq:NN \l__examzh_font_leq_style_tl \l_keys_choice_tl } ,
+% integral .choices:nn =
+% { upright , slanted }
+% { \tl_set_eq:NN \l__examzh_font_integral_style_tl \l_keys_choice_tl } ,
+% integral-limits .bool_set:N = \l__examzh_font_integral_limits_bool ,
+% partial .choices:nn =
+% { upright , slanted }
+% { \tl_set_eq:NN \l__examzh_font_partial_style_tl \l_keys_choice_tl } ,
+% math-ellipsis .choices:nn =
+% { centered , lower , AMS }
+% { \tl_set_eq:NN \l__examzh_font_math_ellipsis_tl \l_keys_choice_tl } ,
+% real-part .choices:nn =
+% { roman , fraktur }
+% { \tl_set_eq:NN \l__examzh_font_real_part_tl \l_keys_choice_tl } ,
+% }
+
+
+
+% New Computer Modern Math
+
+\tl_new:N \l__examzh_font_stylistic_set_tl
+
+\cs_new:Npn \examzh_font_set_math_font_newcm:
+ {
+ % \examzh_font_load_unimath:
+ % \examzh_font_set_unimath_style:
+ \tl_if_eq:NnTF \l__examzh_font_integral_style_tl { upright }
+ { \tl_set:Nn \l__examzh_font_stylistic_set_tl { 2 } }
+ { \tl_clear:N \l__examzh_font_stylistic_set_tl }
+ \setmathfont { NewCMMath-Book }
+ [
+ Extension = .otf,
+ StylisticSet = \l__examzh_font_stylistic_set_tl ,
+ ]
+ \setmathfont { NewCMMath-Book }
+ [
+ Extension = .otf,
+ StylisticSet = 1,
+ range = { scr , bfscr } ,
+ ]
+ \examzh_font_set_stix_names:
+ \setmathfont { \g__examzh_font_font_name_stix_math_tl }
+ [
+ Extension = .otf,
+ range = { \complement } ,
+ ]
+ \setmathrm { NewCM10 }
+ [
+ Extension = .otf,
+ UprightFont = *-Book,
+ BoldFont = *-Bold,
+ ItalicFont = *-BookItalic,
+ BoldItalicFont = *-BoldItalic,
+ ]
+ \setmathsf { NewCMSans10 }
+ [
+ Extension = .otf,
+ UprightFont = *-Book,
+ BoldFont = *-Bold,
+ ItalicFont = *-BookOblique,
+ BoldItalicFont = *-BoldOblique,
+ ]
+ \setmathtt { NewCMMono10 }
+ [
+ Extension = .otf,
+ UprightFont = *-Book,
+ ItalicFont = *-BookItalic,
+ BoldFont = *-Bold,
+ BoldItalicFont = *-BoldOblique,
+ ]
+ }
+
+
+% Latin Modern Math
+\cs_new:Npn \examzh_font_set_math_font_lm:
+ {
+ % \examzh_font_load_unimath:
+ % \examzh_font_set_unimath_style:
+ \setmathfont { latinmodern-math } [ Extension = .otf ]
+ \examzh_font_set_stix_names:
+ \setmathfont { \g__examzh_font_font_name_stix_math_tl }
+ [
+ Extension = .otf,
+ range = { \complement } ,
+ ]
+ \setmathrm { lmroman10 }
+ [
+ Extension = .otf,
+ UprightFont = *-regular,
+ BoldFont = *-bold,
+ ItalicFont = *-italic,
+ BoldItalicFont = *-bolditalic,
+ ]
+ \setmathsf { lmsans10 }
+ [
+ Extension = .otf,
+ UprightFont = *-regular,
+ BoldFont = *-bold,
+ ItalicFont = *-oblique,
+ BoldItalicFont = *-boldoblique,
+ ]
+ \setmathtt { lmmonolt10 }
+ [
+ Extension = .otf,
+ UprightFont = *-regular,
+ BoldFont = *-bold,
+ ItalicFont = *-oblique,
+ BoldItalicFont = *-boldoblique,
+ ]
+ }
+
+
+% STIX Two Math
+\cs_new:Npn \examzh_font_set_math_font_stix:
+ {
+ % \examzh_font_load_unimath:
+ % \examzh_font_set_unimath_style:
+ \examzh_font_set_stix_names:
+ \tl_if_eq:NnTF \l__examzh_font_integral_style_tl { upright }
+ { \tl_set:Nn \l__examzh_font_stylistic_set_tl { 8 } }
+ { \tl_clear:N \l__examzh_font_stylistic_set_tl }
+ \setmathfont { \g__examzh_font_font_name_stix_math_tl }
+ [
+ Extension = .otf,
+ StylisticSet = \l__examzh_font_stylistic_set_tl,
+ ]
+ \setmathfont { \g__examzh_font_font_name_stix_math_tl }
+ [
+ Extension = .otf,
+ StylisticSet = 1,
+ range = { scr , bfscr },
+ ]
+ }
+
+
+% XITS Math
+\cs_new:Npn \examzh_font_set_math_font_xits:
+ {
+ % \examzh_font_load_unimath:
+ % \examzh_font_set_unimath_style:
+ \examzh_font_set_xits_names:
+ \tl_if_eq:NnTF \l__examzh_font_integral_style_tl { upright }
+ { \tl_set:Nn \l__examzh_font_stylistic_set_tl { 8 } }
+ { \tl_clear:N \l__examzh_font_stylistic_set_tl }
+ \setmathfont { \g__examzh_font_font_name_xits_math_tl }
+ [
+ Extension = .otf ,
+ StylisticSet = \l__examzh_font_stylistic_set_tl ,
+ ]
+ \setmathfont { \g__examzh_font_font_name_xits_math_tl }
+ [
+ Extension = .otf ,
+ StylisticSet = 1 ,
+ range = { cal , bfcal } ,
+ ]
+ }
+
+% Libertinus Math
+\cs_new:Npn \examzh_font_set_math_font_libertinus: {
+ % \examzh_font_load_unimath:
+ % \examzh_font_set_unimath_style:
+ \examzh_font_set_libertinus_names:
+ \tl_if_eq:NnTF \l__examzh_font_integral_style_tl { slanted }
+ { \tl_set:Nn \l__examzh_font_stylistic_set_tl { 8 } }
+ { \tl_clear:N \l__examzh_font_stylistic_set_tl }
+ \setmathfont { \g__examzh_font_font_name_libertinus_math_tl }
+ [
+ Extension = .otf,
+ StylisticSet = \l__examzh_font_stylistic_set_tl,
+ ]
+ \examzh_font_set_stix_names:
+ \setmathfont { \g__examzh_font_font_name_stix_math_tl }
+ [
+ Extension = .otf,
+ range = { \complement } ,
+ ]
+}
+
+
+% Cambria Math
+\cs_new:Npn \examzh_font_set_math_font_cambria: {
+ % \examzh_font_load_unimath:
+ % \examzh_font_set_unimath_style:
+ \setmathfont { Cambria~ Math }
+ \examzh_font_set_stix_names:
+ \setmathfont { \g__examzh_font_font_name_stix_math_tl }
+ [
+ Extension = .otf,
+ range = { \complement } ,
+ ]
+}
+
+
+
+\AtEndPreamble
+ {
+ \tl_if_empty:NT \g__examzh_font_font_tl
+ { \keys_set:nn { exam-zh } { font = newcm } }
+ \tl_if_empty:NT \g__examzh_font_math_font_tl
+ { \keys_set:nn { exam-zh } { math-font = newcm } }
+ }
+
+
+% unicode-math 的配置
+
+% 兼容旧的粗体命令:\pkg{bm} 的 \cs{bm} 和 \pkg{amsmath} 的 \cs{boldsymbol}。
+\AtEndOfPackageFile* { unicode-math }
+ {
+ \NewDocumentCommand \bm { m } { { \symbfit { ##1 } } }
+ \RenewDocumentCommand \boldsymbol { m } { { \symbfit { ##1 } } }
+ % 兼容 \pkg{amsfonts} 和 \pkg{amssymb} 中的一些命令。
+ \NewDocumentCommand \square { } { \mdlgwhtsquare }
+ \NewDocumentCommand \blacksquare { } { \mdlgblksquare }
+ \AtBeginDocument
+ { \RenewDocumentCommand \checkmark { } { \ensuremath{ ✓ } } }
+ }
diff --git a/macros/xetex/latex/exam-zh/tex/exam-zh-question.sty b/macros/xetex/latex/exam-zh/tex/exam-zh-question.sty
new file mode 100644
index 0000000000..825a6ad991
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/tex/exam-zh-question.sty
@@ -0,0 +1,1260 @@
+%
+% Copyright (c) 2022 Zeping Lee
+% Released under the LaTeX Project Public License v1.3c License.
+% Repository: https://gitee.com/zepinglee/exam-zh
+%
+
+\NeedsTeXFormat{LaTeX2e}
+
+\RequirePackage{expl3}
+\RequirePackage{xparse}
+
+\ProvidesExplPackage {exam-zh-question} {2022-07-28} {v0.1.13}
+ {exam-zh question module}
+
+\RequirePackage { amsthm }
+\@ifpackageloaded { tcolorbox }
+ { \tcbuselibrary { breakable } }
+ { \RequirePackage [ most ] { tcolorbox } }
+\RequirePackage { zref-savepos }
+\RequirePackage { ulem }
+
+\ExplSyntaxOff
+\usetikzlibrary{shapes.misc}
+\ExplSyntaxOn
+
+
+
+\NewDocumentCommand \questionsetup { m }
+ { \keys_set:nn { exam-zh / question } { #1 } }
+\NewDocumentCommand \fillinsetup { m }
+ { \keys_set:nn { exam-zh / fillin } { #1 } }
+
+% ulem 宏包重定义了 \emph,使用 \normalem 恢复
+\normalem
+
+
+% question 环境相关变量
+
+% 计数器
+\int_new:N \g__examzh_question_index_int
+% 答案颜色
+\tl_new:N \l__examzh_question_answer_color_tl
+% 题目分数
+\int_new:N \l__examzh_question_points_int
+% 是否显示题目分数
+\bool_new:N \l__examzh_question_show_points_bool
+\bool_new:N \l__examzh_question_show_points_auto_bool
+% 题目分数是否单独成段,解答题需要单独成段
+\bool_new:N \l__examzh_question_points_separate_par_bool
+% 是否显示括号
+\bool_new:N \l__examzh_question_show_paren_bool
+% 是否显示答案
+\bool_new:N \l__examzh_question_show_answer_bool
+\bool_new:N \l__examzh_question_show_fillin_answer_bool
+\bool_new:N \l__examzh_question_show_paren_answer_bool
+% 上下的间距
+\skip_new:N \l__examzh_question_top_sep_skip
+\skip_new:N \l__examzh_question_bottom_sep_skip
+% label 的对齐
+\tl_new:N \l__examzh_question_label_align_tl
+
+
+\keys_define:nn { exam-zh }
+ { question .meta:nn = { exam-zh / question } {#1} }
+
+
+\keys_define:nn { exam-zh / question }
+ {
+ % 手动调整 question 环境的计数器
+ index .int_gset:N = \g__examzh_question_index_int ,
+ % 分数
+ points .int_set:N = \l__examzh_question_points_int ,
+ % 分数显示控制
+ show-points .choice: ,
+ show-points / auto .code:n =
+ { \bool_set_true:N \l__examzh_question_show_points_auto_bool } ,
+ show-points / true .code:n =
+ {
+ \bool_set_true:N \l__examzh_question_show_points_bool
+ \bool_set_false:N \l__examzh_question_show_points_auto_bool
+ } ,
+ show-points / false .code:n =
+ {
+ \bool_set_false:N \l__examzh_question_show_points_bool
+ \bool_set_false:N \l__examzh_question_show_points_auto_bool
+ } ,
+ % 分数是否单独成段
+ points-separate-par .bool_set:N = \l__examzh_question_points_separate_par_bool ,
+ % 是否显示答案
+ % show-answer .bool_set:N = \l__examzh_question_show_answer_bool ,
+ show-answer .choice: ,
+ show-answer / true .code:n =
+ {
+ \bool_set_true:N \l__examzh_question_show_fillin_answer_bool
+ \bool_set_true:N \l__examzh_question_show_paren_answer_bool
+ },
+ show-answer / false .code:n =
+ {
+ \bool_set_false:N \l__examzh_question_show_fillin_answer_bool
+ \bool_set_false:N \l__examzh_question_show_paren_answer_bool
+ },
+ % 上方间距
+ top-sep .skip_set:N = \l__examzh_question_top_sep_skip ,
+ % 下方间距
+ bottom-sep .skip_set:N = \l__examzh_question_bottom_sep_skip ,
+ label .tl_set:N = \l__examzh_question_label_tl,
+ combine-fillin .bool_set:N = \l__examzh_question_combine_fillin_bool,
+ combine-fillin-args .tl_set:N = \l__examzh_question_combine_fillin_args_tl,
+ label-align .choices:nn =
+ { left, center, right }
+ { \tl_set_eq:NN \l__examzh_question_label_align_tl \l_keys_choice_tl }
+ }
+
+\keys_set:nn { exam-zh / question }
+ {
+ index = 1,
+ points = 0 ,
+ show-points = auto ,
+ points-separate-par = false ,
+ show-answer = false ,
+ top-sep = .25em plus .25em minus .1em ,
+ bottom-sep = .25em plus .25em minus .1em ,
+ label = \arabic*.,
+ combine-fillin = false,
+ label-align = right
+ }
+
+
+
+% 是否按照解答题的格式排版
+\bool_new:N \l__examzh_question_problem_style_bool
+
+
+% 选择题和填空题的题干
+\NewDocumentEnvironment { question } { O { } +b }
+ {
+ \bool_set_false:N \l__examzh_question_problem_style_bool
+ \__examzh_question_begin:nn {#1}{#2}
+ }
+ { \__examzh_question_end:nn {#1}{#2} }
+
+% 解答题
+\NewDocumentEnvironment { problem } { O { } +b }
+ {
+ \bool_set_true:N \l__examzh_question_problem_style_bool
+ \__examzh_question_begin:nn {#1}{#2}
+ }
+ { \__examzh_question_end:nn {#1}{#2} }
+
+\prg_generate_conditional_variant:Nnn \int_compare:nNn { xNn } { T }
+\cs_new:Npn \__examzh_question_begin:nn #1#2
+ {
+ \par
+ % 根据是否按解答题方式排版来设置是否分数要分段
+ \bool_if:NTF \l__examzh_question_problem_style_bool
+ { \keys_set:nn { exam-zh / question } { points-separate-par = true } }
+ { \keys_set:nn { exam-zh / question } { points-separate-par = false } }
+ % \bool_if:NTF \l__examzh_question_combine_fillin_bool
+ % { \keys_set:nn { exam-zh / question } { label-align = left } }
+ % { \keys_set:nn { exam-zh / question } { label-align = right } }
+ % 设置键值
+ \keys_set:nn { exam-zh / question } { #1 }
+ % 题干计数器的值加一
+ \int_gincr:N \g__examzh_question_index_int
+ % 设置上方间距
+ % \addvspace { \l__examzh_question_top_sep_skip }
+ \vspace { \l__examzh_question_top_sep_skip }
+ % 严格禁止孤行和寡行
+ \int_set:Nn \clubpenalty { 10000 }
+ \int_set:Nn \widowpenalty { 10000 }
+ % 尽量避免在题目中间换行
+ \int_set:Nn \interlinepenalty { 301 }
+ % 这部分是仿照 source2e 中 enumerate 的定义写的
+ % \@enumdepth 主要控制 enumerate 不同层级的编号
+ % 这样设置后,在 question 中使用 enumerate 会调用 level 2 的编号
+ % 也就是 question 中的 enumerate 环境直接从第二层开始
+ \int_incr:N \@enumdepth
+ % 如果 show-points = auto 那么解答题显示分数,选择题和填空题不显示分数
+ % 这样设置考虑到选择题和填空题都是每道题一样的分数,在最开始的地方说明即可
+ % 而解答题不太一样
+ \bool_if:NT \l__examzh_question_show_points_auto_bool
+ {
+ \bool_if:NTF \l__examzh_question_problem_style_bool
+ { \bool_set_true:N \l__examzh_question_show_points_bool }
+ { \bool_set_false:N \l__examzh_question_show_points_bool }
+ }
+ % 使用列表环境输出
+ \list
+ {
+ % \int_use:N \g__examzh_question_index_int .
+ \__examzh_question_make_label:n
+ {
+ \bool_if:NT \l__examzh_question_combine_fillin_bool
+ {
+ \tl_if_blank:VTF \l__examzh_question_combine_fillin_args_tl
+ { \fillin }
+ {
+ \use:x
+ {
+ \exp_not:N \fillin \l__examzh_question_combine_fillin_args_tl
+ }
+ }
+ }
+ \int_compare:xNnT { \g__examzh_question_index_int } < { 11 }
+ { \phantom {1} }
+ \__examzh_question_the_label:
+ }
+ }
+ {
+ % 用 group 是为了防止 combine-fillin 的 type 影响了环境里面的 fillin 的type
+ \group_begin:
+ \dim_gset:Nn \topsep { 0pt }
+ \dim_gset:Nn \partopsep { 0pt }
+ \dim_gset:Nn \itemsep { 0pt }
+ \dim_gset:Nn \parsep { 0pt }
+ % \group_begin:
+ % 上面 \fillin 里面的设置是局部的,这样的问题是 question 的可选参数改 type 的时候不会影响 \l__examzh_fillin_type_str 的值
+ % 所以要把 \l__examzh_question_combine_fillin_args_tl 里关于 type 的选取出来
+ \__examzh_question_begin_fillin_type_set:
+ \__examzh_question_begin_labelsep_labelwidth_set:
+ % \group_end:
+ \bool_if:NTF \l__examzh_question_problem_style_bool
+ {
+ % 解答题是正文 + 缩进 2em 的效果
+ \bool_if:NTF \l__examzh_question_combine_fillin_bool
+ {
+ % 如果 combine 的话就和 question 一样的缩进
+ \dim_gset:Nn \leftmargin { 6em }
+ \dim_gset:Nn \itemindent { 0pt }
+ }
+ {
+ \dim_gset:Nn \leftmargin { 0pt }
+ \dim_gset:Nn \itemindent { 2em }
+ }
+ }
+ {
+ % 选择和填空题是悬挂效果
+ \bool_if:NTF \l__examzh_question_combine_fillin_bool
+ % {
+ % \str_case:VnF \l__examzh_question_label_align_tl
+ % {
+ % { left } { \dim_set:Nn \leftmargin { 8em } }
+ % }
+ { \dim_gset:Nn \leftmargin { 6em } }
+ % }
+ { \dim_gset:Nn \leftmargin { 2em } }
+ \dim_set:Nn \itemindent { 0pt }
+ }
+ \dim_gset_eq:NN \listparindent \itemindent
+ \group_end:
+ }
+ \item \relax
+ % 输出题目分数
+ \bool_if:NT \l__examzh_question_show_points_bool
+ {
+ % 如果设置了分数且 show-points 的 bool 是 true 的话就显示
+ \int_compare:nNnT { \l__examzh_question_points_int } > { 0 }
+ { ( \int_use:N \l__examzh_question_points_int ~ 分 ) }
+ % 是否分段(解答题需要分段)
+ \bool_if:NT \l__examzh_question_points_separate_par_bool
+ % \par 分段之后使用 \nopagebreak 避免分页导致序号和分数出现在页面最后一行
+ { \par \nopagebreak }
+ }
+ }
+\int_new:N \l__examzh_question_begin_fillin_args_bracket_num_int
+\cs_generate_variant:Nn \regex_count:nnN { nVN }
+\prg_generate_conditional_variant:Nnn \regex_extract_once:nnN { nxN } { F }
+\cs_new:Npn \__examzh_question_begin_fillin_type_set:
+ {
+ \regex_count:nVN { \[ } %]
+ \l__examzh_question_combine_fillin_args_tl
+ \l__examzh_question_begin_fillin_args_bracket_num_int
+ % \int_use:N \l__examzh_question_begin_fillin_args_bracket_num_int
+ \int_compare:nNnT { \l__examzh_question_begin_fillin_args_bracket_num_int } = {2}
+ {
+ \regex_extract_once:nxNF { \[ (.*?) \] } { \l__examzh_question_combine_fillin_args_tl } \l_tmpa_seq { \fail }
+ \seq_pop_left:NN \l_tmpa_seq \l_tmpa_tl
+ % \seq_use:Nn \l_tmpa_seq {,}
+ \keys_set:nx { exam-zh / fillin } { \seq_use:Nn \l_tmpa_seq {,} }
+ }
+ }
+\cs_new:Npn \__examzh_question_begin_labelsep_labelwidth_set:
+ {
+ \bool_if:NTF \l__examzh_question_combine_fillin_bool
+ {
+ \str_case:Vn \l__examzh_question_label_align_tl
+ {
+ { left }
+ {
+ \str_case:VnF \l__examzh_fillin_type_str
+ {
+ { paren }
+ {
+ % combin-left-paren
+ \dim_gset:Nn \labelsep { 2.8em }
+ \dim_gset:Nn \labelwidth { 4.2em }
+ }
+ { line }
+ {
+ % combin-left-line
+ \dim_gset:Nn \labelsep { 2.4em }
+ \dim_gset:Nn \labelwidth { 3.8em }
+ }
+ }
+ {
+ % combin-left-paren/line 外的
+ \dim_gset:Nn \labelsep { 2.8em }
+ \dim_gset:Nn \labelwidth { 1.3em }
+ }
+ }
+ { center }
+ {
+ \str_case:VnF \l__examzh_fillin_type_str
+ {
+ { paren }
+ {
+ % combin-center-paren
+ \dim_gset:Nn \labelsep { 2em }
+ \dim_gset:Nn \labelwidth { 5em }
+ }
+ { line }
+ {
+ % combin-center-line
+ \dim_gset:Nn \labelsep { 2.8em }
+ \dim_gset:Nn \labelwidth { 4em }
+ }
+ }
+ {
+ % combin-center-paren/line 外的
+ \dim_gset:Nn \labelsep { 2em }
+ \dim_gset:Nn \labelwidth { 1.3em }
+ }
+ }
+ { right }
+ {
+ \dim_gset:Nn \labelsep { .7em }
+ \dim_gset:Nn \labelwidth { 1.3em }
+ }
+ }
+ }
+ {
+ \str_case:Vn \l__examzh_question_label_align_tl
+ {
+ { left }
+ {
+ \dim_gset:Nn \labelsep { .7em }
+ \dim_gset:Nn \labelwidth { 1.8em }
+ }
+ { center }
+ {
+ \dim_gset:Nn \labelsep { .7em }
+ \dim_gset:Nn \labelwidth { 1.3em }
+ }
+ { right }
+ {
+ \dim_gset:Nn \labelsep { .7em }
+ \dim_gset:Nn \labelwidth { 1.3em }
+ }
+ }
+
+ }
+ }
+
+\cs_new:Npn \__examzh_question_end:nn #1#2
+ {
+ #2
+ % 结束列表环境
+ \endlist
+ % 增加下方间距
+ % \addvspace { \l__examzh_question_bottom_sep_skip }
+ \vspace { \l__examzh_question_bottom_sep_skip }
+ }
+
+% 处理 question / problem 的 label
+\tl_new:N \l__examzh_question_counters_commands_set_tl
+
+\cs_new:Npn \__examzh_question_the_label:
+ {
+ \group_begin:
+ % 定义计数器相关的命令函数
+ \l__examzh_question_counters_commands_set_tl
+ % 输出处理后的 label
+ \l__examzh_question_label_tl
+ \group_end:
+ }
+\cs_new:Npn \__examzh_question_make_label:n #1
+ {
+ \str_case:Vn \l__examzh_question_label_align_tl
+ {
+ { left } { \rlap { #1 } \hss }
+ { center } { \hss \clap { #1 } \hss }
+ { right } { \hss \llap { #1 } }
+ }
+ }
+\NewDocumentCommand \AddQuestionCounter { m m }
+ {
+ % 生成用户层命令
+ \tl_put_right:Nn \l__examzh_question_counters_commands_set_tl
+ { \__examzh_process_counter:NNn #1 #2 { question } }
+ % 把核心函数存起来
+ \cs_set_eq:cN { __examzh_question_save_ \cs_to_str:N #1 : } #2
+ \cs_set_eq:cN { __examzh_question_save_ \cs_to_str:N #2 : } #2
+ }
+
+\AddQuestionCounter \arabic \@arabic
+\AddQuestionCounter \alph \@alph
+\AddQuestionCounter \Alph \@Alph
+\AddQuestionCounter \roman \@roman
+\AddQuestionCounter \Roman \@Roman
+
+\cs_new:Npn \__examzh_process_counter:NNn #1#2#3
+ % #1: \Alph
+ % #2: \@Alph
+ % #3: question / fillin
+ {
+ \cs_set:Npn #1 { \use:c { __examzh_ #3 _process_counter_aux:Nn } #2 }
+ \cs_set:Npn #2 { \use:c { __examzh_ #3 _process_counter_aux:Nn } #2 }
+ }
+
+\cs_new:Npn \__examzh_question_process_counter_aux:Nn #1#2
+ {
+ \tl_if_eq:nnTF {#2} { * }
+ {
+ % \Alph*
+ \use:c { __examzh_question_save_ \cs_to_str:N #1 : }
+ { \int_eval:n { \g__examzh_question_index_int - 1 } }
+ }
+ {
+ % \Alph{...}
+ \use:c { __examzh_question_save_ \cs_to_str:N #1 : }
+ {#2}
+ }
+ }
+
+
+% 处理 fillin/no-answer-type = counter 的 label
+\tl_new:N \l__examzh_fillin_counters_commands_set_tl
+
+
+\cs_new:Npn \__examzh_fillin_the_label:
+ {
+ \group_begin:
+ % 定义计数器相关的命令函数
+ \l__examzh_fillin_counters_commands_set_tl
+ % 输出处理后的 label
+ \l__examzh_fillin_label_tl
+ \group_end:
+ }
+
+\NewDocumentCommand \AddFillinCounter { m m }
+ {
+ % 生成用户层命令
+ \tl_put_right:Nn \l__examzh_fillin_counters_commands_set_tl
+ { \__examzh_process_counter:NNn #1 #2 { fillin } }
+ % 把核心函数存起来
+ \cs_set_eq:cN { __examzh_fillin_save_ \cs_to_str:N #1 : } #2
+ \cs_set_eq:cN { __examzh_fillin_save_ \cs_to_str:N #2 : } #2
+ }
+
+\AddFillinCounter \arabic \@arabic
+\AddFillinCounter \alph \@alph
+\AddFillinCounter \Alph \@Alph
+\AddFillinCounter \roman \@roman
+\AddFillinCounter \Roman \@Roman
+
+\cs_new:Npn \__examzh_fillin_process_counter_aux:Nn #1#2
+ {
+ \tl_if_eq:nnTF {#2} { * }
+ {
+ % \Alph*
+ \use:c { __examzh_fillin_save_ \cs_to_str:N #1 : }
+ { \int_eval:n { \g__examzh_fillin_no_answer_counter_int - 1 } }
+ }
+ {
+ % \Alph{...}
+ \use:c { __examzh_fillin_save_ \cs_to_str:N #1 : }
+ {#2}
+ }
+ }
+
+% 使用中文字体直接输出 unicode 带圈数字
+% \circlednumber 的参数既可以接受 LaTeX2e 的 <counter>,也可以直接接受 <intexpr>。
+\NewDocumentCommand \circlednumber { s m }
+ {
+ \int_if_exist:cTF { c@ #2 }
+ { \int_set_eq:Nc \l_tmpa_int { c@#2 } }
+ { \int_set:Nn \l_tmpa_int { #2 } }
+ \IfBooleanTF {#1}
+ {
+ \exp_args:Nx \__examzh_tikz_circled_number:n { \int_use:N \l_tmpa_int }
+ }
+ {
+ \exp_args:Nx \__examzh_question_circled_number:n { \int_use:N \l_tmpa_int }
+ }
+ }
+
+\cs_new:Npn \__examzh_circled_number:nn #1#2
+ {
+ \int_set:Nn \l_tmpa_int {#1}
+ \int_compare:nNnTF { \l_tmpa_int } = { 0 }
+ { \int_set:Nn \l_tmpa_int { "24EA } }
+ {
+ \int_compare:nNnTF { \l_tmpa_int } < { 21 }
+ { \int_add:Nn \l_tmpa_int { "245F } }
+ {
+ \int_compare:nNnTF { \l_tmpa_int } < { 36 }
+ { \int_add:Nn \l_tmpa_int { "3250 } }
+ {
+ \int_compare:nNnTF { \l_tmpa_int } < { 51 }
+ { \int_add:Nn \l_tmpa_int { "32B0 } }
+ {
+ \msg_error:nnn { exam-zh / #2 }
+ { invalid-circled-number } { \int_use:N \l_tmpa_int }
+ }
+ }
+ }
+ }
+ \group_begin:
+ \CJKfamily+ { }
+ \symbol { \l_tmpa_int }
+ \group_end:
+ }
+
+\msg_new:nnn { exam-zh / question } { invalid-circled-number }
+{ Invalid~ circled~ number~ #1. }
+
+\msg_new:nnn { exam-zh / fillin } { invalid-circled-number }
+{ Invalid~ circled~ number~ #1. }
+
+\cs_new:Npn \__examzh_question_circled_number:n #1
+ { \__examzh_circled_number:nn {#1} { question } }
+\cs_new:Npn \__examzh_fillin_circled_number:n #1
+ { \__examzh_circled_number:nn {#1} { fillin } }
+
+\AddQuestionCounter \circlednumber \__examzh_question_circled_number:n
+\AddFillinCounter \circlednumber \__examzh_fillin_circled_number:n
+
+% tikz 绘制带圈数字
+\fp_new:N \l__examzh_tikz_circled_number_xscale_fp % 水平压缩系数
+\fp_new:N \l__examzh_tikz_circled_number_yscale_fp % 垂直压缩系数
+\dim_new:N \l__examzh_tikz_circled_number_total_hegiht_dim % 数字的总高度
+\dim_new:N \l__examzh_tikz_circled_number_radius_dim % 半径
+
+\cs_new:Npn \__examzh_tikz_circled_number_aux:n #1
+ {
+ % 根据数字大小设置压缩系数
+ \fp_set:Nn \l__examzh_tikz_circled_number_xscale_fp
+ {
+ \int_compare:nNnTF {#1} < { 10 }
+ { 0.9 }
+ {
+ \int_compare:nNnTF {#1} < { 100 }
+ { 0.7 }
+ { 0.5 }
+ }
+ }
+ \fp_set:Nn \l__examzh_tikz_circled_number_yscale_fp
+ {
+ \int_compare:nNnTF {#1} < { 10 }
+ { 0.9 }
+ {
+ \int_compare:nNnTF {#1} < { 100 }
+ { 0.8 }
+ { 0.6 }
+ }
+ }
+ % 获取数字的高度
+ \hbox_set:Nn \l_tmpa_box {#1}
+ \dim_set:Nn \l__examzh_tikz_circled_number_total_hegiht_dim
+ { \box_ht:N \l_tmpa_box + \box_dp:N \l_tmpa_box }
+ % 设置圆的半径
+ \dim_set:Nn \l__examzh_tikz_circled_number_radius_dim
+ { \dim_eval:n { \l__examzh_tikz_circled_number_total_hegiht_dim / 2 + 0.34 ex } }
+ % 绘制
+ \tikz [ baseline ]
+ {
+ \node
+ [ inner~sep = 0pt, outer~sep = 0pt ]
+ at (0, \dim_use:N \l__examzh_tikz_circled_number_total_hegiht_dim / 2 )
+ {
+ \hbox_set:Nn \l_tmpa_box
+ {
+ \int_compare:nNnTF {#1} > {9}
+ { \textbf {#1} }
+ {#1}
+ }
+ \makebox[0.35em][c]
+ {
+ % \scalebox { \fp_use:N \l__examzh_tikz_circled_number_xscale_fp }
+ % [ \fp_use:N \l__examzh_tikz_circled_number_yscale_fp ]
+ \box_scale:Nnn \l_tmpa_box
+ { \fp_use:N \l__examzh_tikz_circled_number_xscale_fp }
+ { \fp_use:N \l__examzh_tikz_circled_number_yscale_fp }
+ \box_use_drop:N \l_tmpa_box
+ }
+ };
+ \draw (0, \l__examzh_tikz_circled_number_total_hegiht_dim / 2 )
+ circle ( \l__examzh_tikz_circled_number_radius_dim );
+ }
+ }
+\cs_new:Npn \__examzh_tikz_circled_number:n #1
+ {
+ \__examzh_tikz_circled_number_aux:n { \int_eval:n {#1} }
+ }
+\AddQuestionCounter \tikzcirclednumber \__examzh_tikz_circled_number:n
+\AddFillinCounter \tikzcirclednumber \__examzh_tikz_circled_number:n
+
+% 选择题括号
+% 控制括号是否右对齐
+\bool_new:N \l__examzh_paren_type_hfill_bool
+\keys_define:nn { exam-zh / paren }
+ {
+ show-answer .bool_set:N = \l__examzh_question_show_paren_answer_bool,
+ text-color .tl_set:N = \l__examzh_paren_text_color_tl ,
+ % 是否显示选择题的括号
+ show-paren .bool_set:N = \l__examzh_question_show_paren_bool ,
+ type .choice:,
+ type / hfill .code:n =
+ {
+ \bool_set_true:N \l__examzh_paren_type_hfill_bool
+ },
+ type / none .code:n =
+ {
+ \bool_set_false:N \l__examzh_paren_type_hfill_bool
+ },
+ }
+\keys_set:nn { exam-zh / paren }
+ {
+ show-answer = false,
+ text-color = black,
+ show-paren = false,
+ type = hfill
+ }
+\keys_define:nn { exam-zh }
+ { paren .meta:nn = { exam-zh / paren } {#1} }
+\NewDocumentCommand \paren { O { } }
+ {
+ % 如果开了 show answer 就默认 show paren
+ \bool_if:NT \l__examzh_question_show_paren_answer_bool
+ { \bool_set_true:N \l__examzh_question_show_paren_bool }
+ \bool_if:NT \l__examzh_question_show_paren_bool
+ {
+ % 使括号单独成行时居于右侧
+ % \null -> \hbox{}
+ % 𝖅𝖊𝖕𝖎𝖓𝖌 𝕷𝖊𝖊, [Mar 19, 2022 at 22:47:07]:
+ % 这个写法是为了处理这样的情况:假设括号需要 3em 宽度,但是如果题干末尾只剩下了 2em 的空白,括号就必要另起一行,并且用 \hill 把括号推到最右侧
+ % 所以中间用了两个 \hfill
+ % 至于 \nobreak 和 \allowbreak 大概是为了能够同时处理「括号不换行」和「括号换行」两种情况
+ % 这里参考 source2e 的 \@dottedtocline(目录的格式)
+ % 控制是否 hfill 到行尾
+ \bool_if:NT \l__examzh_paren_type_hfill_bool
+ {
+ \nobreak \hfill \allowbreak
+ \null \nobreak \hfill \nobreak
+ }
+ \hbox:n
+ {
+ (
+ \hbox_to_wd:nn { 3em }
+ {
+ \bool_if:NT \l__examzh_question_show_paren_answer_bool
+ { \hfill \__examzh_paren_print_answer:n {#1} \hfill }
+ }
+ ) \kern -.4em
+ }
+ }
+ }
+% “打印出”答案内容 因为 show 被用作“显示与否”的含义了,所以此处用 print
+\cs_new:Npn \__examzh_fillin_print_answer:n #1
+ {
+ % \group_begin:
+ \tl_if_eq:NnF \l__examzh_fillin_text_color_tl { black }
+ { \exp_args:NV \color \l__examzh_fillin_text_color_tl }
+ #1
+ % \group_end:
+ }
+\cs_new:Npn \__examzh_paren_print_answer:n #1
+ {
+ \group_begin:
+ \tl_if_eq:NnF \l__examzh_paren_text_color_tl { black }
+ { \exp_args:NV \color \l__examzh_paren_text_color_tl }
+ #1
+ \group_end:
+ }
+
+
+% fillin 的下划线样式控制
+\str_new:N \l__examzh_fillin_type_str
+
+% 不显示答案时显示的类型
+\str_new:N \l__examzh_fillin_no_answer_type_str
+
+% no-answer-type = counter 的计数器
+\int_new:N \g__examzh_fillin_no_answer_counter_int
+
+\keys_define:nn { exam-zh / fillin }
+ {
+ type .code:n =
+ {
+ \str_set:Nn \l__examzh_fillin_type_str {#1}
+ },
+ show-answer .bool_set:N = \l__examzh_question_show_fillin_answer_bool,
+ width .skip_set:N = \l__examzh_fillin_F_width_skip,
+ color .tl_set:N = \l__examzh_fillin_color_tl,
+ text-color .tl_set:N = \l__examzh_fillin_text_color_tl,
+ no-answer-type .choices:nn =
+ { blacktriangle, counter, none }
+ { \str_set:Nx \l__examzh_fillin_no_answer_type_str { \l_keys_choice_tl } },
+ no-answer-counter-index .int_gset:N = \g__examzh_fillin_no_answer_counter_int,
+ no-answer-counter-label .tl_set:N = \l__examzh_fillin_label_tl
+ }
+\keys_set:nn { exam-zh / fillin }
+ {
+ type = line,
+ show-answer = false,
+ width = 3em plus 1em minus 1em,
+ color = black,
+ text-color = black,
+ no-answer-type = blacktriangle,
+ no-answer-counter-index = 1,
+ no-answer-counter-label = \arabic*
+ }
+
+\keys_define:nn { exam-zh }
+ { fillin .meta:nn = { exam-zh / fillin } {#1} }
+
+
+\dim_new:N \l__examzh_question_answer_depth_dim
+
+% 填空命令
+% \fillin \fillin[] \fillin[][] 在 show-answer = false 的情况下
+% no-answer-type = blacktriangle 就显示黑色三角形
+% no-answer-type = counter :计数器(设计来源于完形填空)
+% no-answer-type = none :不显示
+\NewDocumentCommand \fillin { s O{} o }
+ {
+ \group_begin:
+ \IfNoValueTF {#3}
+ {
+ \bool_if:NTF \l__examzh_question_show_fillin_answer_bool
+ {
+ % 显示答案
+ \IfBooleanTF {#1}
+ {
+ % \fillin*[]
+ \__examzh_fillin_breakline:n {#2}
+ }
+ {
+ % \fillin[]
+ \__examzh_fillin:n {#2}
+ }
+ }
+ {
+ % 不显示答案
+ \__examzh_fillin_no_answer_typeset:
+ }
+ }
+ {
+ \keys_set:nn { exam-zh / fillin }
+ {#2}
+ \bool_if:NTF \l__examzh_question_show_fillin_answer_bool
+ {
+ % 显示答案
+ \IfBooleanTF {#1}
+ {
+ % \fillin*[][]
+ \__examzh_fillin_breakline:n {#3}
+ }
+ {
+ % \fillin[][]
+ \__examzh_fillin:n {#3}
+ }
+ }
+ {
+ % 不显示答案
+ \__examzh_fillin_no_answer_typeset:
+ }
+ }
+ \group_end:
+ \space \ignorespaces
+ }
+\msg_new:nnn { exam-zh / fillin } { no-such-noanswertype }
+ {
+ There~is~no~such~noanswertype~named~#1!\\
+ Please~read~the~manual~carefully!
+ }
+\cs_new:Npn \__examzh_fillin_no_answer_typeset:
+ {
+ \str_case:VnF \l__examzh_fillin_no_answer_type_str
+ {
+ { blacktriangle } { \__examzh_fillin_no_answer_typeset_blacktriangle: }
+ { counter } { \__examzh_fillin_no_answer_typeset_counter: }
+ { none } { \__examzh_fillin_no_answer_typeset_none: }
+ }
+ {
+ \msg_error:nnx { exam-zh / fillin } { no-such-noanswertype }
+ { \l__examzh_fillin_no_answer_type_str }
+ }
+ }
+\cs_new:Npn \__examzh_fillin_no_answer_typeset_blacktriangle:
+ {
+ \__examzh_fillin_without_judge:n { \__examzh_fillin_blacktriangle: }
+ }
+\cs_new:Npn \__examzh_fillin_no_answer_typeset_counter:
+ {
+ \int_gincr:N \g__examzh_fillin_no_answer_counter_int
+ \__examzh_fillin_without_judge:n
+ { \__examzh_fillin_the_label: }
+ % { \int_eval:n { \g__examzh_fillin_no_answer_counter_int - 1 } }
+ }
+\cs_new:Npn \__examzh_fillin_no_answer_typeset_none:
+ {
+ \__examzh_fillin_output_F:
+ }
+\cs_new:Npn \__examzh_fillin_without_judge:n #1
+ {
+ % \ULdepth 是 \uline 的下划线的深度
+ \dim_set:Nn \ULdepth { 0.3em }
+ % lazy 版本是指需要判断时才去获取当前用于判断的 bool 值
+ % 而不是类似于“提前展开”,和项子越在 LaTeX3 的 b站视频里讲到的 lazy evaluation 想法相同
+ \hbox_set:Nn \l_tmpa_box { \__examzh_fillin_print_answer:n {#1} }
+ \dim_set:Nn \l__examzh_question_answer_depth_dim
+ { \box_dp:N \l_tmpa_box }
+ \__examzh_fillin_output_T:
+ }
+\cs_new:Npn \__examzh_fillin:n #1
+ {
+ % \ULdepth 是 \uline 的下划线的深度
+ \dim_set:Nn \ULdepth { 0.3em }
+ % lazy 版本是指需要判断时才去获取当前用于判断的 bool 值
+ % 而不是类似于“提前展开”,和项子越在 LaTeX3 的 b站视频里讲到的 lazy evaluation 想法相同
+ \bool_lazy_and:nnTF
+ { \bool_if_p:N \l__examzh_question_show_fillin_answer_bool }
+ { \bool_not_p:n { \tl_if_empty_p:n {#1} } }
+ {
+ \hbox_set:Nn \l_tmpa_box { \__examzh_fillin_print_answer:n {#1} }
+ \dim_set:Nn \l__examzh_question_answer_depth_dim
+ { \box_dp:N \l_tmpa_box }
+ \__examzh_fillin_output_T:
+ }
+ {
+ \__examzh_fillin_output_F:
+ }
+ }
+\cs_new:Npn \__examzh_fillin_breakline:n #1
+ {
+ \bool_lazy_and:nnTF
+ { \bool_if_p:N \l__examzh_question_show_fillin_answer_bool }
+ { \bool_not_p:n { \tl_if_empty_p:n {#1} } }
+ {
+ \tl_set:Nn \l_tmpa_tl { \__examzh_fillin_print_answer:n {#1} }
+ \__examzh_fillin_output_breakline_T:
+ }
+ {
+ \__examzh_fillin_output_F:
+ }
+ }
+\msg_new:nnn { exam-zh } { no-fillin-type }
+ {
+ There~is~no~type~of~\fillin~named~#1!\\
+ Please~read~the~manual~for~more~details.
+ }
+\cs_new:Npn \__examzh_fillin_output_T:
+ {
+ \str_case:VnF \l__examzh_fillin_type_str
+ {
+ { line } { \__examzh_fillin_uline_T: }
+ { paren } { \__examzh_fillin_paren_T: }
+ { circle } { \__examzh_fillin_circle_T: }
+ { blank } { \__examzh_fillin_blank_T: }
+ { rectangle } { \__examzh_fillin_rectangle_T: }
+ }
+ {
+ \msg_error:nnx { exam-zh } { no-fillin-type }
+ { \l__examzh_fillin_type_str }
+ }
+ }
+\cs_new:Npn \__examzh_fillin_output_breakline_T:
+ {
+ \str_case:VnF \l__examzh_fillin_type_str
+ {
+ { line } { \__examzh_fillin_uline_breakline_T: }
+ { paren } { \__examzh_fillin_paren_breakline_T: }
+ { blank } { \__examzh_fillin_blank_breakline_T: }
+ }
+ {
+ \msg_error:nnx { exam-zh } { no-breakable-fillin-type }
+ { \l__examzh_fillin_type_str }
+ }
+ }
+\msg_new:nnn { exam-zh } { no-breakable-fillin-type }
+ {
+ The~type~:~#1~ cannot~be~used~in~breakable~fillin~cmd.
+ }
+\cs_new:Npn \__examzh_fillin_output_F:
+ {
+ \str_case:VnF \l__examzh_fillin_type_str
+ {
+ { line } { \__examzh_fillin_uline_F: }
+ { paren } { \__examzh_fillin_paren_F: }
+ { circle } { \__examzh_fillin_circle_F: }
+ { blank } { \__examzh_fillin_blank_F: }
+ { rectangle } { \__examzh_fillin_rectangle_F: }
+ }
+ {
+ \msg_error:nnx { exam-zh } { no-fillin-type }
+ { \l__examzh_fillin_type_str }
+ }
+ }
+\cs_new:Npn \__examzh_fillin_uline_T:
+ {
+ \uline
+ {
+ \hspace* { 0.5em plus .5em minus .5em }
+ \dim_compare:nNnTF { \l__examzh_question_answer_depth_dim } > { 0.2em }
+ {
+ \dim_sub:Nn \l__examzh_question_answer_depth_dim { 0.2em }
+ \raisebox { \l__examzh_question_answer_depth_dim }
+ { \box_use_drop:N \l_tmpa_box }
+ }
+ { \box_use_drop:N \l_tmpa_box }
+ \hspace* { 0.5em plus .5em minus .5em }
+ }
+ }
+\cs_new:Npn \__examzh_fillin_uline_F:
+ {
+ \uline { \hspace* { \l__examzh_fillin_F_width_skip } }
+ }
+\cs_new:Nn \__examzh_fillin_uline:
+ {
+ \bgroup
+ \color{ \l__examzh_fillin_text_color_tl }
+ \markoverwith{\textcolor{black}{\rule[-0.7ex]{2pt}{0.4pt}}}
+ \ULon
+ }
+\cs_new:Npn \__examzh_fillin_uline_breakline_T:
+ {
+ % \CJKunderline*
+ % \uline
+ \__examzh_fillin_uline:
+ {
+ \hspace* { 0.5em plus .5em minus .5em }
+ \l_tmpa_tl
+ % 答案很长时,不能完全显示,答案很长时,不能完全显示
+ \hspace* { 0.5em plus .5em minus .5em }
+ }
+ }
+\cs_new:Npn \__examzh_fillin_paren_T:
+ {
+ (
+ \hspace* { 0.5em plus .5em minus .5em }
+ \group_begin:
+ \box_use_drop:N \l_tmpa_box
+ \group_end:
+ \hspace* { 0.5em plus .5em minus .5em }
+ )
+ }
+\cs_new:Npn \__examzh_fillin_paren_breakline_T:
+ {
+ (
+ \hspace* { 0.5em plus .5em minus .5em }
+ \group_begin:
+ \l_tmpa_tl
+ \group_end:
+ \hspace* { 0.5em plus .5em minus .5em }
+ )
+ }
+\cs_new:Npn \__examzh_fillin_paren_F:
+ {
+ ( \hspace* { \l__examzh_fillin_F_width_skip} )
+ }
+\cs_new:Npn \__examzh_fillin_blank_T:
+ {
+ \hspace* { 0.5em plus .5em minus .5em }
+ \group_begin:
+ \box_use_drop:N \l_tmpa_box
+ \group_end:
+ \hspace* { 0.5em plus .5em minus .5em }
+ }
+\cs_new:Npn \__examzh_fillin_blank_breakline_T:
+ {
+ \hspace* { 0.5em plus .5em minus .5em }
+ \group_begin:
+ \l_tmpa_tl
+ \group_end:
+ \hspace* { 0.5em plus .5em minus .5em }
+ }
+\cs_new:Npn \__examzh_fillin_blank_F:
+ {
+ \hspace* { \l__examzh_fillin_F_width_skip }
+ }
+\tikzset
+ {
+ fillin-circle/.style =
+ {
+ rounded~rectangle~west~arc = convex,
+ draw, rounded~rectangle,
+ color = \l__examzh_fillin_color_tl, text = \l__examzh_fillin_text_color_tl
+ }
+ }
+\cs_new:Npn \__examzh_fillin_circle_T:
+ {
+ \hspace* { .5em minus .5em }
+ \tikz[baseline=-3pt]
+ {
+ \node [fillin-circle] at (0,0)
+ { \box_use_drop:N \l_tmpa_box };
+ }
+ \hspace* { .5em minus .5em }
+ }
+\cs_new:Npn \__examzh_fillin_circle_F:
+ {
+ \hspace* { 0.5em plus .5em minus .5em }
+ \tikz[baseline=-3pt]
+ {
+ \node [fillin-circle] at (0,0)
+ { \phantom{t} };
+ }
+ \hspace* { 0.5em plus .5em minus .5em }
+ }
+\cs_new:Npn \__examzh_fillin_rectangle_T:
+ {
+ \hspace* { .5em minus .5em }
+ \begin{tikzpicture}[baseline = -3pt]
+ \node[draw, color = \l__examzh_fillin_color_tl, text = \l__examzh_fillin_text_color_tl]
+ { \box_use_drop:N \l_tmpa_box };
+ \end{tikzpicture}
+ \hspace* { .5em minus .5em }
+ }
+\cs_new:Npn \__examzh_fillin_rectangle_F:
+ {
+ \hspace* { 0.5em plus .5em minus .5em }
+ \begin{tikzpicture}[baseline = -3pt]
+ \node[draw, color = \l__examzh_fillin_color_tl, text = \l__examzh_fillin_text_color_tl]
+ { \phantom{a} };
+ \end{tikzpicture}
+ \hspace* { 0.5em plus .5em minus .5em }
+ }
+
+
+\dim_new:N \l__examzh_blacktriangle_length_dim
+\dim_set:Nn \l__examzh_blacktriangle_length_dim { .7em }
+\cs_new:Npn \__examzh_fillin_blacktriangle:
+ {
+ \tikz[rounded~corners=0.5pt,baseline=0pt]
+ {
+ \fill[] (0,0) -- ++(60\c_colon_str \l__examzh_blacktriangle_length_dim) -- ++(-60\c_colon_str \l__examzh_blacktriangle_length_dim) -- cycle ;
+ }
+ }
+
+\str_new:N \l__examzh_solution_blank_type_str
+\keys_define:nn { exam-zh / solution }
+ {
+ show-solution .bool_set:N = \l__examzh_solution_show_bool,
+ show-qed .bool_set:N = \l__examzh_solution_show_qed_bool,
+ qedsymbol .tl_set:N = \l__examzh_solution_qedsymbol_tl,
+ label-content .tl_set:N = \l__examzh_solution_label_content_tl,
+ label-punct .tl_set:N = \l__examzh_solution_label_punct_tl,
+ score-showleader .bool_set:N = \l__examzh_score_show_leader_bool,
+ score-pre-content .tl_set:N = \l__examzh_score_pre_content_tl,
+ score-post-content .tl_set:N = \l__examzh_score_post_content_tl,
+ score-format .tl_set:N = \l__examzh_score_format_tl,
+ text-color .tl_set:N = \l__examzh_solution_text_color_tl,
+ blank-type .choices:nn =
+ { none, manual, hide }
+ {
+ \str_set:Nx \l__examzh_solution_blank_type_str { \l_keys_choice_tl }
+ },
+ blank-vsep .skip_set:N = \l__examzh_solution_blank_vsep_skip,
+ top-sep .skip_set:N = \l__examzh_solution_top_sep_skip,
+ bottom-sep .skip_set:N = \l__examzh_solution_bottom_sep_skip,
+ parbreak .bool_set:N = \l__examzh_solution_par_break_bool,
+ }
+\keys_set:nn { exam-zh / solution }
+ {
+ show-solution = false,
+ show-qed = true,
+ qedsymbol = $\square$,
+ label-content = {解答},
+ label-punct = {},
+ score-showleader = true,
+ score-pre-content = {},
+ score-post-content = 分,
+ score-format = \color{red},
+ text-color = black,
+ blank-type = none,
+ blank-vsep = 12ex plus 1ex minus 1ex,
+ top-sep = .25em plus .25em minus .1em,
+ bottom-sep = 0pt,
+ parbreak = false
+ }
+\keys_define:nn { exam-zh }
+ { solution .meta:nn = { exam-zh / solution } {#1} }
+% 解答题环境
+\NewDocumentEnvironment { solution } { O{ } +b }
+ {
+ % \addvspace { \l__examzh_solution_top_sep_skip }
+ \vspace { \l__examzh_solution_top_sep_skip }
+ \keys_set:nn { exam-zh / solution } {#1}
+ % 放在这是使得 \examsetup 设置 qedsymbol 可以放在正文区
+ \cs_set_eq:NN \qedsymbol \l__examzh_solution_qedsymbol_tl
+ \bool_if:NTF \l__examzh_solution_show_bool
+ {
+ \__examzh_solution_print_answer:n {#2}
+ }
+ {
+ \str_case:VnF \l__examzh_solution_blank_type_str
+ {
+ { none } { }
+ { manual } { \addvspace { \l__examzh_solution_blank_vsep_skip } }
+ { hide } { \__examzh_solution_simply_hide_solution:n {#2} }
+ }
+ {}
+ }
+ \par
+ % \mode_leave_vertical:
+ % \addvspace { \l__examzh_solution_bottom_sep_skip }
+ \vspace { \l__examzh_solution_bottom_sep_skip }
+ }
+ {}
+\cs_new:Npn \__examzh_solution_simply_hide_solution:n #1
+ {
+ \begin{tcolorbox}
+ [
+ invisible,
+ frame~hidden,
+ breakable,
+ opacityback = 0,
+ opacityframe = 0,
+ size = minimal,
+ width = \linewidth
+ ]
+ #1
+ \end{tcolorbox}
+ }
+\cs_new:Npn \__examzh_solution_print_answer:n #1
+ {
+ \par
+ \pushQED { \qed }
+ % \normalfont \topsep6 \p@ \@plus6 \p@ \relax
+ % \trivlist
+ % \item \relax
+ \group_begin:
+ % \hspace* { 2\ccwd }
+ \bfseries \l__examzh_solution_label_content_tl
+ \@addpunct { \l__examzh_solution_label_punct_tl }
+ \group_end:
+ \hspace{0.5em}
+ % \ignorespaces
+ % 是否要新起一段开始
+ \bool_if:NT \l__examzh_solution_par_break_bool { \par }
+ \group_begin:
+ \color { \l__examzh_solution_text_color_tl } #1
+ \group_end:
+ \bool_if:NT \l__examzh_solution_show_qed_bool
+ { \popQED }
+ % \endtrivlist
+ % \@endpefalse
+ }
+
+% https://github.com/CTeX-org/forum/issues/256#issuecomment-1172319787
+\zref@require@unique
+
+\NewDocumentCommand { \score } { O{} m }
+ {
+ \group_begin:
+ \mode_if_math:TF
+ {
+ \__examzh_score_math_version:n { #2 }
+ }
+ {
+ \__examzh_score_text_version:n { #2 }
+ }
+ \group_end:
+ }
+\cs_new:Npn \__examzh_score_math_version:n #1
+ {
+ \bool_if:NTF \l__examzh_score_show_leader_bool
+ {
+ \__examzh_math_cdotfill:n
+ {
+ \l__examzh_score_format_tl
+ \l__examzh_score_pre_content_tl
+ #1
+ \l__examzh_score_post_content_tl
+ }
+ }
+ {
+ \__examzh_math_nodotfill:n
+ {
+ {
+ \l__examzh_score_format_tl
+ \l__examzh_score_pre_content_tl
+ #1
+ \l__examzh_score_post_content_tl
+ }
+ }
+ }
+ }
+\cs_new:Npn \__examzh_score_text_version:n #1
+ {
+ \bool_if:NTF \l__examzh_score_show_leader_bool
+ {
+ \__examzh_cdotfill:
+ \l__examzh_score_format_tl
+ \l__examzh_score_pre_content_tl #1 \l__examzh_score_post_content_tl
+ }
+ {
+ \hfill
+ \l__examzh_score_format_tl
+ \l__examzh_score_pre_content_tl #1 \l__examzh_score_post_content_tl
+ }
+ \par \noindent \ignorespaces
+ }
+% 仿照 latex.ltx, line 651 的 \dotfill
+\cs_new:Npn \__examzh_cdotfill:
+ {
+ \mode_leave_vertical:
+ \cleaders
+ \hbox_to_wd:nn { .44em } { \hss $\cdot$ \hss }
+ \hfill \kern\z@
+ }
+\cs_new_protected:Npn \__examzh_math_nodotfill:n #1
+ {
+ \stepcounter { zref@unique }
+ \hbox_overlap_right:n
+ {
+ \zsaveposx { \thezref@unique L }
+ \zref@ifrefundefined { \thezref@unique R }
+ { }
+ {
+ \skip_horizontal:n
+ {
+ \zposx { \thezref@unique R } sp
+ - \zposx { \thezref@unique L } sp
+ }
+ }
+ }
+ \tag * { \zsaveposx { \thezref@unique R } #1 }
+ }
+\cs_new_protected:Npn \__examzh_math_cdotfill:n #1
+ {
+ \stepcounter { zref@unique }
+ \hbox_overlap_right:n
+ {
+ \zsaveposx { \thezref@unique L }
+ \zref@ifrefundefined { \thezref@unique R }
+ { }
+ {
+ \cleaders
+ \hbox_to_wd:nn { .44em } { \hss $\cdot$ \hss }
+ \skip_horizontal:n
+ {
+ \zposx { \thezref@unique R } sp
+ - \zposx { \thezref@unique L } sp
+ }
+ }
+ }
+ \tag * { \zsaveposx { \thezref@unique R } #1 }
+ } \ No newline at end of file
diff --git a/macros/xetex/latex/exam-zh/tex/exam-zh-symbols.sty b/macros/xetex/latex/exam-zh/tex/exam-zh-symbols.sty
new file mode 100644
index 0000000000..e0f147aab3
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/tex/exam-zh-symbols.sty
@@ -0,0 +1,1198 @@
+%
+% Copyright (c) 2022 Kangwei Xia
+% Released under the LaTeX Project Public License v1.3c License.
+% Repository: https://gitee.com/zepinglee/exam-zh
+%
+
+\NeedsTeXFormat{LaTeX2e}
+
+\RequirePackage{expl3}
+
+\ProvidesExplPackage {exam-zh-symbols} {2022-07-28} {v0.1.13}
+ {exam-zh symbols module}
+
+\RequirePackage { tikz }
+
+\keys_define:nn { exam-zh }
+ { symbols .meta:nn = { exam-zh / symbols } {#1} }
+
+
+% 分数 \frac \dfrac
+\int_new:N \l__examzh_symbols_frac_numerator_str_int % frac 分子字符数
+\int_new:N \l__examzh_symbols_frac_denominator_str_int % frac 分母字符数
+\int_new:N \l__examzh_symbols_dfrac_numerator_str_int % frac 分子字符数
+\int_new:N \l__examzh_symbols_dfrac_denominator_str_int % frac 分母字符数
+
+\keys_define:nn { exam-zh / symbols }
+ {
+ % 是否重定义 \frac
+ change-frac-style .bool_set:N = \l__examzh_symbols_change_frac_style_bool,
+ % 是否重定义 \dfrac
+ change-dfrac-style .bool_set:N = \l__examzh_symbols_change_dfrac_style_bool,
+ % \frac 分子分母增加的额外距离
+ frac-add .muskip_set:N = \l__examzh_symbols_frac_add_distance_muskip,
+ % \dfrac 分子分母增加的额外距离
+ dfrac-add .muskip_set:N = \l__examzh_symbols_dfrac_add_distance_muskip,
+ }
+\keys_set:nn { exam-zh / symbols }
+ {
+ change-frac-style = false,
+ change-dfrac-style = false,
+ frac-add = 5mu,
+ dfrac-add = 5mu,
+ }
+\NewCommandCopy { \examzhfrac } { \frac }
+\NewCommandCopy { \examzhdfrac } { \dfrac }
+\RenewDocumentCommand { \frac } { m m }
+ {
+ \group_begin:
+ \bool_if:NTF \l__examzh_symbols_change_frac_style_bool
+ {
+ % 计算分子分母的字符数
+ \__examzh_symbols_frac_calc_str_num:nn {#1} {#2}
+ % 根据字符数选择将额外的距离加在哪
+ \__examzh_symbols_frac_add_distance:NNNNnn
+ \examzhfrac
+ \l__examzh_symbols_frac_numerator_str_int
+ \l__examzh_symbols_frac_denominator_str_int
+ \l__examzh_symbols_frac_add_distance_muskip
+ {#1}{#2}
+ }
+ { \examzhfrac {#1} {#2} }
+ \group_end:
+ }
+\RenewDocumentCommand { \dfrac } { m m }
+ {
+ \group_begin:
+ \bool_if:NTF \l__examzh_symbols_change_dfrac_style_bool
+ {
+ % 计算分子分母的字符数
+ \__examzh_symbols_frac_calc_str_num:nn {#1} {#2}
+ % 根据字符数选择将额外的距离加在哪
+ \__examzh_symbols_frac_add_distance:NNNNnn
+ \examzhdfrac
+ \l__examzh_symbols_frac_numerator_str_int
+ \l__examzh_symbols_frac_denominator_str_int
+ \l__examzh_symbols_dfrac_add_distance_muskip
+ {#1}{#2}
+ }
+ { \examzhdfrac {#1} {#2} }
+ \group_end:
+ }
+\cs_new:Npn \__examzh_symbols_frac_calc_str_num:nn #1#2
+ {
+ \int_set:Nn \l__examzh_symbols_frac_numerator_str_int
+ { \str_count:n {#1} }
+ \int_set:Nn \l__examzh_symbols_frac_denominator_str_int
+ { \str_count:n {#2} }
+ }
+% \__examzh_symbols_frac_add_distance:NNNNnn
+ % <\oldfrac><numerator str num><denominator str num><add muskip><numerator><denominator>
+\cs_new:Npn \__examzh_symbols_frac_add_distance:NNNNnn #1#2#3#4#5#6
+ {
+ \int_compare:nNnTF {#2} = {1}
+ {
+ \int_compare:nNnTF {#3} = {1}
+ {
+ % 分子字符数=1,分母字符数=1
+ #1
+ {
+ \mskip #4
+ #5
+ \mskip #4
+ } {#6}
+ }
+ {
+ % 分子字符数=1,分母字符数>1
+ #1 {#5}
+ {
+ \mskip #4
+ #6
+ \mskip #4
+ }
+ }
+ }
+ {
+ \int_compare:nNnTF {#3} = {1}
+ {
+ % 分子字符数>1,分母字符数=1
+ #1
+ {
+ \mskip #4
+ #5
+ \mskip #4
+ } {#6}
+ }
+ {
+ % 分子字符数>1,分母字符数>1
+ #1
+ {
+ \mskip #4
+ #5
+ \mskip #4
+ } {#6}
+ }
+ }
+ }
+
+% 向量 vec
+\int_new:N \l__examzh_symbols_vec_input_count_int
+
+\AtBeginDocument
+ {
+ \RenewDocumentCommand { \vec } { m }
+ { \__examzh_symbols_vec:n {#1} }
+ }
+\cs_new:Npn \__examzh_symbols_vec:n #1
+ {
+ % 先检测 #1 有多少个字符
+ \__examzh_symbols_vec_detect_number_of_input_str:n {#1}
+ % 只有 1 个的:加粗,多于两个的加箭头
+ \int_compare:nNnTF { \l__examzh_symbols_vec_input_count_int } = {1}
+ { \symbfit {#1} }
+ { \overrightarrow {#1} }
+ }
+\cs_new:Npn \__examzh_symbols_vec_detect_number_of_input_str:n #1
+ {
+ \int_set:Nn \l__examzh_symbols_vec_input_count_int
+ { \str_count:n { #1 } }
+ }
+
+% 平行四边形 \parallelogram
+\keys_define:nn { exam-zh / symbols }
+ {
+ parallelogram-angle .fp_set:N = \l__examzh_symbols_parallelogram_angle_fp,
+ parallelogram-x .dim_set:N = \l__examzh_symbols_parallelogram_x_dim,
+ parallelogram-y .dim_set:N = \l__examzh_symbols_parallelogram_y_dim
+ }
+
+\cs_new:Npn \__examzh_symbols_parallelogram:
+ {
+ \begin{tikzpicture}[baseline]
+ \draw[line~join = round] (0,0) --++ (\l__examzh_symbols_parallelogram_x_dim,0) --++ (\fp_use:N \l__examzh_symbols_parallelogram_angle_fp \c_colon_str \l__examzh_symbols_parallelogram_y_dim) -- (\fp_use:N \l__examzh_symbols_parallelogram_angle_fp \c_colon_str \l__examzh_symbols_parallelogram_y_dim) -- cycle;
+ \end{tikzpicture}
+ }
+
+\AtBeginDocument
+ {
+ \RenewDocumentCommand { \parallelogram } { }
+ {
+ \group_begin:
+ \keys_set:nn { exam-zh / symbols }
+ {
+ parallelogram-angle = 67,
+ parallelogram-x = 0.9em,
+ parallelogram-y = 0.7em
+ }
+ \mathrel
+ {
+ \__examzh_symbols_symbol_four_size:n
+ { \__examzh_symbols_parallelogram: }
+ }
+ \group_end:
+ }
+ }
+
+% 平行 \parallel
+\bool_new:N \l__examzh_symbols_parallel_slant_bool
+\bool_new:N \l__examzh_symbols_nparallel_slant_bool
+
+\keys_define:nn { exam-zh / symbols }
+ {
+ parallel-angle .fp_set:N = \l__examzh_symbols_parallel_angle_fp,
+ parallel-twoline-distance .dim_set:N = \l__examzh_symbols_parallel_twoline_distance_dim,
+ parallel-length .dim_set:N = \l__examzh_symbols_parallel_length_dim,
+ parallel-baseline .dim_set:N = \l__examzh_symbols_parallel_baseline_dim,
+ nparallel-slant-angle .fp_set:N = \l__examzh_symbols_nparallel_slant_angle_fp,
+ nparallel-slant-length .dim_set:N = \l__examzh_symbols_nparallel_slant_length_dim,
+ parallel-type .choice:,
+ parallel-type / slant.code:n =
+ { \bool_set_true:N \l__examzh_symbols_parallel_slant_bool },
+ parallel-type / perpendicular .code:n =
+ { \bool_set_false:N \l__examzh_symbols_parallel_slant_bool },
+ nparallel-type .choice:,
+ nparallel-type / slant.code:n =
+ { \bool_set_true:N \l__examzh_symbols_nparallel_slant_bool },
+ nparallel-type / perpendicular .code:n =
+ { \bool_set_false:N \l__examzh_symbols_nparallel_slant_bool },
+ }
+\keys_set:nn { exam-zh / symbols }
+ {
+ parallel-type = slant,
+ nparallel-type = slant,
+ }
+
+\cs_new:Npn \__examzh_symbols_parallel:
+ {
+ \begin{tikzpicture}[baseline=\l__examzh_symbols_parallel_baseline_dim]
+ \draw[line~cap = round] (0, 0) --++ (\fp_use:N \l__examzh_symbols_parallel_angle_fp \c_colon_str \l__examzh_symbols_parallel_length_dim)
+ (\l__examzh_symbols_parallel_twoline_distance_dim, 0) --++ (\fp_use:N \l__examzh_symbols_parallel_angle_fp \c_colon_str \l__examzh_symbols_parallel_length_dim);
+ \end{tikzpicture}
+ }
+\cs_new:Npn \__examzh_symbols_nparallel:
+ {
+ \begin{tikzpicture}[line~cap = round, baseline=\l__examzh_symbols_parallel_baseline_dim]
+ \draw
+ (0, 0) --++ (\fp_use:N \l__examzh_symbols_parallel_angle_fp \c_colon_str \l__examzh_symbols_parallel_length_dim)
+ (\l__examzh_symbols_parallel_twoline_distance_dim, 0) --++ (\fp_use:N \l__examzh_symbols_parallel_angle_fp \c_colon_str \l__examzh_symbols_parallel_length_dim);
+ % n 线
+ \draw
+ (\l__examzh_symbols_parallel_twoline_distance_dim / 2, 0)++(\fp_use:N \l__examzh_symbols_parallel_angle_fp \c_colon_str \l__examzh_symbols_parallel_length_dim / 2) --++ (\fp_use:N \l__examzh_symbols_nparallel_slant_angle_fp \c_colon_str \l__examzh_symbols_nparallel_slant_length_dim / 2)
+ (\l__examzh_symbols_parallel_twoline_distance_dim / 2, 0)++(\fp_use:N \l__examzh_symbols_parallel_angle_fp \c_colon_str \l__examzh_symbols_parallel_length_dim / 2) --++ (\fp_eval:n { \l__examzh_symbols_nparallel_slant_angle_fp + 180 } \c_colon_str \l__examzh_symbols_nparallel_slant_length_dim / 2);
+ \end{tikzpicture}
+ }
+
+\AtBeginDocument
+ {
+ \cs_set_eq:NN \__examzh_symbols_old_parallel: \parallel
+ \cs_set_eq:NN \__examzh_symbols_old_nparallel: \nparallel
+ \RenewDocumentCommand { \parallel } { }
+ {
+ \group_begin:
+ \bool_if:NTF \l__examzh_symbols_parallel_slant_bool
+ {
+ \keys_set:nn { exam-zh / symbols }
+ {
+ parallel-angle = 60,
+ parallel-twoline-distance = 0.28em,
+ parallel-length = 0.98em,
+ parallel-baseline = 0.5pt
+ }
+ }
+ {
+ % 竖直
+ \keys_set:nn { exam-zh / symbols }
+ {
+ parallel-angle = 90,
+ parallel-twoline-distance = 0.2em,
+ parallel-length = 0.93em,
+ parallel-baseline = 1pt
+ }
+ }
+ \mathrel
+ {
+ \__examzh_symbols_symbol_four_size:n
+ { \__examzh_symbols_parallel: }
+ }
+ \group_end:
+ }
+ \RenewDocumentCommand { \nparallel } { }
+ {
+ \group_begin:
+
+ \bool_if:NTF \l__examzh_symbols_nparallel_slant_bool
+ {
+ \keys_set:nn { exam-zh / symbols }
+ {
+ parallel-angle = 60,
+ parallel-twoline-distance = 0.28em,
+ parallel-length = 0.98em,
+ parallel-baseline = 0.5pt,
+ nparallel-slant-angle = 120,
+ nparallel-slant-length = 0.65em
+ }
+ }
+ {
+ \keys_set:nn { exam-zh / symbols }
+ {
+ parallel-angle = 90,
+ parallel-twoline-distance = 0.2em,
+ parallel-length = 0.93em,
+ parallel-baseline = 1pt,
+ nparallel-slant-angle = 50,
+ nparallel-slant-length = 0.6em
+ }
+ % \tikz[baseline = {([yshift = 5pt]current~bounding~box.south)}]{ \node { $\__examzh_symbols_old_nparallel:$ }; }
+ }
+ \mathrel
+ {
+ \__examzh_symbols_symbol_four_size:n
+ { \__examzh_symbols_nparallel: }
+ }
+ \group_end:
+ }
+ }
+
+% 平行且相等 \paralleleq
+\bool_new:N \l__examzh_symbols_paralleleq_slant_bool
+
+\keys_define:nn { exam-zh / symbols }
+ {
+ % 上面部分的倾斜角
+ paralleleq-slant-angle .fp_set:N = \l__examzh_symbols_paralleleq_angle_fp,
+ % 线长度
+ paralleleq-upper-line-length .dim_set:N = \l__examzh_symbols_paralleleq_upper_line_length_dim,
+ paralleleq-lower-line-length .dim_set:N = \l__examzh_symbols_paralleleq_lower_line_length_dim,
+ % 线间距
+ paralleleq-upper-twoline-distance .dim_set:N = \l__examzh_symbols_paralleleq_upper_twoline_distance_dim,
+ paralleleq-lower-twoline-distance .dim_set:N = \l__examzh_symbols_paralleleq_lower_twoline_distance_dim,
+ % 下面部分的水平偏移量
+ paralleleq-lower-xshift .dim_set:N = \l__examzh_symbols_paralleleq_lower_xshift_dim,
+ paralleleq-type .choice:,
+ paralleleq-type / slant.code:n =
+ { \bool_set_true:N \l__examzh_symbols_paralleleq_slant_bool },
+ paralleleq-type / perpendicular .code:n =
+ { \bool_set_false:N \l__examzh_symbols_paralleleq_slant_bool },
+ }
+
+\keys_set:nn { exam-zh / symbols }
+ { paralleleq-type = slant }
+
+\cs_new:Npn \__examzh_symbols_paralleleq:
+ {
+ \begin{tikzpicture}[baseline = -1.7pt]
+ \draw[line~cap = round, name = parallel] (0, 0) --++ (\fp_use:N \l__examzh_symbols_paralleleq_angle_fp \c_colon_str \l__examzh_symbols_paralleleq_upper_line_length_dim)
+ (\l__examzh_symbols_paralleleq_upper_twoline_distance_dim, 0) --++ (\fp_use:N \l__examzh_symbols_paralleleq_angle_fp \c_colon_str \l__examzh_symbols_paralleleq_upper_line_length_dim);
+ \draw[anchor = parallel.south]
+ (\l__examzh_symbols_paralleleq_upper_twoline_distance_dim / 2 + \l__examzh_symbols_paralleleq_lower_xshift_dim,0) --++ (\l__examzh_symbols_paralleleq_lower_line_length_dim / 2,0)
+ (\l__examzh_symbols_paralleleq_upper_twoline_distance_dim / 2 + \l__examzh_symbols_paralleleq_lower_xshift_dim,0) --++ (-\l__examzh_symbols_paralleleq_lower_line_length_dim / 2,0)
+ (\l__examzh_symbols_paralleleq_upper_twoline_distance_dim / 2 + \l__examzh_symbols_paralleleq_lower_xshift_dim,-\l__examzh_symbols_paralleleq_lower_twoline_distance_dim) --++ (\l__examzh_symbols_paralleleq_lower_line_length_dim / 2 ,0)
+ (\l__examzh_symbols_paralleleq_upper_twoline_distance_dim / 2 + \l__examzh_symbols_paralleleq_lower_xshift_dim,-\l__examzh_symbols_paralleleq_lower_twoline_distance_dim) --++ (-\l__examzh_symbols_paralleleq_lower_line_length_dim / 2,0)
+ ;
+ \end{tikzpicture}
+ }
+
+\NewDocumentCommand { \paralleleq } { }
+ {
+ \group_begin:
+ \keys_set:nn { exam-zh / symbols }
+ {
+ paralleleq-upper-line-length = 0.65em,
+ paralleleq-lower-line-length = 0.8em,
+ paralleleq-upper-twoline-distance = 0.2em,
+ paralleleq-lower-twoline-distance = 0.18em,
+ }
+ \bool_if:NTF \l__examzh_symbols_paralleleq_slant_bool
+ {
+ % \paralleleq : 倾斜型
+ \keys_set:nn { exam-zh / symbols }
+ {
+ paralleleq-slant-angle = 70,
+ paralleleq-lower-xshift = 0.04em
+ }
+ }
+ {
+ % \paralleleq* : 垂直型
+ \keys_set:nn { exam-zh / symbols }
+ {
+ paralleleq-slant-angle = 90,
+ paralleleq-lower-xshift = 0em
+ }
+ }
+ \mathrel
+ {
+ \__examzh_symbols_symbol_four_size:n
+ { \__examzh_symbols_paralleleq: }
+ }
+ \group_end:
+ }
+
+
+% 子集 \subset 真子集 \subseteqq
+\keys_define:nn { exam-zh / symbols }
+ {
+ % 半圆的半径
+ subset-radius .dim_set:N = \l__examzh_symbols_subset_semicircle_radius_dim,
+ % 半圆右边横线的长度
+ subset-upper-linewidth .dim_set:N = \l__examzh_symbols_subset_semicircle_line_width_dim,
+ % 下面线的长度
+ subset-lower-linewidth .dim_set:N = \l__examzh_symbols_subset_lower_line_width_dim,
+ % 上面部分和下面部分的距离
+ subset-upper-lower-distance .dim_set:N = \l__examzh_symbols_subset_upper_lower_distance_dim,
+ % 下面部分 两条线的距离
+ subsetneqq-lower-twoline-distance .dim_set:N = \l__examzh_symbols_subsetneqq_lower_twoline_distance_dim,
+ % 下面斜线的长度
+ subsetneqq-lower-slant-length .dim_set:N = \l__examzh_symbols_subsetneqq_lower_slant_line_length_dim,
+ supsetneqq-lower-slant-length .dim_set:N = \l__examzh_symbols_supsetneqq_lower_slant_line_length_dim,
+ % 真子集下方斜线的倾斜角度
+ subsetneqq-lower-slant-angle .fp_set:N = \l__examzh_symbols_subsetneqq_lower_slant_line_angle_fp,
+ supsetneqq-lower-slant-angle .fp_set:N = \l__examzh_symbols_supsetneqq_lower_slant_line_angle_fp,
+ % nxxx 类的参数
+ % --角度--
+ nsubset-n-slant-angle .fp_set:N = \l__examzh_symbols_nsubset_slant_angle_fp,
+ nsubseteq-n-slant-angle .fp_set:N = \l__examzh_symbols_nsubseteq_slant_angle_fp,
+ nsubsetneqq-n-slant-angle .fp_set:N = \l__examzh_symbols_nsubsetneqq_slant_angle_fp,
+ % --长度--
+ nsubset-n-slant-length .dim_set:N = \l__examzh_symbols_nsubset_slant_length_dim,
+ nsubseteq-n-slant-length .dim_set:N = \l__examzh_symbols_nsubseteq_slant_length_dim,
+ nsubsetneqq-n-slant-length .dim_set:N = \l__examzh_symbols_nsubsetneqq_slant_length_dim,
+ }
+\keys_set:nn { exam-zh / symbols }
+ {
+ subset-radius = 0.2em,
+ subset-upper-linewidth = 0.6em,
+ subset-lower-linewidth =
+ {
+ \l__examzh_symbols_subset_semicircle_radius_dim + \l__examzh_symbols_subset_semicircle_line_width_dim
+ },
+ subset-upper-lower-distance = 0.12em,
+ subsetneqq-lower-twoline-distance = 0.14em,
+ subsetneqq-lower-slant-length = 0.42em,
+ supsetneqq-lower-slant-length = 0.4em,
+ subsetneqq-lower-slant-angle = 55,
+ supsetneqq-lower-slant-angle = 60,
+ nsubset-n-slant-angle = 65,
+ nsubseteq-n-slant-angle = 68,
+ nsubsetneqq-n-slant-angle = 70,
+ nsubset-n-slant-length = 1em,
+ nsubseteq-n-slant-length = 1em,
+ nsubsetneqq-n-slant-length = 1.2em,
+ }
+
+\cs_new:Npn \__examzh_symbols_subset:
+ {
+ \begin{tikzpicture}[line~cap=round,baseline = {([yshift = -1pt]current~bounding~box.south)}]
+ % 半圆 + 两条线
+ \draw[line~cap=round] (0,\l__examzh_symbols_subset_semicircle_radius_dim) arc (90 \c_colon_str 270 \c_colon_str \l__examzh_symbols_subset_semicircle_radius_dim)
+ (0,\l__examzh_symbols_subset_semicircle_radius_dim) --++ (\l__examzh_symbols_subset_semicircle_line_width_dim,0)
+ (0,-\l__examzh_symbols_subset_semicircle_radius_dim) --++ (\l__examzh_symbols_subset_semicircle_line_width_dim,0);
+ \end{tikzpicture}
+ }
+\cs_new:Npn \__examzh_symbols_nsubset:
+ {
+ \begin{tikzpicture}[line~cap=round,baseline = {([yshift = -1pt]current~bounding~box.south)}]
+ % 半圆 + 两条线
+ \draw (0,\l__examzh_symbols_subset_semicircle_radius_dim) arc (90 \c_colon_str 270 \c_colon_str \l__examzh_symbols_subset_semicircle_radius_dim)
+ (0,\l__examzh_symbols_subset_semicircle_radius_dim) --++ (\l__examzh_symbols_subset_semicircle_line_width_dim,0)
+ (0,-\l__examzh_symbols_subset_semicircle_radius_dim) --++ (\l__examzh_symbols_subset_semicircle_line_width_dim,0);
+ % 定位斜线的中心
+ \coordinate (n-center) at (\l__examzh_symbols_subset_semicircle_line_width_dim / 2 - \l__examzh_symbols_subset_semicircle_radius_dim / 2,0);
+ % 画斜线
+ \draw[overlay]
+ (n-center) --++ (\fp_use:N \l__examzh_symbols_nsubset_slant_angle_fp \c_colon_str \l__examzh_symbols_nsubset_slant_length_dim / 2)
+ (n-center) --++ (\fp_eval:n { \l__examzh_symbols_nsubset_slant_angle_fp + 180} \c_colon_str \l__examzh_symbols_nsubset_slant_length_dim / 2);
+ \end{tikzpicture}
+ }
+\cs_new:Npn \__examzh_symbols_subseteq:
+ {
+ \begin{tikzpicture}[line~cap=round,baseline = (current~bounding~box.south)]
+ % 半圆 + 两条线
+ \draw (0,\l__examzh_symbols_subset_semicircle_radius_dim) arc (90 \c_colon_str 270 \c_colon_str \l__examzh_symbols_subset_semicircle_radius_dim)
+ (0,\l__examzh_symbols_subset_semicircle_radius_dim) --++ (\l__examzh_symbols_subset_semicircle_line_width_dim,0)
+ (0,-\l__examzh_symbols_subset_semicircle_radius_dim) --++ (\l__examzh_symbols_subset_semicircle_line_width_dim,0);
+ % 下面的一条线
+ \draw (-\l__examzh_symbols_subset_semicircle_radius_dim, - \l__examzh_symbols_subset_semicircle_radius_dim - \l__examzh_symbols_subset_upper_lower_distance_dim) --++ (\l__examzh_symbols_subset_lower_line_width_dim, 0);
+ \end{tikzpicture}
+ }
+\cs_new:Npn \__examzh_symbols_nsubseteq:
+ {
+ \begin{tikzpicture}[line~cap=round,baseline = (current~bounding~box.south)]
+ % 半圆 + 两条线
+ \draw (0,\l__examzh_symbols_subset_semicircle_radius_dim) arc (90 \c_colon_str 270 \c_colon_str \l__examzh_symbols_subset_semicircle_radius_dim)
+ (0,\l__examzh_symbols_subset_semicircle_radius_dim) --++ (\l__examzh_symbols_subset_semicircle_line_width_dim,0)
+ (0,-\l__examzh_symbols_subset_semicircle_radius_dim) --++ (\l__examzh_symbols_subset_semicircle_line_width_dim,0);
+ % 下面的一条线
+ \draw (-\l__examzh_symbols_subset_semicircle_radius_dim, - \l__examzh_symbols_subset_semicircle_radius_dim - \l__examzh_symbols_subset_upper_lower_distance_dim) --++ (\l__examzh_symbols_subset_lower_line_width_dim, 0);
+ % 定位斜线的中心
+ \coordinate (n-center) at (\l__examzh_symbols_subset_semicircle_line_width_dim / 2 - \l__examzh_symbols_subset_semicircle_radius_dim / 2,0);
+ % 画斜线
+ \draw[overlay]
+ (n-center) --++ (\fp_use:N \l__examzh_symbols_nsubseteq_slant_angle_fp \c_colon_str \l__examzh_symbols_nsubseteq_slant_length_dim / 8 * 3.5)
+ (n-center) --++ (\fp_eval:n { \l__examzh_symbols_nsubseteq_slant_angle_fp + 180} \c_colon_str \l__examzh_symbols_nsubseteq_slant_length_dim / 8 * 4.5);
+ \end{tikzpicture}
+ }
+% 真子集
+\cs_new:Npn \__examzh_symbols_subsetneqq:
+ {
+ \begin{tikzpicture}[line~cap=round,baseline = (current~bounding~box.south)]
+ % 半圆 + 两条线
+ \draw (0,\l__examzh_symbols_subset_semicircle_radius_dim) arc (90 \c_colon_str 270 \c_colon_str \l__examzh_symbols_subset_semicircle_radius_dim)
+ (0,\l__examzh_symbols_subset_semicircle_radius_dim) --++ (\l__examzh_symbols_subset_semicircle_line_width_dim,0)
+ (0,-\l__examzh_symbols_subset_semicircle_radius_dim) --++ (\l__examzh_symbols_subset_semicircle_line_width_dim,0);
+ % 下面的两条线
+ \draw (-\l__examzh_symbols_subset_semicircle_radius_dim, - \l__examzh_symbols_subset_semicircle_radius_dim - \l__examzh_symbols_subset_upper_lower_distance_dim) --++ (\l__examzh_symbols_subset_lower_line_width_dim, 0)
+ (-\l__examzh_symbols_subset_semicircle_radius_dim, - \l__examzh_symbols_subset_semicircle_radius_dim - \l__examzh_symbols_subset_upper_lower_distance_dim - \l__examzh_symbols_subsetneqq_lower_twoline_distance_dim) --++ (\l__examzh_symbols_subset_lower_line_width_dim, 0);
+ % 定位斜线的中心点
+ \coordinate (lower-center) at
+ (\l__examzh_symbols_subset_semicircle_line_width_dim / 2 - \l__examzh_symbols_subset_semicircle_radius_dim / 2 , - \l__examzh_symbols_subset_semicircle_radius_dim - \l__examzh_symbols_subset_upper_lower_distance_dim - \l__examzh_symbols_subsetneqq_lower_twoline_distance_dim / 2 );
+ % 画斜线
+ \draw[overlay]
+ (lower-center) --++ (\fp_use:N \l__examzh_symbols_subsetneqq_lower_slant_line_angle_fp \c_colon_str \l__examzh_symbols_subsetneqq_lower_slant_line_length_dim / 2)
+ (lower-center) --++ (\fp_eval:n {\l__examzh_symbols_subsetneqq_lower_slant_line_angle_fp + 180} \c_colon_str \l__examzh_symbols_subsetneqq_lower_slant_line_length_dim / 2);
+ \end{tikzpicture}
+ }
+\cs_new:Npn \__examzh_symbols_nsubsetneqq:
+ {
+ \begin{tikzpicture}[line~cap=round,baseline = (current~bounding~box.south)]
+ % 半圆 + 两条线
+ \draw (0,\l__examzh_symbols_subset_semicircle_radius_dim) arc (90 \c_colon_str 270 \c_colon_str \l__examzh_symbols_subset_semicircle_radius_dim)
+ (0,\l__examzh_symbols_subset_semicircle_radius_dim) --++ (\l__examzh_symbols_subset_semicircle_line_width_dim,0)
+ (0,-\l__examzh_symbols_subset_semicircle_radius_dim) --++ (\l__examzh_symbols_subset_semicircle_line_width_dim,0);
+ % 下面的两条线
+ \draw (-\l__examzh_symbols_subset_semicircle_radius_dim, - \l__examzh_symbols_subset_semicircle_radius_dim - \l__examzh_symbols_subset_upper_lower_distance_dim) --++ (\l__examzh_symbols_subset_lower_line_width_dim, 0)
+ (-\l__examzh_symbols_subset_semicircle_radius_dim, - \l__examzh_symbols_subset_semicircle_radius_dim - \l__examzh_symbols_subset_upper_lower_distance_dim - \l__examzh_symbols_subsetneqq_lower_twoline_distance_dim) --++ (\l__examzh_symbols_subset_lower_line_width_dim, 0);
+ % 定位斜线的中心点
+ \coordinate (lower-center) at
+ (\l__examzh_symbols_subset_semicircle_line_width_dim / 2 - \l__examzh_symbols_subset_semicircle_radius_dim / 2 , - \l__examzh_symbols_subset_semicircle_radius_dim - \l__examzh_symbols_subset_upper_lower_distance_dim - \l__examzh_symbols_subsetneqq_lower_twoline_distance_dim / 2 );
+ % 画斜线
+ \draw[overlay]
+ (lower-center) --++ (\fp_use:N \l__examzh_symbols_subsetneqq_lower_slant_line_angle_fp \c_colon_str \l__examzh_symbols_subsetneqq_lower_slant_line_length_dim / 2)
+ (lower-center) --++ (\fp_eval:n {\l__examzh_symbols_subsetneqq_lower_slant_line_angle_fp + 180} \c_colon_str \l__examzh_symbols_subsetneqq_lower_slant_line_length_dim / 2);
+ % 定位斜线的中心
+ \coordinate (n-center) at (\l__examzh_symbols_subset_semicircle_line_width_dim / 2 - \l__examzh_symbols_subset_semicircle_radius_dim / 2,0);
+ % 画斜线
+ \draw[overlay]
+ (n-center) --++ (\fp_use:N \l__examzh_symbols_nsubsetneqq_slant_angle_fp \c_colon_str \l__examzh_symbols_nsubsetneqq_slant_length_dim / 8 * 3.2)
+ (n-center) --++ (\fp_eval:n { \l__examzh_symbols_nsubsetneqq_slant_angle_fp + 180} \c_colon_str \l__examzh_symbols_nsubsetneqq_slant_length_dim / 8 * 4.8);
+ \end{tikzpicture}
+ }
+\cs_new:Npn \__examzh_symbols_supset:
+ {
+ \begin{tikzpicture}[line~cap=round,baseline = {([yshift = -1pt]current~bounding~box.south)}]
+ \draw (0,\l__examzh_symbols_subset_semicircle_radius_dim) arc (90 \c_colon_str -90 \c_colon_str \l__examzh_symbols_subset_semicircle_radius_dim)
+ (0,\l__examzh_symbols_subset_semicircle_radius_dim) --++ (-\l__examzh_symbols_subset_semicircle_line_width_dim,0)
+ (0,-\l__examzh_symbols_subset_semicircle_radius_dim) --++ (-\l__examzh_symbols_subset_semicircle_line_width_dim,0);
+ \end{tikzpicture}
+ }
+\cs_new:Npn \__examzh_symbols_nsupset:
+ {
+ \begin{tikzpicture}[line~cap=round,baseline = {([yshift = -1pt]current~bounding~box.south)}]
+ \draw (0,\l__examzh_symbols_subset_semicircle_radius_dim) arc (90 \c_colon_str -90 \c_colon_str \l__examzh_symbols_subset_semicircle_radius_dim)
+ (0,\l__examzh_symbols_subset_semicircle_radius_dim) --++ (-\l__examzh_symbols_subset_semicircle_line_width_dim,0)
+ (0,-\l__examzh_symbols_subset_semicircle_radius_dim) --++ (-\l__examzh_symbols_subset_semicircle_line_width_dim,0);
+ % 定位斜线的中心
+ \coordinate (n-center) at (- \l__examzh_symbols_subset_semicircle_line_width_dim / 2 + \l__examzh_symbols_subset_semicircle_radius_dim / 2,0);
+ % 画斜线
+ \draw[overlay]
+ (n-center) --++ (\fp_use:N \l__examzh_symbols_nsubset_slant_angle_fp \c_colon_str \l__examzh_symbols_nsubset_slant_length_dim / 2)
+ (n-center) --++ (\fp_eval:n { \l__examzh_symbols_nsubset_slant_angle_fp + 180} \c_colon_str \l__examzh_symbols_nsubset_slant_length_dim / 2);
+ \end{tikzpicture}
+ }
+\cs_new:Npn \__examzh_symbols_supseteq:
+ {
+ \begin{tikzpicture}[line~cap=round,baseline = (current~bounding~box.south)]
+ \draw (0,\l__examzh_symbols_subset_semicircle_radius_dim) arc (90 \c_colon_str -90 \c_colon_str \l__examzh_symbols_subset_semicircle_radius_dim);
+ \draw (0,\l__examzh_symbols_subset_semicircle_radius_dim) --++ (-\l__examzh_symbols_subset_semicircle_line_width_dim,0);
+ \draw (0,-\l__examzh_symbols_subset_semicircle_radius_dim) --++ (-\l__examzh_symbols_subset_semicircle_line_width_dim,0);
+ \draw
+ (\l__examzh_symbols_subset_semicircle_radius_dim, - \l__examzh_symbols_subset_semicircle_radius_dim - \l__examzh_symbols_subset_upper_lower_distance_dim) --++ (-\l__examzh_symbols_subset_semicircle_line_width_dim - \l__examzh_symbols_subset_semicircle_radius_dim, 0);
+ \end{tikzpicture}
+ }
+\cs_new:Npn \__examzh_symbols_nsupseteq:
+ {
+ \begin{tikzpicture}[line~cap=round,baseline = (current~bounding~box.south)]
+ \draw (0,\l__examzh_symbols_subset_semicircle_radius_dim) arc (90 \c_colon_str -90 \c_colon_str \l__examzh_symbols_subset_semicircle_radius_dim)
+ (0,\l__examzh_symbols_subset_semicircle_radius_dim) --++ (-\l__examzh_symbols_subset_semicircle_line_width_dim,0)
+ (0,-\l__examzh_symbols_subset_semicircle_radius_dim) --++ (-\l__examzh_symbols_subset_semicircle_line_width_dim,0);
+ \draw
+ (\l__examzh_symbols_subset_semicircle_radius_dim, - \l__examzh_symbols_subset_semicircle_radius_dim - \l__examzh_symbols_subset_upper_lower_distance_dim) --++ (-\l__examzh_symbols_subset_semicircle_line_width_dim - \l__examzh_symbols_subset_semicircle_radius_dim, 0);
+ \coordinate (n-center) at (-\l__examzh_symbols_subset_semicircle_line_width_dim / 2 + \l__examzh_symbols_subset_semicircle_radius_dim / 2,0);
+ % 画斜线
+ \draw[overlay]
+ (n-center) --++ (\fp_use:N \l__examzh_symbols_nsubseteq_slant_angle_fp \c_colon_str \l__examzh_symbols_nsubseteq_slant_length_dim / 8 * 3.5)
+ (n-center) --++ (\fp_eval:n { \l__examzh_symbols_nsubseteq_slant_angle_fp + 180} \c_colon_str \l__examzh_symbols_nsubseteq_slant_length_dim / 8 * 4.5);
+ \end{tikzpicture}
+ }
+% 反向真子集
+\cs_new:Npn \__examzh_symbols_supsetneqq:
+ {
+ \begin{tikzpicture}[line~cap=round,baseline = (current~bounding~box.south)]
+ \draw (0,\l__examzh_symbols_subset_semicircle_radius_dim) arc (90 \c_colon_str -90 \c_colon_str \l__examzh_symbols_subset_semicircle_radius_dim);
+ \draw (0,\l__examzh_symbols_subset_semicircle_radius_dim) --++ (-\l__examzh_symbols_subset_semicircle_line_width_dim,0);
+ \draw (0,-\l__examzh_symbols_subset_semicircle_radius_dim) --++ (-\l__examzh_symbols_subset_semicircle_line_width_dim,0);
+ \draw
+ (\l__examzh_symbols_subset_semicircle_radius_dim, - \l__examzh_symbols_subset_semicircle_radius_dim - \l__examzh_symbols_subset_upper_lower_distance_dim) --++ (-\l__examzh_symbols_subset_semicircle_line_width_dim - \l__examzh_symbols_subset_semicircle_radius_dim, 0)
+ (\l__examzh_symbols_subset_semicircle_radius_dim, - \l__examzh_symbols_subset_semicircle_radius_dim - \l__examzh_symbols_subset_upper_lower_distance_dim - \l__examzh_symbols_subsetneqq_lower_twoline_distance_dim) --++ (-\l__examzh_symbols_subset_semicircle_line_width_dim - \l__examzh_symbols_subset_semicircle_radius_dim, 0);
+ % 定位斜线的中心点
+ \coordinate (center) at
+ (- \l__examzh_symbols_subset_semicircle_line_width_dim / 2 + \l__examzh_symbols_subset_semicircle_radius_dim / 2 , - \l__examzh_symbols_subset_semicircle_radius_dim - \l__examzh_symbols_subset_upper_lower_distance_dim - \l__examzh_symbols_subsetneqq_lower_twoline_distance_dim / 2 );
+ % 画斜线
+ \draw[overlay]
+ (center) --++ (\fp_use:N \l__examzh_symbols_supsetneqq_lower_slant_line_angle_fp \c_colon_str \l__examzh_symbols_supsetneqq_lower_slant_line_length_dim / 2)
+ (center) --++ (\fp_eval:n {\l__examzh_symbols_supsetneqq_lower_slant_line_angle_fp + 180} \c_colon_str \l__examzh_symbols_supsetneqq_lower_slant_line_length_dim / 2);
+ \end{tikzpicture}
+ }
+\cs_new:Npn \__examzh_symbols_nsupsetneqq:
+ {
+ \begin{tikzpicture}[line~cap=round,baseline = (current~bounding~box.south)]
+ \draw (0,\l__examzh_symbols_subset_semicircle_radius_dim) arc (90 \c_colon_str -90 \c_colon_str \l__examzh_symbols_subset_semicircle_radius_dim);
+ \draw (0,\l__examzh_symbols_subset_semicircle_radius_dim) --++ (-\l__examzh_symbols_subset_semicircle_line_width_dim,0);
+ \draw (0,-\l__examzh_symbols_subset_semicircle_radius_dim) --++ (-\l__examzh_symbols_subset_semicircle_line_width_dim,0);
+ \draw
+ (\l__examzh_symbols_subset_semicircle_radius_dim, - \l__examzh_symbols_subset_semicircle_radius_dim - \l__examzh_symbols_subset_upper_lower_distance_dim) --++ (-\l__examzh_symbols_subset_semicircle_line_width_dim - \l__examzh_symbols_subset_semicircle_radius_dim, 0)
+ (\l__examzh_symbols_subset_semicircle_radius_dim, - \l__examzh_symbols_subset_semicircle_radius_dim - \l__examzh_symbols_subset_upper_lower_distance_dim - \l__examzh_symbols_subsetneqq_lower_twoline_distance_dim) --++ (-\l__examzh_symbols_subset_semicircle_line_width_dim - \l__examzh_symbols_subset_semicircle_radius_dim, 0);
+ % 定位斜线的中心点
+ \coordinate (center) at
+ (- \l__examzh_symbols_subset_semicircle_line_width_dim / 2 + \l__examzh_symbols_subset_semicircle_radius_dim / 2 , - \l__examzh_symbols_subset_semicircle_radius_dim - \l__examzh_symbols_subset_upper_lower_distance_dim - \l__examzh_symbols_subsetneqq_lower_twoline_distance_dim / 2 );
+ % 画斜线
+ \draw[overlay]
+ (center) --++ (\fp_use:N \l__examzh_symbols_supsetneqq_lower_slant_line_angle_fp \c_colon_str \l__examzh_symbols_supsetneqq_lower_slant_line_length_dim / 2)
+ (center) --++ (\fp_eval:n {\l__examzh_symbols_supsetneqq_lower_slant_line_angle_fp + 180} \c_colon_str \l__examzh_symbols_supsetneqq_lower_slant_line_length_dim / 2);
+ % 定位斜线的中心
+ \coordinate (n-center) at (-\l__examzh_symbols_subset_semicircle_line_width_dim / 2 + \l__examzh_symbols_subset_semicircle_radius_dim / 2,0);
+ % 画斜线
+ \draw[overlay]
+ (n-center) --++ (\fp_use:N \l__examzh_symbols_nsubsetneqq_slant_angle_fp \c_colon_str \l__examzh_symbols_nsubsetneqq_slant_length_dim / 8 * 3.2)
+ (n-center) --++ (\fp_eval:n { \l__examzh_symbols_nsubsetneqq_slant_angle_fp + 180} \c_colon_str \l__examzh_symbols_nsubsetneqq_slant_length_dim / 8 * 4.8);
+ \end{tikzpicture}
+ }
+\AtBeginDocument
+ {
+ \cs_set_eq:NN \__examzh_symbols_old_subset: \subset
+ \cs_set_eq:NN \__examzh_symbols_old_supset: \supset
+ \cs_set_eq:NN \__examzh_symbols_old_nsubset: \nsubset
+ \cs_set_eq:NN \__examzh_symbols_old_nsupset: \nsupset
+ \cs_set_eq:NN \__examzh_symbols_old_subseteq: \subseteq
+ \cs_set_eq:NN \__examzh_symbols_old_supseteq: \supseteq
+ \cs_set_eq:NN \__examzh_symbols_old_nsubseteq: \nsubseteq
+ \cs_set_eq:NN \__examzh_symbols_old_nsupseteq: \nsupseteq
+ \cs_set_eq:NN \__examzh_symbols_old_subsetneqq: \subsetneqq
+ \cs_set_eq:NN \__examzh_symbols_old_supsetneqq: \supsetneqq
+ % \cs_set_eq:NN \__examzh_symbols_old_nsubsetneqq: \nsubsetneqq
+ % \cs_set_eq:NN \__examzh_symbols_old_nsupsetneqq: \nsupsetneqq
+ \RenewDocumentCommand { \subset } { s }
+ {
+ \group_begin:
+ \keys_set:nn { exam-zh / symbols }
+ {
+ subset-radius = 0.2em,
+ subset-upper-linewidth = 0.6em
+ }
+ \IfBooleanTF {#1}
+ { \__examzh_symbols_old_subset: }
+ {
+ \mathrel
+ {
+ \__examzh_symbols_symbol_four_size:n
+ { \__examzh_symbols_subset: }
+ }
+ }
+ \group_end:
+ }
+ \RenewDocumentCommand { \nsubset } { s }
+ {
+ \group_begin:
+ \keys_set:nn { exam-zh / symbols }
+ {
+ subset-radius = 0.2em,
+ subset-upper-linewidth = 0.6em,
+ nsubset-n-slant-angle = 65,
+ nsubset-n-slant-length = 1em,
+ }
+ \IfBooleanTF {#1}
+ { \__examzh_symbols_old_nsubset: }
+ {
+ \mathrel
+ {
+ \__examzh_symbols_symbol_four_size:n
+ { \__examzh_symbols_nsubset: }
+ }
+ }
+ \group_end:
+ }
+ \RenewDocumentCommand { \subseteq } { s }
+ {
+ \group_begin:
+ \keys_set:nn { exam-zh / symbols }
+ {
+ subset-radius = 0.2em,
+ subset-upper-linewidth = 0.6em,
+ subset-upper-lower-distance = 0.12em,
+ subset-lower-linewidth =
+ {
+ \l__examzh_symbols_subset_semicircle_radius_dim + \l__examzh_symbols_subset_semicircle_line_width_dim
+ }
+ }
+ \IfBooleanTF {#1}
+ { \__examzh_symbols_old_subseteq: }
+ {
+ \mathrel
+ {
+ \__examzh_symbols_symbol_four_size:n
+ { \__examzh_symbols_subseteq: }
+ }
+ }
+ \group_end:
+ }
+ \RenewDocumentCommand { \nsubseteq } { s }
+ {
+ \group_begin:
+ \keys_set:nn { exam-zh / symbols }
+ {
+ subset-radius = 0.2em,
+ subset-upper-linewidth = 0.6em,
+ subset-lower-linewidth =
+ {
+ \l__examzh_symbols_subset_semicircle_radius_dim + \l__examzh_symbols_subset_semicircle_line_width_dim
+ },
+ subset-upper-lower-distance = 0.12em,
+ nsubseteq-n-slant-angle = 68,
+ nsubseteq-n-slant-length = 1em,
+ }
+ \IfBooleanTF {#1}
+ { \__examzh_symbols_old_nsubseteq: }
+ {
+ \mathrel
+ {
+ \__examzh_symbols_symbol_four_size:n
+ { \__examzh_symbols_nsubseteq: }
+ }
+ }
+ \group_end:
+ }
+ \RenewDocumentCommand { \subsetneqq } { s }
+ {
+ \group_begin:
+ \keys_set:nn { exam-zh / symbols }
+ {
+ subset-radius = 0.2em,
+ subset-upper-linewidth = 0.6em,
+ subset-lower-linewidth =
+ {
+ \l__examzh_symbols_subset_semicircle_radius_dim + \l__examzh_symbols_subset_semicircle_line_width_dim
+ },
+ subset-upper-lower-distance = 0.12em,
+ subsetneqq-lower-twoline-distance = 0.14em,
+ subsetneqq-lower-slant-length = 0.42em,
+ subsetneqq-lower-slant-angle = 55,
+ }
+ \IfBooleanTF {#1}
+ { \__examzh_symbols_old_subsetneqq: }
+ {
+ \mathrel
+ {
+ \__examzh_symbols_symbol_four_size:n
+ { \__examzh_symbols_subsetneqq: }
+ }
+ }
+ \group_end:
+ }
+ \NewDocumentCommand { \nsubsetneqq } { }
+ {
+ \group_begin:
+ \keys_set:nn { exam-zh / symbols }
+ {
+ subset-radius = 0.2em,
+ subset-upper-linewidth = 0.6em,
+ subset-lower-linewidth =
+ {
+ \l__examzh_symbols_subset_semicircle_radius_dim + \l__examzh_symbols_subset_semicircle_line_width_dim
+ },
+ subset-upper-lower-distance = 0.12em,
+ subsetneqq-lower-twoline-distance = 0.14em,
+ subsetneqq-lower-slant-length = 0.42em,
+ subsetneqq-lower-slant-angle = 55,
+ nsubsetneqq-n-slant-angle = 70,
+ nsubsetneqq-n-slant-length = 1.2em,
+ }
+ \mathrel
+ {
+ \__examzh_symbols_symbol_four_size:n
+ { \__examzh_symbols_nsubsetneqq: }
+ }
+ \group_end:
+ }
+ \RenewDocumentCommand { \supset } { s }
+ {
+ \group_begin:
+ \keys_set:nn { exam-zh / symbols }
+ {
+ subset-radius = 0.2em,
+ subset-upper-linewidth = 0.6em
+ }
+ \IfBooleanTF {#1}
+ { \__examzh_symbols_old_supset: }
+ {
+ \mathrel
+ {
+ \__examzh_symbols_symbol_four_size:n
+ { \__examzh_symbols_supset: }
+ }
+ }
+ \group_end:
+ }
+ \RenewDocumentCommand { \nsupset } { s }
+ {
+ \group_begin:
+ \keys_set:nn { exam-zh / symbols }
+ {
+ subset-radius = 0.2em,
+ subset-upper-linewidth = 0.6em,
+ nsubset-n-slant-angle = 65,
+ nsubset-n-slant-length = 1em,
+ }
+ \IfBooleanTF {#1}
+ { \__examzh_symbols_old_nsupset: }
+ {
+ \mathrel
+ {
+ \__examzh_symbols_symbol_four_size:n
+ { \__examzh_symbols_nsupset: }
+ }
+ }
+ \group_end:
+ }
+ \RenewDocumentCommand { \supseteq } { s }
+ {
+ \group_begin:
+ \keys_set:nn { exam-zh / symbols }
+ {
+ subset-radius = 0.2em,
+ subset-upper-linewidth = 0.6em,
+ subset-upper-lower-distance = 0.12em,
+ subset-lower-linewidth =
+ {
+ \l__examzh_symbols_subset_semicircle_radius_dim + \l__examzh_symbols_subset_semicircle_line_width_dim
+ }
+ }
+ \IfBooleanTF {#1}
+ { \__examzh_symbols_old_supseteq: }
+ {
+ \mathrel
+ {
+ \__examzh_symbols_symbol_four_size:n
+ { \__examzh_symbols_supseteq: }
+ }
+ }
+ \group_end:
+ }
+ \RenewDocumentCommand { \nsupseteq } { s }
+ {
+ \group_begin:
+ \keys_set:nn { exam-zh / symbols }
+ {
+ subset-radius = 0.2em,
+ subset-upper-linewidth = 0.6em,
+ subset-lower-linewidth =
+ {
+ \l__examzh_symbols_subset_semicircle_radius_dim + \l__examzh_symbols_subset_semicircle_line_width_dim
+ },
+ subset-upper-lower-distance = 0.12em,
+ nsubseteq-n-slant-angle = 68,
+ nsubseteq-n-slant-length = 1em,
+ }
+ \IfBooleanTF {#1}
+ { \__examzh_symbols_old_nsupseteq: }
+ {
+ \mathrel
+ {
+ \__examzh_symbols_symbol_four_size:n
+ { \__examzh_symbols_nsupseteq: }
+ }
+ }
+ \group_end:
+ }
+ \RenewDocumentCommand { \supsetneqq } { s }
+ {
+ \group_begin:
+ \keys_set:nn { exam-zh / symbols }
+ {
+ subset-radius = 0.2em,
+ subset-upper-linewidth = 0.6em,
+ subset-lower-linewidth =
+ {
+ \l__examzh_symbols_subset_semicircle_radius_dim + \l__examzh_symbols_subset_semicircle_line_width_dim
+ },
+ subset-upper-lower-distance = 0.12em,
+ subsetneqq-lower-twoline-distance = 0.14em,
+ supsetneqq-lower-slant-length = 0.4em,
+ supsetneqq-lower-slant-angle = 60,
+ }
+ \IfBooleanTF {#1}
+ { \__examzh_symbols_old_supsetneqq: }
+ {
+ \mathrel
+ {
+ \__examzh_symbols_symbol_four_size:n
+ { \__examzh_symbols_supsetneqq: }
+ }
+ }
+ \group_end:
+ }
+ \NewDocumentCommand { \nsupsetneqq } { }
+ {
+ \group_begin:
+ \keys_set:nn { exam-zh / symbols }
+ {
+ subset-radius = 0.2em,
+ subset-upper-linewidth = 0.6em,
+ subset-lower-linewidth =
+ {
+ \l__examzh_symbols_subset_semicircle_radius_dim + \l__examzh_symbols_subset_semicircle_line_width_dim
+ },
+ subset-upper-lower-distance = 0.12em,
+ subsetneqq-lower-twoline-distance = 0.14em,
+ supsetneqq-lower-slant-length = 0.4em,
+ supsetneqq-lower-slant-angle = 60,
+ nsubsetneqq-n-slant-angle = 70,
+ nsubsetneqq-n-slant-length = 1.2em,
+ }
+ \mathrel
+ {
+ \__examzh_symbols_symbol_four_size:n
+ { \__examzh_symbols_nsupsetneqq: }
+ }
+ \group_end:
+ }
+ % \RenewDocumentCommand { \subset } { s }
+ % {
+ % \group_begin:
+ % \keys_set:nn { exam-zh / symbols }
+ % {
+ % subset-radius = 0.2em,
+ % subset-upper-linewidth = 0.6em,
+ % subset-lower-linewidth =
+ % {
+ % \l__examzh_symbols_subset_semicircle_radius_dim + \l__examzh_symbols_subset_semicircle_line_width_dim
+ % },
+ % subset-upper-lower-distance = 0.12em,
+ % subsetneqq-lower-twoline-distance = 0.14em,
+ % subsetneqq-lower-slant-length = 0.42em,
+ % supsetneqq-lower-slant-length = 0.4em,
+ % subsetneqq-lower-slant-angle = 55,
+ % supsetneqq-lower-slant-angle = 60,
+ % nsubset-n-slant-angle = 65,
+ % nsubseteq-n-slant-angle = 68,
+ % nsubsetneqq-n-slant-angle = 70,
+ % nsubset-n-slant-length = 1em,
+ % nsubseteq-n-slant-length = 1em,
+ % nsubsetneqq-n-slant-length = 1.2em,
+ % }
+ % \IfBooleanTF {#1}
+ % { \__examzh_symbols_old_subset: }
+ % {
+ % \mathrel
+ % {
+ % \__examzh_symbols_symbol_four_size:n
+ % { \__examzh_symbols_subset: }
+ % }
+ % }
+ % \group_end:
+ % }
+ \RenewDocumentCommand { \subseteq } { s }
+ {
+ \group_begin:
+ \keys_set:nn { exam-zh / symbols }
+ {
+ subset-radius = 0.2em,
+ subset-upper-linewidth = 0.6em,
+ subset-lower-linewidth =
+ {
+ \l__examzh_symbols_subset_semicircle_radius_dim + \l__examzh_symbols_subset_semicircle_line_width_dim
+ },
+ subset-upper-lower-distance = 0.12em,
+ }
+ \IfBooleanTF {#1}
+ { \__examzh_symbols_old_subseteq: }
+ {
+ \mathrel
+ {
+ \__examzh_symbols_symbol_four_size:n
+ { \__examzh_symbols_subseteq: }
+ }
+ }
+ \group_end:
+ }
+
+ }
+
+
+
+% 并集 交集 cap cup
+
+% 直线长度
+\dim_new:N \l__examzh_symbols_cap_line_length_dim
+\dim_new:N \l__examzh_symbols_cup_line_length_dim
+% 半径大小
+\dim_new:N \l__examzh_symbols_cap_radius_dim
+\dim_new:N \l__examzh_symbols_cup_radius_dim
+
+\cs_new:Npn \__examzh_symbols_cap:
+ {
+ \begin{tikzpicture}[line~cap=round, line~width = 0.6pt,baseline = {([yshift = 1.2pt]current~bounding~box.south)}]
+ \draw (\l__examzh_symbols_cap_radius_dim,0) arc (0 \c_colon_str 180 \c_colon_str \l__examzh_symbols_cap_radius_dim);
+ \draw
+ (\l__examzh_symbols_cap_radius_dim,0) --++ (0,-\l__examzh_symbols_cap_line_length_dim)
+ (-\l__examzh_symbols_cap_radius_dim,0) --++ (0,-\l__examzh_symbols_cap_line_length_dim);
+ \end{tikzpicture}
+ }
+\cs_new:Npn \__examzh_symbols_cup:
+ {
+ \begin{tikzpicture}[line~cap=round, line~width = 0.6pt,baseline = {([yshift = 1.8pt]current~bounding~box.south)}]
+ \draw (-\l__examzh_symbols_cup_radius_dim,0) arc (180 \c_colon_str 360 \c_colon_str \l__examzh_symbols_cup_radius_dim);
+ \draw
+ (\l__examzh_symbols_cup_radius_dim,0) --++ (0,\l__examzh_symbols_cup_line_length_dim)
+ (-\l__examzh_symbols_cup_radius_dim,0) --++ (0,\l__examzh_symbols_cup_line_length_dim);
+ \end{tikzpicture}
+ }
+\AtBeginDocument
+ {
+ \cs_set_eq:NN \__examzh_symbols_old_cap: \cap
+ \cs_set_eq:NN \__examzh_symbols_old_cup: \cup
+ \RenewDocumentCommand { \cap } { s }
+ {
+ \group_begin:
+ \dim_set:Nn \l__examzh_symbols_cap_line_length_dim { 0.56em }
+ \dim_set:Nn \l__examzh_symbols_cap_radius_dim { 0.28em }
+ \IfBooleanTF {#1}
+ { \__examzh_symbols_old_cap: }
+ {
+ \mathrel
+ {
+ \__examzh_symbols_symbol_four_size:n
+ { \__examzh_symbols_cap: }
+ }
+ }
+ \group_end:
+ }
+ \RenewDocumentCommand { \cup } { s }
+ {
+ \group_begin:
+ \dim_set:Nn \l__examzh_symbols_cup_line_length_dim { 0.53em }
+ \dim_set:Nn \l__examzh_symbols_cup_radius_dim { 0.28em }
+ \IfBooleanTF {#1}
+ { \__examzh_symbols_old_cup: }
+ {
+ \mathrel
+ {
+ \__examzh_symbols_symbol_four_size:n
+ { \__examzh_symbols_cup: }
+ }
+ }
+ \group_end:
+ }
+ }
+% 相似
+\cs_new:Npn \__examzh_symbols_sim:
+ {
+ \begin{tikzpicture}[line~cap=round, line~width = 0.6pt,baseline = {([yshift = -1pt]current~bounding~box.south)}]
+ \draw
+ (-.25em,1.15ex)
+ .. controls (-.55em,1.15ex) and (-.51em,.23ex) .. (-.275em,.23ex)
+ .. controls (0,.23ex) and (0,1.15ex) .. (.275em,1.15ex)
+ .. controls (.51em,1.15ex) and (.55em,.23ex) .. (.25em,.23ex);
+ \end{tikzpicture}
+ }
+\cs_new:Npn \__examzh_symbols_nsim:
+ {
+ \begin{tikzpicture}[line~width = 0.6pt,line~cap=round, baseline = {([yshift = 1pt]current~bounding~box.south)}]
+ \draw
+ (-.25em,1.15ex)
+ .. controls (-.55em,1.15ex) and (-.51em,.23ex) .. (-.275em,.23ex)
+ .. controls (0,.23ex) and (0,1.15ex) .. (.275em,1.15ex)
+ .. controls (.51em,1.15ex) and (.55em,.23ex) .. (.25em,.23ex);
+ \draw (-0.15em,-0.2ex) --++ (70 \c_colon_str 0.8em);
+ \end{tikzpicture}
+ }
+\AtBeginDocument
+ {
+ \cs_set_eq:NN \__examzh_symbols_old_sim: \backsim
+ \RenewDocumentCommand { \sim } { s }
+ {
+ \IfBooleanTF {#1}
+ { \__examzh_symbols_old_sim: }
+ {
+ \mathrel { \__examzh_symbols_symbol_four_size:n { \__examzh_symbols_sim: } }
+ }
+ }
+ \RenewDocumentCommand { \nsim } { }
+ {
+ \mathrel { \__examzh_symbols_symbol_four_size:n { \__examzh_symbols_nsim: } }
+ }
+ }
+
+% 全等
+\cs_new:Npn \__examzh_symbols_cong:
+ {
+ \begin{tikzpicture}[line~cap=round, baseline]
+ \draw
+ (-.2em,1.35ex)
+ .. controls (-.46em,1.6ex) and (-.54em,.65ex) .. (-.25em,.65ex)
+ .. controls (-.06em,.65ex) and (.06em,1.35ex) .. (.25em,1.35ex)
+ .. controls (.54em,1.35ex) and (.46em,.4ex) .. (.2em,.65ex)
+ (-.46em,.4ex) -- (.46em,.4ex)
+ (-.46em,0ex) -- (.46em,0ex);
+ \end{tikzpicture}
+ }
+\cs_new:Npn \__examzh_symbols_ncong:
+ {
+ \begin{tikzpicture}[line~cap=round, baseline]
+ \draw
+ (-.2em,1.35ex)
+ .. controls (-.46em,1.6ex) and (-.54em,.65ex) .. (-.25em,.65ex)
+ .. controls (-.06em,.65ex) and (.06em,1.35ex) .. (.25em,1.35ex)
+ .. controls (.54em,1.35ex) and (.46em,.4ex) .. (.2em,.65ex)
+ (-.46em,.4ex) -- (.46em,.4ex)
+ (-.46em,0ex) -- (.46em,0ex);
+ \draw (-0.22em,-0.4ex) --++ (66 \c_colon_str 1em);
+ \end{tikzpicture}
+ }
+
+\AtBeginDocument
+ {
+ \cs_set_eq:NN \__examzh_symbols_old_cong: \backcong
+ \RenewDocumentCommand { \cong } { s }
+ {
+ \IfBooleanTF {#1}
+ { \__examzh_symbols_old_cong: }
+ {
+ \mathrel { \__examzh_symbols_symbol_four_size:n { \__examzh_symbols_cong: } }
+ }
+ }
+ \RenewDocumentCommand { \ncong } { }
+ {
+ \mathrel { \__examzh_symbols_symbol_four_size:n { \__examzh_symbols_ncong: } }
+ }
+ }
+
+% 处理符号的不同情况的大小
+\cs_set_eq:NN \NewDocumentCommand:Nnn \NewDocumentCommand
+\cs_set_eq:NN \RenewDocumentCommand:Nnn \RenewDocumentCommand
+\cs_generate_variant:Nn \NewDocumentCommand:Nnn { cnn }
+\cs_generate_variant:Nn \RenewDocumentCommand:Nnn { cnn }
+
+\cs_new:Npn \__examzh_symbols_new_command_without_star_or_old_version:n #1
+ {
+ \NewDocumentCommand:cnn { #1 } { }
+ {
+ \mathrel
+ {
+ \__examzh_symbols_symbol_four_size:n
+ { \use:c { __examzh_symbols_ #1 : } }
+ }
+ }
+ }
+
+\cs_new:Npn \__examzh_symbols_new_command_with_star_and_old_version:n #1
+ {
+ \RenewDocumentCommand:cnn { #1 } { s }
+ {
+ \IfBooleanTF {##1}
+ { \use:c { __examzh_symbols_old_ #1 : } }
+ {
+ \mathrel
+ {
+ \__examzh_symbols_symbol_four_size:n
+ { \use:c { __examzh_symbols_ #1 : } }
+ }
+ }
+ }
+ }
+\cs_new:Npn \__examzh_symbols_symbol_four_size:n #1
+ {
+ \mathchoice
+ {
+ \hbox:n
+ {
+ \fontsize{\tf@size}{\tf@size}\selectfont #1
+ }
+ }
+ {
+ \hbox:n
+ {
+ \fontsize{\tf@size}{\tf@size}\selectfont #1
+ }
+ }
+ {
+ \hbox:n
+ {
+ \fontsize{\sf@size}{\sf@size}\selectfont #1
+ }
+ }
+ {
+ \hbox:n
+ {
+ \fontsize{\ssf@size}{\ssf@size}\selectfont #1
+ }
+ }
+ } \ No newline at end of file
diff --git a/macros/xetex/latex/exam-zh/tex/exam-zh.cls b/macros/xetex/latex/exam-zh/tex/exam-zh.cls
new file mode 100644
index 0000000000..7deb619de6
--- /dev/null
+++ b/macros/xetex/latex/exam-zh/tex/exam-zh.cls
@@ -0,0 +1,2214 @@
+%
+% Copyright (c) 2022 Zeping Lee
+% Released under the LaTeX Project Public License v1.3c License.
+% Repository: https://gitee.com/zepinglee/exam-zh
+%
+
+\NeedsTeXFormat{LaTeX2e}[2017/04/15]
+\RequirePackage{expl3}
+\ProvidesExplClass {exam-zh} {2022-07-28} {v0.1.13} {LaTeX template for Chinese exam}
+
+% 检查 LaTeX2e kernel 版本
+\msg_new:nnn { exam-zh } { latex-too-old }
+ { TeX~ Live~ 2020~ or~ later~ version~ is~ required~ to~ compile~ this~ document. }
+\@ifl@t@r \fmtversion { 2020/02/02 }
+ { }
+ { \msg_fatal:nn { exam-zh } { latex-too-old } }
+
+% 检查编译引擎,要求使用 XeLaTeX。
+\msg_new:nnn { exam-zh } { incompatible-engine }
+ { XeLaTeX~ is~ required~ to~ compile~ this~ document. }
+
+\sys_if_engine_xetex:F
+ { \msg_fatal:nn { exam-zh } { incompatible-engine } }
+
+
+% 使用 l3keys 定义 \examsetup 配置命令
+\NewDocumentCommand \examsetup { m }
+ { \keys_set:nn { exam-zh } {#1} }
+
+
+
+
+% 加载文档类和宏包
+
+% 处理文档类选项
+\PassOptionsToClass { UTF8 , scheme = chinese, openany } { ctexbook }
+\DeclareOption* { \PassOptionsToClass { \CurrentOption } { ctexbook } }
+\ProcessOptions*
+
+\RequirePackage { filehook }
+\AtEndOfPackageFile* { fontspec }
+ { \msg_redirect_name:nnn { fontspec } { no-script } { none } }
+\AtEndOfPackageFile* { xeCJK }
+ {
+ \msg_redirect_name:nnn { xeCJK } { CJKfamily-redef } { none }
+ \defaultCJKfontfeatures
+ {
+ Script = CJK,
+ % Mapping = fullwidth-stop ,
+ }
+ }
+
+% 载入 \cls{ctexbook} 文档类。
+\LoadClass { ctexbook }
+
+% 要求 ctex v2.4.9 2017-04-01 或更高的版本。
+\msg_new:nnn { exam-zh } { require-package-version }
+ { The~ package~ "#1"~ is~ required. }
+
+\@ifclasslater { ctexbook } { 2017/04/01 }
+ { }
+ {
+ \msg_fatal:nnn { exam-zh } { require-package-version }
+ { ctex~ v2.4.9~ 2017-04-01 }
+ }
+
+% 建议在模板开始处载入全部宏包,不要轻易改变加载顺序。
+\RequirePackage { etoolbox }
+\RequirePackage { geometry }
+\RequirePackage { fontspec }
+\RequirePackage { xeCJK }
+\RequirePackage { xeCJKfntef }
+\RequirePackage { fancyhdr }
+\RequirePackage { lastpage }
+\RequirePackage { amsmath }
+\RequirePackage { enumitem }
+\RequirePackage { varwidth }
+
+\ExplSyntaxOff
+\RequirePackage { tikzpagenodes }
+\usetikzlibrary { decorations.markings }
+\usetikzlibrary { decorations.text }
+\ExplSyntaxOn
+
+\RequirePackage { exam-zh-font }
+\RequirePackage { exam-zh-question }
+\RequirePackage { exam-zh-choices }
+\RequirePackage { exam-zh-symbols }
+\RequirePackage { exam-zh-chinese-english }
+
+\AtEndPreamble
+ {
+ \RequirePackage { hyperref }
+ \hypersetup
+ {
+ bookmarksnumbered = true,
+ psdextra = true,
+ unicode = true,
+ hidelinks
+ }
+ }
+
+
+% 对冲突的宏包报错。
+\msg_new:nnn { exam-zh } { package-conflict }
+ { The~ "#2"~ package~ is~ incompatible~ with~ "#1". }
+
+\cs_new:Npn \examzh_package_conflict:nn #1#2
+ {
+ \AtEndOfPackageFile* {#1}
+ {
+ \AtBeginOfPackageFile* {#2}
+ { \msg_error:nnnn { exam-zh } { package-conflict } {#1} {#2} }
+ }
+ }
+
+\examzh_package_conflict:nn { unicode-math } { amscd }
+\examzh_package_conflict:nn { unicode-math } { amsfonts }
+\examzh_package_conflict:nn { unicode-math } { amssymb }
+\examzh_package_conflict:nn { unicode-math } { bbm }
+\examzh_package_conflict:nn { unicode-math } { bm }
+\examzh_package_conflict:nn { unicode-math } { eucal }
+\examzh_package_conflict:nn { unicode-math } { eufrak }
+\examzh_package_conflict:nn { unicode-math } { mathrsfs }
+\examzh_package_conflict:nn { unicode-math } { newtxmath }
+\examzh_package_conflict:nn { unicode-math } { upgreek }
+
+\examzh_package_conflict:nn { enumitem } { paralist }
+
+
+% 标点处理
+\tl_const:Nn \c__examzh_fwid_full_stop_tl { ^^^^ff0e }
+
+\keys_define:nn { exam-zh }
+ { style .meta:nn = { exam-zh / style } {#1} }
+\keys_define:nn { exam-zh / style }
+ {
+ fullwidth-stop .choice:,
+ fullwidth-stop .value_required:n = true,
+ fullwidth-stop / catcode .code:n =
+ {
+ \__examzh_set_fullwidth_stop_catcode:
+ },
+ fullwidth-stop / false .code:n = { }
+ }
+\cs_new:Npn \__examzh_set_fullwidth_stop_catcode:
+ {
+ \char_set_active_eq:NN ^^^^3002 \c__examzh_fwid_full_stop_tl
+ \char_set_catcode_active:N ^^^^3002
+ }
+
+\keys_set:nn { exam-zh / style }
+ {
+ fullwidth-stop = false
+ }
+
+\keys_set:nn { ctex }
+ {
+ % 修改目录层级
+ tocdepth = 0,
+ chapter =
+ {
+ numbering = false,
+ beforeskip = -4ex,
+ afterskip = 4ex minus 1ex
+ }
+ }
+
+% 师生两版
+
+% 用户自定义统一控制的预设 (将所需要控制的键值进行预设置)
+
+\NewDocumentCommand { \ExamPrintAnswerSet } { O{} m }
+ % #1: 命令
+ % #2: 键值 foo/bar
+ {
+ \clist_const:Nn \g__examzh_print_answer_cmd_set_clist {#1}
+ \clist_const:Nn \g__examzh_print_answer_keys_set_clist {#2}
+ }
+
+\NewDocumentCommand { \ExamPrintAnswer } { }
+ {
+ \clist_use:Nn \g__examzh_print_answer_cmd_set_clist {}
+ \clist_if_empty:NF \g__examzh_print_answer_keys_set_clist
+ {
+ \keys_set:nx { exam-zh }
+ { \g__examzh_print_answer_keys_set_clist }
+ }
+ }
+
+
+
+\str_new:N \l__examzh_latexmk_engine_str
+\str_new:N \g__examzh_student_version_jobname_str
+\str_new:N \l__examzh_student_version_suffix_str
+\str_const:Nn \l__examzh_latexmk_str { latexmk }
+
+\keys_define:nn { exam-zh / style }
+ {
+ student-version-suffix .code:n =
+ { \str_set:Nn \l__examzh_student_version_suffix_str {#1} },
+ student-version-cleanaux .bool_set:N = \l__examzh_student_version_clean_aux_bool
+ }
+\keys_set:nn { exam-zh / style }
+ {
+ student-version-suffix = { _student_version },
+ student-version-cleanaux = true
+ }
+
+\cs_new:Nn \__examzh_build_student_version_jobname:
+ {
+ \str_gset:Nx \g__examzh_student_version_jobname_str { \c_sys_jobname_str }
+ \str_gremove_all:Nn \g__examzh_student_version_jobname_str { " }
+ \str_gput_left:Nn \g__examzh_student_version_jobname_str { " }
+ \str_gput_right:Nx \g__examzh_student_version_jobname_str { \l__examzh_student_version_suffix_str }
+ \str_gput_right:Nn \g__examzh_student_version_jobname_str { " }
+ }
+
+\AtEndPreamble
+ {
+ \sys_if_shell_unrestricted:T
+ {
+ \str_set:Nn \l__examzh_latexmk_engine_str { -xelatex }
+ \__examzh_build_student_version_jobname:
+ \sys_shell_now:x
+ {
+ \l__examzh_latexmk_str \c_space_tl
+ \l__examzh_latexmk_engine_str \c_space_tl
+ -pretex='
+ % \string\RequirePackage{etoolbox}
+ % \string\BeforeBeginEnvironment{document}{\string\ExamPrintAnswer}
+ \string\AddToHook{env/document/before}{\string\ExamPrintAnswer}
+ % \string\AtBeginDocument{\string\ExamPrintAnswer}
+ ' \c_space_tl
+ -usepretex \c_space_tl
+ -jobname=\g__examzh_student_version_jobname_str \c_space_tl
+ \c_sys_jobname_str
+ \bool_if:NT \l__examzh_student_version_clean_aux_bool
+ {
+ &&
+ \l__examzh_latexmk_str \c_space_tl
+ \l__examzh_latexmk_engine_str \c_space_tl
+ -c \c_space_tl
+ -jobname=\g__examzh_student_version_jobname_str \c_space_tl
+ \c_sys_jobname_str
+ }
+ }
+ \sys_shell_now:x
+ {
+ \l__examzh_latexmk_str \c_space_tl
+ \l__examzh_latexmk_engine_str \c_space_tl
+ \c_sys_jobname_str
+ \bool_if:NT \l__examzh_student_version_clean_aux_bool
+ {
+ &&
+ \l__examzh_latexmk_str \c_space_tl
+ \l__examzh_latexmk_engine_str \c_space_tl
+ -c \c_space_tl
+ \c_sys_jobname_str
+ }
+ }
+ \stop
+ }
+ }
+
+
+% 处理目录
+\patchcmd { \tableofcontents }
+ { \@starttoc{toc} }
+ {
+ \thispagestyle { empty }
+ \pagestyle { empty }
+ \@starttoc{toc}
+ }
+ {}{\fail}
+\cs_set_eq:NN \t@bleofcontents \tableofcontents
+\RenewDocumentCommand { \tableofcontents } { }
+ {
+ \newpage
+ \int_set:Nn \c@page { 0 }
+ \group_begin:
+ % \str_case:VnT \g__examzh_sealline_scope_str
+ % {
+ % { everypage } {}
+ % { oddpage } {}
+ % }
+ % {
+ % \RemoveFromHook { shipout / background }
+ \cs_set_eq:NN \onecolumn \twocolumn
+ \bool_set_true:N \g__examzh_page_show_chapter_bool
+ \keys_set:nn { ctex }
+ {
+ chapter =
+ {
+ beforeskip = 1pt,
+ afterskip = 2ex minus 1ex
+ }
+ }
+ \t@bleofcontents
+ \group_end:
+ \newpage
+ % 将页码计数器重设置为 1
+ \int_set:Nn \c@page { 1 }
+ }
+
+\AtEndPreamble
+ {
+ % A3 情况 separate 的目录页码需要改为 2* -1
+ \bool_lazy_and:nnT
+ {
+ ! \bool_if_p:c { g__examzh_page_size_a4paper_bool }
+ }
+ {
+ ! \bool_if_p:c { g__examzh_page_a3paper_foot_common_bool }
+ }
+ {
+ \cs_set_eq:Nc \addcontentsline { __examzh_addcontentsline_a3paper_separate:nnn }
+ }
+ }
+% https://tex.stackexchange.com/questions/650823/why-my-patch-to-addcontentsline-is-broken-in-atendpreamble-and-bool-ifnt
+% 改自 hyperref.sty
+\cs_set:cpn { __examzh_addcontentsline_a3paper_separate:nnn } #1#2#3
+ {
+ \begingroup
+ \let\label\@gobble
+ \ifx\@currentHref\@empty
+ \Hy@Warning{
+ No destination for bookmark of \string\addcontentsline,%
+ \MessageBreak destination is added%
+ }
+ \phantomsection
+ \fi
+ \expandafter\ifx\csname toclevel@#2\endcsname\relax
+ \begingroup
+ \def\Hy@tempa{#1}
+ \ifx\Hy@tempa\Hy@bookmarkstype
+ \Hy@WarningNoLine{
+ bookmark level for unknown #2 defaults to 0%
+ }
+ \else
+ \Hy@Info{bookmark level for unknown #2 defaults to 0}%
+ \fi
+ \endgroup
+ \expandafter\gdef\csname toclevel@#2\endcsname{0}%
+ \fi
+ \edef\Hy@toclevel{\csname toclevel@#2\endcsname}%
+ \Hy@writebookmark{\csname the#2\endcsname}%
+ {#3}
+ {\@currentHref}
+ {\Hy@toclevel}
+ {#1}
+ \ifHy@verbose
+ \begingroup
+ \def\Hy@tempa{#3}
+ \@onelevel@sanitize\Hy@tempa
+ \let\temp@online\on@line
+ \let\on@line\@empty
+ \Hy@Info{
+ bookmark\temp@online:\MessageBreak
+ thecounter {\csname the#2\endcsname}\MessageBreak
+ text {\Hy@tempa}\MessageBreak
+ reference {\@currentHref}\MessageBreak
+ toclevel {\Hy@toclevel}\MessageBreak
+ type {#1}
+ }
+ \endgroup
+ \fi
+ \addtocontents{#1}{
+ \protect\contentsline{#2}{#3}
+ % {\thepage}
+ { \int_eval:n { 2 * \c@page - 1 } }
+ {\@currentHref}\protected@file@percent
+ }
+ \endgroup
+ }
+\keys_define:nn { exam-zh / page }
+ {
+ show-chapter .bool_gset:N = \g__examzh_page_show_chapter_bool
+ }
+\keys_set:nn { exam-zh / page }
+ {
+ show-chapter = true
+ }
+
+\cs_set_eq:NN \__examzh_chapter:nn \chapter
+\cs_new:Npn \__examzh_chapter_star:n #1
+ {
+ \__examzh_chapter:nn * {#1}
+ }
+\RenewDocumentCommand{ \chapter }{ s o m }
+ {
+ \keys_set:nn { exam-zh / question }
+ { index = 1 }
+ \int_set:Nn \c@section { 0 }
+ \bool_if:NTF \g__examzh_page_show_chapter_bool
+ {
+ \IfBooleanTF {#1}
+ { \__examzh_chapter_star:n {#3} }
+ {
+ \IfNoValueTF {#2}
+ { \__examzh_chapter:nn {#3} }
+ { \__examzh_chapter:nn [#2] {#3} }
+ }
+ \pagestyle { plain }
+ }
+ {
+ \IfBooleanF {#1}
+ {
+ \newpage
+ % 只录入目录
+ \phantomsection
+ \addcontentsline { toc } { chapter } {#3}
+ \pagestyle { plain }
+ }
+ \clearpage
+ }
+ }
+
+% 纸张和页面布局
+
+% 控制 a3paper 和 a4paper
+\bool_new:c { g__examzh_page_size_a4paper_bool }
+% a3paper 的页脚:两页共用一个或者仍然一页一个
+\bool_new:c { g__examzh_page_a3paper_foot_common_bool }
+
+\keys_define:nn { exam-zh / page }
+ {
+ % 页面大小
+ size .choice:,
+ size / a3paper .code:n =
+ {
+ \bool_gset_false:c { g__examzh_page_size_a4paper_bool }
+ },
+ size / a4paper .code:n =
+ {
+ \bool_gset_true:c { g__examzh_page_size_a4paper_bool }
+ },
+ size .value_required:n = true,
+ % 页脚的类型
+ foot-type .choice:,
+ foot-type / common .code:n =
+ {
+ \bool_gset_true:c
+ { g__examzh_page_a3paper_foot_common_bool }
+ },
+ foot-type / separate .code:n =
+ {
+ \bool_gset_false:c
+ { g__examzh_page_a3paper_foot_common_bool }
+ }
+ }
+\keys_set:nn { exam-zh / page }
+ {
+ size = a4paper,
+ foot-type = separate,
+ }
+
+\keys_define:nn { exam-zh }
+ {
+ page .meta:nn = { exam-zh / page } {#1}
+ }
+
+
+% 字体
+
+% 中文字体
+
+% 在 ctex 的字体配置的基础上进行一些修改
+% 将苹方和微软雅黑分别替换为华文黑体和中易黑体
+
+\str_if_eq:onTF { \g__ctex_fontset_tl } { mac }
+ {
+ % \setCJKmainfont{Source~Han~Serif~SC}
+ % [
+ % ItalicFont = FZKai-Z03,
+ % ]
+ \setCJKsansfont { Heiti~ SC~ Light } [ BoldFont = Heiti~ SC~ Medium ]
+ }
+ {
+ \str_if_eq:onT { \g__ctex_fontset_tl } { windows }
+ {
+ % \setCJKmainfont{Source~Han~Serif~SC}
+ % [
+ % ItalicFont = FZKai-Z03,
+ % ]
+ \setCJKsansfont { SimHei }
+ }
+ }
+
+% 罗马数字使用中文字体
+\xeCJKDeclareCharClass { CJK } { "2160 -> "217F }
+% 带圈数字
+\xeCJKDeclareCharClass { CJK } { "2460 -> "2473 }
+
+
+% 如果有内容较高(如分式)使得行间距小于 0.5em,则将其增加至 0.5em。
+\dim_set:Nn \lineskiplimit { .5em }
+\skip_set:Nn \lineskip { .5em }
+
+
+
+% 设置 enumitem 列表格式
+\keys_define:nn { exam-zh / list }
+ {
+ step-name .tl_set:N = \l__examzh_list_step_name_tl,
+ method-name .tl_set:N = \l__examzh_list_method_name_tl,
+ case-name .tl_set:N = \l__examzh_list_case_name_tl,
+ step-punct .tl_set:N = \l__examzh_list_step_punct_tl,
+ method-punct .tl_set:N = \l__examzh_list_method_punct_tl,
+ case-punct .tl_set:N = \l__examzh_list_case_punct_tl,
+ }
+\keys_set:nn { exam-zh / list }
+ {
+ step-name = 步骤,
+ method-name = 方法,
+ case-name = 情形,
+ step-punct = .,
+ method-punct = ,
+ case-punct = .,
+ }
+\keys_define:nn { exam-zh }
+ { list .meta:nn = { exam-zh / list } {#1} }
+
+\setlist{nosep}
+
+\setlist[enumerate, 1]
+ {
+ labelindent = \parindent,
+ leftmargin = *,
+ label = { \arabic * .}
+ }
+
+\setlist[enumerate, 2]
+ {
+ left = 2em,
+ labelsep = 0pt,
+ label = { ( \arabic * ) }
+ }
+
+% 多种方法: method环境
+\newlist{method}{enumerate}{1}
+\setlist[method, 1]
+ {
+ label = {\bfseries \l__examzh_list_method_name_tl \zhnum*\l__examzh_list_method_punct_tl},
+ labelindent = !,
+ labelwidth = 1.3cm,
+ labelsep* = 0.5em,
+ leftmargin = 1.4cm
+ }
+% 分类讨论: case环境
+\newlist{case}{enumerate}{2}
+\setlist[case, 1]
+ {
+ label = {\bfseries \l__examzh_list_case_name_tl \arabic*\l__examzh_list_case_punct_tl},
+ % labelindent=-3em ,labelwidth=1.3cm, labelsep*=1em, leftmargin=20pt
+ labelindent = !,
+ labelwidth = 1.3cm,
+ labelsep* = 0.5em,
+ leftmargin = 1.7cm
+ % labelindent=\parindent, leftmargin=0pt, widest=0, itemindent=*
+ }
+\setlist[case, 2]
+ {
+ label = {\bfseries \l__examzh_list_case_name_tl \arabic{casei}.\arabic*\l__examzh_list_case_punct_tl},
+ % labelindent=-1em ,labelwidth=1.3cm, labelsep*=1em, leftmargin =20pt
+ labelindent = -0.5em,
+ labelwidth = 1.3cm,
+ labelsep* = 0.5em,
+ leftmargin = 0cm
+ }
+% 分步: step环境
+\newlist{step}{enumerate}{2}
+\setlist[step, 1]
+ {
+ label = {\bfseries \l__examzh_list_step_name_tl \arabic*\l__examzh_list_step_punct_tl},
+ labelindent = !,
+ labelwidth = 1.3cm,
+ labelsep* = 0.5em,
+ leftmargin = 1.7cm
+ % labelindent=\parindent, leftmargin = 0pt, widest = 0, itemindent = *
+ }
+\setlist[step, 2]
+ {
+ label = {\bfseries \l__examzh_list_step_name_tl \arabic{stepi}.\arabic*\l__examzh_list_step_punct_tl},
+ labelindent = -0.5em,
+ labelwidth = 1.3cm,
+ labelsep* = 0.5em,
+ leftmargin = 0cm
+ }
+
+% 横向的个人信息
+
+\clist_new:N \l__examzh_horizontal_information_clist
+
+\NewDocumentCommand \information { O{\quad} m }
+% #1 分隔符
+% #2 信息内容
+ {
+ \clist_set:Nn \l__examzh_horizontal_information_clist {#2}
+ \__examzh_print_horizontal_information:n {#1}
+ }
+\cs_new:Npn \__examzh_print_horizontal_information:n #1
+ {
+ \par \null \hfill
+ \clist_use:Nn \l__examzh_horizontal_information_clist {#1}
+ \hfill \null \par
+ }
+
+% 警告,如“在此卷上答题无效”
+\NewDocumentCommand \warning { O{\large \sffamily \bfseries} m }
+ {
+ \group_begin:
+ #1
+ \hfill #2 \hfill \null
+ \group_end:
+ \par
+ }
+
+
+% 标题处理
+\keys_define:nn { exam-zh / title }
+ {
+ title-format .tl_set:N = \l__examzh_title_format_tl,
+ subject-format .tl_set:N = \l__examzh_subject_format_tl,
+ top-sep .skip_set:N = \l__examzh_title_top_sep_skip,
+ bottom-sep .skip_set:N = \l__examzh_title_bottom_sep_skip,
+ }
+\keys_set:nn { exam-zh / title }
+ {
+ title-format = \Large,
+ subject-format = \sffamily \bfseries \huge,
+ top-sep = -.5em plus 0.3em minus 0.2em,
+ bottom-sep = 0em plus 0.3em minus 0.2em,
+ }
+\keys_define:nn { exam-zh }
+ { title .meta:nn = { exam-zh / title } {#1} }
+
+\cs_new_protected:Npn \__examzh_spread_box:nn #1#2
+ {
+ \mode_leave_vertical:
+ \hbox_to_wd:nn {#1}
+ { \tl_map_inline:xn {#2} { ##1 \hfil } \unskip }
+ }
+
+% 科目
+\tl_new:N \l__exam_zh_subject_tl
+\NewDocumentCommand \subject { o m }
+ {
+ \IfNoValueTF {#1}
+ {
+ % 默认使用自然宽度
+ \hbox_set:Nn \l_tmpa_box {#2}
+ \dim_set:Nn \l_tmpa_dim { \box_wd:N \l_tmpa_box * 2 }
+ \tl_set:Nn \l__exam_zh_subject_tl
+ {
+ \__examzh_spread_box:nn { \l_tmpa_dim } {#2}
+ }
+ }
+ {
+ % 手动调整宽度
+ \tl_set:Nn \l__exam_zh_subject_tl
+ {
+ \__examzh_spread_box:nn {#1} {#2}
+ }
+ }
+ }
+
+% 输出标题
+\RenewDocumentCommand \maketitle { }
+ {
+ \par
+ \vspace { \l__examzh_title_top_sep_skip }
+ \begin { center }
+ \let \footnote \thanks
+ { \l__examzh_title_format_tl \@title \par }
+ \tl_if_blank:VF \l__exam_zh_subject_tl
+ {
+ \addvspace { 1em }
+ { \l__examzh_subject_format_tl \l__exam_zh_subject_tl }
+ }
+ \end { center }
+ \par
+ \vspace { \l__examzh_title_bottom_sep_skip }
+ }
+
+
+
+\prg_new_conditional:Npnn \examzh_if_defined:N #1 { T , F , TF }
+ {
+ \if_meaning:w #1 \@undefined
+ \prg_return_false:
+ \else:
+ \prg_return_true:
+ \fi:
+ }
+
+% 绝密 启用前
+\NewDocumentCommand \secret { O{\bfseries} }
+ {
+ \par \noindent
+ \group_begin:
+ #1
+ 绝密 $\bigstar$ 启用前
+ \group_end:
+ \par
+ }
+
+% 祝考试顺利
+\NewDocumentCommand \goodluck { O{祝考试顺利} }
+ {
+ \group_begin:
+ \centering
+ \examzh_if_defined:NTF \lishu
+ { \lishu }
+ { \bfseries }
+ \Large
+ $\bigstar$ #1 $\bigstar$
+ \par
+ \group_end:
+ }
+
+
+% 注意事项环境 notice
+\keys_define:nn { exam-zh / notice }
+ {
+ label .tl_set:N = \l__examzh_notice_label_tl,
+ label-format .tl_set:N = \l__examzh_notice_label_format_tl,
+ top-sep .skip_set:N = \l__examzh_notice_top_sep_skip,
+ bottom-sep .skip_set:N = \l__examzh_notice_bottom_sep_skip,
+
+ }
+\keys_set:nn { exam-zh / notice }
+ {
+ label = 注意事项:,
+ label-format = \sffamily \bfseries,
+ top-sep = .25em plus .25em minus .1em,
+ bottom-sep = .25em plus .25em minus .1em,
+ }
+\NewDocumentEnvironment { notice } { O { } O { } }
+ {
+ \keys_set:nn { exam-zh / notice } {#1}
+ \par
+ \vspace { \l__examzh_notice_top_sep_skip }
+ \noindent
+ \group_begin:
+ \l__examzh_notice_label_format_tl
+ \l__examzh_notice_label_tl
+ \group_end:
+ \begin { enumerate }
+ [
+ leftmargin = 0pt ,
+ itemindent = 3.5em ,
+ labelsep = 0.5em ,
+ labelwidth = 1.5em ,
+ align = right ,
+ label = { \arabic * . } ,
+ #2
+ ]
+ }
+ {
+ \end { enumerate }
+ \vspace { \l__examzh_notice_bottom_sep_skip }
+ }
+
+
+% 大题的标题使用 \ctexset 设置 \section 的格式
+
+\ctexset
+ {
+ section =
+ {
+ format = \heiti \bfseries ,
+ number = \chinese { section } ,
+ aftername = { 、 } ,
+ beforeskip = 2ex plus 1ex minus .5ex,
+ afterskip = 1ex plus .2ex minus 1ex
+ }
+ }
+
+
+% 正体的 e 和 i
+\NewDocumentCommand \eu { } { \mathrm{ e } }
+\NewDocumentCommand \iu { } { \mathrm{ i } }
+
+
+% 兼容 siunitx v2.x 的一些命令
+\AtEndOfPackageFile* { siunitx }
+ {
+ \ProvideDocumentCommand \unit { } { \si }
+ \ProvideDocumentCommand \qty { } { \SI }
+ \ProvideDocumentCommand \qtyproduct { } { \SI }
+ }
+
+
+
+% 密封线
+\str_new:N \g__examzh_sealline_odd_type_str
+\str_new:N \g__examzh_sealline_even_type_str
+
+\keys_define:nn { exam-zh / sealline }
+ {
+ % 是否显示密封线
+ show .bool_gset:N = \g__examzh_sealline_show_bool,
+ % 密封线类型(也理解为出现的类型,比如只在第一页,只在奇数页)
+ scope .choices:nn =
+ { firstpage, oddpage, everypage, first-and-last, mod-2, mod-3, mod-4, mod-6 }
+ { \str_gset:Nx \g__examzh_sealline_scope_str { \l_keys_choice_tl } },
+ type .choices:nn =
+ { firstpage, oddpage, everypage, first-and-last, mod-2, mod-3, mod-4, mod-6 }
+ { \str_gset:Nx \g__examzh_sealline_scope_str { \l_keys_choice_tl } },
+ % 线的厚度
+ odd-line-thickness .dim_set:N = \g__examzh_sealline_odd_line_thickness_dim,
+ even-line-thickness .dim_set:N = \g__examzh_sealline_even_line_thickness_dim,
+ line-thickness .code:n =
+ {
+ \dim_set:Nn \g__examzh_sealline_odd_line_thickness_dim {#1}
+ \dim_set:Nn \g__examzh_sealline_even_line_thickness_dim {#1}
+ },
+ % 线的偏移
+ odd-line-xshift .dim_set:N = \g__examzh_sealline_odd_line_xshift_dim,
+ odd-line-yshift .dim_set:N = \g__examzh_sealline_odd_line_yshift_dim,
+ even-line-xshift .dim_set:N = \g__examzh_sealline_even_line_xshift_dim,
+ even-line-yshift .dim_set:N = \g__examzh_sealline_even_line_yshift_dim,
+ line-xshift .code:n =
+ {
+ \dim_gset:Nn \g__examzh_sealline_odd_line_xshift_dim {#1}
+ \dim_gset:Nn \g__examzh_sealline_even_line_xshift_dim {#1}
+ },
+ line-yshift .code:n =
+ {
+ \dim_set:Nn \g__examzh_sealline_odd_line_yshift_dim {#1}
+ \dim_set:Nn \g__examzh_sealline_even_line_yshift_dim {#1}
+ },
+ % 密封线的线类型
+ % odd-line-type .str_set:N = \g__examzh_sealline_odd_type_str,
+ % even-line-type .str_set:N = \g__examzh_sealline_even_type_str,
+ odd-line-type .code:n =
+ {
+ \str_set:Nn \g__examzh_sealline_odd_type_str {#1}
+ },
+ even-line-type .code:n =
+ {
+ \str_set:Nn \g__examzh_sealline_even_type_str {#1}
+ },
+ line-type .code:n =
+ {
+ \str_gset:Nn \g__examzh_sealline_odd_type_str {#1}
+ \str_gset:Nn \g__examzh_sealline_even_type_str {#1}
+ },
+ % 密封线路径的文字内容
+ odd-text .tl_set:N = \g__examzh_sealline_odd_text_tl,
+ even-text .tl_set:N = \g__examzh_sealline_even_text_tl,
+ text .code:n =
+ {
+ \tl_gset:Nn \g__examzh_sealline_odd_text_tl {#1}
+ \tl_gset:Nn \g__examzh_sealline_even_text_tl {#1}
+ },
+ % 密封线路径的文字内容偏移
+ odd-text-xshift .dim_set:N = \g__examzh_sealline_odd_text_xshift_dim,
+ even-text-xshift .dim_set:N = \g__examzh_sealline_even_text_xshift_dim,
+ odd-text-yshift .dim_set:N = \g__examzh_sealline_odd_text_yshift_dim,
+ even-text-yshift .dim_set:N = \g__examzh_sealline_even_text_yshift_dim,
+ text-xshift .code:n =
+ {
+ \dim_gset:Nn \g__examzh_sealline_odd_text_xshift_dim {#1}
+ \dim_gset:Nn \g__examzh_sealline_even_text_xshift_dim {#1}
+ },
+ text-yshift .code:n =
+ {
+ \dim_gset:Nn \g__examzh_sealline_odd_text_yshift_dim {#1}
+ \dim_gset:Nn \g__examzh_sealline_even_text_yshift_dim {#1}
+ },
+ % 密封线路径文字的宽度
+ odd-text-width .dim_set:N = \g__examzh_sealline_odd_text_width_dim,
+ even-text-width .dim_set:N = \g__examzh_sealline_even_text_width_dim,
+ text-width .code:n =
+ {
+ \dim_gset:Nn \g__examzh_sealline_odd_text_width_dim {#1}
+ \dim_gset:Nn \g__examzh_sealline_even_text_width_dim {#1}
+ },
+ % 密封线路径文字的字体
+ odd-text-format .tl_set:N = \g__examzh_sealline_odd_text_format_tl,
+ even-text-format .tl_set:N = \g__examzh_sealline_even_text_format_tl,
+ text-format .code:n =
+ {
+ \tl_gset:Nn \g__examzh_sealline_odd_text_format_tl {#1}
+ \tl_gset:Nn \g__examzh_sealline_even_text_format_tl {#1}
+ },
+ % 密封线路径文字的方向
+ odd-text-direction-vertical .bool_gset:N = \g__examzh_sealline_odd_text_direction_vertical_bool,
+ even-text-direction-vertical .bool_gset:N = \g__examzh_sealline_even_text_direction_vertical_bool,
+ text-direction-vertical .choice:,
+ text-direction-vertical / true .code:n =
+ {
+ \bool_gset_true:N \g__examzh_sealline_odd_text_direction_vertical_bool
+ \bool_gset_true:N \g__examzh_sealline_even_text_direction_vertical_bool
+ },
+ text-direction-vertical / false .code:n =
+ {
+ \bool_gset_false:N \g__examzh_sealline_odd_text_direction_vertical_bool
+ \bool_gset_false:N \g__examzh_sealline_even_text_direction_vertical_bool
+ },
+ % 密封线路径文字的防缩比例
+ odd-text-xscale .fp_set:N = \g__examzh_sealline_odd_text_xscale_fp,
+ odd-text-yscale .fp_set:N = \g__examzh_sealline_odd_text_yscale_fp,
+ even-text-xscale .fp_set:N = \g__examzh_sealline_even_text_xscale_fp,
+ even-text-yscale .fp_set:N = \g__examzh_sealline_even_text_yscale_fp,
+ text-xscale .code:n =
+ {
+ \fp_gset:Nn \g__examzh_sealline_odd_text_xscale_fp {#1}
+ \fp_gset:Nn \g__examzh_sealline_even_text_xscale_fp {#1}
+ },
+ text-yscale .code:n =
+ {
+ \fp_gset:Nn \g__examzh_sealline_odd_text_yscale_fp {#1}
+ \fp_gset:Nn \g__examzh_sealline_even_text_yscale_fp {#1}
+ },
+ % 密封线上圆圈的参数
+ % --控制显示--
+ odd-circle-show .bool_set:N = \g__examzh_sealline_odd_circle_show_bool,
+ even-circle-show .bool_set:N = \g__examzh_sealline_even_circle_show_bool,
+ circle-show .choice:,
+ circle-show / true .code:n =
+ {
+ \bool_gset_true:N \g__examzh_sealline_odd_circle_show_bool
+ \bool_gset_true:N \g__examzh_sealline_even_circle_show_bool
+ },
+ circle-show / false .code:n =
+ {
+ \bool_gset_false:N \g__examzh_sealline_odd_circle_show_bool
+ \bool_gset_false:N \g__examzh_sealline_even_circle_show_bool
+ },
+ % --开始--
+ odd-circle-start .fp_set:N = \g__examzh_sealline_odd_circle_start_fp,
+ even-circle-start .fp_set:N = \g__examzh_sealline_even_circle_start_fp,
+ circle-start .code:n =
+ {
+ \fp_gset:Nn \g__examzh_sealline_odd_circle_start_fp {#1}
+ \fp_gset:Nn \g__examzh_sealline_even_circle_start_fp {#1}
+ },
+ % --结束--
+ odd-circle-end .fp_set:N = \g__examzh_sealline_odd_circle_end_fp,
+ even-circle-end .fp_set:N = \g__examzh_sealline_even_circle_end_fp,
+ circle-end .code:n =
+ {
+ \fp_gset:Nn \g__examzh_sealline_odd_circle_end_fp {#1}
+ \fp_gset:Nn \g__examzh_sealline_even_circle_end_fp {#1}
+ },
+ % --步长--
+ odd-circle-step .dim_set:N = \g__examzh_sealline_odd_circle_step_dim,
+ even-circle-step .dim_set:N = \g__examzh_sealline_even_circle_step_dim,
+ circle-step .code:n =
+ {
+ \dim_gset:Nn \g__examzh_sealline_odd_circle_step_dim {#1}
+ \dim_gset:Nn \g__examzh_sealline_even_circle_step_dim {#1}
+ },
+ % --直径--
+ odd-circle-diameter .dim_set:N = \g__examzh_sealline_odd_circle_diameter_dim,
+ even-circle-diameter .dim_set:N = \g__examzh_sealline_even_circle_diameter_dim,
+ circle-diameter .code:n =
+ {
+ \dim_gset:Nn \g__examzh_sealline_odd_circle_diameter_dim {#1}
+ \dim_gset:Nn \g__examzh_sealline_even_circle_diameter_dim {#1}
+ },
+ % --偏移--
+ odd-circle-xshift .dim_set:N = \g__examzh_sealline_odd_circle_xshift_dim,
+ even-circle-xshift .dim_set:N = \g__examzh_sealline_even_circle_xshift_dim,
+ circle-xshift .code:n =
+ {
+ \dim_gset:Nn \g__examzh_sealline_odd_circle_xshift_dim {#1}
+ \dim_gset:Nn \g__examzh_sealline_even_circle_xshift_dim {#1}
+ },
+ % 学生信息
+ % --内容--
+ odd-info-content .clist_set:N = \g__examzh_sealline_odd_info_content_clist,
+ % --分隔符--
+ odd-info-seperator .tl_set:N = \g__examzh_sealline_odd_info_seperator_tl,
+ % --对齐--
+ odd-info-align .tl_set:N = \g__examzh_sealline_odd_info_align_tl,
+ % --偏移--
+ odd-info-xshift .dim_set:N = \g__examzh_sealline_odd_info_xshift_dim,
+ odd-info-yshift .dim_set:N = \g__examzh_sealline_odd_info_yshift_dim,
+ }
+\keys_set:nn { exam-zh / sealline }
+ {
+ show = false,
+ % scope = firstpage,
+ % scope = oddpage,
+ scope = everypage,
+ line-thickness = 1pt,
+ line-xshift = 8mm,
+ line-yshift = 0mm,
+ line-type = loosely-dashed,
+ text = 密封线内不得答题,
+ text-xshift = 11mm,
+ text-yshift = 0pt,
+ text-width = 0.8\textheight,
+ text-format = \zihao{4}\sffamily,
+ text-xscale = 1.0,
+ text-yscale = 0.8,
+ text-direction-vertical = false,
+ circle-show = true,
+ circle-start = 0.07,
+ circle-end = 0.92,
+ circle-step = 3.5em,
+ circle-diameter = 3mm,
+ circle-xshift = 8mm,
+ odd-info-content = {
+ {\kaishu 姓名}:{\underline{\hspace*{8em}}},
+ {\kaishu 准考证号}:{\underline{\hspace*{8em}}},
+ {\kaishu 考场号}:{\underline{\hspace*{8em}}},
+ {\kaishu 座位号}:{\underline{\hspace*{8em}}}
+ },
+ odd-info-seperator = \hspace*{3em},
+ odd-info-align = center,
+ odd-info-xshift = 20mm,
+ odd-info-yshift = 0mm
+ }
+\keys_define:nn { exam-zh }
+ { sealline .meta:nn = { exam-zh / sealline } {#1} }
+
+% 只在第一页出现
+\cs_new:Npn \__examzh_sealline_scope_firstpage:
+ {
+ \AddToHook { shipout / firstpage } [ sealline ]
+ {
+ \put (0cm, 0cm)
+ { \__examzh_sealline_odd: }
+ }
+ }
+% 只在第一页和最后一页出现
+\cs_new:Npn \__examzh_sealline_scope_firstpage_and_lastpage:
+ {
+ \AddToHook { shipout / firstpage } [ sealline ]
+ {
+ \put (0cm, 0cm)
+ { \__examzh_sealline_odd: }
+ }
+ \AddToHook { shipout / lastpage } [ sealline ]
+ {
+ \put (0cm, 0cm)
+ {
+ \int_if_odd:nTF { \c@page }
+ { \__examzh_sealline_odd: }
+ { \__examzh_sealline_even: }
+ }
+ }
+ }
+% 只在奇数页出现
+\cs_new:Npn \__examzh_sealline_scope_oddpage:
+ {
+ \AddToHook { shipout / background } [ sealline ]
+ {
+ \put (0cm, 0cm)
+ {
+ \int_if_odd:nT { \c@page }
+ { \__examzh_sealline_odd: }
+ }
+ }
+ }
+% 每页都有,奇偶不同
+\cs_new:Npn \__examzh_sealline_scope_everypage:
+ {
+ \AddToHook { shipout / background } [ sealline ]
+ {
+ \put (0cm, 0cm)
+ {
+ \int_if_odd:nTF { \c@page }
+ { \__examzh_sealline_odd: }
+ { \__examzh_sealline_even: }
+ }
+ }
+ }
+% mod 2 = 1 的类型
+\cs_new:cpn { __examzh_sealline_scope_mod_2_equals_1: }
+ {
+ \AddToHook { shipout / background } [ sealline ]
+ {
+ \put (0cm, 0cm)
+ {
+ \int_compare:nNnT { \int_mod:nn { \c@page } { 2 } } = {1} { \__examzh_sealline_odd: }
+ }
+ }
+ }
+% mod 3 = 1 的类型
+\cs_new:cpn { __examzh_sealline_scope_mod_3_equals_1: }
+ {
+ \AddToHook { shipout / background } [ sealline ]
+ {
+ \put (0cm, 0cm)
+ {
+ \int_compare:nNnT { \int_mod:nn { \c@page } { 3 } } = {1} { \__examzh_sealline_odd: }
+ }
+ }
+ }
+% mod 4 = 1 的类型
+\cs_new:cpn { __examzh_sealline_scope_mod_4_equals_1: }
+ {
+ \AddToHook { shipout / background } [ sealline ]
+ {
+ \put (0cm, 0cm)
+ {
+ \int_compare:nNnT { \int_mod:nn { \c@page } { 4 } } = {1} { \__examzh_sealline_odd: }
+ }
+ }
+ }
+% mod 6 = 1 的类型
+\cs_new:cpn { __examzh_sealline_scope_mod_6_equals_1: }
+ {
+ \AddToHook { shipout / background } [ sealline ]
+ {
+ \put (0cm, 0cm)
+ {
+ \int_compare:nNnT { \int_mod:nn { \c@page } { 6 } } = {1} { \__examzh_sealline_odd: }
+ }
+ }
+ }
+
+
+\AtBeginDocument
+ { \__examzh_sealline_set: }
+\cs_new:Npn \__examzh_sealline_set:
+ {
+ \bool_if:NT \g__examzh_sealline_show_bool
+ {
+ \__examzh_sealline_scope_set:
+ \str_case:Vn \g__examzh_sealline_scope_str
+ {
+ { firstpage } { \__examzh_sealline_scope_firstpage: }
+ { oddpage } { \__examzh_sealline_scope_oddpage: }
+ { everypage } { \__examzh_sealline_scope_everypage: }
+ { first-and-last } { \__examzh_sealline_scope_firstpage_and_lastpage: }
+ { mod-2 } { \use:c { __examzh_sealline_scope_mod_2_equals_1: } }
+ { mod-3 } { \use:c { __examzh_sealline_scope_mod_3_equals_1: } }
+ { mod-4 } { \use:c { __examzh_sealline_scope_mod_4_equals_1: } }
+ { mod-6 } { \use:c { __examzh_sealline_scope_mod_6_equals_1: } }
+ }
+ }
+ }
+\cs_new:Npn \__examzh_sealline_scope_set:
+ {
+ \tl_gset:Nx \g__examzh_sealline_odd_type_parameter_tl
+ {
+ \str_case:Vn \g__examzh_sealline_odd_type_str
+ {
+ { solid } { solid }
+ { dotted } { dotted }
+ { densely-dotted } { densely~dotted }
+ { loosely-dotted } { loosely~dotted }
+ { dashed } { dashed }
+ { densely-dashed } { densely~dashed }
+ { loosely-dashed } { loosely~dashed }
+ { dash-dot } { dash~dot }
+ { densely-dash-dot } { densely~dash~dot }
+ { loosely-dash-dot } { loosely~dash~dot }
+ { dash-dot-dot } { dash~dot~dot }
+ { densely-dash-dot-dot } { densely~dash~dot~dot }
+ { loosely-dash-dot-dot } { loosely~dash~dot~dot }
+ }
+ }
+ \tl_gset:Nx \g__examzh_sealline_even_type_parameter_tl
+ {
+ \str_case:Vn \g__examzh_sealline_even_type_str
+ {
+ { solid } { solid }
+ { dotted } { dotted }
+ { densely-dotted } { densely~dotted }
+ { loosely-dotted } { loosely~dotted }
+ { dashed } { dashed }
+ { densely-dashed } { densely~dashed }
+ { loosely-dashed } { loosely~dashed }
+ { dash-dot } { dash~dot }
+ { densely-dash-dot } { densely~dash~dot }
+ { loosely-dash-dot } { loosely~dash~dot }
+ { dash-dot-dot } { dash~dot~dot }
+ { densely-dash-dot-dot } { densely~dash~dot~dot }
+ { loosely-dash-dot-dot } { loosely~dash~dot~dot }
+ }
+ }
+ }
+
+\keys_define:nn { exam-zh / page }
+ {
+ show-columnline .bool_set:N = \l__examzh_show_columnline_bool,
+ columnline-width .dim_set:N = \l__examzh_columnline_dim,
+ }
+\keys_set:nn { exam-zh / page }
+ {
+ show-columnline = true,
+ columnline-width = 0.4pt
+ }
+
+\AtEndPreamble
+ {
+ \bool_if:cTF { g__examzh_page_size_a4paper_bool }
+ {
+ % a4paper
+ \bool_if:NTF \g__examzh_sealline_show_bool
+ {
+ % 有密封线
+ \geometry
+ {
+ twoside,
+ paper = a4paper,
+ margin = 1in,
+ inner = 1.3in,
+ outer = 0.8in,
+ }
+ }
+ {
+ % 无密封线
+ \geometry
+ {
+ paper = a4paper,
+ margin = 1in,
+ }
+ }
+ }
+ {
+ % a3paper
+ \bool_if:NT \l__examzh_show_columnline_bool
+ { \dim_set:Nn \columnseprule { \l__examzh_columnline_dim } }
+ \bool_if:NTF \g__examzh_sealline_show_bool
+ {
+ % 有密封线
+ \geometry
+ {
+ twoside,
+ paper = a3paper,
+ landscape,
+ twocolumn,
+ columnsep = 30mm,
+ margin = 1in,
+ inner = 1.2in,
+ outer = 0.8in,
+ % showframe
+ }
+ }
+ {
+ % 无密封线
+ \geometry
+ {
+ paper = a3paper,
+ landscape,
+ twocolumn,
+ columnsep = 30mm,
+ margin = 1in,
+ }
+ }
+ }
+ }
+
+
+\cs_new:Npn \__examzh_sealline_odd:
+ {
+ \begin{tikzpicture}
+ [
+ remember~picture,
+ overlay,
+ ]
+ % 密封线:线
+ \__examzh_sealline_odd_line:
+ % 密封线:小圆圈
+ \__examzh_sealline_odd_circle:
+ % 线上的文字
+ \__examzh_sealline_odd_text_around_line:
+ % 学生信息
+ \__examzh_sealline_odd_infomation:
+ \end{tikzpicture}
+ }
+
+\cs_new:Npn \__examzh_sealline_even:
+ {
+ \begin{tikzpicture}[remember~picture, overlay]
+ % 密封线:线
+ \__examzh_sealline_even_line:
+ % 密封线:小圆圈
+ \__examzh_sealline_even_circle:
+ % 线上的文字
+ \__examzh_sealline_even_text_around_line:
+ \end{tikzpicture}
+ }
+
+% 线
+\cs_new:Npn \__examzh_sealline_odd_line:
+ {
+ \use:x
+ {
+ \exp_not:N \draw
+ [
+ \g__examzh_sealline_odd_type_parameter_tl,
+ line~width = \dim_use:N \g__examzh_sealline_odd_line_thickness_dim
+ ]
+ }
+ ([xshift = -\g__examzh_sealline_odd_line_xshift_dim, yshift = -\g__examzh_sealline_odd_line_yshift_dim]current~page~text~area.north~west)
+ --
+ ([xshift = -\g__examzh_sealline_odd_line_xshift_dim, yshift = \g__examzh_sealline_odd_line_yshift_dim]current~page~text~area.south~west);
+ }
+\cs_new:Npn \__examzh_sealline_even_line:
+ {
+ \use:x
+ {
+ \exp_not:N \draw
+ [
+ \g__examzh_sealline_even_type_parameter_tl,
+ line~width = \dim_use:N \g__examzh_sealline_even_line_thickness_dim
+ ]
+ }
+ ([xshift = \g__examzh_sealline_even_line_xshift_dim, yshift = -\g__examzh_sealline_even_line_yshift_dim]current~page~text~area.north~east)
+ --
+ ([xshift = \g__examzh_sealline_even_line_xshift_dim, yshift = \g__examzh_sealline_even_line_yshift_dim]current~page~text~area.south~east);
+ }
+
+% 小圆圈
+\cs_new:Npn \__examzh_sealline_odd_circle:
+ {
+ \bool_if:NT \g__examzh_sealline_odd_circle_show_bool
+ {
+ \use:x
+ {
+ \exp_not:N
+ \fill
+ [
+ decorate,
+ decoration =
+ {
+ markings,
+ mark =
+ between~positions~
+ \fp_use:N \g__examzh_sealline_odd_circle_start_fp
+ ~and~
+ \fp_use:N \g__examzh_sealline_odd_circle_end_fp
+ ~step~
+ \dim_use:N \g__examzh_sealline_odd_circle_step_dim
+ ~with
+ {
+ \exp_not:N
+ \node
+ [
+ circle,
+ draw = black,
+ fill = white,
+ minimum~size = \dim_use:N \g__examzh_sealline_odd_circle_diameter_dim
+ ]
+ {};
+ }
+ }
+ ]
+ }
+ ([xshift = -\g__examzh_sealline_odd_circle_xshift_dim]current~page~text~area.north~west)
+ --
+ ([xshift = -\g__examzh_sealline_odd_circle_xshift_dim]current~page~text~area.south~west);
+ }
+ }
+\cs_new:Npn \__examzh_sealline_even_circle:
+ {
+ \bool_if:NT \g__examzh_sealline_even_circle_show_bool
+ {
+ \use:x
+ {
+ \exp_not:N
+ \fill
+ [
+ decorate,
+ decoration =
+ {
+ markings,
+ mark =
+ between~positions~
+ \fp_use:N \g__examzh_sealline_even_circle_start_fp
+ ~and~
+ \fp_use:N \g__examzh_sealline_even_circle_end_fp
+ ~step~
+ \dim_use:N \g__examzh_sealline_even_circle_step_dim
+ ~with
+ {
+ \exp_not:N
+ \node
+ [
+ circle,
+ draw = black,
+ fill = white,
+ minimum~size = \dim_use:N \g__examzh_sealline_even_circle_diameter_dim
+ ]
+ {};
+ }
+ }
+ ]
+ }
+ ([xshift = \g__examzh_sealline_even_circle_xshift_dim]current~page~text~area.north~east)
+ --
+ ([xshift = \g__examzh_sealline_even_circle_xshift_dim]current~page~text~area.south~east);
+ }
+ }
+% 线上的文字(密封线外不得答题)
+\cs_new_protected:Npn \__examzh_sealline_odd_spread_box:nn #1#2
+ {
+ \mode_leave_vertical:
+ \bool_if:NTF \g__examzh_sealline_odd_text_direction_vertical_bool
+ {
+ \hbox_set_to_wd:Nnn \l_tmpa_box {#1}
+ {
+ \tl_set:Nx \l_tmpa_tl {#2}
+ \tl_reverse:N \l_tmpa_tl
+ \tl_map_inline:xn { \l_tmpa_tl }
+ {
+ \hbox_set:Nn \l_tmpb_box {##1}
+ \box_rotate:Nn \l_tmpb_box { -90 }
+ \box_use_drop:N \l_tmpb_box
+ \hfil
+ }
+ \unskip
+ }
+ }
+ {
+ \hbox_set_to_wd:Nnn \l_tmpa_box {#1}
+ {
+ \tl_map_inline:xn {#2} { ##1 \hfil } \unskip
+ }
+ }
+ \box_scale:Nnn \l_tmpa_box
+ { \fp_use:N \g__examzh_sealline_odd_text_xscale_fp }
+ { \fp_use:N \g__examzh_sealline_odd_text_yscale_fp }
+ \box_rotate:Nn \l_tmpa_box { 90 }
+ \box_move_down:nn
+ { #1 / 2 }
+ { \box_use_drop:N \l_tmpa_box }
+ }
+\cs_new_protected:Npn \__examzh_sealline_even_spread_box:nn #1#2
+ {
+ \mode_leave_vertical:
+ \bool_if:NTF \g__examzh_sealline_odd_text_direction_vertical_bool
+ {
+ \hbox_set_to_wd:Nnn \l_tmpa_box {#1}
+ {
+ \tl_map_inline:xn {#2}
+ {
+ \hbox_set:Nn \l_tmpb_box {##1}
+ \box_rotate:Nn \l_tmpb_box { 90 }
+ \box_use_drop:N \l_tmpb_box
+ \hfil
+ }
+ \unskip
+ }
+ }
+ {
+ \hbox_set_to_wd:Nnn \l_tmpa_box {#1}
+ {
+ \tl_map_inline:xn {#2} { ##1 \hfil } \unskip
+ }
+ }
+ \box_scale:Nnn \l_tmpa_box
+ { \fp_use:N \g__examzh_sealline_odd_text_xscale_fp }
+ { \fp_use:N \g__examzh_sealline_odd_text_yscale_fp }
+ \box_rotate:Nn \l_tmpa_box { -90 }
+ \box_move_up:nn
+ { #1 / 2 }
+ { \box_use_drop:N \l_tmpa_box }
+ }
+\cs_new:Npn \__examzh_sealline_odd_text_around_line:
+ {
+ \node [ anchor = east ]
+ at ([xshift = -\g__examzh_sealline_odd_text_xshift_dim, yshift = \g__examzh_sealline_odd_text_yshift_dim]current~page~text~area.west)
+ {
+ \g__examzh_sealline_odd_text_format_tl
+ \__examzh_sealline_odd_spread_box:nn { \g__examzh_sealline_odd_text_width_dim }
+ { \g__examzh_sealline_odd_text_tl }
+ };
+ }
+\cs_new:Npn \__examzh_sealline_even_text_around_line:
+ {
+ \bool_if:NTF \g__examzh_sealline_odd_text_direction_vertical_bool
+ {
+ \dim_set_eq:NN \l_tmpa_dim \g__examzh_sealline_even_text_yshift_dim
+ }
+ {
+ \dim_set:Nn \l_tmpa_dim { - \g__examzh_sealline_even_text_yshift_dim }
+ }
+ \dim_set_eq:NN \g__examzh_sealline_even_text_yshift_dim \l_tmpa_dim
+ \node [ anchor = west ]
+ at ([xshift = \g__examzh_sealline_even_text_xshift_dim, yshift = \g__examzh_sealline_even_text_yshift_dim]current~page~text~area.east)
+ {
+ \g__examzh_sealline_even_text_format_tl
+ \__examzh_sealline_even_spread_box:nn { \g__examzh_sealline_even_text_width_dim }
+ { \g__examzh_sealline_even_text_tl }
+ };
+ }
+% 学生信息
+\cs_new:Npn \__examzh_sealline_odd_infomation:
+ {
+ \use:x
+ {
+ \exp_not:N
+ \path
+ [
+ decorate,
+ decoration =
+ {
+ text~along~path,
+ text~align = \g__examzh_sealline_odd_info_align_tl,
+ reverse~path,
+ text = {
+ \clist_use:Nn \g__examzh_sealline_odd_info_content_clist
+ { { \g__examzh_sealline_odd_info_seperator_tl } }
+ }
+ }
+ ]
+ }
+ ([xshift = -\g__examzh_sealline_odd_info_xshift_dim, yshift = 0mm]current~page~text~area.north~west)
+ --
+ ([xshift = -\g__examzh_sealline_odd_info_xshift_dim, yshift = \g__examzh_sealline_odd_info_yshift_dim]current~page~text~area.south~west);
+ }
+
+% 信息的方格
+\keys_define:nn { exam-zh / square }
+ {
+ x-length .dim_set:N = \l__examzh_information_square_x_dim,
+ y-length .dim_set:N = \l__examzh_information_square_y_dim,
+ baseline .dim_set:N = \l__examzh_information_square_baseline_dim,
+ linewidth .dim_set:N = \l__examzh_information_square_linewidth_dim,
+ xshift .dim_set:N = \l__examzh_information_square_xshift_dim
+ }
+\keys_set:nn { exam-zh / square }
+ {
+ x-length = 1.4em,
+ y-length = 1.2em,
+ baseline = 3pt,
+ linewidth = 0.4pt,
+ }
+\keys_define:nn { exam-zh }
+ { square .meta:nn = { exam-zh / square } {#1} }
+\cs_new:Npn \__examzh_information_square_single:
+ {
+ \begin{tikzpicture}[baseline = \l__examzh_information_square_baseline_dim]
+ \draw[line~width = \l__examzh_information_square_linewidth_dim] (0,0) rectangle
+ ( \l__examzh_information_square_x_dim , \l__examzh_information_square_y_dim);
+ \end{tikzpicture}
+ }
+\cs_new:Npn \__examzh_information_square_multiple:n #1
+ {
+ \dim_compare:nNnT { \l__examzh_information_square_xshift_dim } = { 0pt }
+ {
+ \dim_set_eq:NN
+ \l__examzh_information_square_xshift_dim
+ \l__examzh_information_square_linewidth_dim
+ }
+ \int_compare:nNnTF { #1 } = { 1 }
+ { \__examzh_information_square_single: }
+ {
+ \__examzh_information_square_single:
+ \prg_replicate:nn { #1 - 1 }
+ {
+ \hspace*{ -\l__examzh_information_square_xshift_dim }
+ \__examzh_information_square_single:
+ }
+ }
+ }
+
+\NewDocumentCommand { \examsquare } { O{ } m }
+ {
+ \group_begin:
+ \keys_set:nn { exam-zh / square } { #1 }
+ \__examzh_information_square_multiple:n { #2 }
+ \group_end:
+ }
+
+
+% 页眉和页脚
+
+
+\keys_define:nn { exam-zh / page }
+ {
+ show-foot .bool_set:N = \l__examzh_show_foot_bool,
+ foot-content .tl_set:N = \l__examzh_foot_content_format_tl
+ % foo, bar: foo <page> bar
+ % foo, bar, baz: foo <page> bar <lastpage> baz
+ }
+\keys_set:nn { exam-zh / page }
+ {
+ show-foot = true,
+ foot-content = {数学试题第;页(共~;页)}
+ }
+
+\int_new:N \l__examzh_foot_content_count_semicolon_int
+\tl_new:N \l__examzh_foot_content_before_page_tl
+\tl_new:N \l__examzh_foot_content_after_page_tl
+\tl_new:N \l__examzh_foot_content_after_lastpage_tl
+\cs_generate_variant:Nn \regex_count:nnN { nxN }
+
+\cs_new:Npn \__examzh_foot_content_only_page_input:ww #1 ; #2 \q_stop
+ {
+ \tl_set:Nn \l__examzh_foot_content_before_page_tl {#1}
+ \tl_set:Nn \l__examzh_foot_content_after_page_tl {#2}
+ }
+\cs_new:Npn \__examzh_foot_content_only_page_input:n #1
+ {
+ \__examzh_foot_content_only_page_input:ww #1 \q_stop
+ }
+\cs_generate_variant:Nn \__examzh_foot_content_only_page_input:n { V }
+
+\cs_new:Npn \__examzh_foot_content_page_and_lastpage_input:www #1 ; #2 ; #3 \q_stop
+ {
+ \tl_set:Nn \l__examzh_foot_content_before_page_tl {#1}
+ \tl_set:Nn \l__examzh_foot_content_after_page_tl {#2}
+ \tl_set:Nn \l__examzh_foot_content_after_lastpage_tl {#3}
+ }
+\cs_new:Npn \__examzh_foot_content_page_and_lastpage_input:n #1
+ {
+ \__examzh_foot_content_page_and_lastpage_input:www #1 \q_stop
+ }
+\cs_generate_variant:Nn \__examzh_foot_content_page_and_lastpage_input:n { V }
+
+\cs_new:Npn \__examzh_foot_content_no_page_or_lastpage_output:
+ {
+ \l__examzh_foot_content_format_tl
+ }
+\cs_new:Npn \__examzh_foot_content_only_page_output:
+ {
+ \l__examzh_foot_content_before_page_tl \thepage { }
+ \l__examzh_foot_content_after_page_tl
+ }
+\cs_new:cpn { __examzh_foot_content_only_page_a3paper_left_output: }
+ {
+ \l__examzh_foot_content_before_page_tl \int_eval:n { 2 * \c@page - 1 } { }
+ \l__examzh_foot_content_after_page_tl
+ }
+\cs_new:cpn { __examzh_foot_content_only_page_a3paper_right_output: }
+ {
+ \l__examzh_foot_content_before_page_tl \int_eval:n { 2 * \c@page } { }
+ \l__examzh_foot_content_after_page_tl
+ }
+\cs_new:Npn \__examzh_foot_content_page_and_lastpage_output:
+ {
+ \l__examzh_foot_content_before_page_tl \thepage { }
+ \l__examzh_foot_content_after_page_tl \unskip \c_space_tl \pageref { LastPage }~
+ \l__examzh_foot_content_after_lastpage_tl
+ }
+\cs_new:cpn { __examzh_foot_content_page_and_lastpage_a3paper_left_output: }
+ {
+ \__examzh_foot_lastpage_tmp_set:
+ \l__examzh_foot_content_before_page_tl \int_eval:n { 2 * \c@page - 1 } { }
+ \l__examzh_foot_content_after_page_tl ~\int_eval:n { 2 * \l__examzh_tmp_int }~
+ \l__examzh_foot_content_after_lastpage_tl
+ }
+\cs_new:cpn { __examzh_foot_content_page_and_lastpage_a3paper_right_output: }
+ {
+ \__examzh_foot_lastpage_tmp_set:
+ \l__examzh_foot_content_before_page_tl \int_eval:n { 2 * \c@page } { }
+ \l__examzh_foot_content_after_page_tl ~\int_eval:n { 2 * \l__examzh_tmp_int }~
+ \l__examzh_foot_content_after_lastpage_tl
+ }
+\cs_new_nopar:Npn \__examzh_relax: { \relax }
+\cs_new:Npn \__examzh_foot_lastpage_tmp_set:
+ {
+ \cs_if_eq:NNTF \lastpage@lastpage \__examzh_relax:
+ { \int_set:Nn \l__examzh_tmp_int { 0 } }
+ { \int_set:Nn \l__examzh_tmp_int { \lastpage@lastpage } }
+ }
+\msg_new:nnn { exam-zh } { foot-semicolon-number-error }
+ {
+ The~number~of~semicolon~of~foot-line~must~be~1,~2~or~3!
+ }
+\cs_new:cpn { __examzh_foot_content_a4paper_output: }
+ {
+ % 检测输入有多少个 ;
+ \regex_count:nxN { ; }
+ { \l__examzh_foot_content_format_tl }
+ \l__examzh_foot_content_count_semicolon_int
+ \int_case:nnF { \l__examzh_foot_content_count_semicolon_int }
+ {
+ {0} { \__examzh_foot_content_no_page_or_lastpage_output: }
+ {1}
+ {
+ % 将输入“分解”
+ \__examzh_foot_content_only_page_input:V \l__examzh_foot_content_format_tl
+ % 然后输出
+ \__examzh_foot_content_only_page_output:
+ }
+ {2}
+ {
+ % 将输入“分解”
+ \__examzh_foot_content_page_and_lastpage_input:V \l__examzh_foot_content_format_tl
+ % 然后输出
+ \__examzh_foot_content_page_and_lastpage_output:
+ }
+ }
+ {
+ \msg_error:nn { exam-zh } { foot-semicolon-number-error }
+ }
+ }
+\cs_set_eq:cc
+ { __examzh_foot_content_a3paper_common_output: }
+ { __examzh_foot_content_a4paper_output: }
+\cs_new:cpn { __examzh_foot_content_a3paper_separate_left_output: }
+ {
+ % 检测输入有多少个 ;
+ \regex_count:nxN { ; }
+ { \l__examzh_foot_content_format_tl }
+ \l__examzh_foot_content_count_semicolon_int
+ \int_case:nnF { \l__examzh_foot_content_count_semicolon_int }
+ {
+ {0} { \__examzh_foot_content_no_page_or_lastpage_output: }
+ {1}
+ {
+ % 将输入“分解”
+ \__examzh_foot_content_only_page_input:V \l__examzh_foot_content_format_tl
+ % 然后输出
+ \use:c { __examzh_foot_content_only_page_a3paper_left_output: }
+ }
+ {2}
+ {
+ % 将输入“分解”
+ \__examzh_foot_content_page_and_lastpage_input:V \l__examzh_foot_content_format_tl
+ % 然后输出
+ \use:c { __examzh_foot_content_page_and_lastpage_a3paper_left_output: }
+ }
+ }
+ {
+ \msg_error:nn { exam-zh } { foot-semicolon-number-error }
+ }
+ }
+\cs_new:cpn { __examzh_foot_content_a3paper_separate_right_output: }
+ {
+ % 检测输入有多少个 ;
+ \regex_count:nxN { ; }
+ { \l__examzh_foot_content_format_tl }
+ \l__examzh_foot_content_count_semicolon_int
+ \int_case:nnF { \l__examzh_foot_content_count_semicolon_int }
+ {
+ {0} { \__examzh_foot_content_no_page_or_lastpage_output: }
+ {1}
+ {
+ % 将输入“分解”
+ \__examzh_foot_content_only_page_input:V \l__examzh_foot_content_format_tl
+ % 然后输出
+ \use:c { __examzh_foot_content_only_page_a3paper_right_output: }
+ }
+ {2}
+ {
+ % 将输入“分解”
+ \__examzh_foot_content_page_and_lastpage_input:V \l__examzh_foot_content_format_tl
+ % 然后输出
+ \use:c { __examzh_foot_content_page_and_lastpage_a3paper_right_output: }
+ }
+ }
+ {
+ \msg_error:nn { exam-zh } { foot-semicolon-number-error }
+ }
+ }
+
+\tl_set:Nn \headrulewidth { 0pt }
+% \cs_set_eq:NN \@mkboth \use_none:n
+\cs_set_eq:NN \sectionmark \use_none:n
+\cs_set_eq:NN \subsectionmark \use_none:n
+
+\cs_new:Npn \__examzh_column_box:n #1
+ {
+ \makebox [ \columnwidth ] {#1}
+ }
+
+
+\fancypagestyle { plain }
+ {
+ \fancyhf { }
+ \bool_if:cTF { g__examzh_page_size_a4paper_bool }
+ {
+ % a4paper
+ \bool_if:NT \l__examzh_show_foot_bool
+ {
+ \fancyfoot [ C ]
+ {
+ \small
+ \use:c { __examzh_foot_content_a4paper_output: }
+ % \l__exam_zh_subject_tl 试题第 \thepage { } 页(共 \pageref { LastPage } ~ 页)
+ }
+ }
+ }
+ {
+ % a3paper
+ \bool_if:NT \l__examzh_show_foot_bool
+ {
+ \bool_if:cTF
+ { g__examzh_page_a3paper_foot_common_bool }
+ {
+ % 两页共用一个页脚
+ \fancyfoot [ C ]
+ {
+ \small
+ % \l__exam_zh_subject_tl 试题第 \thepage { } 页(共 \pageref { LastPage } ~ 页)
+ \use:c { __examzh_foot_content_a3paper_common_output: }
+ }
+ }
+ {
+ % 每页一个页脚
+ \fancyfoot [ L ]
+ {
+ \__examzh_column_box:n
+ {
+ \small
+ \use:c { __examzh_foot_content_a3paper_separate_left_output: }
+ % \l__exam_zh_subject_tl 试题第
+ % % \thepage
+ % \int_eval:n { 2 * \c@page - 1 }
+ % { } 页
+ % (共
+ % % \pageref { LastPage }
+ % \int_eval:n { 2 * \l__examzh_tmp_int }
+ % ~ 页)
+ % \use:c { l__examzh_foot_content_a3paper_left_tl }
+ }
+ }
+ \fancyfoot [ R ]
+ {
+ \__examzh_column_box:n
+ {
+ \small
+ \use:c { __examzh_foot_content_a3paper_separate_right_output: }
+ % % \int_gincr:N \c@page
+ % \int_set:Nn \l__examzh_tmp_int { \lastpage@lastpage }
+
+ % \l__exam_zh_subject_tl 试题第
+ % \int_eval:n { 2 * \c@page }
+ % { }
+ % 页
+ % (共
+ % % \pageref { LastPage }
+ % \int_eval:n { 2 * \l__examzh_tmp_int }
+ % ~ 页)
+ % % \use:c { l__examzh_foot_content_a3paper_right_tl }
+ }
+ }
+ }
+ }
+ }
+ }
+\AtBeginDocument { \pagestyle { plain } }
+
+
+
+% 草稿纸
+
+% “草稿纸”三个字的尺寸
+\dim_new:N \l__examzh_draft_watermark_size_dim
+% 控制是否自动添加草稿纸
+\bool_new:N \l__examzh_draft_show_auto_bool
+
+\keys_define:nn { exam-zh / draft }
+ {
+ watermark-size .code:n =
+ {
+ % 之所以这样设置而不是 .dim_set:N 是因为 a4 和 a3 的切换不是文档选项
+ % 而是通过 \examsetup 更改的。所以要设置默认值必须用 \AtEndPreamble
+ % 来检测 g__examzh_page_size_a4paper_bool 的值才行,但这样的话就会
+ % 把 watermark-size 的值覆盖,所以得实现“watermark-size” 的设置要盖掉 \AtEndPreamble
+ % 设置的默认值,才可以达到用户输入产生效果
+ \AtEndPreamble
+ {
+ \dim_set:Nn \l__examzh_draft_watermark_size_dim {#1}
+ }
+ },
+ show-watermark .bool_set:N = \l__examzh_draft_show_watermark_bool,
+ show-draft .choice:,
+ show-draft / auto .code:n =
+ { \bool_set_true:N \l__examzh_draft_show_auto_bool },
+ show-draft / manual .code:n =
+ { \bool_set_false:N \l__examzh_draft_show_auto_bool },
+ }
+\keys_set:nn { exam-zh / draft }
+ {
+ show-watermark = true,
+ show-draft = manual,
+ }
+% “草稿纸”尺寸默认值
+\AtEndPreamble
+ {
+ \bool_if:cTF { g__examzh_page_size_a4paper_bool }
+ {
+ \keys_set:nn { exam-zh / draft }
+ { watermark-size = 100pt }
+ }
+ {
+ \keys_set:nn { exam-zh / draft }
+ { watermark-size = 180pt }
+ }
+ }
+\AtEndDocument
+ {
+ \bool_if:NT \l__examzh_draft_show_auto_bool
+ { \draftpaper \draftpaper }
+ }
+\NewDocumentCommand { \draftpaper } { O{} }
+ {
+ \group_begin:
+ \keys_set:nn { exam-zh / draft } {#1}
+ \bool_if:NTF \l__examzh_draft_show_watermark_bool
+ { \__examzh_draft_with_watermark: }
+ { \__examzh_draft_without_watermark: }
+ \group_end:
+ }
+\cs_new:Npn \__examzh_draft_with_watermark:
+ {
+ \clearpage
+ \null
+ \thispagestyle { empty }
+ \begin{tikzpicture}
+ [
+ remember~picture,
+ overlay,
+ font = \sffamily\fontsize{ \l__examzh_draft_watermark_size_dim }{180pt}\selectfont
+ ]
+ \node[text = lightgray!40] at (current~page.center) {草\quad 稿\quad 纸};
+ \end{tikzpicture}
+ \clearpage
+ }
+\cs_new:Npn \__examzh_draft_without_watermark:
+ {
+ \clearpage
+ \null
+ \thispagestyle { empty }
+ \clearpage
+ }
+
+
+
+% 评分框 scoring box
+
+\bool_new:N \g__examzh_combine_section_with_scoringbox_position_left_bool
+
+\NewCommandCopy { \examzholdsection } { \section }
+\cs_new:Npn \__examzh_combine_section_with_twocolumn_scoringbox:
+ {
+ \bool_if:NTF \g__examzh_combine_section_with_scoringbox_position_left_bool
+ {
+ \RenewDocumentCommand { \section } { m }
+ {
+ \par\addvspace{1.5em}\noindent
+ \begin{tabular}{lc}
+ \begin{minipage}{0.2\columnwidth}
+ \begin{tabular}{|c|c|}
+ \hline
+ 得分 & \rule{3em}{0pt}\rule[-0.7em]{0pt}{2em} \\\hline
+ 阅卷人 & \rule{3em}{0pt}\rule[-0.7em]{0pt}{2em} \\\hline
+ \end{tabular}
+ \end{minipage} &
+ \begin{minipage}{0.745\columnwidth}
+ \examzholdsection {##1}
+ \end{minipage}
+ \end{tabular}
+ \par
+ \addvspace{1em}
+ }
+ }
+ {
+ \RenewDocumentCommand { \section } { m }
+ {
+ \par\addvspace{1.5em}\noindent
+ \begin{tabular}{lc}
+ \begin{minipage}{0.745\columnwidth}
+ \examzholdsection {##1}
+ \end{minipage} &
+ \begin{minipage}{0.2\columnwidth}
+ \begin{tabular}{|c|c|}
+ \hline
+ 得分 & \rule{3em}{0pt}\rule[-0.7em]{0pt}{2em} \\\hline
+ 阅卷人 & \rule{3em}{0pt}\rule[-0.7em]{0pt}{2em} \\\hline
+ \end{tabular}
+ \end{minipage}
+ \end{tabular}
+ \par
+ \addvspace{1em}
+ }
+ }
+ }
+\cs_new:Npn \__examzh_combine_section_with_onecolumn_scoringbox:
+ {
+ \bool_if:NTF \g__examzh_combine_section_with_scoringbox_position_left_bool
+ {
+ \RenewDocumentCommand { \section } { m }
+ {
+ \par\addvspace{1.5em}\noindent
+ \begin{tabular}{cc}
+ \begin{varwidth}{3.5em}
+ \begin{tabular}{|c|}
+ \hline
+ 得分\rule[-0.7em]{0pt}{2em} \\\hline
+ \rule[-0.7em]{0pt}{2em} \\\hline
+ \end{tabular}
+ \end{varwidth} &
+ \begin{varwidth}{0.865\columnwidth}
+ \examzholdsection {##1}
+ \end{varwidth}
+ \end{tabular}
+ \par
+ \addvspace{1em}
+ }
+ }
+ {
+ \RenewDocumentCommand { \section } { m }
+ {
+ \par\addvspace{1.5em}\noindent
+ \begin{tabular}{cc}
+ \begin{varwidth}{0.865\columnwidth}
+ \examzholdsection {##1}
+ \end{varwidth} &
+ \begin{varwidth}{3.5em}
+ \begin{tabular}{|c|}
+ \hline
+ 得分\rule[-0.7em]{0pt}{2em} \\\hline
+ \rule[-0.7em]{0pt}{2em} \\\hline
+ \end{tabular}
+ \end{varwidth}
+ \end{tabular}
+ \par
+ \addvspace{1em}
+ }
+ }
+ }
+\cs_new:Npn \__examzh_restore_section:
+ {
+ \RenewCommandCopy { \section } { \examzholdsection }
+ }
+
+\keys_define:nn { exam-zh / scoringbox }
+ {
+ type .choice:,
+ type / onecolumn .code:n =
+ {
+ \AtEndPreamble { \__examzh_combine_section_with_onecolumn_scoringbox: }
+ },
+ type / twocolumn .code:n =
+ {
+ \AtEndPreamble { \__examzh_combine_section_with_twocolumn_scoringbox: }
+ },
+ type / none .code:n = { \__examzh_restore_section: },
+ position .choice:,
+ position / left .code:n =
+ {
+ \bool_gset_true:N \g__examzh_combine_section_with_scoringbox_position_left_bool
+ },
+ position / right .code:n =
+ {
+ \bool_gset_false:N \g__examzh_combine_section_with_scoringbox_position_left_bool
+ },
+ }
+\keys_set:nn { exam-zh / scoringbox }
+ {
+ type = none,
+ position = left
+ }
+\keys_define:nn { exam-zh }
+ { scoringbox .meta:nn = { exam-zh / scoringbox } {#1} }
+
+
+\NewDocumentCommand { \scoringbox } { s }
+ {
+ \IfBooleanTF {#1}
+ { \__examzh_scoringbox_onecolumn: }
+ { \__examzh_scoringbox_twocolumn: }
+ }
+\cs_new_protected:Nn \__examzh_scoringbox_twocolumn:
+ {
+ \begin{tabular}{|c|c|}
+ \hline
+ 得分 & \rule{3em}{0pt}\rule[-0.7em]{0pt}{2em} \\\hline
+ 阅卷人 & \rule{3em}{0pt}\rule[-0.7em]{0pt}{2em} \\\hline
+ \end{tabular}
+ }
+\cs_new_protected:Nn \__examzh_scoringbox_onecolumn:
+ {
+ \begin{tabular}{|c|}
+ \hline
+ 得分\rule[-0.7em]{0pt}{2em} \\\hline
+ \rule[-0.7em]{0pt}{2em} \\\hline
+ \end{tabular}
+ }
+
+
+
+% 脚注
+% 摘自 fduthesis.cls
+
+\cs_new_protected:Npn \__examzh_define_fn_style:nn #1#2
+ { \tl_const:cn { c__examzh_fn_style_ #1 _tl } {#2} }
+\cs_new:Npn \__examzh_symbol:n #1 { \tex_char:D #1 \scan_stop: }
+
+\clist_map_inline:nn
+ {
+ { plain } { plain },
+ { libertinus } { libertinus },
+ { libertinus_neg } { libertinus* },
+ { libertinus_sans } { libertinus-sans },
+ { pifont } { pifont },
+ { pifont_neg } { pifont* },
+ { pifont_sans } { pifont-sans },
+ { pifont_sans_neg } { pifont-sans* },
+ { xits } { xits },
+ { xits_sans } { xits-sans },
+ { xits_sans_neg } { xits-sans* }
+ }
+ { \__examzh_define_fn_style:nn #1 }
+\tl_new:N \l__examzh_fn_style_tl
+\keys_define:nn { exam-zh / style }
+ {
+ footnote-style .choices:nn =
+ {
+ plain,
+ libertinus, libertinus*, libertinus-sans,
+ pifont, pifont*, pifont-sans, pifont-sans*,
+ xits, xits-sans, xits-sans*
+ }
+ {
+ \tl_gset_eq:NN \l__examzh_fn_style_tl \l_keys_choice_tl
+ \int_compare:nT { 5 <= \l_keys_choice_int <= 8 }
+ { \RequirePackage { pifont } }
+ },
+ footnote-style .value_required:n = true
+ }
+\keys_set:nn { exam-zh / style }
+ {
+ footnote-style = libertinus
+ }
+\cs_new:Npn \__examzh_fn_symbol_libertinus:n #1
+ {
+ \int_compare:nTF { #1 >= 21 }
+ {
+ \int_compare:nTF { #1 >= 47 }
+ { \__examzh_symbol:n { \int_eval:n { "24B6 - 47 + #1 } } }
+ { \__examzh_symbol:n { \int_eval:n { "24D0 - 21 + #1 } } }
+ }
+ { \__examzh_symbol:n { \int_eval:n { "2460 - 1 + #1 } } }
+ }
+\cs_new:Npn \__examzh_fn_symbol_libertinus_neg:n #1
+ {
+ \int_compare:nTF { #1 >= 11 }
+ { \__examzh_symbol:n { \int_eval:n { "24EB - 11 + #1 } } }
+ { \__examzh_symbol:n { \int_eval:n { "2776 - 1 + #1 } } }
+ }
+\cs_new_eq:NN \__examzh_fn_symbol_libertinus_sans:n \__examzh_fn_symbol_libertinus:n
+\cs_new:Npn \__examzh_fn_symbol_pifont:n #1
+ { \ding { \int_eval:n { 171 + #1 } } }
+\cs_new:Npn \__examzh_fn_symbol_pifont_neg:n #1
+ { \ding { \int_eval:n { 181 + #1 } } }
+\cs_new:Npn \__examzh_fn_symbol_pifont_sans:n #1
+ { \ding { \int_eval:n { 191 + #1 } } }
+\cs_new:Npn \__examzh_fn_symbol_pifont_sans_neg:n #1
+ { \ding { \int_eval:n { 201 + #1 } } }
+\cs_new:Npn \__examzh_fn_symbol_xits:n #1
+ {
+ \int_compare:nTF { #1 >= 10 }
+ {
+ \int_compare:nTF { #1 >= 36 }
+ { \__examzh_symbol:n { \int_eval:n { "24B6 - 36 + #1 } } }
+ { \__examzh_symbol:n { \int_eval:n { "24D0 - 10 + #1 } } }
+ }
+ { \__examzh_symbol:n { \int_eval:n { "2460 - 1 + #1 } } }
+ }
+\cs_new:Npn \__examzh_fn_symbol_xits_sans:n #1
+ { \__examzh_symbol:n { \int_eval:n { "2780 - 1 + #1 } } }
+\cs_new:Npn \__examzh_fn_symbol_xits_sans_neg:n #1
+ { \__examzh_symbol:n { \int_eval:n { "278A - 1 + #1 } } }
+\cs_set:Npn \thefootnote { \examzh_footnote_number:N \c@footnote }
+\cs_new:Npn \examzh_footnote_number:N #1
+ {
+ \tl_case:NnF \l__examzh_fn_style_tl
+ {
+ \c__examzh_fn_style_plain_tl
+ { \int_use:N #1 }
+ \c__examzh_fn_style_libertinus_tl
+ {
+ \fontspec { LibertinusSerif-Regular .otf }
+ \__examzh_fn_symbol_libertinus:n {#1}
+ }
+ \c__examzh_fn_style_libertinus_neg_tl
+ {
+ \fontspec { LibertinusSerif-Regular .otf }
+ \__examzh_fn_symbol_libertinus_neg:n {#1}
+ }
+ \c__examzh_fn_style_libertinus_sans_tl
+ {
+ \fontspec { LibertinusSans-Regular .otf }
+ \__examzh_fn_symbol_libertinus_sans:n {#1}
+ }
+ \c__examzh_fn_style_pifont_tl
+ { \__examzh_fn_symbol_pifont:n {#1} }
+ \c__examzh_fn_style_pifont_neg_tl
+ { \__examzh_fn_symbol_pifont_neg:n {#1} }
+ \c__examzh_fn_style_pifont_sans_tl
+ { \__examzh_fn_symbol_pifont_sans:n {#1} }
+ \c__examzh_fn_style_pifont_sans_neg_tl
+ { \__examzh_fn_symbol_pifont_sans_neg:n {#1} }
+ \c__examzh_fn_style_xits_tl
+ {
+ \fontspec { XITS-Regular .otf }
+ \__examzh_fn_symbol_xits:n {#1}
+ }
+ \c__examzh_fn_style_xits_sans_tl
+ {
+ \fontspec { XITS-Regular .otf }
+ \__examzh_fn_symbol_xits_sans:n {#1}
+ }
+ \c__examzh_fn_style_xits_sans_neg_tl
+ {
+ \fontspec { XITS-Regular .otf }
+ \__examzh_fn_symbol_xits_sans_neg:n {#1}
+ }
+ }
+ { \int_use:N #1 }
+ }
+\cs_set:Npn \@makefntext #1
+ {
+ \mode_leave_vertical:
+ \hbox_to_wd:nn { 1.5 em } { \@thefnmark \hfil }
+ #1
+ } \ No newline at end of file
diff --git a/macros/xetex/latex/xduts/README.md b/macros/xetex/latex/xduts/README.md
index f0120632c3..3597bc118c 100644
--- a/macros/xetex/latex/xduts/README.md
+++ b/macros/xetex/latex/xduts/README.md
@@ -61,7 +61,7 @@ xetex xduts.ins
Run command below to get the documentation.
```shell
-l3build ctan
+l3build doc
```
## Note
diff --git a/macros/xetex/latex/xduts/xduts.dtx b/macros/xetex/latex/xduts/xduts.dtx
index 8e43cadca1..86fd91d50f 100644
--- a/macros/xetex/latex/xduts/xduts.dtx
+++ b/macros/xetex/latex/xduts/xduts.dtx
@@ -1,14 +1,14 @@
% \iffalse
%<*driver>
\ProvidesFile{xduts.dtx}
-[2022/06/28 v2.10.3.0 Xidian University TeX Suite]
+[2022/07/28 v2.12.1.1 Xidian University TeX Suite]
%</driver>
%<class|sty>\NeedsTeXFormat{LaTeX2e}
%<class|sty>\RequirePackage{expl3}
%<xdufont>\ProvidesExplPackage{xdufont}
%<xdupgthesis>\ProvidesExplClass{xdupgthesis}
%<xduugthesis>\ProvidesExplClass{xduugthesis}
-%<class|sty> {2022/06/28}{2.10.3.0}
+%<class|sty> {2022/07/28}{2.12.1.1}
%<xdufont> {Xidian University Font package}
%<xdupgthesis> {Xidian University Postgraduate Thesis document class}
%<xduugthesis> {Xidian University Undergraduate Thesis document class}
@@ -155,22 +155,6 @@
\end{document}
%</driver>
% \fi
-% \CheckSum{3008}
-% \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
-% Lower-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
-% Digits \0\1\2\3\4\5\6\7\8\9
-% Exclamation \! Double quote \" Hash (number) \#
-% Dollar \$ Percent \% Ampersand \&
-% Acute accent \' Left paren \( Right paren \)
-% Asterisk \* Plus \+ Comma \,
-% Minus \- Point \. Solidus \/
-% Colon \: Semicolon \; Less than \<
-% Equals \= Greater than \> Question mark \?
-% Commercial at \@ Left bracket \[ Backslash \\
-% Right bracket \] Circumflex \^ Underscore \_
-% Grave accent \` Left brace \{ Vertical bar \|
-% Right brace \} Tilde \~}
% \GetFileInfo{\jobname.dtx}
% \title{\bfseries\xduts{}手册}
% \author{\href{https://github.com/note286/}{note286}}
@@ -197,6 +181,8 @@
% \end{enumerate}
% \end{abstract}
% \clearpage
+% \begin{documentation}
+% \changes{v2.12.1.1}{2022/07/28}{使用\clsx{l3doc}文档和实现环境}
% \section*{\contentsname\markright{目录}}
% \makeatletter
% \@starttoc{toc}
@@ -225,7 +211,6 @@
% 如确定\xduts{}存在bug,
% 可以在GitHub Issues\footurl{https://github.com/note286/xduts/issues/}
% 具体描述。另外,\textbf{不接受任何Pull Requests}。
-% \StopEventually{}
% \section{使用说明}
% \label{使用说明}
% 《一份(不太)简短的\LaTeXe{}介绍》\footctan{info/lshort/chinese/lshort-zh-cn.pdf}
@@ -289,6 +274,8 @@
% 语言配置见\secrefx{语言配置},
% 参考文献配置见\secrefx{参考文献配置},
% 页面配置见\secrefx{页面配置},
+% \changes{v2.12.0.1}{2022/07/01}{研究生学位论文增加文件配置}
+% 文件配置见\secrefx{文件配置},
% 交叉引用配置见\secrefx{交叉引用配置},
% Caption配置见\secrefx{Caption配置},
% 表格配置见\secrefx{表格配置},
@@ -329,6 +316,8 @@
% 部分英文字体切换见\secrefx{英文字体},
% 参考文献配置见\secrefx{参考文献配置},
% 页面配置见\secrefx{页面配置},
+% \changes{v2.12.0.1}{2022/07/01}{本科生毕业设计增加文件配置}
+% 文件配置见\secrefx{文件配置},
% 交叉引用配置见\secrefx{交叉引用配置},
% Caption配置见\secrefx{Caption配置},
% 表格配置见\secrefx{表格配置},
@@ -642,6 +631,27 @@
% \item[分散对齐] 页面高度均匀地填满,使每一页的底部直接对齐。
% \item[顶部对齐] 页面中的内容保持它的自然高度,每一页的页面底部用空白填满。
% \end{optdesc}
+% \subsection{文件配置}
+% \label{文件配置}
+% \begin{function}[added=2022-07-01]{style/file-search-path}
+% \begin{syntax}
+% \optx{style/file-search-path}=\argx{路径}
+% \end{syntax}
+% 设置文件搜索路径,可用于\tnx{input}、\tnx{include}和\tnx{includegraphics},
+% 多个路径之间需要使用英文半角逗号隔开。
+% 设置后\tnx{input}、\tnx{include}和\tnx{includegraphics}仅需填写文件名。
+% \end{function}
+% \begin{function}[added=2022-07-01]{style/fix-input,style/fix-include,style/fix-includegraphics}
+% \begin{syntax}
+% \optx{style/fix-input}=\metax{true|(false)}
+% \optx{style/fix-include}=\metax{true|(false)}
+% \optx{style/fix-includegraphics}=\metax{true|(false)}
+% \end{syntax}
+% TEXMF树搜索优先级高于用户自定义的文件搜索路径,
+% 如果在TEXMF树内存在同名文件,则会导致错误的文件被加载。
+% 通过为\tnx{input}、\tnx{include}和\tnx{includegraphics}命令打补丁可以避免该问题。
+% 如果用户的\TeX{}或图片等文件不与TEXMF树内文件同名,或与\TeX{}主文件在同一目录,则无需打补丁。
+% \end{function}
% \subsection{交叉引用配置}
% \label{交叉引用配置}
% \begin{function}[added=2022-04-16,updated=2022-05-08]{style/ref-add-space}
@@ -1443,9 +1453,10 @@
% \setlength\parindent{2em}
% \subsection{页面和信息移除}
% \label{页面和信息移除}
+% \changes{v2.12.1.0}{2022/07/03}{页面和信息移除选项增加分组}
% \begin{function}[added=2022-06-26]{style/remove-page}
% \begin{syntax}
-% \optx{style/remove-page}=\metax{封面|提名页|声明页|摘要|索引|对照表|目录|附录|参考文献|致谢|作者简介}
+% \optx{style/remove-page}=\argx{封面|提名页|声明页|摘要|索引|对照表|目录|附录|参考文献|致谢|作者简介}
% \end{syntax}
% 设置移除的页面,可多选,多个值之间需要使用英文半角逗号隔开。
% \end{function}
@@ -1559,6 +1570,9 @@
% 提供了很大帮助。
% 在文档的编写过程中,参考了\filex{ctex.dtx}、\filex{fduthesis.dtx}、\filex{njuthesis.dtx}和\filex{thuthesis.dtx}。
% \clearpage
+% \end{documentation}
+% \begin{implementation}
+% \addtocontents{toc}{\protect\value{tocdepth}=5}
% \section{代码实现}
% \changes{v0.1.0.0}{2022/04/03}{基本完成本科毕业设计论文模板}
% \setlength\parindent{0pt}
@@ -2393,17 +2407,15 @@
% \end{macro}
% \begin{macro}{\@@_load_math_font_xits:}
% \changes{v0.5.1.0}{2022/04/06}{适配macOS平台MacTeX内置XITSMath数学字体}
+% \changes{v2.12.1.0}{2022/07/03}{移除XITSMath数学字体冗余语句}
% 数学字体配置\valuex{xits}。
% \begin{macrocode}
\cs_new:Npn \@@_load_math_font_xits:
{
\@@_load_unicode_math_pkg:
\@@_if_platform_macos:FT
+ { \setmathfont { XITS~Math } }
{
- \setmathfont { XITS~Math }
- }
- {
- \@@_load_unicode_math_pkg:
\setmathfont { XITSMath-Regular.otf }
\setmathfont { XITSMath-Bold.otf }
[ range= { bfup -> up, bfit -> it } ]
@@ -3163,6 +3175,11 @@
% \l_@@_lang_tl,
% \l_@@_bib_tool_tl,
% \l_@@_biblatex_option_tl,
+% \l_@@_search_path_clist,
+% \l_@@_fix_input_bool,
+% \l_@@_fix_include_bool,
+% \l_@@_fix_graphics_bool,
+% \l_@@_ref_add_space_bool,
% \l_@@_cap_label_sep_tl,
% \l_@@_tab_small_bool,
% \l_@@_alg_small_cap_bool,
@@ -3178,6 +3195,7 @@
% \l_@@_sym_mgn_bool,
% \l_@@_page_v_align_tl
% }
+% \changes{v2.12.0.2}{2022/07/01}{精简变量名称}
% 英文是否使用中文字体。
% \begin{macrocode}
\bool_new:N \l_@@_en_cjk_font_bool
@@ -3194,9 +3212,19 @@
% \begin{macrocode}
\tl_new:N \l_@@_biblatex_option_tl
% \end{macrocode}
+% 设置文件搜索路径。
+% \begin{macrocode}
+\clist_new:N \l_@@_search_path_clist
+% \end{macrocode}
+% 是否修复文件导入命令。
+% \begin{macrocode}
+\bool_new:N \l_@@_fix_input_bool
+\bool_new:N \l_@@_fix_include_bool
+\bool_new:N \l_@@_fix_graphics_bool
+% \end{macrocode}
% 是否在\tnx{ref}和\tnx{pageref}两侧自动调整中英文间空白。
% \begin{macrocode}
-\tl_new:N \l_@@_ref_add_space
+\tl_new:N \l_@@_ref_add_space_bool
% \end{macrocode}
% 标签与后面标题之间的间距。
% \begin{macrocode}
@@ -3261,9 +3289,19 @@
% \begin{macrocode}
biblatex-option .tl_set:N = \l_@@_biblatex_option_tl,
% \end{macrocode}
+% 设置文件搜索路径。
+% \begin{macrocode}
+ file-search-path .clist_set:N = \l_@@_search_path_clist,
+% \end{macrocode}
+% 是否修复文件导入命令。
+% \begin{macrocode}
+ fix-input .bool_set:N = \l_@@_fix_input_bool,
+ fix-include .bool_set:N = \l_@@_fix_include_bool,
+ fix-includegraphics .bool_set:N = \l_@@_fix_graphics_bool,
+% \end{macrocode}
% 是否在\tnx{ref}和\tnx{pageref}两侧自动调整中英文间空白。
% \begin{macrocode}
- ref-add-space .bool_set:N = \l_@@_ref_add_space,
+ ref-add-space .bool_set:N = \l_@@_ref_add_space_bool,
% \end{macrocode}
% 标签与后面标题之间的间距。
% \begin{macrocode}
@@ -3317,6 +3355,10 @@
style / language = zh,
style / bib-backend = biblatex,
style / biblatex-option = { },
+ style / file-search-path = { },
+ style / fix-input = false,
+ style / fix-include = false,
+ style / fix-includegraphics = false,
style / ref-add-space = false,
style / caption-label-sep = { 0.75em },
style / table-small-font = true,
@@ -3419,16 +3461,16 @@
% \subsection{作者简介样式配置}
% \begin{variable}
% {
-% \l_@@_customize_edubg_bool,
-% \l_@@_customize_resresult_bool
+% \l_@@_cust_edubg_bool,
+% \l_@@_cust_resresult_bool
% }
% 是否完全自定义作者简介中教育背景。
% \begin{macrocode}
-\bool_new:N \l_@@_customize_edubg_bool
+\bool_new:N \l_@@_cust_edubg_bool
% \end{macrocode}
% 是否完全自定义作者简介中攻读硕士学位期间的研究成果。
% \begin{macrocode}
-\bool_new:N \l_@@_customize_resresult_bool
+\bool_new:N \l_@@_cust_resresult_bool
% \end{macrocode}
% \end{variable}
% \begin{macro}{\keys_define:nn}
@@ -3439,11 +3481,11 @@
% \end{macrocode}
% 是否完全自定义作者简介中教育背景。
% \begin{macrocode}
- customize-edubg .bool_set:N = \l_@@_customize_edubg_bool,
+ customize-edubg .bool_set:N = \l_@@_cust_edubg_bool,
% \end{macrocode}
% 是否完全自定义作者简介中攻读硕士学位期间的研究成果。
% \begin{macrocode}
- customize-resresult .bool_set:N = \l_@@_customize_resresult_bool
+ customize-resresult .bool_set:N = \l_@@_cust_resresult_bool
}
% \end{macrocode}
% \end{macro}
@@ -4496,6 +4538,48 @@
%</xdupgthesis>
%<*thesis>
% \end{macrocode}
+% \subsection{文件配置}
+% \begin{macro}
+% {
+% \input,
+% \include,
+% \includegraphics
+% }
+% \changes{v2.12.0.0}{2022/07/01}{配置文件搜索路径}
+% 配置文件搜索路径。
+% \begin{macrocode}
+\ctex_at_end_preamble:n
+ {
+ \seq_if_empty:NF \l_@@_search_path_clist
+ {
+ \clist_map_inline:Nn \l_@@_search_path_clist
+ { \seq_put_right:Nn \l_file_search_path_seq { #1 } }
+ }
+ \bool_if:NT \l_@@_fix_input_bool
+ {
+ \cs_new_eq:NN \@@_org_input:n \input
+ \RenewDocumentCommand { \input } { m }
+ { \@@_org_input:n { ./ #1 } }
+ }
+ \bool_if:NT \l_@@_fix_include_bool
+ {
+ \cs_new_eq:NN \@@_org_include:n \include
+ \RenewDocumentCommand { \include } { m }
+ { \@@_org_include:n { ./ #1 } }
+ }
+ \bool_if:NT \l_@@_fix_graphics_bool
+ {
+ \cs_new_eq:NN \@@_org_includegraphics:n \includegraphics
+ \RenewDocumentCommand { \includegraphics } { o m }
+ {
+ \IfNoValueTF { #1 }
+ { \@@_org_includegraphics:n { ./ #2 } }
+ { \@@_org_includegraphics:n [ #1 ] { ./ #2 } }
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
% \subsection{公式}
% \begin{macro}{\theequation}
% 重定义公式编号样式。
@@ -4503,6 +4587,19 @@
\renewcommand { \theequation } { \thechapter - \arabic { equation } }
% \end{macrocode}
% \end{macro}
+% \subsection{浮动体}
+% \begin{variable}
+% {
+% \topfraction,
+% \floatpagefraction
+% }
+% \changes{v2.11.0.0}{2022/06/30}{限制浮动环境占用大小}
+% 限制浮动环境占用大小。
+% \begin{macrocode}
+\cs_set:Npn \topfraction { .8 }
+\cs_set:Npn \floatpagefraction { .8 }
+% \end{macrocode}
+% \end{variable}
% \subsection{算法}
% \begin{macro}{\ALG@name,\algorithmcfname}
% \changes{v1.1.1.0}{2022/04/15}{汉化算法标签名称}
@@ -4776,7 +4873,7 @@
% \end{macrocode}
% \end{macro}
% \subsection{超链接和PDF元数据}
-% \begin{macro}{\hyperref}
+% \begin{macro}{\hypersetup}
% \changes{v0.5.0.0}{2022/04/05}{添加PDF主题元数据}
% \changes{v1.10.0.0}{2022/05/04}{添加PDF应用程序元数据}
% 配置超链接和PDF元数据。
@@ -4809,7 +4906,7 @@
% \begin{macrocode}
\ctex_at_end_preamble:n
{
- \bool_if:NT \l_@@_ref_add_space
+ \bool_if:NT \l_@@_ref_add_space_bool
{
\str_if_eq:NNT { \l_@@_lang_tl } { zh }
{
@@ -6633,7 +6730,7 @@
% \end{macrocode}
% 定义教育背景表格环境。
% \begin{macrocode}
- \bool_if:NF \l_@@_customize_edubg_bool
+ \bool_if:NF \l_@@_cust_edubg_bool
{
\RequirePackage { tabularray }
\newenvironment { edubg }
@@ -6653,7 +6750,7 @@
% \end{macrocode}
% 定义研究成果列表。
% \begin{macrocode}
- \bool_if:NF \l_@@_customize_resresult_bool
+ \bool_if:NF \l_@@_cust_resresult_bool
{
\RequirePackage { enumitem }
\SetEnumitemKey { resresult }
@@ -6776,5 +6873,4 @@
% \begin{macrocode}
%<@@=>
% \end{macrocode}
-% \Finale
-\endinput
+% \end{implementation}
diff --git a/macros/xetex/latex/xduts/xduts.pdf b/macros/xetex/latex/xduts/xduts.pdf
index 765e5bb869..81bf52a76b 100644
--- a/macros/xetex/latex/xduts/xduts.pdf
+++ b/macros/xetex/latex/xduts/xduts.pdf
Binary files differ
diff --git a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
index 5c8991cee2..3970c7e96c 100644
--- a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+++ b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
@@ -30,6 +30,7 @@ $mirrors = {
'http://ctan.imsc.res.in/' => 1,
},
'Indonesia' => {
+ 'http://repo.ugm.ac.id/ctan/' => 1,
'https://mirror.unpad.ac.id/ctan/' => 1,
},
'Iran' => {
@@ -49,7 +50,6 @@ $mirrors = {
'https://cran.asia/tex/' => 1,
'https://ftp.kaist.ac.kr/pub/tex-archive/' => 1,
'https://lab.uklee.pe.kr/tex-archive/' => 1,
- 'https://mirror.kakao.com/CTAN/' => 1,
'https://mirror.navercorp.com/CTAN/' => 1,
},
'Philippines' => {
@@ -106,6 +106,7 @@ $mirrors = {
'https://ftp.tu-chemnitz.de/pub/tex/' => 1,
'https://mirror.clientvps.com/CTAN/' => 1,
'https://mirror.dogado.de/tex-archive/' => 1,
+ 'https://mirror.informatik.hs-fulda.de/tex-archive/' => 1,
'https://mirror.physik.tu-berlin.de/pub/CTAN/' => 1,
'https://packages.oth-regensburg.de/ctan/' => 1,
},
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb b/systems/texlive/tlnet/tlpkg/texlive.tlpdb
index bc2c9568ad..bfad33eae6 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb
@@ -26,11 +26,11 @@ depend container_split_src_files/1
depend frozen/0
depend minrelease/2016
depend release/2022
-depend revision/63988
+depend revision/63996
name 00texlive.image
category TLCore
-revision 63988
+revision 63995
shortdesc TeX Live files only in the source repository
longdesc The files here are not copied by the installer and containers
longdesc are not built for them; they exist only in the source
@@ -1688,6 +1688,7 @@ runfiles size=12912
tlpkg/tlpsrc/everyshi.tlpsrc
tlpkg/tlpsrc/exam-n.tlpsrc
tlpkg/tlpsrc/exam-randomizechoices.tlpsrc
+ tlpkg/tlpsrc/exam-zh.tlpsrc
tlpkg/tlpsrc/exam.tlpsrc
tlpkg/tlpsrc/examdesign.tlpsrc
tlpkg/tlpsrc/example.tlpsrc
@@ -4606,7 +4607,7 @@ depend setting_available_architectures:aarch64-linux amd64-freebsd amd64-netbsd
name 00texlive.installer
category TLCore
-revision 63985
+revision 63990
shortdesc TeX Live standalone installer package
longdesc This package defines the files to go into the installer
longdesc archives (install-tl-unx.tar.gz, install-tl.zip) built by the
@@ -57388,7 +57389,7 @@ catalogue-version 1.1.0
name circuit-macros
category Package
-revision 61987
+revision 63991
shortdesc M4 macros for electric circuit diagrams
relocated 1
longdesc A set of m4 macros for drawing high-quality electric circuits
@@ -57407,10 +57408,10 @@ longdesc for Unix and PC machines.) Alternative output macros can create
longdesc TeX output to be read by pstricks, TikZ commands for use by the
longdesc pgf bundle, or SVG.
containersize 1496
-containerchecksum 77dc6e34bd1e09231b1f6ccfebebdf0197dd633023feba1d9498db089204c9b703f268915e4f76eccf24fffaf15fdb2b8962f498f174085eb76563b04a30f3ce
-doccontainersize 2327636
-doccontainerchecksum 2c13ea2e449b19670e4faf81baec04e54d06ced867a578ff6e875dba6f8cfdc363a29787903590be8c834ceaa50512a77e696e3d6721aba88a2151b70966785d
-docfiles size=1332
+containerchecksum 63e4b798c956b7c49ba097a416e79d19bff14a2f56b30b6308fd425cc1623ffc6dc22f64094e2b8e465a42f6c0a5ad988d121a9047cc94c9bb9919356b22b2c1
+doccontainersize 2339944
+doccontainerchecksum 0a66ce6d349ed8d0a735ffeaa59f22725723b1321e1c6bb08746b6e85af004c793fa549a530e9610fb4922a4ce969bdbb6da132ccfc7794ae255ef113b2cf6c4
+docfiles size=1343
RELOC/doc/latex/circuit-macros/CHANGES
RELOC/doc/latex/circuit-macros/Copying
RELOC/doc/latex/circuit-macros/INSTALL
@@ -57639,6 +57640,7 @@ docfiles size=1332
RELOC/doc/latex/circuit-macros/examples/SQUID.m4
RELOC/doc/latex/circuit-macros/examples/SampleFlow.m4
RELOC/doc/latex/circuit-macros/examples/Schottky.m4
+ RELOC/doc/latex/circuit-macros/examples/ShadeSector.m4
RELOC/doc/latex/circuit-macros/examples/Shaky.m4
RELOC/doc/latex/circuit-macros/examples/ShiftR.m4
RELOC/doc/latex/circuit-macros/examples/Sierpinski.m4
@@ -57798,6 +57800,7 @@ docfiles size=1332
RELOC/doc/latex/circuit-macros/examples/svg/ShiftRSVG.m4
RELOC/doc/latex/circuit-macros/examples/svg/SierpinskiSVG.m4
RELOC/doc/latex/circuit-macros/examples/svg/SixpoleSVG.m4
+ RELOC/doc/latex/circuit-macros/examples/svg/SmithchartSVG.m4
RELOC/doc/latex/circuit-macros/examples/svg/SourcesSVG.m4
RELOC/doc/latex/circuit-macros/examples/svg/SwitchesSVG.m4
RELOC/doc/latex/circuit-macros/examples/svg/TTLnandSVG.m4
@@ -57837,6 +57840,7 @@ docfiles size=1332
RELOC/doc/latex/circuit-macros/examples/svg/fetSVG.m4
RELOC/doc/latex/circuit-macros/examples/svg/graysurfSVG.m4
RELOC/doc/latex/circuit-macros/examples/svg/icsSVG.m4
+ RELOC/doc/latex/circuit-macros/examples/svg/keyboardSVG.m4
RELOC/doc/latex/circuit-macros/examples/svg/lcctSVG.m4
RELOC/doc/latex/circuit-macros/examples/svg/local_init.m4
RELOC/doc/latex/circuit-macros/examples/svg/paletteSVG.m4
@@ -57891,7 +57895,7 @@ catalogue-contact-repository https://gitlab.com/aplevich/circuit_macros
catalogue-ctan /graphics/circuit_macros
catalogue-license lppl1.3c
catalogue-topics diagram-circ electronic
-catalogue-version 9.8
+catalogue-version 9.9
name circuitikz
category Package
@@ -68254,7 +68258,7 @@ containerchecksum 3fdcf41fafd94373254281f3f7ee9f2a2e136cfa1adc1dd38e4b5cd6f90d03
name collection-langchinese
category Collection
-revision 61913
+revision 63995
shortdesc Chinese
relocated 1
longdesc Support for Chinese; additional packages in collection-langcjk.
@@ -68267,6 +68271,7 @@ depend cns
depend collection-langcjk
depend ctex
depend ctex-faq
+depend exam-zh
depend fandol
depend fduthesis
depend hanzibox
@@ -68291,8 +68296,8 @@ depend zhmetrics
depend zhmetrics-uptex
depend zhnumber
depend zhspacing
-containersize 544
-containerchecksum 3df5cd6944b02a2760836149ff9c80e8fcbceee26607974ff9c3100c5ab0b8be35a9df9a5bcbba8ff3c502471c5191d01403bc358d03a7eb589b4c1495a338ae
+containersize 552
+containerchecksum d10096b2d83dc0378361184a64c347918e75dd51f48d962893371534c375dd8880e8febb1aaf1207e5ce04e59860f629f10c99bbf6304239e1147a5072194137
name collection-langcjk
category Collection
@@ -84429,8 +84434,8 @@ catalogue-topics czech slovak font font-mf
name csassignments
category Package
-revision 63517
-shortdesc csassignments is a wrapper for article with macros and customizations specifically for computer science assignments
+revision 63992
+shortdesc A wrapper for article with macros and customizations for computer science assignments
relocated 1
longdesc This class wraps the default article and extends it for a
longdesc homogeneous look of hand-in assignments at university (RWTH
@@ -84439,29 +84444,26 @@ longdesc in the field of computer science, but easily extensible to
longdesc other fields. It provides macros for structuring exercises,
longdesc aggregating points, and displaying a grading table, as well as
longdesc several macros for easier math mode usage.
-containersize 3908
-containerchecksum 7fde9ee95f6ed8f5b1981edc188fdf5b608e425d055b46d17ec17af9a856f92f87a807a2188127aaf5e54a8ef175cb0a65f259876de104628df4927fad5711ed
-doccontainersize 105448
-doccontainerchecksum 099eaca01b7b70b5c749fa798558c162d16eab696e3aff1c187999b36be52e3c42c74f5e4d26582daf1c4f58faaa9d09892015a0dace530c089c6029cd6f3be5
-docfiles size=34
+containersize 3884
+containerchecksum 0e5356f133fb6f3fb33ee0407a53d59330e646e4f1356c307464c45f5dbb66435d68ec833c6482673417c53d611816c4a66a5db34da6b14e327691c0f0c3590f
+doccontainersize 106972
+doccontainerchecksum 3523504d0f7289d485fd34463ab7a0ba2fcc3d4a9b2908f3853977a8b3d7fad4266fd20050d2ee8a685483f47a66e04b50fd4cbaf0788f22c1ce48d2f4b89476
+docfiles size=36
RELOC/doc/latex/csassignments/README.md details="Readme"
RELOC/doc/latex/csassignments/csassignments.pdf details="Package documentation"
-srccontainersize 8156
-srccontainerchecksum 02626df3e0eb70c3cf9594e47a65fc8e84bbfdf9ddf06860cf4eae49d18ce99de862d2600f06e3fb4fd22e1fc28ab6d3b8e779f5eb6d916045c7a07c9b3f951f
+srccontainersize 8200
+srccontainerchecksum 0ba1b40ea19e3c1196a4314427ed882a00a4c4807127d0792ad6f020cb273d3c157ffc469bb7f363726b8a73ec20a9989de43a9cd82e114ccf1b9a1e66328547
srcfiles size=8
RELOC/source/latex/csassignments/csassignments.dtx
RELOC/source/latex/csassignments/csassignments.ins
runfiles size=3
RELOC/tex/latex/csassignments/csassignments.cls
catalogue-contact-bugs https://github.com/zoomoid/assignments/issues
-catalogue-contact-development https://github.com/zoomoid/assignments
-catalogue-contact-home https://github.com/zoomoid/assignments
catalogue-contact-repository https://github.com/zoomoid/assignments
-catalogue-contact-support https://github.com/zoomoid/assignments
catalogue-ctan /macros/latex/contrib/csassignments
catalogue-license mit
catalogue-topics class comp-sci maths
-catalogue-version 1.0.1
+catalogue-version 1.0.2
name csbulletin
category Package
@@ -113816,6 +113818,68 @@ catalogue-license lppl1.3
catalogue-topics exam random
catalogue-version 0.2
+name exam-zh
+category Package
+revision 63995
+shortdesc LaTeX template for Chinese exams
+relocated 1
+longdesc Although there are already several excellent exam packages or
+longdesc classes like exam and bhcexam, these do not fit the Chinese
+longdesc style very well, or they cannot be customized easily for
+longdesc Chinese exams of all types, like exams in primary school,
+longdesc junior high school, senior high school and even college. This
+longdesc is the main reason why this package was created. This package
+longdesc provides a class exam-zh.cls and several module packages like
+longdesc exam-zh-question.sty and exam-zh-choices.sty, where these
+longdesc module packages can be used individually. Using exam-zh you can
+longdesc separate the format and the content very well; use the choices
+longdesc environment to typeset choice items easily and automatically;
+longdesc design the seal line easily; and more (see manual).
+containersize 31680
+containerchecksum 42ad62e946ff663b02066fe3bb677dbb3c07976b4a896cee83ffea2425195638687ccf167c668fc11de8199cd18eef3469af037888e3b6e659a5164d64e15e3c
+doccontainersize 1831772
+doccontainerchecksum fe5926e28653d00c077df488366713eb13af3cde3cbdda97ed48c9324675779ab789fabc7615697c6fd96328e7fc5a50217c8c885ef8b6d90f8c8c3e26f1f7fd
+docfiles size=588
+ RELOC/doc/xelatex/exam-zh/CHANGELOG.md
+ RELOC/doc/xelatex/exam-zh/LICENSE
+ RELOC/doc/xelatex/exam-zh/README.md details="Readme"
+ RELOC/doc/xelatex/exam-zh/doc/back/about-author.tex
+ RELOC/doc/xelatex/exam-zh/doc/back/development.tex
+ RELOC/doc/xelatex/exam-zh/doc/back/main-changelog.tex
+ RELOC/doc/xelatex/exam-zh/doc/back/package.tex
+ RELOC/doc/xelatex/exam-zh/doc/body/cover.tex
+ RELOC/doc/xelatex/exam-zh/doc/body/installation.tex
+ RELOC/doc/xelatex/exam-zh/doc/body/introduction.tex
+ RELOC/doc/xelatex/exam-zh/doc/body/usage.tex
+ RELOC/doc/xelatex/exam-zh/doc/exam-zh-doc-setup.tex
+ RELOC/doc/xelatex/exam-zh/doc/exam-zh-doc.pdf details="Package documentation"
+ RELOC/doc/xelatex/exam-zh/doc/exam-zh-doc.tex
+ RELOC/doc/xelatex/exam-zh/doc/figures/firstpage.pdf
+ RELOC/doc/xelatex/exam-zh/doc/figures/gitee-main.png
+ RELOC/doc/xelatex/exam-zh/doc/figures/gitee-release.png
+ RELOC/doc/xelatex/exam-zh/doc/xdyydoc.cls
+ RELOC/doc/xelatex/exam-zh/examples/example-multiple.pdf details="Example of use (3)"
+ RELOC/doc/xelatex/exam-zh/examples/example-multiple.tex
+ RELOC/doc/xelatex/exam-zh/examples/example-single.pdf details="Example of use (1)"
+ RELOC/doc/xelatex/exam-zh/examples/example-single.tex
+ RELOC/doc/xelatex/exam-zh/examples/example-single_student_version.pdf details="Example of use (2)"
+runfiles size=57
+ RELOC/tex/latex/exam-zh/exam-zh-chinese-english.sty
+ RELOC/tex/latex/exam-zh/exam-zh-choices.sty
+ RELOC/tex/latex/exam-zh/exam-zh-font.sty
+ RELOC/tex/latex/exam-zh/exam-zh-question.sty
+ RELOC/tex/latex/exam-zh/exam-zh-symbols.sty
+ RELOC/tex/latex/exam-zh/exam-zh.cls
+catalogue-contact-bugs https://gitee.com/zepinglee/exam-zh/issues
+catalogue-contact-development https://gitee.com/zepinglee/exam-zh/pulls
+catalogue-contact-home https://gitee.com/zepinglee/exam-zh
+catalogue-contact-repository https://gitee.com/zepinglee/exam-zh/releases
+catalogue-contact-support https://gitee.com/zepinglee/exam-zh/issues
+catalogue-ctan /macros/xetex/latex/exam-zh
+catalogue-license lppl1.3c
+catalogue-topics exam chinese expl3
+catalogue-version 0.1.13
+
name examdesign
category Package
revision 15878
@@ -189802,7 +189866,7 @@ catalogue-version 0.8
name lua-widow-control
category Package
-revision 63642
+revision 63994
shortdesc Automatically remove widows and orphans from any document
relocated 1
longdesc Unmodified TeX has very few ways of preventing widows and
@@ -189823,16 +189887,16 @@ longdesc start of your document. To load: Plain LuaTeX: \input
longdesc lua-widow-control LuaLaTeX: \usepackage{lua-widow-control}
longdesc ConTeXt: \usemodule[lua-widow-control] OpTeX:
longdesc \load[lua-widow-control]
-containersize 16480
-containerchecksum 6458561169353a2311db5a63f4072a6dc95142ca4ab62a991d31756a04a4c1fbb9e5c90f84960e9a43fa9cfc645bba6ff68ba7c6c49fad63e5901c67f6de4eee
-doccontainersize 750088
-doccontainerchecksum a2729be1ad70f4d5d20344bec0d21aecb09f04c04ee770cfb62c446bc5ac21d7ccea0ac7552ff8fb1ea767b8900a3b1c696a1898e5f8320bad7e00bea00978d2
-docfiles size=222
+containersize 16396
+containerchecksum c8d4cdd72687ff990ce2f591ec0f7081b5a7fa822e4bb4d5cd00f32ce34b9177b18e582e0d6b9dda5a99568226915abd6b367b8808630787fba71590ad54d63f
+doccontainersize 745928
+doccontainerchecksum 6dc59ea9bffa68f543af29adc1eec155aebe96b7f802a7796d0fbef3a7b4765e74f570cf901c3398afad1437c610a4bdbd56af5b8a6d9ddf11334e16b5875240
+docfiles size=221
RELOC/doc/luatex/lua-widow-control/README.md details="Readme"
RELOC/doc/luatex/lua-widow-control/lua-widow-control.pdf details="Package documentation"
RELOC/doc/luatex/lua-widow-control/tb133chernoff-widows.pdf details="TUGboat Article"
-srccontainersize 47832
-srccontainerchecksum 9786a5688063dbf3e6ee80446fff2c1b400ea3b6bbc8ba74612166f0bb487cbc3944e7fae041b4714fafb9a0eeb68f5317f8c1d14fc257da3cd7124223113be0
+srccontainersize 47940
+srccontainerchecksum afe2c83278b7dc5b73e4e52adb04384f1df2497c53c89f3112c1da4b4399d5e21f97b10c8a57e0646a639f3f42201c9596c669f4a0a7650736c25c240c5f0864
srcfiles size=49
RELOC/source/luatex/lua-widow-control/CHANGELOG.md
RELOC/source/luatex/lua-widow-control/lwc-manual-samples.tex
@@ -189857,7 +189921,7 @@ catalogue-contact-support https://github.com/gucci-on-fleek/lua-widow-control/di
catalogue-ctan /macros/luatex/generic/lua-widow-control
catalogue-license other-free cc-by-sa-4
catalogue-topics layout luatex expl3
-catalogue-version 2.2.0
+catalogue-version 2.2.1
name luaaddplot
category Package
@@ -221188,7 +221252,7 @@ catalogue-topics font font-type1 font-decor
name nicematrix
category Package
-revision 63912
+revision 63993
shortdesc Improve the typesetting of mathematical matrices with PGF
relocated 1
longdesc This package is based on the package array. It creates PGF/TikZ
@@ -221200,26 +221264,26 @@ longdesc border matrices); control of the width of the columns; tools to
longdesc color rows and columns with a good PDF result; blocks of cells;
longdesc etc. The package requires and loads l3keys2e, xparse, array,
longdesc amsmath, pgfcore, and the module shapes of PGF.
-containersize 35616
-containerchecksum bba2715df7998f91e607869d3cfdbd8ccfde4dd7644d808e53eeb65158a97153004d9f6cdc149202aef42fbdffa3185e049e126e7e10b2a73aa1516b0d2ddaf9
-doccontainersize 2030764
-doccontainerchecksum 5a89ee25023008c0fdeb63a638bd34b4995467510f5cd4b8f1a634d56486b39787b5011e23a527653b495b66cecf7aac2a252bf3035ba00a9ade14fadf11d810
-docfiles size=555
+containersize 36828
+containerchecksum 424303425ca6bee9a73a1077d3aef20524d0d3ee41074520ef73513787a025492e8f53dc9372fe4b006d1bffa0868fa99fa9d37f9aaca0d426a025bec5c5931c
+doccontainersize 1794476
+doccontainerchecksum 0ed48785563c24a51ebe23d133083a4de036f3dcef47eaf465d97420e1f74f6500401e6117c58c393f2af13c13fe8798c09f5bf1615457eb8f91fb6f8e00900d
+docfiles size=491
RELOC/doc/latex/nicematrix/README.md details="Readme"
RELOC/doc/latex/nicematrix/nicematrix-french.pdf details="Package documentation in French" language="fr"
RELOC/doc/latex/nicematrix/nicematrix-french.tex
RELOC/doc/latex/nicematrix/nicematrix.pdf details="Package documentation"
-srccontainersize 115924
-srccontainerchecksum d1612c7449096984bed5c2310732c30d03a072ff48891915743fd26c22ae3aee65a14d6c2f1316a43f2a491c96fe7a1c49628da0bd80a16916585f5d43eadf6e
-srcfiles size=178
+srccontainersize 118508
+srccontainerchecksum efc3b8e1bd5d27b65d0bfa224cca6b654b1a668dfa4e404467059f4677f7bfd028a010c6d48f10da5f963c5ef718b72a316c9d067ea6cb572dc22eb042f2955d
+srcfiles size=182
RELOC/source/latex/nicematrix/nicematrix.dtx
RELOC/source/latex/nicematrix/nicematrix.ins
-runfiles size=79
+runfiles size=81
RELOC/tex/latex/nicematrix/nicematrix.sty
catalogue-ctan /macros/latex/contrib/nicematrix
catalogue-license lppl1.3
catalogue-topics maths matrix pgf-tikz expl3
-catalogue-version 6.11
+catalogue-version 6.12
name nicetext
category Package
@@ -306043,7 +306107,7 @@ docfiles size=376
name texlive-scripts
category TLCore
-revision 63985
+revision 63990
shortdesc TeX Live infrastructure programs
longdesc Includes install-tl, tl-portable, rungs, etc.; not needed for
longdesc tlmgr to run but still ours. Not included in tlcritical.
@@ -306051,10 +306115,10 @@ depend texlive-scripts.ARCH
depend texlive.infra
execute addMap mathpple.map
postaction shortcut type=menu name="TeX Live command-line" cmd=TEXDIR/tlpkg/installer/tl-cmd.bat
-containersize 113488
-containerchecksum d93f3cd5b2b7ff74b2de920c5a8d11fbe74b0da4115c4a660d34b8a780ee67932e978bed2c14efe41db4cda14acb24129e201669579a195865bb00815bafd181
-doccontainersize 419064
-doccontainerchecksum 752542ec2b657447a385c0357e613cf0fdaa412526895e3801b9f587140f954cdb50554cccec96a990182ab12f494658e5bede0f2d27897ed89d117df2f3d1f2
+containersize 113504
+containerchecksum 32917edff777c520398e8e42b9cfd2ed3cd9eefb885d7421e8dae68b2074aecd2d381c6e7d80e25d524d12ce123f5bccabb90317e4426f543c80ea94bfd75965
+doccontainersize 419024
+doccontainerchecksum 46fd88cd477c4e5241a1e132a04020cce8f012f139bb1f93b95ba2e91abdebd4816594a2def90090bca81466bb94ba42c61e5b83317cd8386e792ddc769fdcf5
docfiles size=516
doc.html
texmf-dist/doc/man/man1/fmtutil-sys.1
@@ -342834,7 +342898,7 @@ catalogue-version 1.00
name xduts
category Package
-revision 63751
+revision 63996
shortdesc Xidian University TeX Suite
relocated 1
longdesc XDUTS is designed to help Xidian University students use LaTeX
@@ -342843,16 +342907,16 @@ longdesc package that meets the school's requirements and can be applied
longdesc to any document class. In addition, there are thesis and thesis
longdesc proposal templates for both undergraduate and postgraduate that
longdesc meet the school's requirements.
-containersize 520844
-containerchecksum 3fe00bdd9b7387cae2b8d92a1721fb84464e49759c2fd147641d1a921b7dff0f6488ca78e8f85f37ec977fdc0f78bc08a9b8c39b5dc5436ac3c47f46fc7a762a
-doccontainersize 686392
-doccontainerchecksum 5b54dbe2a079bbbfc4ced18621cf443bad26a4b9f9b5b05da3b1ca50964acd8d445969e0c9de5727e2d310d4a4d0f9614327b0a8d367abb32e153b6cc1c635d1
+containersize 521060
+containerchecksum 03a5dde2dc5dfa06aef788a6428da604b43f7b2d8b5ceae71e8277e4608ea94fcef0c2845c9291b0a6ce9a60189e91ef9a6a4e4e3bdde6934761e12e62b42654
+doccontainersize 689216
+doccontainerchecksum 8255b65b94d0237ed0027ec93c17215d92fe72b1397c9a4dedc823ea0b2bc6f6cce758c50726764e710d47e65b0d657cdb9b580f374d1f46fdd1e8defd2f5057
docfiles size=174
RELOC/doc/xelatex/xduts/README.md details="Readme"
RELOC/doc/xelatex/xduts/xduts.pdf details="Package documentation" language="zh"
-srccontainersize 37860
-srccontainerchecksum 8bbcf00802cea969f94a07b67a4e821120688be605c8d01cf3078e804b31c7fbc939e5818c9a258f55b69a9a3e619b1ed1818165744c78ad7234f98698b3e69b
-srcfiles size=59
+srccontainersize 38156
+srccontainerchecksum 9484f5bb304ec18db47fc78a813d59d99debb651d11476eb5c5c40736fbd5a484cd4bdbc9dc9b523113889e5d81318368d8b794a864fb1e6beb807cb8a872ef1
+srcfiles size=60
RELOC/source/xelatex/xduts/xduts.dtx
RELOC/source/xelatex/xduts/xduts.ins
runfiles size=253
@@ -342867,8 +342931,8 @@ catalogue-contact-repository https://github.com/note286/xduts
catalogue-contact-support https://github.com/note286/xduts/discussions
catalogue-ctan /macros/xetex/latex/xduts
catalogue-license lppl1.3c
-catalogue-topics dissertation proposal
-catalogue-version 2.10.3.0
+catalogue-topics dissertation proposal expl3
+catalogue-version 2.12.1.1
name xdvi
category TLCore
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
index 98ff92f81d..7bffb2a2bd 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
@@ -1 +1 @@
-e9b74bd4af4dc117ce29d278665badbb texlive.tlpdb
+470e3f850a6dc408bec514fc4b36d109 texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
index 96aac07603..2130792af1 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
@@ -1 +1 @@
-a24de12a0a4aad90cc19b71505acfb99a0e140a70e273d99e8578b3c142601645ae89678924d2359146598e3e404cc17783983d6c8d1a6fbef82cd0238deb742 texlive.tlpdb
+9b49e319dda79e72f00c82a21a604d735bfe6b2d7b138fe22d0e09d4b4449ddd3d54fb99f1e8fede97ebf9acaf94587491b45d16fd542e0b509778e5eca383b9 texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
index 086c627587..09c0a3fbe1 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-----
-iQEcBAEBCgAGBQJi4dAFAAoJEEzhh34ZQ4xwkP0IAKJclKK+u0iVgqlg9rOve01s
-XMheL2lYyaXIDbSAnCK5Ofe8oobjB5KpQ+Ciy/WqMYTKEZR5Nfh0dcHOzesCRdXC
-V8Kn32MDtTNDhIqRt7FjUmPODeTDOTaCwjmspu6mq/RayZbd9MJPcDpt+uNAVegh
-ZlXnjTwrOR66LhfiZFLLO9kP/jPoKOkFdRHWYf2L3yi3/+99MDHOeHzqeNEOFnKg
-fh6lvI8qtlMCHhfRO5smYbVjbN+k2/ceYFJqf4qGonm5G7WEtuzSNYMS4clfRlTr
-5oYcityeJdJ2ZyzFh+7Di3hB5plzEtabplON7JjmEfJ61O8OOlfiBD48dBLiIlQ=
-=XzAM
+iQEcBAEBCgAGBQJi4yGDAAoJEEzhh34ZQ4xwIXYH/27xswDm1i8MMwbgwgbnBE/F
+DkxSu03EnkXlE0kVSby+H8vaE1x3ytf8eM6bIk35jFOW50X79R5+MwAyqkHTWztx
+UnA5Wqu0j421tRmKJxkzwhVD/qnM8ickq60T0bJJRthX7FucRuAxsyMhgA2O2vT+
+xezjunJdMWqo/1/zs9MpLjxJb1DXuSCoHfMg8TyQUGnoT9RjrA5gVbCGI+zPuUtR
+xUbxrM8TGAsT0ki/ypoBPoI5iz6MIZ9HXQu0m8WLDvrLnq2lLsY4mr3bRzxngk4j
+eMWZooehNlVwd0jdQrVe7AI2hTSeEHA8uJKPS3GBvRi+CKFoMDlt6rlpBj7Eu5s=
+=hnIo
-----END PGP SIGNATURE-----
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
index 2220214fb4..eceb5d35ab 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 2de8ee8daf..6c139c5501 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=1658953191
+date=1659039486
lastupd=miktex-arctrl-bin-x64-2.9 miktex-asymptote-bin-x64-2.9 miktex-autosp-bin-x64-2.9 miktex-axohelp-bin-x64-2.9 miktex-bibarts-bin-x64-2.9 miktex-bibtex-bin-x64-2.9 miktex-bibtex8bit-bin-x64-2.9 miktex-bzip2-bin-x64-2.9 miktex-cairo-bin-x64-2.9 miktex-chktex-bin-x64-2.9 miktex-cjkutils-bin-x64-2.9 miktex-console-bin-x64-2.9 miktex-curl-bin-x64-2.9 miktex-cweb-bin-x64-2.9 miktex-devnag-bin-x64-2.9 miktex-doc miktex-dvicopy-bin-x64-2.9 miktex-dvipdfmx-bin-x64-2.9 miktex-dvipng-bin-x64-2.9 miktex-dvips-bin-x64-2.9
-lstdigest=474a78ea5eb6dd45560fc90a772f3467
+lstdigest=493a45fcb163759de00852ad95946fd9
numpkg=5829
relstate=next
-version=8243
+version=8244
;;;;This configuration file is signed by a MiKTeX maintainer. The signature follows.
;;;;-----BEGIN MIKTEX SIGNATURE-----
-;;;; signature/miktex: XqD90Coeb8MSlgJlfKH5rL7bMQD1MWr6xfyuzxq95bBHwycIfI/WTzM5ZJHyQ/sGsjHj8PW49k9gH+RKCywup8/pPX52qcu4aqBlbAszK3tHpTIwommA7vQurGB2t9a+8za8CW6cQoAAAmnJbeQc6jCFtf0fLoMaX0CsvWJXraGhnJd4fFyMUMQnPWsk8ndTr2dyV0Zk7wq/WZlzthSyrrOCaMq6G2PX7VCaSkhmYXOPJ6negck/VjIiZVjw1XGkFuS1NKvMkX0OSewLFBu7Xwt8IYCTQr0zqWUdkMf6uoUZWZJ8A3UaJBzqc7duUSmWc14LzCecGY3oEREO4OaDXQ==
+;;;; signature/miktex: JsXBhLA7J10wm5huv9aTLu4FP/vFSSw62KKyUjdkRiyvP0xLpdX5w0V7iJohGjw6zu4KRYGjTBto60tpbpP9q0nQFVvvWksCmxv7Ulx1GNna3OdHQb1PQwAtz22lLVBQqSjo44RYgwTS0Qbw3PnTpsXaoeiuLIUBt0OSSaZPEzuFrghvqfheAc2ZK3UCxEbO+kpNkYARfYYnXWPMv6yfmTuKmO8fG1Zo0ghH9Pn+gOEHzbuTPw/fm53kzs4lhMYU08BQAC6u/7eqkHWH2UCExsFQHPREPLOkYVUpfobxLI7wjNLv7VYvM232N6wtRdl0M5ej8Z8i6VFWqex4XuBRrg==
;;;;-----END MIKTEX SIGNATURE-----
diff --git a/systems/win32/miktex/tm/packages/pr.ini b/systems/win32/miktex/tm/packages/pr.ini
index 9d2576ac23..f3fc8be2cd 100644
--- a/systems/win32/miktex/tm/packages/pr.ini
+++ b/systems/win32/miktex/tm/packages/pr.ini
@@ -1,13 +1,13 @@
[repository]
-date=1658952713
+date=1659039103
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=5edba264654ef4a7976a3957185a1d01
+lstdigest=c80f00d4981db82337f902edf6d183f7
numpkg=5829
relstate=stable
-version=8243
+version=8244
;;;;This configuration file is signed by a MiKTeX maintainer. The signature follows.
;;;;-----BEGIN MIKTEX SIGNATURE-----
-;;;; signature/miktex: TK3XTUMZHknGBeDU2URGvm3V/uP4GXc7C5RsGZJuV/bdLOXANIQ1QBdCFvCq1kjT9MCu/9pwv2DDLWikTK8FL4KRMjwA4K3s+is1qWaBj6rLceTjEIfQVQaFcpH/AOvFOckb6NOW07ltISshuVoRlnI2n9AcSaUldrrpt16prFHed+YT0fqYCvpd9p1nSr3cPmV6H0xB/7smRmWZMFVhZdHK+CMWnUCFd4wnPhF0aYFYO9WTgOY4xUOvy9FaEhr6SDlVjasf+dCbcc8mgiw/wrEmScLZEi33GsBsRHK2+GDewAStuFtmcI52Sokl+tI2fxoOCgSSul4NQ7LE1Ti4jQ==
+;;;; signature/miktex: r8OdAtxTSD1TyjIrq9/q7my2uKTATbpY8hkwBaECTZsI5Wm4+2HxatE/wGnvOMtyR16H6/BmwSugE0lnoQdEiEBG1PstWVfk8YgdQMw4EsHbCSzBdgTSOavltdZPSfPgpMXCEe6fXR31Qi4MrPcDf+oqPKJsKLSff/V0xMuoRkVa8HnuPrAsNCpqlKkFloQuSkeWQ4LG90YMGE/U5Ho6ZVnQor8LjivJ3Vb1ASgxULoa3t/mTlB9R64ciu7XQgYSxpC9aIuIrVt3fA9ffizHeZOhql+fKS6DFuK6iEpRGFiPwFdPGWyFAKu3Bq50953StqT9qJfKKI1plMU1PHFtxg==
;;;;-----END MIKTEX SIGNATURE-----
diff --git a/timestamp b/timestamp
index 02b96df83a..7201ecb1f3 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:
-2022-07-28-02-02
+2022-07-29-02-02